Entérate de todos los anuncios de Firebase Summit y descubre cómo Firebase puede ayudarte a acelerar el desarrollo de las apps y a ejecutarlas con confianza. Más información

Detecta objetos en imágenes con un modelo entrenado con AutoML en Android

Después de entrenar su propio modelo con AutoML Vision Edge , puede usarlo en su aplicación para detectar objetos en las imágenes.

Hay dos formas de integrar modelos entrenados desde AutoML Vision Edge: puede agrupar el modelo colocándolo dentro de la carpeta de activos de su aplicación, o puede descargarlo dinámicamente desde Firebase.

Opciones de agrupación de modelos
Incluido en su aplicación
  • El modelo es parte del APK de tu aplicación.
  • El modelo está disponible de inmediato, incluso cuando el dispositivo Android está fuera de línea
  • No es necesario un proyecto de Firebase
Alojado con Firebase
  • Aloje el modelo cargándolo en Firebase Machine Learning
  • Reduce el tamaño de APK
  • El modelo se descarga bajo demanda.
  • Envía actualizaciones de modelos sin volver a publicar tu aplicación
  • Pruebas A/B sencillas con Firebase Remote Config
  • Requiere un proyecto de Firebase

Antes de que empieces

  1. Si desea descargar un modelo , asegúrese de agregar Firebase a su proyecto de Android , si aún no lo ha hecho. Esto no es necesario cuando empaqueta el modelo.

  2. Agregue las dependencias para la biblioteca de tareas de TensorFlow Lite al archivo gradle de nivel de aplicación de su módulo, que generalmente es app/build.gradle :

    Para agrupar un modelo con su aplicación:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    Para descargar dinámicamente un modelo de Firebase, agregue también la dependencia de Firebase ML:

    dependencies {
      // ...
      // Object detection with an Auto ML model deployed to Firebase
      implementation platform('com.google.firebase:firebase-bom:26.1.1')
      implementation 'com.google.firebase:firebase-ml-model-interpreter'
    
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly'
    }
    

1. Cargue el modelo

Configurar una fuente de modelo local

Para agrupar el modelo con su aplicación:

  1. Extraiga el modelo del archivo zip que descargó de Google Cloud Console.
  2. Incluya su modelo en el paquete de su aplicación:
    1. Si no tiene una carpeta de activos en su proyecto, cree una haciendo clic con el botón derecho en la app/ carpeta y luego haciendo clic en Nuevo > Carpeta > Carpeta de activos .
    2. Copie su archivo de modelo tflite con metadatos incrustados en la carpeta de activos.
  3. Agrega lo siguiente al archivo build.gradle de tu aplicación para asegurarte de que Gradle no comprima el archivo del modelo al compilar la aplicación:

    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

    El archivo del modelo se incluirá en el paquete de la aplicación y estará disponible como recurso sin procesar.

Configurar una fuente de modelo alojada en Firebase

Para usar el modelo alojado de forma remota, cree un objeto RemoteModel , especificando el nombre que asignó al modelo cuando lo publicó:

Java

// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

kotlin

// Specify the name you assigned when you deployed the model.
val remoteModel =
    FirebaseCustomRemoteModel.Builder("your_model_name").build()

Luego, inicie la tarea de descarga del modelo, especificando las condiciones bajo las cuales desea permitir la descarga. Si el modelo no está en el dispositivo, o si hay disponible una versión más reciente del modelo, la tarea descargará el modelo de forma asíncrona desde Firebase:

Java

DownloadConditions downloadConditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Task<Void> task) {
                // Success.
            }
        });

kotlin

val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

Muchas aplicaciones inician la tarea de descarga en su código de inicialización, pero puede hacerlo en cualquier momento antes de que necesite usar el modelo.

Cree un detector de objetos a partir de su modelo

Después de configurar las fuentes de su modelo, cree un objeto ObjectDetector a partir de una de ellas.

Si solo tiene un modelo empaquetado localmente, simplemente cree un detector de objetos a partir de su archivo de modelo y configure el umbral de puntuación de confianza que desea solicitar (consulte Evaluar su modelo ):

Java

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud Console
                           // to determine an appropriate value.
    .build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

kotlin

// Initialization
val options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud Console
                           // to determine an appropriate value.
    .build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)

Si tiene un modelo alojado de forma remota, deberá verificar que se haya descargado antes de ejecutarlo. Puede comprobar el estado de la tarea de descarga del modelo mediante el método isModelDownloaded() del administrador de modelos.

Aunque solo tiene que confirmar esto antes de ejecutar el detector de objetos, si tiene un modelo alojado de forma remota y un modelo empaquetado localmente, puede tener sentido realizar esta verificación al instanciar el detector de objetos: cree un detector de objetos desde el control remoto. modelo si se ha descargado, y del modelo local en caso contrario.

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

Si solo tiene un modelo alojado de forma remota, debe deshabilitar la funcionalidad relacionada con el modelo, por ejemplo, atenuar u ocultar parte de su interfaz de usuario, hasta que confirme que el modelo se ha descargado. Puede hacerlo adjuntando un oyente al método download() del administrador de modelos.

Una vez que sepa que su modelo se ha descargado, cree un detector de objetos a partir del archivo del modelo:

Java

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnCompleteListener(new OnCompleteListener<File>() {
            @Override
            public void onComplete(@NonNull Task<File> task) {
                File modelFile = task.getResult();
                if (modelFile != null) {
                    ObjectDetectorOptions options = ObjectDetectorOptions.builder()
                            .setScoreThreshold(0)
                            .build();
                    objectDetector = ObjectDetector.createFromFileAndOptions(
                            getApplicationContext(), modelFile.getPath(), options);
                }
            }
        });

kotlin

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnSuccessListener { modelFile ->
            val options = ObjectDetectorOptions.builder()
                    .setScoreThreshold(0f)
                    .build()
            objectDetector = ObjectDetector.createFromFileAndOptions(
                    applicationContext, modelFile.path, options)
        }

2. Prepara la imagen de entrada

Luego, para cada imagen que quieras etiquetar, crea un objeto TensorImage a partir de tu imagen. Puedes crear un objeto TensorImage a partir de un Bitmap de bits usando el método fromBitmap :

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

kotlin

val image = TensorImage.fromBitmap(bitmap)

Si los datos de su imagen no están en un Bitmap de bits, puede cargar una matriz de píxeles como se muestra en los documentos de TensorFlow Lite .

3. Ejecute el detector de objetos

Para detectar objetos en una imagen, pasa el objeto TensorImage al método detect() de ObjectDetector .

Java

List<Detection> results = objectDetector.detect(image);

kotlin

val results = objectDetector.detect(image)

4. Obtener información sobre objetos etiquetados

Si la operación de detección de objetos tiene éxito, devuelve una lista de objetos de Detection . Cada objeto de Detection representa algo que se detectó en la imagen. Puede obtener el cuadro delimitador de cada objeto y sus etiquetas.

Por ejemplo:

Java

for (Detection result : results) {
    RectF bounds = result.getBoundingBox();
    List<Category> labels = result.getCategories();
}

kotlin

for (result in results) {
    val bounds = result.getBoundingBox()
    val labels = result.getCategories()
}

Sugerencias para mejorar el rendimiento en tiempo real

Si desea etiquetar imágenes en una aplicación en tiempo real, siga estas pautas para lograr las mejores tasas de cuadros:

  • Acelera las llamadas al etiquetador de imágenes. Si un nuevo cuadro de video está disponible mientras se ejecuta el etiquetador de imágenes, suelte el cuadro. Consulte la clase VisionProcessorBase en la aplicación de muestra de inicio rápido para ver un ejemplo.
  • Si está utilizando la salida del etiquetador de imágenes para superponer gráficos en la imagen de entrada, primero obtenga el resultado, luego renderice la imagen y superponga en un solo paso. Al hacerlo, renderiza en la superficie de visualización solo una vez para cada cuadro de entrada. Consulte las clases CameraSourcePreview y GraphicOverlay en la aplicación de muestra de inicio rápido para ver un ejemplo.
  • Si usa la API Camera2, capture imágenes en formato ImageFormat.YUV_420_888 .

    Si usa la API de cámara anterior, capture imágenes en formato ImageFormat.NV21 .