Reconoce flores con TensorFlow Lite en Android

1. Introducción

657431be3173fa86.png android.png

Nota: En este codelab, se requiere un dispositivo físico para realizar las pruebas

TensorFlow es un framework multipropósito de aprendizaje automático. TensorFlow se puede usar en cualquier lugar, ya sea para entrenar modelos grandes en clústeres en la nube o para ejecutar modelos de forma local en un sistema incorporado, como tu teléfono.

En este codelab, se usa TensorFlow Lite para ejecutar un modelo de reconocimiento de imágenes en un dispositivo Android.

Instala Android Studio 4.1 o una versión posterior

Si aún no lo tienes, ve a descargar e instalar Android Studio 4.1 o una versión posterior mientras entrenas tu modelo de TensorFlow Lite.

Qué aprenderás

  • Cómo entrenar tu propio clasificador de imágenes personalizado con TensorFlow Lite Model Maker
  • Cómo usar Android Studio para importar el modelo de TensorFlow Lite a fin de integrar el modelo personalizado en una app para Android con CameraX
  • Cómo usar GPU en tu teléfono para acelerar tu modelo.

Qué compilarás

Una app de cámara sencilla que ejecuta un programa de reconocimiento de imágenes de TensorFlow para identificar flores.

f11c2821f2c8311d.png

Licencia: De uso gratuito

2. Entrena un reconocedor de flores con Colab

Antes de comenzar el entrenamiento de modelos, descarga e instala Android Studio 4.1 o una versión posterior.

Abre Colab, que muestra cómo entrenar un clasificador con Keras para reconocer flores con el aprendizaje por transferencia de TensorFlow Lite.

3. Configura el directorio de trabajo

Clona el repositorio de Git

Con el siguiente comando, se clonará el repositorio de Git que contiene los archivos necesarios para este codelab:

git clone https://github.com/hoitab/TFLClassify.git

A continuación, ve al directorio en el que acabas de clonar el repositorio. Aquí es donde trabajarás durante el resto de este codelab:

cd TFLClassify

4. Cómo configurar la app de Skeleton de Android

android.png

Instala Android Studio 4.1 o una versión posterior

Si aún no lo tienes, instala Android Studio 4.1 o una versión posterior.

Abre el proyecto con Android Studio

Para abrir un proyecto con Android Studio, sigue estos pasos:

  1. Abre Android Studio 8f2480ded53a193b.png. Cuando se cargue, selecciona "Open an Existing project" desde esta ventana emergente:

f3b8bea7e3b39376.png

  1. En el selector de archivos, elige TFLClassify/build.gradle en el directorio de trabajo.
  1. Obtendrás una "Gradle Sync" la primera vez que abres el proyecto, en la que se te pregunta sobre el uso del wrapper de Gradle. Haz clic en "Aceptar".

d68b4d7189e6c1e4.png

  1. Habilita el modelo de desarrollador y la depuración por USB en tu teléfono si aún no lo has hecho. Esta configuración se realiza por única vez. Sigue estas instrucciones.
  2. Una vez que el proyecto y el teléfono estén listos, puedes ejecutarlo en un dispositivo real. Para ello, selecciona TFL_Classify.start y presiona el botón de ejecución 86934b7b01ad7565.png en la barra de herramientas:

60a77ef126c1373d.png

  1. Ahora, permita que la demostración de Tensorflow acceda a su cámara:

b63cba02bb36b7e3.png

  1. Verás la siguiente pantalla en tu teléfono con números al azar que reemplazarán donde se mostrarán los resultados reales.

82c603596afa35f1.png

5. Agrega TensorFlow Lite a la app para Android

  1. Selecciona el módulo start en el explorador de proyectos ubicado en el lado izquierdo:

cede7f2b8b23c1a7.png

  1. Haz clic con el botón derecho en el módulo start o en File y, luego, en New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Selecciona la ubicación del modelo donde descargaste antes el entrenamiento personalizado FlowerModel.tflite.

