
El taxi debe ser cómodo y seguro. Y esto depende no solo de la calidad del automóvil y el servicio, sino también de la concentración de la atención del conductor, que cae durante el trabajo excesivo. Por lo tanto, en el nivel de servicio, limitamos el tiempo que el conductor pasa detrás del volante.
Pero a veces los conductores ya están cansados, por ejemplo, una persona estuvo ocupada en otro trabajo todo el día y por la noche decidió "conducir". ¿Qué hacer al respecto? ¿Cómo entender que el conductor interviene sin cambiar el sueño? Puede, por ejemplo, tratar de evaluar qué tan de cerca monitorea el camino y determinar signos de fatiga, por ejemplo, por la naturaleza del parpadeo. ¿Suena simple? Todo es más complicado de lo que parece.
Hoy les diremos primero a los lectores de Habr cómo se nos ocurrió y desarrollamos una cámara que pueda hacer esto.
Entonces, se da: la frecuencia y la duración de los parpadeos dependen del grado de fatiga. Cuando estamos cansados, la cabeza es menos móvil, la dirección de nuestra mirada cambia con menos frecuencia, parpadeamos con más frecuencia y dejamos los ojos cerrados durante largos períodos de tiempo; la diferencia se puede medir en fracciones de un segundo o varios grados de rotación, pero existe. Nuestra tarea consistía en diseñar un dispositivo que nos permitiera analizar los parpadeos, así como la dirección de nuestra mirada, bostezos y movimientos de la cabeza, a fin de evaluar el nivel de atención y fatiga del conductor.
Primero, decidimos: hagamos una aplicación para computadora portátil, pongamosla en los voluntarios de entre los empleados, y ¿usará la cámara incorporada para rastrear las señales que necesitamos? Por lo tanto, recopilaremos de inmediato una gran cantidad de información para el análisis y probaremos rápidamente nuestras hipótesis.
Spoiler: no pasó nada! Rápidamente se hizo evidente que la mayoría de las personas que trabajan en una computadora constantemente miran el teclado e inclinan la cabeza. Es decir, los ojos no son visibles, y ni siquiera está claro si están cerrados o abiertos, una persona parpadea o simplemente mira desde la pantalla al teclado y viceversa.

Luego nos dimos cuenta de que incluso para hacer un prototipo, necesitamos algún tipo de dispositivo. Compramos el primer modelo de cámara IP disponible, que funciona en el rango infrarrojo.
¿Por qué necesitamos infrarrojos? La iluminación puede ser diferente, a veces el usuario está a la sombra, a veces la luz es desde atrás, desde arriba o no hay ninguna. Si hacemos un dispositivo de medición, entonces debería funcionar igual bajo cualquier condición.
Para el experimento, apareció una cámara bastante popular de Xiaomi: CHUANGMI.

Resultó que dispara a una frecuencia de 15 fotogramas por segundo, y necesitamos el doble: el parpadeo dura de 30 a 150 ms, a 15 fotogramas por segundo nos arriesgamos a "no ver" el parpadeo de menos de 60–70 ms. Por lo tanto, tuvimos que modificar su firmware para encender a la fuerza la iluminación IR, obtener acceso directo a la transmisión de video y recoger los 30 cuadros por segundo necesarios. Después de haber conectado la cámara al portátil y configurado para recibir la transmisión de video a través del protocolo RTSP, comenzamos a grabar los primeros videos. La cámara se colocó a 15 cm por debajo de la cámara del portátil, y esto permitió "ver" mejor los ojos del usuario.
El éxito? Y de nuevo, no. Después de recopilar varios cientos de videos, nos dimos cuenta de que no pasaba nada. El comportamiento del usuario de la computadora portátil durante el día es diferente del comportamiento del conductor: una persona puede levantarse en cualquier momento, moverse para morder, simplemente caminar y hacer un calentamiento, mientras que el conductor pasa mucho más tiempo sentado. Por lo tanto, dichos datos no nos convienen.
Quedó claro que la única forma es hacer o comprar una cámara adecuada e instalarla en el automóvil.
Parece que todo es elemental: compramos un DVR, nos volvemos hacia el conductor, nos fijamos en el automóvil y una vez a la semana recogemos tarjetas SD con grabaciones de video. Pero aquí, en realidad, todo resultó no ser tan simple.
En primer lugar, es extremadamente difícil encontrar un DVR con iluminación IR, y necesitamos ver bien la cara, especialmente de noche.
En segundo lugar, todos los DVR tienen una lente gran angular, por lo que el área con la cara del conductor es bastante pequeña y no se puede ver nada en el registro. Y la distorsión de la lente estropea el análisis de la posición de la cabeza y la dirección de la vista.
En tercer lugar, esta empresa no escala bien en diez, cien o más máquinas. Necesitamos recolectar muchos datos de diferentes controladores para analizarlos y sacar conclusiones. Cambiar manualmente las tarjetas de memoria en un centenar de máquinas cada semana o cada día es una gran pérdida de tiempo. Incluso intentamos encontrar una cámara que cargara videos a la nube, pero no había nada similar en el mercado.
Incluso hubo una idea para hacer "su propio DVR" con la Raspberry Pi, una cámara con iluminación IR y soportes.

El resultado no fue exactamente lo que esperábamos: engorroso, es imposible instalar la cámara por separado de la computadora. El hecho es que con una longitud de cable de más de 50 cm, hay problemas con la señal iniciada, y el cable CSI en sí mismo es bastante frágil, demasiado ancho y, por lo tanto, no muy adecuado para la instalación en una máquina.
Debemos ir a Hong Kong, decidimos. El propósito del viaje era bastante abstracto: ver qué están haciendo los diferentes fabricantes en el campo del análisis del comportamiento del conductor, comprar muestras de productos si los encontramos y buscar soluciones / componentes técnicos adecuados que podamos instalar en los automóviles.
Fuimos inmediatamente a dos exhibiciones populares de electrónica y componentes. En el pabellón de la electrónica automotriz, vimos un dominio sin precedentes de grabadoras de video, cámaras retrovisoras y sistemas
ADAS , pero casi nadie estaba involucrado en analizar el comportamiento del conductor. Los prototipos de varios fabricantes determinaron quedarse dormido, distraerse, fumar y hablar por teléfono, pero nadie pensó en la fatiga.
Como resultado, compramos varias muestras de cámaras y computadoras de una sola placa. Quedó claro que 1) no hay productos terminados adecuados para nosotros; 2) es necesario separar la computadora y la cámara para no oscurecer la vista del conductor. Por lo tanto, tomamos una placa de cámara con una interfaz USB y, como unidad informática, una computadora Banana Pi de placa única y, al mismo tiempo, varios reproductores Android basados en procesadores Amlogic.

"¿Por qué están los jugadores?" - usted pregunta De hecho, el
S912 e incluso el S905 son bastante potentes en términos de rendimiento y pueden extraer fácilmente la grabación de video para nuestros propósitos, incluso con el análisis de imágenes en el acto. Se necesitaba un análisis de imagen en el sitio para no enviar toda la transmisión de video al servidor.
Vamos a contar: un minuto de video bien comprimido en resolución H.264 de 640 × 480 (30 FPS) toma al menos 5 megabytes. Entonces, en una hora habrá 300 megabytes, y para un turno estándar de 8 horas, aproximadamente 2-3 gigabytes.
Cargar 3 gigabytes de video todos los días con la ayuda de un módem LTE es muy "costoso". Por lo tanto, decidimos grabar periódicamente videos de 5 minutos y analizar todo lo que sucede en el automóvil allí mismo y subirlo a nuestros servidores en forma de una secuencia analizada de eventos: un conjunto de puntos faciales, una dirección de visión, un giro de cabeza, etc.
Regresamos de las exposiciones de buen humor, trajimos un montón de basura necesaria (e innecesaria) y nos dimos cuenta de cómo seguiríamos haciendo el prototipo.
La cámara USB que encontramos en Hong Kong fue casi perfecta para nosotros: tamaño 38 × 38 mm, lentes estándar (12 mm), la capacidad de soldar iluminadores IR directamente en la placa.

Por lo tanto, inmediatamente le pedimos al fabricante que nos hiciera un prototipo con los componentes necesarios. Ahora entendimos: necesitamos una cámara USB con luz de fondo y una PC de placa única para el procesamiento de video. Decidimos probar todo lo que se presentó en el mercado y organizamos una sesión de compra en AliExpress. Compramos cuatro docenas de cámaras diferentes, una docena de PC de una sola placa, reproductores Android, una colección de lentes de 12 mm y muchos otros dispositivos extraños.

El problema con el hardware se resolvió. ¿Y qué hay del software?
Rápidamente, pudimos obtener un prototipo simple basado en
OpenCV , que escribe un video, encuentra la cara del conductor, la analiza, marca 68 puntos clave en la cara, reconoce el parpadeo, el bostezo, el giro de la cabeza, etc.
La siguiente tarea fue hacer que nuestro prototipo funcionara en una PC de placa única. Raspberry PI se cayó de inmediato: pocos núcleos, un procesador débil, más de siete cuadros por segundo no se pueden extraer de él. Y sobre cómo escribir simultáneamente un video, reconocer una cara y analizarla, no había duda. Por las mismas razones, los decodificadores y las computadoras de placa única en Allwinner (H2, H3, H5), Amlogic S905 y Rockchip RK3328 no nos quedaron, aunque este último estuvo muy cerca del rendimiento deseado. Como resultado, todavía tenemos dos SoC potenciales: Amlogic S912 y Rockchip RK3399.
En Amlogic, la elección de los dispositivos era pequeña: una caja de TV o Khadas VIM2. Todo funcionaba igual en la caja de TV y Khadas, pero el enfriamiento de los decodificadores dejaba mucho que desear, y la configuración de Linux en ellos a menudo no era para los débiles: hacer que Wi-Fi, BT funcionen, hacer que el sistema operativo vea toda la memoria, - Es largo, difícil e impredecible. Como resultado, elegimos Khadas VIM2: tiene un radiador de enfriamiento estándar y la placa es lo suficientemente compacta como para esconderse detrás del tablero de la máquina.

En este momento, el fabricante de la placa de la cámara ya nos había enviado un lote de prueba de cien piezas, y estábamos ansiosos por la batalla: hacer un prototipo, ponerlo en un automóvil y recopilar datos.
Teníamos una cámara, había software, había una PC de placa única, pero no había la menor idea de cómo poner todo esto en el automóvil y conectarlo a la fuente de alimentación a bordo.
Obviamente, la cámara necesitaba un cuerpo y una montura. Compramos dos impresoras 3D a la vez para imprimir piezas, y el contratista nos hizo el primer modelo primitivo de la carcasa.

Ahora ha surgido la difícil tarea de elegir: dónde montar la cámara en el automóvil para obtener una buena imagen, pero no para oscurecer la visión del conductor. Había exactamente tres opciones:
- En medio del parabrisas.
- En el estante izquierdo.
- En el espejo retrovisor.

En ese momento, nos pareció que era mejor colocar la cámara directamente en el espejo retrovisor: siempre está dirigida en la cara del conductor, por lo que la cámara disparará exactamente lo que necesitamos. Desafortunadamente, los fabricantes de espejos retrovisores no se aseguraron de que algo se les pudiera unir de manera conveniente y confiable. Las cámaras no aguantaron bien, cayeron y cerraron la revisión.

Sin embargo, equipamos varias máquinas y comenzamos a recopilar datos de ellas. Se hizo evidente que el diseño era imperfecto, y los problemas relacionados con el rendimiento y el calentamiento aumentaron al mismo tiempo que grababan y analizaban la cara.
Luego decidimos montar la cámara a la altura de los ojos en el estante izquierdo: cerramos menos la revisión y tenemos un buen ángulo para la cámara para que se pueda ver el controlador. El estuche tuvo que volver a hacerse, ya que los sujetadores con bisagras resultaron extremadamente poco confiables: se rompen cuando se sacuden, se rompen y las ventosas se despegan del vidrio.

Decidimos que para el prototipo y la recopilación de datos es mejor pegar firmemente las cámaras al vidrio para que ninguna sacudida o influencia externa pueda cambiar su posición. Modificamos ligeramente la carcasa y al mismo tiempo realizamos pruebas de carga de la instalación utilizando una cinta especial de doble cara. Para las pruebas, se utilizó equipo complejo y de alta precisión.

Debido a problemas de rendimiento, decidimos cambiar el SoC a uno más potente, por lo que elegimos la PC de placa única NanoPI M4 en el procesador Rockchip RK3399.
En comparación con Khadas VIM2, es aproximadamente un tercio más productivo, tiene compresión de hardware y decodificación de video, y se comporta mucho más estable en condiciones de temperatura difíciles. Sí, tratamos de colocar cámaras y placas de circuito en el congelador, las calentamos en el horno y realizamos muchas otras pruebas inhumanas.

Como grabamos videos no solo así, sino también en dinámicas durante todo el día, era importante que la hora del sistema en el dispositivo fuera precisa. Desafortunadamente, la mayoría de las computadoras de placa única no están equipadas con un reloj autoalimentado. Tuvimos suerte de que nuestro NanoPI tuviera un conector de batería.
Tuve que diseñar un estuche para una computadora que lo protegería físicamente y actuaría como soporte para antenas WiFi y BT. Allí también proporcionamos un lugar para montar la batería del reloj con un soporte.


Luego, planeamos equipar cien máquinas con prototipos que grabarán video y transmitirán toda la telemetría a la nube en línea: ¿hay un conductor, con qué frecuencia y durante mucho tiempo parpadea, bosteza, se distrae de la carretera, gira la cabeza, etc. Todo esto ( y no solo) los parámetros nos permiten entrenar un modelo que evalúa qué tan concentrado está el conductor en la carretera, si está distraído o cansado. Para hacer todo esto directamente en el dispositivo en el automóvil, tuvimos que reescribir completamente el código, hacer compresión de video por hardware, rotar registros y grabaciones de video, enviarlo regularmente al servidor, actualizar el software de forma remota y mucho más.
Al mismo tiempo, nos quedó claro que nuestros cálculos y algoritmos funcionarían mucho mejor con un análisis facial básico más preciso. En los primeros prototipos, utilizamos el detector de caras integrado en OpenCV basado en el
modelo de cascada de haar y el modelo para marcar 68 puntos faciales basados en la biblioteca
dlib . Calculamos la posición de la cabeza nosotros mismos
calculando la proyección de los puntos de la cara en el plano focal. Las soluciones de código abierto para el reconocimiento y el marcado de caras funcionan bien en cuadros donde la cara se dispara al frente o al perfil, pero en condiciones intermedias a menudo se confunden.
Por lo tanto, decidimos licenciar una buena solución de reconocimiento y marcado facial de terceros: VisionLabs SDK. En comparación con los algoritmos anteriores, requiere más recursos, pero proporciona un aumento notable en la calidad del reconocimiento y el marcado de rostros, lo que conduce a una extracción más precisa de los factores para el aprendizaje automático. Con la ayuda de colegas de VisionLabs, pudimos cambiar rápidamente a su SDK y obtener el rendimiento que necesitábamos: 30 cuadros / segundo. a una resolución de 640x480.
VisionLabs SDK utiliza redes neuronales para el reconocimiento facial. La tecnología procesa cada cuadro, encuentra la cara del conductor y proporciona las coordenadas de los ojos, la nariz, la boca y otros puntos clave. Los datos obtenidos se utilizan para crear un marco normalizado de 250x250 de tamaño, donde la cara se encuentra estrictamente en el centro. Este marco ya se puede usar para calcular la posición de la cabeza en grados a lo largo de tres ejes: guiñada, cabeceo y balanceo. Para rastrear el estado de los ojos del conductor, el sistema analiza la imagen de los ojos y para cada ojo decide si está cerrado o abierto. El sistema puede determinar usando la tecnología IR Liveness si una persona viva está frente a la cámara o si el conductor ha adjuntado una foto. Para el análisis, se utiliza un marco normalizado, y en la salida obtenemos el resultado vivo o no vivo.
Conclusión
Mientras estábamos reescribiendo y depurando software, nuestras impresoras 3D imprimieron estuches para cámaras y PC de placa única día y noche. La impresión del kit (cuerpo de la cámara + carcasa de la PC) tomó alrededor de 3-4 horas de funcionamiento de la impresora, por lo que tuvimos que ampliar las capacidades de producción: utilizamos cuatro impresoras. Pero logramos hacer todo a tiempo.

En dos semanas, hemos equipado completamente los primeros cien autos en varias flotas de taxis: socios de Yandex.Taxi. Ahora, con su ayuda, recopilamos videos, analizamos el comportamiento del conductor, los signos de fatiga, mejoramos los algoritmos y entrenamos modelos que evalúan el nivel de atención y fatiga. Y solo después de eso (teniendo en cuenta todos los datos, comentarios de los conductores y pasajeros) estaremos listos para pasar a la siguiente etapa: producción en masa e implementación.
Desafortunadamente, para escalar a varios miles o decenas de miles de instalaciones, la solución técnica actual no es muy adecuada por varias razones. Todo lo que hablamos en este artículo es un experimento rápido, cuyo propósito era aprender rápidamente cómo recopilar datos directamente de las máquinas para entrenar modelos. El siguiente gran paso para nosotros es desarrollar y comenzar a producir un dispositivo de las mismas dimensiones, pero que consta de una unidad: la cámara, los sensores y el módem se ubicarán en una caja compacta, que instalaremos masivamente en las máquinas.