Hacer un detector de humor para perros con Google Cloud y Raspberry Pi basado en Arm

KDPV protagonizada por Bob, la canción de Deniskin



Today , los teléfonos inteligentes , los relojes inteligentes y los rastreadores de actividad están en todas partes. Son útiles para monitorizarnos a nosotros mismos, nuestro entorno, pueden enviar notificaciones e incluso detectar problemas graves como la fibrilación auricular. Y estamos solo al comienzo del movimiento de micromonitoreo.



En este artículo, veremos la idea de un detector de humor para perros. Crearemos un dispositivo que escuche los sonidos ambientales y, si hay un perro presente, intentará determinar qué sonido está haciendo: ladridos amistosos, gemidos asustados o gruñidos agresivos. Dependiendo de la preferencia del usuario, el dispositivo vibra cuando cree que es necesario controlar al perro. Esto posiblemente podría ayudar a los dueños a realizar un seguimiento de sus perros cuando están fuera del alcance del oído. Por supuesto, esto es solo un prototipo, y los resultados de esta idea aún no se han probado en condiciones reales.



Usaremos una computadora Raspberry Pi basada en Arm para hacer un prototipo de este dispositivo. Es una gran plataforma para implementar el aprendizaje automático en los dispositivos de los usuarios finales. Los procesadores Arm no solo se utilizan en la Raspberry Pi, sino que también funcionan en muchos teléfonos móviles, consolas de juegos móviles y muchos otros dispositivos. El procesador de bajo consumo de energía de estas computadoras tiene una gran potencia de procesamiento y se puede comprar a un precio asequible en cualquier lugar.






Desafortunadamente, hasta ahora las capacidades de los dispositivos pequeños a menudo están limitadas por la potencia de procesamiento, la falta de conectividad a Internet y, por regla general, pequeñas cantidades de almacenamiento de datos. Aunque estos dispositivos pueden completar muchas observaciones en poco tiempo, si no hay conexión a Internet debido a limitaciones de almacenamiento, a menudo es imposible guardar todas las observaciones para una sincronización posterior. Además, enviar grandes cantidades de datos de forma inalámbrica también consume una pequeña cantidad de energía de la batería.



Para aprovechar al máximo las señales grabadas, es imperativo trasladar la etapa de procesamiento de señales a los propios dispositivos del usuario final.



Durante la última década, el aprendizaje automáticoha logrado avances significativos en la precisión de muchas tareas de procesamiento de señales, como la detección de objetos en imágenes, el reconocimiento de gestos de video y el reconocimiento de voz. Hoy solo estamos rascando la superficie de lo posible. El uso de ML en dispositivos pequeños ofrece innumerables otras formas de mejorar la vida de las personas.



Comienzo



Echaremos un vistazo a Google AudioSet para la formación . Esta es la colección más grande de clips de audio de 10 segundos de videos de YouTube. Los datos se proporcionan en un formato preprocesado compatible con el kit de inicio de YouTube-8M . Se utilizará para entrenar un modelo capaz de clasificar clips de audio.



Puede llevar algún tiempo entrenar este modelo, por lo que trasladaremos el procesamiento a la plataforma Google Cloud AI.y una vez completado, cargue el modelo. Con todos los componentes listos, transferiremos el modelo a la Raspberry Pi. También crearemos un script de Python para capturar la entrada del micrófono conectado y tratar de predecir cada segundo sonidos de perros identificados.



Creando el modelo deseado



Primero, creemos una carpeta en algún lugar para todo el trabajo que vamos a hacer.



Para crear un modelo, se debe cargar un conjunto de datos . Está disponible en el enlace bajo el encabezado Conjunto de datos de características. La forma más sencilla es descargar un archivo comprimido gzip en su computadora local.

 

Luego descomprímalo y extraiga los archivos. Hay tres carpetas en este paquete: una contiene el conjunto de entrenamiento equilibrado, la otra el conjunto de evaluación y la tercera el conjunto de entrenamiento no equilibrado. Cada carpeta contiene más de 4000 archivos.



Los archivos TFRecord contienen etiquetas preprocesadas. Los nombres de archivo comienzan con los dos primeros caracteres de la identificación del video de YouTube. Debido a que los ID de video distinguen entre mayúsculas y minúsculas, debe tener cuidado al extraer archivos si el sistema de archivos local no distingue entre mayúsculas y minúsculas, como en Windows.