cfee18cc6674a408.png

  1. Haz clic en Finish.
  2. Al final, verás lo siguiente. FlowerModel.tflite se importó correctamente y muestra la información de alto nivel sobre el modelo, incluida la entrada y la salida, así como un código de muestra para comenzar.

82840065f0d59def.png

6. Opcional: Revisa toda la lista de tareas pendientes

La lista de tareas pendientes te permite navegar fácilmente hasta la ubicación exacta en la que necesitas actualizar el codelab. También puedes usarla en tu proyecto de Android para recordar trabajos futuros. Puedes agregar elementos de tareas pendientes con comentarios de código y escribir la palabra clave TODO. Para acceder a la lista de tareas pendientes, puedes hacer lo siguiente:

  1. Una buena manera de ver qué vamos a hacer es consultar la lista de tareas pendientes. Para hacerlo, selecciona la barra de menú superior View > Tool Windows > TODO

5de29b413574f25c.png

  1. De forma predeterminada, enumera todos los elementos TODO en todos los módulos, lo que lo hace un poco confuso. Podemos ordenar solo las tareas pendientes iniciales. Para ello, haz clic en el botón Agrupar por en el costado del panel de tareas pendientes y elige Modules.

5d8fe7b102340208.png

  1. Expande todos los elementos debajo de los módulos de inicio:

8d0f14a039995b20.png

7. Ejecuta el modelo personalizado con TensorFlow Lite

  1. Haz clic en TODO 1 en la lista de tareas pendientes o abre el archivo MainActivity.kt y busca TODO 1, inicializa el modelo, agregando esta línea:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. Dentro del método de análisis para CameraX Analyzer, debemos convertir el objeto ImageProxy de entrada de la cámara en un Bitmap y crear un objeto TensorImage para el proceso de inferencia.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. Procesa la imagen y realiza las siguientes operaciones en el resultado:
  • Ordena los resultados por probabilidad de forma descendente en el atributo score, con la probabilidad más alta primero.
  • Toma los resultados k superiores según lo definido por la constante MAX_RESULT_DISPLAY. Si lo deseas, puedes variar el valor de esta variable para obtener más o menos resultados.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Convierte los resultados ordenados y filtrados en objetos de datos Recognition listos para que RecyclerView los consuma a través de la vinculación de datos:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Marca como comentario o borra las siguientes líneas que ayudan a generar los resultados falsos que vemos antes:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. Para ejecutar la app en un dispositivo real, selecciona TFL_Classify.start y presiona el botón de ejecución 86934b7b01ad7565.png en la barra de herramientas:

60a77ef126c1373d.png

  1. Verás la siguiente pantalla en tu teléfono; los números al azar cambiarán donde se mostrarán los resultados reales:

f11c2821f2c8311d.png

8. Opcional: Acelera la inferencia con el delegado de GPU

TensorFlow Lite admite varios aceleradores de hardware para acelerar la inferencia en tu dispositivo móvil. La GPU es uno de los aceleradores que TensorFlow Lite puede aprovechar a través de un mecanismo de delegado y es bastante fácil de usar.

  1. Abre build.gradle en el módulo start o haz clic en TODO 5 en la lista de tareas pendientes y agrega la siguiente dependencia:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Regresa al archivo MainActivity.kt o haz clic en TODO 6, en la lista de tareas pendientes. Reemplaza el inicio simple de flowerModel por lo siguiente: Obtén una instancia de la lista de compatibilidad de GPU y, luego, inicializa la GPU en función de si es una de las GPU compatibles que figuran en la lista. De lo contrario, inicia 4 subprocesos de CPU para ejecutar el modelo en su lugar:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Cambia el inicializador del modelo para usarlo. Para ello, agrega options a la entrada del método:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}
  1. Para ejecutar la app en un dispositivo real, selecciona TFL_Classify.start y presiona el botón de ejecución 86934b7b01ad7565.png en la barra de herramientas:

60a77ef126c1373d.png

9. Próximos pasos

Aquí tienes algunos vínculos para obtener más información: