Tabla de contenido:

¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2: 16 pasos (con imágenes)
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2: 16 pasos (con imágenes)

Video: ¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2: 16 pasos (con imágenes)

Video: ¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2: 16 pasos (con imágenes)
Video: DETECCION Y CLASIFICACION DE MANOS con Python y OpenCV | Clasificador de Imágenes con Tensorflow 2024, Noviembre
Anonim
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2
¿Eso es una mano? (Cámara Raspberry Pi + Red neuronal) Parte 1/2

Hace unos días, me lesioné la muñeca derecha en el gimnasio. Después, cada vez que usaba el mouse de mi computadora, me causaba mucho dolor debido al ángulo pronunciado de la muñeca.

Fue entonces cuando me di cuenta de que "no sería genial si pudiéramos convertir cualquier superficie en un trackpad" y no sé por qué, pero por alguna razón pensé en ella, en la película HER, dejaré que lo averigüen fuera. Fue un pensamiento emocionante, pero no sabía si podría hacerlo, decidí intentarlo.

Este artículo captura lo que salió de él.

Antes de comenzar, tengo un descargo de responsabilidad.

'Al final de este artículo, no pude convertir ninguna superficie en un trackpad, pero no aprendí mucho y agregué grandes herramientas a mi arsenal. Espero que a ti también te pase eso '

Empecemos.

Paso 1: video

Image
Image

Aquí hay un pequeño video de 5 minutos que cubre todos los pasos. Echar un vistazo.

Paso 2: hardware

Hardware
Hardware

Configuré una frambuesa pi junto con una cámara frambuesa pi a una altura de unos 45 cm. Esto nos da un área de monitoreo de aproximadamente 25x25 cm debajo de la cámara.

Las cámaras Raspberry Pi y Raspberry Pi están fácilmente disponibles, solo busque en Google y debería poder encontrar una tienda local.

Eche un vistazo a este enlace o una de mis listas de reproducción de Raspberry pi para poner en funcionamiento su pi sin cabeza.

Después de esta configuración, necesitamos un fragmento de código que decida si hay una mano en el área que la cámara está monitoreando y, de ser así, dónde está.

Paso 3: Pieza de código

Pieza de código
Pieza de código
Pieza de código
Pieza de código

Un fragmento de código que nos permite decidir si hay una mano en el área de interés usa algo llamado Red neuronal. Se incluyen en la categoría de programación en la que no definimos reglas para tomar decisiones, pero mostramos suficientes datos de la red neuronal para que descubra las reglas por sí misma.

En nuestro caso, en lugar de codificar cómo se ve la mano, mostramos imágenes de redes neuronales capturadas de raspberry pi que contienen mano y que no contienen mano. Esta fase se denomina entrenamiento de la red neuronal y las imágenes utilizadas se denominan conjunto de datos de entrenamiento.

Paso 4: obtener imágenes

Obtener imágenes
Obtener imágenes

Inicié sesión remotamente en mi raspberry pi y capturé un montón de imágenes usando el siguiente comando.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame% 04d.jpg

Capturé 80 imágenes con mano y 80 imágenes que no contienen mano. 160 imágenes no son suficientes para entrenar adecuadamente una red neuronal, pero deberían ser suficientes para una prueba de concepto.

Además de 160 imágenes, capturé 20 imágenes más para probar nuestra red una vez que esté entrenada.

Una vez que el conjunto de datos estuvo listo, comencé a escribir código para redes neuronales.

Paso 5: Herramientas e idioma utilizado

Herramientas e idioma utilizado
Herramientas e idioma utilizado
Herramientas e idioma utilizado
Herramientas e idioma utilizado

Escribí mi red neuronal en la biblioteca de aprendizaje profundo de Python llamada Keras y el código está escrito en el cuaderno jupyter de anaconda navigator.

Paso 6: preparación del conjunto de datos para la capacitación

Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento
Preparar el conjunto de datos para el entrenamiento

