Utilice Machine Learning para reconocer imágenes con IBM Watson

¿No sería genial si una aplicación de Android pudiera ver y entender su entorno? ¿Te imaginas lo mejor que podría ser su interfaz de usuario si pudiera ver a sus usuarios y saber al instante sus edades, géneros y emociones? Bueno, tal aplicación puede parecer futurista, pero hoy es totalmente factible.

Con el servicio IBM Watson Visual Recognition, crear aplicaciones móviles que puedan detectar y analizar con precisión objetos en imágenes es más fácil que nunca. En este tutorial, te mostraré cómo usarlo para crear una aplicación inteligente para Android que pueda adivinar la edad y el género de una persona e identificar objetos prominentes en una fotografía..

Prerrequisitos

Para poder seguir este tutorial, debes tener:

  • una cuenta de IBM Bluemix
  • Android Studio 3.0 Canary 8 o superior
  • y un dispositivo o emulador con Android 4.4 o superior

1. Activación del Servicio de Reconocimiento Visual.

Al igual que todos los servicios de Watson, el servicio de reconocimiento visual también debe activarse manualmente antes de que pueda usarse en una aplicación. Así que inicie sesión en la consola de IBM Bluemix y navegue hasta Servicios> Watson. En la página que se abre, presiona la Crear servicio Watson botón.

De la lista de servicios disponibles que se muestra a continuación, elija Reconocimiento visual.

Ahora puede dar un nombre significativo al servicio y presionar la tecla Crear botón.

Una vez que el servicio esté listo, se generará una clave API para él. Puedes verlo abriendo el Credenciales de servicio pestaña y presionando el Ver credenciales botón.

2. Configuración del proyecto

En este tutorial, usaremos los SDK de Watson para Java y Android mientras interactuamos con el servicio de Reconocimiento Visual. También utilizaremos la biblioteca de Picasso para buscar y mostrar imágenes de Internet. Por lo tanto, agregue lo siguiente implementación dependencias a tu aplicación módulo de construir.gradle expediente:

implementación 'com.ibm.watson.developer_cloud: visual-Recognition: 3.9.1' implementación 'com.ibm.watson.developer_cloud: android-sdk: 0.4.2' implementación 'com.squareup.picasso: picasso: 2.5.2'

Para poder interactuar con los servidores de Watson, su aplicación necesitará la INTERNET permiso, así que solicítalo en tu proyecto. AndroidManifest.xml expediente.

Además, la aplicación que vamos a crear hoy necesitará acceso a la cámara del dispositivo y a los medios de almacenamiento externos, por lo que también debe solicitar la CÁMARA y WRITE_EXTERNAL_STORAGE permisos.

 

Por último, agregue la clave API de su servicio de reconocimiento visual a la strings.xml expediente.

a1234567890bcdefe

3. Inicializando un cliente de reconocimiento visual

El Watson Java SDK expone todas las características que ofrece el servicio de reconocimiento visual a través de Reconocimiento visual clase. Por lo tanto, ahora debe inicializar una instancia de ella utilizando su constructor, que espera tanto la fecha de la versión como la clave de la API como sus argumentos..

Mientras utiliza el servicio de reconocimiento visual, generalmente querrá tomar fotografías con la cámara del dispositivo. El Watson Android SDK tiene un CameraHelper clase para ayudarte a hacerlo Aunque no tiene que hacerlo, le sugiero que también inicie una instancia dentro de su actividad. onCreate () método.

VisualRecognition vrClient privado; ayudante privado de CameraHelper; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // Inicializar el cliente de reconocimiento visual vrClient = nuevo VisualRecognition (VisualRecognition.VERSION_DATE_2016_05_20, getString (R.string.api_key)); // Inicializar el asistente de ayuda de la cámara = nuevo CameraHelper (this); 

En este punto, tiene todo lo que necesita para comenzar a analizar imágenes con el servicio.

4. Detectar objetos

El servicio de reconocimiento visual puede detectar una gran variedad de objetos físicos. Como entrada, espera una imagen razonablemente bien iluminada cuya resolución sea de al menos 224 x 224 píxeles. Por ahora, usemos la cámara del dispositivo para tomar una imagen de este tipo..

Paso 1: Definir un diseño

El usuario debe poder presionar un botón para tomar la foto, por lo que el archivo XML de diseño de su actividad debe tener un Botón widget También debe tener un Vista de texto Widget para enumerar los objetos detectados..

Opcionalmente, puedes tirar un ImageView widget para mostrar la imagen.

En el código anterior, hemos agregado un controlador de eventos de clic al Botón widget Puede generar un código auxiliar para este widget codificándolo haciendo clic en la bombilla que se muestra a su lado.

public void takePicture (vista de vista) // Más código aquí

Paso 2: Toma una foto

Puedes tomar una foto simplemente llamando al CameraHelper objetos dispatchTakePictureIntent () método, así que agregue el siguiente código dentro del controlador de eventos:

helper.dispatchTakePictureIntent ();

El método anterior utiliza la aplicación de cámara predeterminada del dispositivo para tomar la foto. Eso significa que para obtener acceso a la imagen tomada, debe anular la actividad de su actividad. onActivityResult () Método y buscar resultados cuyo código de solicitud es REQUEST_IMAGE_CAPTURE. Así es como puedes hacer eso:

@ Override protected void onActivityResult (int requestCode, int resultCode, Intent data) super.onActivityResult (requestCode, resultCode, data); if (requestCode == CameraHelper.REQUEST_IMAGE_CAPTURE) // Más código aquí

Una vez que encuentre el resultado correcto, puede extraer la imagen de ella en forma de Mapa de bits objeto usando el getBitmap () método de la CameraHelper clase. También puede obtener la ruta absoluta de la imagen utilizando la Obtener el archivo() método. Necesitaremos tanto el mapa de bits como la ruta absoluta, así que agregue el siguiente código a continuación:

foto de mapa de bits final = helper.getBitmap (resultCode); archivo final photoFile = helper.getFile (resultCode);

Si eliges agregar el ImageView En el diseño, puede mostrar la imagen ahora pasando directamente el mapa de bits a su setImageBitmap () método.

Vista previa de ImageView = findViewById (R.id.preview); preview.setImageBitmap (foto);

Paso 3: Clasificar la imagen

Para detectar elementos en la imagen, debe pasar la imagen como una entrada al clasificar() método de la Reconocimiento visual objeto. Sin embargo, antes de hacerlo, debe envolverlo en un ClasificarImágenesOpciones objeto, que puede ser creado usando el ClassifyImagesOptions.Builder clase.

El valor de retorno de la clasificar() método es un Llamada de servicio Objeto, que admite solicitudes de red síncronas y asíncronas. Por ahora, llamémoslo ejecutar() Método para realizar una solicitud síncrona. Por supuesto, debido a que las operaciones de red no están permitidas en el subproceso de la interfaz de usuario, debe recordar hacerlo desde un nuevo subproceso..

AsyncTask.execute (new Runnable () @Override public void run () VisualClassification response = vrClient.classify (new ClassifyImagesOptions.Builder () .images (photoFile) .build ()) .execute (); // Más código aquí );

los clasificar() El método está diseñado para manejar múltiples imágenes a la vez. En consecuencia, su respuesta es una lista de detalles de clasificación. Debido a que actualmente estamos trabajando con una sola imagen, solo necesitamos el primer elemento de la lista. Así es como puedes conseguirlo:

Clasificación de clasificación de imagen = response.getImages (). Get (0); Clasificador de VisualClassifier = ranking.getClassifiers (). Get (0);

El servicio de reconocimiento visual trata cada elemento que ha detectado como una clase de tipo separada VisualClassifier.VisualClass. Llamando al getClasses () Método, puede obtener una lista de todas las clases.

Cada clase tiene, entre otros detalles, un nombre y un puntaje de confianza asociado. El siguiente código le muestra cómo recorrer la lista de clases y mostrar los nombres de solo aquellos cuyas puntuaciones son mayores al 70% en el Vista de texto widget.

Salida final de StringBuffer = new StringBuffer (); para (VisualClassifier.VisualClass object: classifier.getClasses ()) if (object.getScore ()> 0.7f) output.append ("<") .append(object.getName()) .append("> "); runOnUiThread (new Runnable () @Override public void run () TextView detectObjects = findViewById (R.id.detected_objects); detectadoObjects.setText (output););

Tenga en cuenta que el código anterior utiliza el runOnUiThread () método porque los contenidos de la Vista de texto El widget solo se puede actualizar desde el hilo de la interfaz de usuario.

Si ejecuta la aplicación ahora y toma una foto, podrá ver el funcionamiento de la clasificación de imágenes de Watson.

5. Analizando las caras

El servicio de Reconocimiento Visual tiene un método dedicado para procesar rostros humanos. Puede determinar la edad y el género de una persona en cualquier fotografía. Si la persona es famosa, también puede nombrarla..

Paso 1: Definir un diseño

Analizar caras con el servicio de Reconocimiento Visual no es muy diferente de clasificar objetos. Así que eres libre de reutilizar el diseño que creaste anteriormente. Sin embargo, para presentarle algunas características más que ofrece el servicio, voy a crear un nuevo diseño, este con una funcionalidad ligeramente diferente..

Esta vez, en lugar de tomar fotografías con la cámara y pasarlas al servicio, le pasaremos directamente una URL de imagen. Para permitir que el usuario escriba una URL e inicie el análisis, nuestro diseño necesitará una Editar texto widget y un Botón widget También necesitará un Vista de texto Widget para mostrar los resultados del análisis..

Te sugiero que también agregues un ImageView del diseño para que el usuario pueda ver la imagen a la que apunta la URL.

  

Paso 2: Visualizar la imagen

Dentro del controlador de clic de la Botón Widget, puedes llamar al getText () método de la Editar texto widget para determinar la URL de la imagen que el usuario escribió. Una vez que conozca la URL, simplemente puede pasarla a Picasso carga() y dentro() Métodos para descargar y visualizar la imagen en el ImageView widget.

EditText imageURLInput = findViewById (R.id.image_url); cadena final url = imageURLInput.getText (). toString (); Vista previa de ImageView = findViewById (R.id.preview); Picasso.with (this) .load (url) .into (vista previa);

Paso 3: Ejecutar análisis de cara

Para ejecutar el análisis facial en la URL, debe usar el detectFaces () método de la Reconocimiento visual cliente. Al igual que el clasificar() método, este método también necesita una VisualRecognitionOptions objeto como su entrada. 

Porque ya sabes como usar el ejecutar() Método para hacer solicitudes sincrónicas, ahora llamemos al poner en cola () método en su lugar, que se ejecuta de forma asíncrona y necesita una devolución de llamada. El siguiente código le muestra cómo:

vrClient.detectFaces (new VisualRecognitionOptions.Builder () .url (url) .build ()) .enqueue (new ServiceCallback() @Override public void onResponse (respuesta DetectedFaces) // Más código aquí @Override public void onFailure (Exception e) );

Como se puede ver en el código anterior, dentro del onResponse () método del objeto de devolución de llamada, usted tiene acceso a un DetectedFaces Objeto, que contiene una lista de resultados de análisis de caras. Debido a que usamos una sola imagen como entrada, solo necesitaremos el primer elemento de la lista. Llamando a su getFaces () método, se obtiene una lista de todos los Cara Objetos detectados.

Lista faces = response.getImages (). get (0) .getFaces ();

Cada Cara El objeto tiene un rango de género y edad asociado, al que se puede acceder llamando al getGender () y getAge () metodos.

los getGender () método en realidad devuelve un Género objeto. Usted debe llamar a su propio getGender () método para obtener el género como una cadena, que será "MALE" o "FEMALE". Del mismo modo, el getAge () método devuelve un Años objeto. Llamando a su getMin () y getMax () métodos, puede determinar la edad aproximada de la cara en años.

El siguiente código le muestra cómo recorrer la lista de Cara objetos, genere una cadena que contenga los géneros y edades de todas las caras, y visualícela en el Vista de texto widget:

Salida de cadena = ""; para (cara cara: caras) salida + = "<" + face.getGender().getGender() + ", " + face.getAge().getMin() + " - " + face.getAge().getMax() + " years old>\ n "; TextView personDetails = findViewById (R.id.person_details); personDetails.setText (salida);

Aquí hay un ejemplo del resultado del análisis de cara:

Conclusión

El servicio Watson Visual Recognition hace que sea extremadamente fácil para usted crear aplicaciones que sean inteligentes y conscientes de su entorno. En este tutorial, aprendió a usarlo con los SDK de Java y Android de Watson para detectar y analizar caras y objetos genéricos..

Para obtener más información sobre el servicio, puede consultar la documentación oficial..

Y asegúrese de revisar algunos de nuestros otros mensajes sobre aprendizaje automático aquí en Envato Tuts+!