
Hoy les contaré cómo creamos un sistema de control de acceso en la oficina basado en el servicio de reconocimiento facial
Vision . Primero, un poco de historia. Como en cualquier servicio de correo electrónico, hemos creado un sistema antispam. Dichos sistemas ahora se hacen sobre la base del aprendizaje automático, tenemos un poderoso equipo a cargo de ello. Y donde hay aprendizaje automático, hay visión por computadora. Por lo tanto, el servicio Vision surgió de forma bastante natural y natural.
Paralelamente a esto, hace unos años, lanzamos Cloud, un almacenamiento de archivos confiable con distribución geográfica a centros de datos, que puede ser utilizado tanto por particulares como por empresas. Con el tiempo, obtuvimos una "Nube para empresas", que no solo almacena archivos, sino que también le permite ordenar máquinas virtuales. Poco a poco, se convirtió en MCS - Mail.ru Cloud Solutions, donde Vision se adapta orgánicamente como uno de los servicios.
Nube
Nuestras redes neuronales son capaces de reconocer no solo rostros, sino también varios
objetos, objetos y escenas , incluidas las
vistas . Ahora pueden reconocer alrededor de 10 mil categorías, y la visión artificial a veces funciona mejor que la humana.

Esta es mi hija en 2012, en 2015 y 2018. Si no la conocía personalmente, probablemente no entendí de inmediato que se trata de la misma persona. Y la red neuronal pudo coincidir y comprender.

Aquí la niña se volvió y entrecerró los ojos, y el niño en general con una gorra con una sombra en la mitad de la cara. Pero al mismo tiempo, la red neuronal los reconoció con precisión, incluso a pesar de condiciones tan difíciles. Naturalmente, la tecnología que se está desarrollando dentro de la empresa no pudo evitar encontrar soporte en los servicios internos.
Nuestra intranet
Nuestra intranet se llama sys. Este es un tipo de red social (tenemos pocos de ellos). En él, los empleados cargan fotos de varios eventos.

Cuando se presentan varios cientos de fotos del evento, es bastante difícil encontrarse allí. Por lo tanto, tenemos visión artificial conectada a estos álbumes, que justo en la intranet, en un solo lugar, muestra las fotografías en las que estoy representado. Aquí el sistema me vio en una de las fiestas corporativas de verano.

La red neuronal me reconoció incluso en el crepúsculo de perfil, y hay muchas más personas en la foto.
Bastidores de conferencia
Más tarde hicimos bastidores de conferencias. Escribí un software para iPad, que está instalado dentro del rack, pero en general soy un desarrollador de iOS y no tengo nada que ver con la visión por computadora, solo ayudo de una manera amigable.

¿Cuál es la esencia de este estante? A lo largo del evento, una reunión, conferencia, fiesta corporativa o al menos un cumpleaños, un fotógrafo lo fotografía. De vez en cuando, deja caer las imágenes acumuladas en la nube. Puede ir al mostrador en cualquier momento, tomar una foto y hacer clic en el botón "Encuéntrame". Y el estante mostrará inmediatamente todas las fotos en las que fue capturado, o dirá que no se ha encontrado nada hasta ahora, si el sistema aún no ha logrado indexar las imágenes y le solicita que ingrese un correo electrónico. Y después del evento, recibirá un enlace por correo a la carpeta en la nube con todas las fotos en las que se encuentre. Esta es una de las aplicaciones del servicio Vision.
Sistema de acceso
Naturalmente, quería usar esas capacidades de reconocimiento facial no solo para buscar mi fisonomía en imágenes corporativas, sino también para algo más práctico. Por ejemplo, para un sistema de rendimiento automático. Aplicar un pase en cada entrada de su piso no es muy conveniente: a menudo se olvida el pase, y para las niñas con ropa ligera en verano no hay lugar para arreglar el pase.
Por lo tanto, decidimos experimentar. Tenemos todas las condiciones para esto: no necesitamos pedir permiso a nadie, un departamento administrativo muy receptivo, que dice con un suspiro: "Está bien. Adjunta tus cámaras. Solo que no en la puerta. Las puertas se relacionan con la seguridad contra incendios ". Somos: "Bueno, entonces. Vamos a adjuntar a un lado ". También tenemos pacientes pacientes, nos han sufrido.
Arquitectura
A primera vista, la arquitectura del sistema de acceso parece muy simple: la cámara toma fotos, la envía a Vision y Vision abre la puerta. Pero cuando comenzamos a pintar con colegas cómo hacer esto realmente, obtuvimos ese esquema:

El bloque de la derecha lo llamamos "cámara": este es el módulo que cuelga de la puerta. Consta de tres partes. La Raspberry Pi recibe video de una cámara USB, codifica con FFmpeg y envía. Probamos varias cámaras IP de un rango de precios razonable, y todos tuvieron un retraso notable de aproximadamente 0.5 s. Y dado que tenemos retrasos en otras etapas, cuando una persona se acerca, mira a la cámara y por unos segundos no pasa nada, ya quiere hacer un pase. Por lo tanto, redujimos los retrasos siempre que fue posible, y la Raspberry Pi con una cámara USB resultó ser más rápida que muchas cámaras IP comerciales. También conectado a la Raspberry hay un pequeño Arduino con un LED multicolor y un chirrido. El LED predeterminado es rojo. Cuando una persona aparece y es reconocida, el verde se ilumina.
Entonces, la Raspberry Pi transmite la transmisión de video, que a través de Ethernet por cable ingresa al servidor. Tenemos una sala de servidores en cada piso, en la que hay interruptores, cables de conexión a los escritorios de los empleados y un sistema de control de acceso a tiempo completo, un sistema de control y gestión de acceso.
Ponemos otro Raspberry Pi en la sala del servidor, que recibe la transmisión de video en tiempo real y la ejecuta a través de OpenCV. ¿Por qué necesitamos OpenCV? Necesitamos determinar si hay una cara en la imagen. Una red neuronal que define a una persona en una fotografía funciona un poco más, y es demasiado costoso alimentarla constantemente. Por lo tanto, a través de OpenCV, determinamos la presencia de una cara y, si aparece, la enviamos a Vision. El servicio responde que no encontró a este empleado o envía el identificador de empleado en la base de datos de Recursos Humanos. Con este identificador de empleado, vamos a la intranet asociada con el ACS y nos devuelve el identificador de pase. Además, lanzamos este identificador de paso en Arduino, que lo pasa al ACS. Para un sistema de control de acceso, esto es equivalente a que una persona solicite un pase. Es decir, no cambiamos el ACS de ninguna manera; todavía registra la entrada y salida de los empleados.
¿Cómo integramos nuestro sistema con ACS? En nuestra oficina, se utilizan dispositivos Bolid C2000-2.

Este es un sistema de control de acceso doméstico. Lo más probable es que pueda conectarse a estos dispositivos a través de la interfaz 485, pero nos conectamos a través del protocolo Wiegand.

Conectamos el Arduino, que actúa como un proxy, al lector de pases instalado cerca de la puerta.

La foto muestra la conexión de alimentación y dos líneas de datos del lector de pases. La almohadilla se usa para una conexión más conveniente.
Arduino recibe el número de pase, ya sea del lector o de la Raspberry Pi a través de USB, y se lo entrega al ACS. El ACS ni siquiera sabe de dónde es el número de pase.
Wiegand
Este es un protocolo estándar para sistemas de control de acceso, es compatible con la mayoría de los lectores. El protocolo es muy simple: dos líneas de datos, una línea de ceros y una línea de unidades. Tan pronto como conecta la línea cero al suelo, el lector comprende que se transmite cero, lo mismo con las unidades. Es decir, el protocolo no tiene tiempos estandarizados, y el número de omisión es fácil de leer a través de una interrupción en el Arduino, es fácil representarlo como una secuencia de datos. Y como la grabación requiere algún tipo de sincronización, me concentré en estos valores:

Ya hay una biblioteca preparada para Arduino. Puede leer diferentes formatos de Wiegand, pero sus capacidades se limitan a esto. Y todavía tenía que transmitir. Por lo tanto, escribí mi biblioteca, que funciona solo con el formato Wiegand-26. 26 es el número de bits: 3 bytes del número de omisión y 2 bits de paridad. Además, en toda la documentación y artículos está escrito que, muy probablemente, su controlador moderno ignorará los bits de paridad, por lo que soy flojo y no los cuento, pero siempre envío cero. ACS percibe esto normalmente.
Tuvimos otro problema: si alguien apareció por primera vez frente a la cámara y luego, sin esperar la operación, aplicó un pase, se produjo una situación de carrera: al mismo tiempo, el número de pase vino del lector y del reconocimiento. ACS no pudo hacer frente a esto y no permitió que la gente entrara. Por lo tanto, tuve que agregar un buffer de anillo con 4 códigos a la biblioteca. No importa de dónde provienen los códigos, se colocan en el búfer y luego con un tiempo de espera de 0.5 s se transmiten al ACS. Desde entonces, sus colegas han dejado de quejarse de que no están permitidos.
Banco de pruebas

El primer prototipo fue ensamblado a partir de algo horrible. Raspberry Pi colgaba en una caja en un estante ridículo, y una cámara estaba pegada encima de una cinta de doble cara. Arduino cuelga de las reglas laterales. En general, todo lo que amamos es muy DIY.
Por supuesto, en esta forma era imposible irse, era necesario organizarlo maravillosamente. Hablamos con varios contratistas, nos prometieron ordenar muestras en China, pero luego pasaron todos los plazos acordados y nadie nos ofreció nada.
Los productos personalizados tienen un problema: todas las soluciones son altamente especializadas, se fabricarán específicamente para nosotros. Primero, nos volvemos dependientes del proveedor. En segundo lugar, resulta un diseño de circuito único con una pequeña circulación, lo que significa que el costo de una pieza será alto. En tercer lugar, el tiempo de producción es lo suficientemente largo y, si falla una copia, no podremos comprar rápidamente un reemplazo en la tienda, tendremos que esperar a que se realice la próxima impresión, y si lo hacemos de inmediato, las copias restantes se desempolvarán en el almacén.
Después de que todos los socios potenciales nos decepcionaron, fui a un colega de Vision y le dije: "Volodia, déjame imprimir una funda en tu impresora 3D para que se vea hermosa". Suspiró y dijo: "Vamos. ¿Qué hacer?
Camera V 1

En Fusion, dibujé un monstruo de Frankenstein. En la esquina se suponía que era una Raspberry Pi con una entrada para un cable Ethernet. Entrada lateral para poder. El "segundo piso" era una cámara. El resultado fue una estructura grande, e incluso lo imprimí con una capa delgada para no gastar mucho plástico. Se veía terrible, y colgarlo era aún más vergonzoso.

Además, un colega me envió una referencia, dicen, nos gustaría. Le respondí que no podía hacer esto, pero decidí diseñar otro edificio.

El nuevo estuche tenía 11 cm de diámetro, más pequeño que el CD. La colocación del relleno también es de dos capas. Después de imprimir la primera versión, me di cuenta de que no tiene sentido colocar la cámara USB por completo en su estuche original. Lo desarme con cuidado, y resultó que tiene 4 agujeros de aterrizaje en el panel frontal. Combiné este panel con una cámara en un ensamblaje común con un tweeter y un LED.

Primero, intentamos generar un chirrido en la Raspberry Pi a través de gpio. Resultó extremadamente mal. Por lo tanto, decidimos tomar esta función por separado de la Raspberry Pi conectando un pequeño arduino (en realidad Iskra mini), al que se soldaron el chirrido y el LED, a través de TTL directamente al bloque.
Así es como se veía en la batalla:
Colgamos el dispositivo en el piso. De esta forma, vivió lo suficiente. Chillando, brillando maravillosamente, abriendo la puerta, sin embargo, no siempre. Los colegas, sin embargo, se quejaron de que el LED es demasiado brillante. Tuve que debilitarlo 4 veces.
Camera V 2
Luego hicieron esta opción:

Se inspiró en el diseño del hub Xiaomi, con un anillo luminoso alrededor del perímetro. Se ve muy hermosa El logotipo de Vision está hecho de partes individuales impresas en plásticos de diferentes colores. Aquí está el modelo:


Esta vez puse el chirriador en la pared posterior, monté el LED en un anillo transparente alrededor del perímetro, impreso desde un PLA transparente. La decoración se derrumbó casi de inmediato, porque originalmente simplemente se insertó por fricción, y tuve que ponerla en pegamento.
Problemas de cámara
Tuvimos la idea de replicar esta decisión en todo el edificio. Pero hay un problema: casi todos los pisos tienen dos puertas, y cada una debe tener dos cámaras, solo 96 cámaras para solo una de nuestras torres, y ahora la segunda se está desarrollando activamente. Es posible imprimir tantos casos, pero ya parece complicado. Además, tenemos bastantes componentes en el dispositivo, lo que significa muchos puntos de falla. Si escalamos la solución a todo el edificio, mantendremos constantemente estas cámaras. Una vez más, la complejidad del reemplazo rápido, porque cada cámara es un dispositivo de pieza. Y debe imprimir muchos de ellos, con un margen, o, si sucedió algo, ejecutar inmediatamente, imprimir y recoger uno nuevo. Nos dimos cuenta de que las soluciones de bricolaje son geniales, pero necesitas algo más conveniente en la replicación. Y surgió la idea de transferir todo al iPad.
IPad
El iPad tiene varias ventajas. El primero es la pantalla. Los colegas se quejaron de la falta de retroalimentación, son adecuados y no entienden si el reconocimiento ha comenzado o no, esperarlos o no esperar.
En segundo lugar, iOS tiene una función de reconocimiento facial incorporada. La función que realizó OpenCV se pasó al iPad. Se muestra un marco en la pantalla, y la persona debe llegar tan lejos que la cara encaje en este marco. Después de eso, el sistema comienza a reconocerlo automáticamente, no necesita presionar nada.
En tercer lugar, el iPad es un producto masivo. Si falla, establecemos otro. Aunque la tableta en sí cuesta unos 20 mil rublos, sigue siendo más barata que las cámaras personalizadas que los socios nos ofrecieron. Además, más rápido y más confiable.
Nueva arquitectura

iPad se hizo cargo de la mayoría de las funciones. En la Raspberry Pi, que se encuentra en la sala de servidores, en realidad solo hay un host HTTP que acepta una solicitud GET con una ID de paso. Inmediatamente representa el código en Arduino, y ella representa en ACS.
En la primera versión, Raspberry Pi estaba muy cargado, porque OpenCV estaba trabajando constantemente en él. Ya no era posible conectarle una segunda cámara; no habría suficiente potencia informática. Ya pensamos en poner una computadora honesta allí, que analizaría 4 hilos de dos puertas. Pero no llegó a eso. Ahora la búsqueda de caras en la imagen se realiza de forma independiente en cada iPad. En la cruz, hay dos Arduino, uno para cada puerta. Ambas placas funcionan con pases de entrada y salida. ¿Por qué es importante trabajar con pases de entrada y salida? En primer lugar, cuando se reconoce la cara y se abre la puerta, se enciende una luz verde en el lector de tarjetas, y los colegas entienden que puede salir. En segundo lugar, ACS registra entradas y salidas. Emulando la entrada y la salida por separado, no rompemos el esquema de operación ACS.
Naturalmente, los diseñadores se unieron y nos dibujaron una interfaz hermosa. Así es como se ve ahora en uno de los pisos de nuestra oficina:

Trabajar con visión
A pesar de que MCS es un producto comercial, los aficionados también pueden usarlo. El servicio ofrece a todos 5 mil transacciones gratuitas por mes, es decir 166 por día. Por lo tanto, puede solicitar sus necesidades domésticas, si encaja en el límite, por supuesto. ¿Cómo se puede hacer esto?
python examples/python/smarty.py \ -u "https://smarty.mail.ru/api/v1/persons/recognize ?oauth_provider=mcs&oauth_token=e50b000614a371ce 99c01a80a4558d8ed93b313737363830" \ -p friends1.jpg \ --meta '{"space":"1", "create_new":true}' \ -v
Tome una foto y envíela a Vision junto con nuestro token de acceso. Indicamos que estamos trabajando con el primer espacio y establecemos
create_new
, luego el sistema creará un nuevo identificador para cada persona desconocida. Esto es lo que obtenemos en respuesta:
{ "status":200, "body":{ "objects": [ { "status":0, "name":"file_0", "persons":[ {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025}, {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548}, {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766}, {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504}, {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849}, {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725} ] } ], "aliases_changed":false }, "htmlencoded":false, "last_modified":0 }
Formateé un poco a JSON. La respuesta contiene el identificador de la persona, las coordenadas de la cara en la foto y dos parámetros: qué tan bien se reconoce la cara y cuánto coincide esta persona con el estándar. Puede enviar una solicitud POST con una imagen en su lenguaje de programación, obtener JSON y analizar la respuesta.
Si tiene una cruz grande y necesita determinar solo una docena de personas, puede configurarlas manualmente. Luego, el sistema proporcionará identificadores para personas conocidas e indefinidas para personas desconocidas. Las personas también se pueden eliminar selectivamente, por ejemplo, si un empleado renuncia.
Ideas
¿En qué proyectos puedes usar el reconocimiento facial? Si desea implementar un sistema de ancho de banda, debe preocuparse por la suplantación de identidad. Por ejemplo, agregar una cámara infrarroja para determinar si es una fotografía o una persona viva. O poniendo dos cámaras para determinar la profundidad del objeto, esto se puede hacer usando OpenCV.
Puede organizar el reconocimiento de personas en la entrada. Si estos son sus vecinos, entonces todo está en orden, y si alguien es un extraño, puede enviarse una alerta. Tenemos tal problema en nuestra casa, los extraños vienen periódicamente y dejan mucha basura después de ellos en el rellano.
Si crea un "espejo inteligente", puede equiparlo con el reconocimiento de los miembros de la familia, para que todos puedan mostrar lo que es interesante para él. Digamos, el espejo me mostrará el horario de las reuniones de hoy, y con mi hija me saludará alegremente y se ofrecerá a lavarme los dientes, y no rápidamente, como siempre, sino dos minutos.
Otra idea es el reconocimiento de una placa por una puerta automática en el país. Para no salir ni presionar el llavero, puede colocar una cámara que eliminará su número y la puerta se abrirá automáticamente.