Crea un modelo de clasificación de audio personalizado previamente entrenado

1. Antes de comenzar

En el codelab anterior, compilaste una app básica para la clasificación de audio.

¿Qué pasa si quieres personalizar el modelo de clasificación de audio para reconocer audio de diferentes clases que no están presentes en un modelo previamente entrenado? ¿O si quiere personalizar el modelo con sus propios datos?

En este codelab, personalizarás un modelo de clasificación de audio previamente entrenado para detectar sonidos de pájaros. La misma técnica se puede replicar con sus propios datos.

Requisitos previos

Este codelab fue diseñado para desarrolladores de dispositivos móviles con experiencia que quieran adquirir experiencia en el aprendizaje automático. Debes estar familiarizado con lo siguiente:

  • Desarrollo para Android con Kotlin y Android Studio
  • Sintaxis básica de Python

Qué aprenderás

  • Cómo realizar el aprendizaje por transferencia para el dominio de audio
  • Cómo crear sus propios datos
  • Cómo implementar tu propio modelo en una app para Android

Requisitos

  • Una versión reciente de Android Studio (v4.1.2 o posterior)
  • Dispositivo Android físico con versión de Android en API 23 (Android 6.0)
  • El código de muestra
  • Conocimientos básicos sobre el desarrollo para Android en Kotlin

2. Conjunto de datos de aves

Utilizará un conjunto de datos de Birdsong que ya está preparado para facilitar su uso. Todos los archivos de audio provienen del sitio web de Xeno-Canto.

Este conjunto de datos contiene canciones de:

Nombre: House Sparrow

Código: houspa

Imagen de la especie de pájaro de gorras de Alejandro Bayer Tamayo de Armenia, Colombia.

[audio]

Nombre: Billboard rojo

Código: redcro

Imagen de la especie de cruz roja de Elaine Wilson.

[audio]

Nombre: Pecho manchado en blanco

Código: wbwwre1

Imagen de un rey de madera de pecho blanco, autor desconocido

[audio]

Nombre: Antpitta con corona de castañas

Código: chcant2

Imagen de una Antpitta de corona de castañas

[audio]

Nombre: Abela's Spintail

Código: azaspi1

Imagen del pájaro de columna vertebral de Azara.

[audio]

Este conjunto de datos está en un archivo ZIP y su contenido es el siguiente:

  • Un objeto metadata.csv que tiene toda la información sobre cada archivo de audio, como quién lo grabó, dónde se grabó, la licencia de uso y el nombre del pájaro.
  • Una carpeta de entrenamiento y pruebas
  • Dentro de las carpetas de entrenamiento o pruebas, hay una carpeta para cada código de aves. Dentro de cada uno de ellos, se encuentran todos los archivos .wav de ese pájaro en esa división.

Los archivos de audio están en el formato WAV y siguen esta especificación:

Esta especificación es importante porque usarás un modelo base que espera datos en este formato. Si deseas obtener más información, consulta esta entrada de blog.

Para facilitar todo el proceso, no necesitarás descargar el conjunto de datos en tu máquina, ya que lo usarás en Google Colab (más adelante en esta guía).

Si quieres usar tus propios datos, todos tus archivos de audio deben estar en este formato específico.

3. Obtén el código de muestra

Descarga el código

Haz clic en el siguiente vínculo a fin de descargar todo el código de este codelab:

Descargar código fuente

Como alternativa, clona el repositorio:

git clone https://github.com/googlecodelabs/odml-pathways.git

Descomprime el archivo zip descargado. Esto descomprimirá una carpeta raíz (odml-pathways) con todos los recursos que necesitarás. Para este codelab, solo necesitarás las fuentes del subdirectorio audio_classification/codelab2/android.

El subdirectorio android en el repositorio audio_classification/codelab2/android contiene dos directorios:

  • android_studio_folder.pngstarter: Código inicial en el que se basa este codelab.
  • android_studio_folder.pngfinal: Código completo para la app de muestra finalizada.

Cómo importar la app de inicio

Para comenzar, importa la app de inicio a Android Studio:

  1. Abre Android Studio y selecciona Import Project (Gradle, Eclipse ADT, etc.).
  2. Abre la carpeta starter (audio_classification/codelab2/android/starter) del código fuente que descargaste antes.

7c0f27882a2698ac.png

Para asegurarte de que todas las dependencias estén disponibles en la app, debes sincronizar tu proyecto con los archivos de Gradle cuando finalice el proceso de importación.

  1. En la barra de herramientas de Android Studio, selecciona Sync Project with Gradle Files ( b451ab2d04d835f9.png).

4. Información sobre la app inicial

Esta app es la misma que se compiló en el primer codelab para la clasificación de audio: Cómo crear una app básica de clasificación de audio.

Para comprender mejor el código en detalle, te recomendamos que lo hagas antes de continuar.

Todo el código está en el MainActivity (para que sea lo más simple posible).

En resumen, el código revisa las tareas a continuación:

  • Carga el modelo
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • Crea la grabadora de audio y comienza la grabación
val tensor = classifier.createInputTensorAudio()

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

val record = classifier.createAudioRecord()
record.startRecording()
  • Crear un subproceso de temporizador para ejecutar la inferencia Los parámetros del método scheduleAtFixedRate son cuánto tiempo se iniciará la ejecución y el tiempo que transcurre entre la ejecución sucesiva de la tarea. En el siguiente código, comenzará en 1 milisegundo y se volverá a ejecutar cada 500 milisegundos.
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • Ejecuta la inferencia en el audio capturado
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
  • Filtrar clasificaciones para puntuaciones bajas
val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}
  • Mostrar los resultados en la pantalla
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   .joinToString(separator = "\n")

runOnUiThread {
   textView.text = outputStr
}

Ahora puedes ejecutar la app y jugar con ella tal como está, pero recuerda que usa un modelo previamente entrenado más genérico.

5. Entrena un modelo de clasificación de audio personalizado con Model Maker

En el paso anterior, descargaste una app que usa un modelo previamente entrenado para clasificar eventos de audio. Pero, a veces, es necesario personalizar este modelo para eventos de audio que te interesen o convertirlo en una versión más especializada.

Como se mencionó anteriormente, se especializará el modelo para los sonidos de aves. Este es un conjunto de datos con audio de aves que se selecciona del sitio web de Xeno-canto.

Colaboratory

A continuación, iremos a Google Colab para entrenar el modelo personalizado.

Entrenar el modelo personalizado demorará unos 30 minutos.

Si deseas omitir este paso, puedes descargar el modelo que hubieras entrenado en el Colab con el conjunto de datos proporcionado y continuar con el siguiente paso.

6. Agrega el modelo TFLite personalizado a la app para Android

Ahora que entrenaste tu propio modelo de clasificación de audio y lo guardaste de forma local, debes colocarlo en la carpeta de elementos de la app para Android.

El primer paso es mover el modelo descargado del paso anterior a la carpeta de elementos en tu app.

  1. En Android Studio, con la vista Android Project, haz clic con el botón derecho en la carpeta assets.

7cca2c22ed8cf4c8.png

  1. Verás una ventana emergente con una lista de opciones. Una de ellas será abrir la carpeta en tu sistema de archivos. Encuentra el más adecuado para tu sistema operativo y selecciónalo. En una Mac, será Discover in Finder, en Windows será Open in Explorer y, en Ubuntu, será Show in Files.

95e0eca881d35f6b.png

  1. Copia el modelo descargado en la carpeta.

Una vez que lo hayas hecho, regresa a Android Studio y verás tu archivo en la carpeta de elementos.

52bda66abe201fe5.png

7. Carga el modelo nuevo en la app de base

La app de base ya usa un modelo previamente entrenado. Lo reemplazará por el que acaba de entrenar.

  1. TODO 1: Para cargar el modelo nuevo después de agregarlo a la carpeta assets, cambia el valor de la variable modelPath:
var modelPath = "my_birds_model.tflite"

El modelo nuevo tiene dos resultados (cabezas):

  • La salida más genérica y original del modelo base que usaste, en este caso, YAMNet.
  • La salida secundaria específica de las aves que usaste en el entrenamiento.

Esto es necesario porque YAMNet hace un gran trabajo cuando reconoce varias clases comunes, como en silencio. Con esto, no tienes que preocuparte por todas las demás clases que no agregaste a tu conjunto de datos.

Ahora, lo que harás ahora es que, si la clasificación YAMNet muestra una puntuación alta para la clase de aves, verás qué pájaro es esa en la otra salida.

37ce1c14e9e2d1b0.png

  1. TODO 2 Lee si el primer encabezado de clasificación tiene un alto nivel de confianza en que es un sonido de pájaro. Aquí cambiarás el filtro para filtrar también lo que no sea pájaro:
val filteredModelOuput = output[0].categories.filter {
   it.label.contains("Bird") && it.score > .3
}
  1. TODO 3: Si la cabeza base del modelo detecta que había un pájaro en el audio con una buena probabilidad, obtendrás cuál es el segundo en la segunda cabeza:
if (filteredModelOutput.isNotEmpty()) {
   Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput = output[1].categories.filter {
       it.score > probabilityThreshold
   }
}

Así de simple. Cambiar el modelo para usar el que acabas de entrenar es sencillo.

El siguiente paso es probarlo.

8. Prueba la app con tu modelo nuevo

Ya integró su modelo de clasificación de audio en la app, así que probémoslo.

  1. Conecta tu dispositivo Android y haz clic en Ejecutar ( execute.png) en la barra de herramientas de Android Studio.

La app debería poder predecir correctamente el audio de los pájaros. Para que sea más fácil realizar pruebas, reproduce uno de los audios de tu computadora (de los pasos anteriores), y tu teléfono debería poder detectarlo. Cuando lo haga, aparecerá en la pantalla el nombre de los pájaros y la probabilidad de que sea correcto.

bec397de3c8aaf32.png

9. Felicitaciones

En este codelab, aprendiste a crear tu propio modelo de clasificación de audio con Model Maker y a implementarlo en tu app para dispositivos móviles con TensorFlow Lite. Para obtener más información sobre TFLite, consulta otras muestras de TFLite.

Temas abordados

  • Cómo preparar su propio conjunto de datos
  • Cómo realizar el aprendizaje por transferencia para la clasificación de audio con Model Maker
  • Cómo usar tu modelo en una app para Android

Próximos pasos

  • Prueba con tus propios datos
  • Comparte con nosotros lo que compilas

Más información

¿Tienes alguna pregunta?

Informar problemas