¡Consejo útil! El programa 7zip se utiliza para extraer dichos archivos de características. 7zip admite opciones de línea de comandos. Esto le permite cambiar el nombre de los archivos existentes automáticamente, asegurándose de que se cambie el nombre de los archivos en lugar de sobrescribirlos.



Habiendo recibido el conjunto de datos extraído correctamente, clonamos el repositorio de Github de YouTube-8Mque contiene el código para entrenar el modelo. Se recomienda clonarlo en la carpeta que se creó para el conjunto de datos extraído.



Luego actualice el archivo reader.py en la carpeta YouTube-8M para admitir los archivos antiguos AudioSet TFRecord. Este proceso incluye dos etapas:



  • Cambie todas las apariciones de "id" a "video_id".
  • Cambie el valor predeterminado del parámetro num_classes a 527. Este número corresponde al número de categorías diferentes en este conjunto de datos de audio.



El identificador debe cambiarse en cinco lugares y num_classes en dos.



Para ejecutar este programa, implemente un nuevo entorno virtual Python 3.6+ e instale tensorflow == 1.14. También es conveniente ahora establecer los requisitos  para el script de salida que crearemos en el siguiente paso. Aunque los números de versión son diferentes para cada paquete, el único requisito estricto es usar la versión 1.14 de tensorflow. Para otros paquetes, simplemente puede instalar la última versión.



En este punto, está listo para entrenar el modelo. Primero, ejecute el script de entrenamiento localmente para probarlo. No tomará mucho tiempo en un conjunto de entrenamiento equilibrado. Abra una ventana del símbolo del sistema, navegue hasta la carpeta creada en el primer paso de esta sección e ingrese el siguiente comando (tenga en cuenta que todo esto es una línea):



python youtube-8m/train.py \ --train_data_pattern=./audioset_v1_embeddings/bal_train/*.tfrecord \
--num_epochs=100 \
--feature_names="audio_embedding" \
--feature_sizes="128" \
--frame_features \
--batch_size=512 \
--train_dir ./trained_models/yt8m \
--model=FrameLevelLogisticModel \
--start_new_model
      
      





También tenga en cuenta que si bien los caracteres de salto de línea \ funcionan bien en sistemas Linux, deben reemplazarse con el carácter ^ en Windows.



Después de 100 épocas, esto continúa hasta que alcanza aproximadamente el paso 8500. FrameLevelLogisticModel funcionará con una precisión máxima de aproximadamente 58–59%. En nuestro sistema de prueba, todo el proceso tomó poco menos de 20 minutos.



Con este kit de inicio se incluyen otros modelos, incluidos DbofModel y LstmModel. Cada uno de estos proporcionará una precisión casi perfecta en los datos de entrenamiento, pero ambos estarán muy sobreajustados en un conjunto de entrenamiento equilibrado cuando se prueben con un conjunto de puntajes.



Entrena el modelo en la nube



Una alternativa es entrenar con un conjunto completo de sonidos usando un conjunto de datos no balanceado. En este caso, el procesamiento llevará mucho más tiempo, pero las GPU basadas en la plataforma Google Cloud AI pueden ayudar significativamente. Un modelo logístico simple logra una precisión de aproximadamente el 88% en un conjunto de entrenamiento desequilibrado.



Para ejecutar este proceso en la nube, regístrese e inicie sesión en su cuenta de la plataforma Google Cloud AI, habilite la facturación y descargue las herramientas de línea de comandos que se detallan aquí .



Con todo configurado, vaya a la consola en la nube, cree un nuevo proyecto y una nueva canasta de almacenamiento. El nombre del depósito de almacenamiento debe ser exclusivo a nivel mundial. Es más fácil si incluye el nombre de la cuenta de usuario. Cargue todas las carpetas audioset_v1_embeddings y youtube-8m en esta canasta de almacenamiento.



Si se hace correctamente, deberíamos poder abrir el shell del SDK de Google Cloud y ejecutar los siguientes comandos para comenzar. Asegúrese de reemplazar your-project-name y your-storage-bucket-name con los valores de cuenta adecuados. Esto está escrito para sistemas basados ​​en Unix. Realice las correcciones adecuadas para los sistemas Windows.



BUCKET_NAME=gs://${USER}_yt8m_train_bucket

gsutil mb -p your-project-name $BUCKET_NAME

JOB_NAME=yt8m_train_$(date +%Y%m%d_%H%M%S)

gcloud --verbosity=debug ml-engine jobs submit training $JOB_NAME 
--python-version 3.5  --package-path=youtube-8m --module-name=youtube-8m.train --staging-bucket=$BUCKET_NAME --region=us-east1 --config=youtube-8m/cloudml-gpu.yaml -- --train_data_pattern='gs://your-storage-bucket-name/audioset_v1_embeddings/unbal_train/*.tfrecord' --model=FrameLevelLogisticModel --train_dir=$BUCKET_NAME/yt8m_train_frame_level_logistic_model
      
      





Nuevamente, tenga en cuenta que la última llamada a gcloud es un comando largo con opciones de configuración.

Tardará más de medio día en completarse. Cuando todo esté dicho y hecho, cargue la salida del modelo desde su depósito de almacenamiento en la nube:



$BUCKET_NAME/yt8m_train_frame_level_logistic_model
      
      





Ejecución en Raspberry Pi



Estamos demostrando esta aplicación en una computadora Raspberry Pi 4 basada en Arm que ejecuta el sistema operativo Raspbian con Python 3. Instale PyAudio en este dispositivo. En caso de problemas, esta respuesta debería ayudar.



Conecte un micrófono USB (con un auricular opcional para salida de audio para pruebas). En este punto, el micrófono es más fácil de configurar como dispositivo predeterminado. Vaya a su escritorio Raspian y haga clic en el icono del altavoz al lado del reloj en la esquina superior derecha y luego seleccione el micrófono a usar.



El último paso importante es obtener instrumentos que procesen audio sin procesar con la misma compresión 128-D que el AudioSet. La herramienta utilizada para esto se incluye en el repositorio Github de modelos de Tensorflow mencionado anteriormente. Siga exactamente el mismo procedimiento de instalación en el Pi, y no olvide instalarlo en su instancia de Python 3. Además, clone este repositorio en la misma carpeta donde clonó el conjunto de datos y el repositorio de YouTube-8M.



Ejecute el script vggish_smoke_test.py para asegurarse de que todo esté instalado correctamente.

 

Ahora copie el modelo descargado de la plataforma Google Cloud a la carpeta con el script de escucha del micrófono .



Ejecute este script. Comenzará a escuchar en el dispositivo predeterminado y escribirá las predicciones en la consola.

 

Si el dispositivo deseado no se puede configurar como el dispositivo predeterminado, ejecute el comando "python model-run.py list" para mostrar una lista de todos los dispositivos por índice. Busque el índice del dispositivo, luego ejecute el comando nuevamente con ese índice. Por ejemplo:



python model-run.py 3
      
      





Copie todo el contenido de esta carpeta en su Raspberry Pi y vuelva a ejecutar el script con el código. Una vez por segundo, debería haber predicciones de cuánto ruido cree el dispositivo que está haciendo el perro. La fase de retirada se puede reemplazar con cualquier mecanismo más apropiado para el dispositivo y el usuario objetivo.



Conclusión



Hoy analizamos una posible aplicación de aprendizaje automático basado en sonido compatible con dispositivos móviles basados ​​en Arm. Este concepto debe probarse con más detalle antes de salir al mercado, pero ya existe la capacidad de ejecutar un modelo de detección de audio arbitrario en un dispositivo móvil.

 

Los datos de AudioSet incluyen 527 etiquetas con una robusta ontología de sonidos urbanos. También hay posibilidades de mejorar el procesamiento del sonido antes de pasarlo a nuestro predictor, como aplicar un algoritmo de cóctel y pasar cada fuente de sonido a través de un filtro vggish .



Ejecutar un detector de humor para perros en una Raspberry Pi con un microprocesador Arm es muy emocionante. Para hacerlo aún más interesante, puede transformar y digitalizar el modelo con las herramientas del paquete TensorFlow y luego ejecutarlo en un microcontrolador Arm de bajo costo y bajo consumo de energía con el paquete de microcontroladores TensorFlow Lite .



¿Suena interesante? Experimente y descubra qué problema puede resolver este enfoque. Nunca se sabe cuánto puede influir en la vida de alguien. Y para descubrir qué más es capaz de hacer el aprendizaje automático en las manos adecuadas, venga a aprender (sin olvidar el código de promoción HABR, por supuesto).





Otras profesiones y cursos
PROFESIÓN








CURSOS







imagen



All Articles