Buen dia a todos.
La pequeña frambuesa es una gran cosa. Utilicé Raspberry Zero W en un par de proyectos en los últimos seis meses. Sobornado por la simplicidad de la creación de prototipos y la eliminación de varias ideas. Y ahora aquí hay una pregunta opcional: ¿este dispositivo extraerá una cuadrícula convolucional completa? [Spoiler - tirar, pero hay matices graciosos]. ¿A quién le importa el tema? Bienvenido a Cat. ¡Atención, habrá muchos gatos!

¿Por qué es la red neuronal Raspberry?
De alguna manera, coleccioné un video trampa simple en Raspbery Zero W para observar la vida nocturna de los animales (principalmente gatos) en el país. El código era simple y funcionaba bastante bien. Para la detección de video-foto, se usó una cámara con iluminación IR como
esta "Cámara Raspberry Pi Night Version" .

La esencia del código es tomar dos cuadros consecutivos, comparar píxel por píxel y, si el número de píxeles modificados es mayor que un cierto valor umbral, comenzar a grabar un video de 10 segundos. No proporcionaré el texto del código en esta publicación, si alguien está interesado, escriba los comentarios, puedo ponerlo a continuación. La característica principal es comparar los dos cuadros en 0.2 segundos, al menos para capturar eventos rápidos. Bueno, compara rápidamente estos marcos, por supuesto.
Luego surgió la idea de fijar una red neuronal simple al algoritmo para que fuera posible determinar un objeto en un cuadro capturado e iniciar una grabación de video solo si la clase de objeto se determinaba de manera confiable. Potencialmente, esto elimina los falsos positivos de la captura de video. Estos ocurren por objetos en movimiento (por ejemplo, hierba o ramas) o por una iluminación nítida de la escena de la cámara (la luz en la ventana encendida o la lámpara se apagó, por ejemplo).
¿Qué cuadrícula poner en la frambuesa?
Afortunadamente, bajo el Python preinstalado (en mi caso es 3.5.3) y el ampliamente disponible OpenCV (uso 3.4.3), puede colocar casi cualquier grilla. Desafortunadamente, debido a las capacidades informáticas limitadas del dispositivo, la lista de opciones es pequeña. De hecho, solo puede elegir entre las opciones "ligeras":
1. SqueezeNet (código de muestra
aquí ).
2. YOLO Tiny (
aquí ).
3. MobileNet-SSD (
aquí ).
4. MobileNet_v1_224 (hay un
video fantástico
del funcionamiento del detector de objetos en esta cuadrícula ).
En todos estos casos, soborna la oportunidad de utilizar un modelo pre-entrenado en conjuntos de datos sólidos, aliviando así todos los tormentos y preocupaciones de un conjunto de datos independiente y el entrenamiento posterior de una red neuronal en ellos.
El solicitante No. 1 se inspiró en la
alta precisión de reconocimiento con modestos tamaños de factores de ponderación. Además, una breve búsqueda en Internet condujo al excelente blog
Adrian Rosebrock , que comentó el código en detalle y describió varias opciones para implementar el aprendizaje profundo en Raspberry.
El código
de aquí se usó para probar las capacidades de SqueezeNet. El autor envía el peso y la representación textual del modelo al correo electrónico después de completar el formulario en el sitio. Por cierto, si no tiene instalado OpenCV, puede encontrar el algoritmo de acciones en su blog. Además, hay ejemplos de "overclocking" del código para acelerar el tiempo de trabajo de los modelos y mucho más. Respeto a Adrian, un recurso realmente genial.
¡Bien, ejecutemos el código y obtengamos un resultado sorprendente en la primera imagen!

El gato en la imagen se define como persa con una probabilidad del 99%. De hecho, él no es persa, sino británico de pelo largo o montañés. Pero para un modelo con un rango de 1000 clases, se puede decir, dar en el blanco. Por conveniencia, coloqué los principales resultados de la red neuronal directamente en la foto. Estas son las 5 clases más probables, la primera es la más probable, la segunda es la siguiente más significativa, y así sucesivamente.
Por cierto, el modelo cuenta las clases de objetos en mi Zero durante 6.5 segundos. Si cree en los datos de Adrian, el cálculo en el Raspberry Pi B + en las imágenes que se muestran en su publicación (foto de las instalaciones del peluquero, la cobra y la medusa) tomará aproximadamente 0.92 segundos. Estoy dispuesto a creer que la versión completa de Raspberry tiene 4 núcleos en el procesador después de todo. Creo que todos saben que Zero solo tiene uno (((
Parece que tendrá que olvidarse de definir la clase de objeto en tiempo real en Zero. Por cierto, debo admitir que un segundo de tiempo para trabajar el modelo en un Pi "completo" tampoco es el sueño final.
Pero sigamos probando el modelo.

El gato cambió la posición del cuerpo y perdió hasta el 7% de su antiguo "persa"). Pero esto es una broma, por supuesto, en general, el trabajo del modelo es muy bueno. Fue en este mismo lugar donde fue posible terminar, pero quería complicar un poco la tarea del modelo. Sigamos practicando en ... gatos. Pero recopilaremos marcos donde el gato no se sienta en una pose clásica, sino que duerme, por ejemplo. Entonces vamos.

En esta imagen, el gato se define como Angora, pero esto no es exacto. Aparentemente por el hecho de que le molesta una solicitud obsesiva de abandonar el fregadero. Bueno, la red neuronal estaba mal, bueno, ¿a quién no le sucede al final?

Resulta que un balón de fútbol esponjoso vive en mi casa) Sí, sucede que las personas no son para nada lo que parecen a primera vista. La pelea de gatos y redes neuronales da un giro serio.

Wow Ahora ella es un husky siberiano. Algo me dice que el gato sigue contando)

Parece que uno de estos dos está claramente derribado y esto claramente no es un gato. Ahora está definido por la red neuronal como un huso (aunque solo en un 8,5%), todavía hay opciones de que sea un beagle, una orca, una pitón rocosa o una mofeta. ¡No es un gato, pero una mujer es un misterio!

Vamos! ¡Esto sigue siendo una orca! Sí, sí, un mamífero marino de orden de cetáceos. Por alguna razón, recordé las líneas de la infancia lejana:
"No hay orden en este cuento,
¡Aquí hay un error, un error tipográfico! Alguien
Contra todas las reglas
En un cuento de hadas, reorganizó las letras,
Transportado
"KIT" en el "CAT",
"CAT" en "KIT", al contrario ".
Suena el gong, el árbitro detiene la pelea)

En la segunda ronda, el gato, con astucia usando anteojos, pasó al bulldog de Boston con una probabilidad del 34%. O para los franceses. Parece que la red neuronal no se ha recuperado completamente de la derrota en la primera ronda)

Bueno, por fin! ¡El gato se define como siamés con una probabilidad de hasta 66%! Bravo, SqueezeNet! En serio, parece que en el conjunto de datos original prevalecieron las fotos de gatos no mentirosos, sino sentados. Mentir eran en su mayoría perros)

La capacidad de los gatos para tomar la forma de una caja es confusa incluso para los humanos, y mucho menos para la red neuronal. La inmersión en la caja redujo la precisión del reconocimiento hasta en un 40%.

Entonces, entonces ... Y esto, al parecer, generalmente es una recepción prohibida. El ratón de la computadora que se encuentra al lado del gato confunde completamente la red neuronal. ¡Ahora nuestro gato es un ratón! )
Entonces, a toda la red neuronal se le presentaron 11 fotos de gatos, de las cuales solo 5 fueron identificadas correctamente, además, con una probabilidad de más del 50% en solo tres casos. De ninguna manera disminuye el trabajo de los autores de SqueezeNet. Esta es una red sólida con una clase muy amplia de objetos y requisitos de recursos relativamente bajos.
El artículo, por supuesto, es de naturaleza cómica, pero se pueden sacar conclusiones bastante pragmáticas de los datos obtenidos. Es necesario usar redes neuronales pre-entrenadas con mucho cuidado, verificándolas en imágenes reales de la tarea para la cual se planea usar una red neuronal.
En cuanto a la elección de la red neuronal óptima para Raspberry, la pregunta sigue abierta hasta ahora. Continúo los experimentos, si hay interés de la audiencia en este tema, compartiré los resultados de más investigaciones. Es solo que los resultados del primer paso resultaron ser tan divertidos que realmente quería compartirlos.
Gracias por leer hasta el final. Buena suerte y que tengas una buena semana laboral)
UPD: Consulte la
segunda parte de esta publicación para ver el código de trabajo para ejecutar una red neuronal en Raspberry Pi Zero W.