Primero (Imagen # 1) incluí todas las bibliotecas necesarias para este proyecto, que incluye PIL, matplotlib, numpy, os y Keras. En la segunda celda del cuaderno de Python (Imagen n. ° 2), defino las rutas al conjunto de datos e imprimo el recuento de muestras. Ahora necesitamos cargar todas las imágenes en una matriz numérica, por lo tanto, en la tercera celda (Imagen n. ° 2) creé una matriz numérica de 82 (número de muestra manual) +75 (número de muestra no manual), es decir, 157x100x100x3. 157 es el número total de imágenes que tengo, 100x100 es nuestra dimensión de imagen redimensionada y 3 es para capas de color rojo, verde y azul en la imagen.

En la cuarta y quinta celda, cargamos imágenes que contienen mano seguidas de imágenes que no contienen mano en la matriz numpy. En la sexta celda, dividimos cada valor por 255, por lo tanto, limitando el rango de valores de 0 a 1. (Imagen n. ° 3)

Lo siento si las imágenes adjuntas no son lo suficientemente buenas. Aquí hay un enlace al repositorio de GITHUB para que vea el código. No olvide reemplazar los nombres de la ruta del directorio con su ruta:).

Moviéndose a lo largo.

A continuación, debemos etiquetar cada imagen, por lo que creamos una matriz numérica unidimensional de 157 de longitud. Las primeras 82 entradas se establecen en 1 y las 75 entradas restantes se establecen en 0, lo que transporta la red neuronal que las primeras 82 imágenes son de una clase y las restantes son de otra (Imagen # 4).

Ahora creemos una red neuronal.

Paso 7: red neuronal

Red neuronal
Red neuronal
Red neuronal
Red neuronal

En la novena celda, definimos nuestra red neuronal. Contiene tres capas de repetición de convolución seguidas de capas maxpool con 8, 12 y 16 filtros de convolución respectivamente. A continuación, tenemos dos densas redes neuronales. Adjuntando dos imágenes para este paso. En primer lugar, se muestra un fragmento de código que crea una red neuronal y, en segundo lugar, está la representación pictórica de la red neuronal con la dimensión de salida y las operaciones anotadas.

Paso 8: Entrenamiento de la red neuronal

Entrenamiento de la red neuronal
Entrenamiento de la red neuronal

En la décima celda, configuramos el optimizador de redes neuronales en 'adam' y la función de pérdida en 'binary_crossentropy'. Desempeñan un papel importante en la forma en que se actualizan los pesos de la red. Finalmente, cuando ejecutamos la undécima celda, la red neuronal comienza a entrenarse. Mientras la red se está entrenando, observe la función de pérdida y asegúrese de que esté disminuyendo.

Paso 9: Prueba de la red neuronal

Prueba de la red neuronal
Prueba de la red neuronal

Una vez que se entrena la red neuronal, debemos preparar el conjunto de datos de prueba. Repetimos el procedimiento realizado para preparar el conjunto de entrenamiento en las celdas 3, 4, 5 y 6 en los datos de prueba para crear el conjunto de prueba. También preparamos la etiqueta para el conjunto de prueba, pero esta vez ejecutamos el modelo en este conjunto de datos para obtener predicciones y no para entrenar.

Paso 10: Resultado y siguiente parte…

Resultado y siguiente parte…
Resultado y siguiente parte…

Obtuve una precisión de prueba del 88%, pero tomo esto con una pizca de sal, ya que los conjuntos de datos utilizados para entrenar y probar este modelo son muy, muy pequeños e inadecuados para entrenar correctamente este modelo.

De todos modos espero que hayas disfrutado de este artículo. Mi intención detrás de este ejercicio aún no está completa y cuidado con la segunda parte. Lo subiré tan pronto como pueda.

En la siguiente parte, entrenaremos otra red neuronal que nos dirá la ubicación de la mano en una imagen detectada por la mano.

Todas las consultas son bienvenidas.

Si alguien está interesado en usar mi pequeño conjunto de datos, hágamelo saber en los comentarios. Lo haré disponible.

Gracias por leer. Te veré pronto con la segunda parte hasta entonces, ¿por qué no creas y entrenas una red neuronal?

Editar: - Los siguientes pasos son para la segunda parte.

Paso 11: Detección de objetos

Detección de objetos
Detección de objetos

En los pasos anteriores creamos un NN que nos dice si la imagen de prueba contiene mano o no. Bueno, que sigue? Si NN clasifica la imagen como mano contenedora, nos gustaría saber la ubicación de la mano. Esto se denomina detección de objetos en la literatura sobre visión por computadora. Así que entrenemos a NN que haga exactamente lo mismo.

Paso 12: video

Image
Image

Un video de 3 minutos que explica todos los pasos restantes. Echar un vistazo.

Paso 13: etiquetado

Etiquetado
Etiquetado
Etiquetado
Etiquetado
Etiquetado
Etiquetado

Si desea que una red neuronal muestre la ubicación de la mano, debemos entrenarla de tal manera, es decir, a diferencia de la red neuronal anterior donde cada imagen se etiquetaba como con la mano y sin la mano. Esta vez, todas las imágenes con la mano tendrán cuatro etiquetas correspondientes a las coordenadas diagonales del cuadro delimitador alrededor de la mano en esa imagen.

La imagen adjunta del archivo csv contiene una etiqueta para cada imagen. Tenga en cuenta que las coordenadas están normalizadas con la dimensión de la imagen, es decir, si la coordenada X superior está en 320 píxeles en la imagen con un ancho de 640 píxeles, la etiquetaremos como 0.5.

Paso 14: etiquetado de la GUI

Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI
Etiquetado de GUI

Quizás se pregunte cómo logré etiquetar las 82 imágenes, bueno, escribí una GUI en Python que me ayudó con esta tarea. Una vez que se carga la imagen en la GUI. Hice clic izquierdo en la coordenada superior y clic derecho en la coordenada inferior del cuadro delimitador probable alrededor de la mano. Estas coordenadas luego se escriben en un archivo y luego hago clic en el botón Siguiente para cargar la siguiente imagen. Repetí este procedimiento para todos los 82 trenes y 4 imágenes de prueba. Una vez que las etiquetas estuvieron listas, llegó el momento de la formación.

Paso 15: Bibliotecas necesarias

Bibliotecas necesarias
Bibliotecas necesarias
Bibliotecas necesarias
Bibliotecas necesarias
Bibliotecas necesarias
Bibliotecas necesarias

Primero necesitamos cargar todas las bibliotecas necesarias. Que incluye

  • PIL para manipulación de imágenes,
  • matplotlib para trazar,
  • numpy para operación matricial,
  • os para la funcionalidad dependiente del sistema operativo y
  • keras para redes neuronales.

Paso 16: Celdas restantes

Celdas restantes
Celdas restantes
Celdas restantes
Celdas restantes
Celdas restantes
Celdas restantes
Celdas restantes
Celdas restantes

En la segunda, tercera, cuarta y quinta celda cargamos imágenes en una matriz numérica y creamos una matriz de cuatro dimensiones a partir del archivo csv para que actúe como etiquetas. En la celda número 6 creamos nuestra red neuronal. Su arquitectura es idéntica a la red neuronal utilizada para la clasificación, excepto que la dimensión de la capa de salida es 4 y no 1. Otra diferencia proviene de la función de pérdida utilizada, que es el error cuadrático medio. En la celda número 8 comenzamos a entrenar nuestra red neuronal. Una vez entrenado, ejecuté este modelo en el conjunto de prueba para obtener predicciones para el cuadro delimitador en las coordenadas superpuestas del cuadro delimitador, parecían bastante precisas.

Gracias por leer.

Recomendado: