Reconocer flores con TensorFlow Lite en Android

657431be3173fa86.pngandroid.png

Nota: este codelab requiere un dispositivo físico para probar

TensorFlow es un marco de aprendizaje automático multipropósito. TensorFlow se puede usar en cualquier lugar, desde entrenar modelos enormes en clústeres en la nube, hasta ejecutar modelos localmente en un sistema integrado como su teléfono.

Este codelab usa TensorFlow Lite para ejecutar un modelo de reconocimiento de imágenes en un dispositivo Android.

Instale Android Studio 4.1 o superior

Si aún no lo tiene instalado, descargue e instale AndroidStudio 4.1 o superior mientras entrena su modelo de TensorFlow Lite.

Lo que 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 para integrar el modelo personalizado en una aplicación de Android usando CameraX.
  • Cómo usar la GPU en su teléfono para acelerar su modelo.

Lo que vas a construir

Una aplicación de cámara simple que ejecuta un programa de reconocimiento de imágenes TensorFlow para identificar flores.

f11c2821f2c8311d.png

Licencia: de uso gratuito

Antes de iniciar el entrenamiento de modelos, comience a descargar e instalar Android Studio 4.1 o superior .

AbraColab, que muestra cómo entrenar a un clasificador con Keras para que reconozca flores mediante el aprendizaje por transferencia de TensorFlow Lite.

Clonar el repositorio de Git

El siguiente comando clonará el repositorio de Git que contiene los archivos necesarios para este laboratorio de código:

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

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

cd TFLClassify

android.png

Instale Android Studio 4.1 o superior

Si aún no lo tiene instalado, instale AndroidStudio 4.1 o superior .

Abra el proyecto con Android Studio

Abra un proyecto con Android Studio siguiendo los siguientes pasos:

  1. Abrir Android Studio 7f2480ded53a193b.png . Después de que se cargue, seleccione "Abrir un proyecto existente" en esta ventana emergente:

f3b8bea7e3b39376.png

  1. En el selector de archivos, elija TFLClassify/build.gradle de su directorio de trabajo.
  1. Obtendrá una ventana emergente "Gradle Sync", la primera vez que abra el proyecto, preguntándole sobre el uso de la envoltura de Gradle. Haga clic en Aceptar".

d68b4d7189e6c1e4.png

  1. Habilite el modelo de desarrollador y la depuración USB en su teléfono si aún no lo ha hecho. Esta es una configuración única. Siga estas instrucciones .
  2. Una vez que tanto su proyecto como su teléfono TFL_Classify.start listos, puede ejecutarlo en un dispositivo real seleccionando TFL_Classify.start y presionando el botón Ejecutar 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á la siguiente pantalla en su teléfono con números aleatorios que toman el lugar donde se mostrarán los resultados reales.

82c603596afa35f1.png

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

cede7f2b8b23c1a7.png

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

bf243d9fdd27e20a.png

  1. Seleccione la ubicación del modelo donde descargó el FlowerModel.tflite entrenado personalizado anteriormente.

cfee18cc6674a408.png

  1. Haga clic en Finish .
  2. Verá lo siguiente al final. El FlowerModel.tflite se importó con éxito y muestra la información de alto nivel con respecto al modelo, incluida la entrada / salida, así como un código de muestra para comenzar.

82840065f0d59def.png

La lista TODO facilita la navegación a la ubicación exacta donde necesita actualizar el codelab. También puede usarlo en su proyecto de Android para recordar el trabajo futuro. Puede agregar elementos de tareas pendientes mediante comentarios de código y escribir la palabra clave TODO . Para acceder a la lista de TODO, puede:

  1. Una excelente manera de ver lo que vamos a hacer es revisar la lista de TODO. Para hacer eso, seleccione en la barra de menú superior View > Tool Windows > TODO

5de29b413574f25c.png

  1. De forma predeterminada, enumera todas las tareas pendientes en todos los módulos, lo que lo hace un poco confuso. Podemos ordenar solo los TODO iniciales haciendo clic en el botón agrupar por en el costado del panel TODO y elegir Modules

5d8fe7b102340208.png

  1. Expanda todos los elementos de los módulos de inicio:

8d0f14a039995b20.png

  1. Haga clic en TODO 1 en la lista TODO o abra el archivo MainActivity.kt y localice TODO 1, inicialice 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, necesitamos convertir la entrada de la cámara ImageProxy 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. Procese la imagen y realice las siguientes operaciones en el resultado:
  • Ordene de forma descendente los resultados por probabilidad bajo el score atributo con la probabilidad más alta primero.
  • Tome los primeros k resultados definidos por la constante MAX_RESULT_DISPLAY . Opcionalmente, puede 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. Convierta los resultados ordenados y filtrados en objetos de datos. Recognition listo para ser consumido por RecyclerView través del enlace 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. Comente o elimine 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. Ejecute la aplicación en un dispositivo real seleccionando TFL_Classify.start y presione el botón Ejecutar 86934b7b01ad7565.png en la barra de herramientas:

60a77ef126c1373d.png

  1. Verá la siguiente pantalla en su teléfono con números aleatorios que toman el lugar donde se mostrarán los resultados reales:

f11c2821f2c8311d.png

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

  1. Abra build.gradle debajo del módulo de start o puede hacer clic en TODO 5 debajo de la lista TODO y agregar la siguiente dependencia:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Regrese al archivo MainActivity.kt o haga clic en TODO 6 en la lista TODO. Reemplace el inicio simple de flowerModel con lo siguiente: Obtenga una instancia de la lista de compatibilidad de GPU e inicialice la GPU dependiendo de si es una de las GPU compatibles enumeradas. De lo contrario, inicie 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. Cambie el inicializador del modelo para usar esto agregando 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. Ejecute la aplicación en un dispositivo real seleccionando TFL_Classify.start y presione el botón Ejecutar 86934b7b01ad7565.png en la barra de herramientas:

60a77ef126c1373d.png

Aquí hay algunos enlaces para obtener más información: