La vision par ordinateur comme alternative aux laissez-passer de bureau



Aujourd'hui, je vais vous dire comment nous avons créé un système de contrôle d'accès au bureau basé sur le service de reconnaissance faciale Vision . Tout d'abord, un peu d'histoire. Comme dans tout service de messagerie, nous avons créé un système anti-spam. De tels systèmes sont maintenant fabriqués sur la base de l'apprentissage automatique, nous avons une équipe puissante en charge. Et là où il y a l'apprentissage automatique, il y a la vision par ordinateur. Par conséquent, le service Vision est né tout naturellement et naturellement.

Parallèlement à cela, nous avons lancé il y a quelques années le Cloud, un stockage de fichiers fiable avec géo-distribution vers les centres de données, qui peut être utilisé par les particuliers et les entreprises. Au fil du temps, nous avons obtenu un "Cloud pour les entreprises", qui non seulement stocke les fichiers, mais vous permet également de commander des machines virtuelles. Progressivement, cela s'est transformé en MCS - Mail.ru Cloud Solutions, où Vision s'intègre organiquement dans l'un des services.

Nuage


Nos réseaux de neurones sont capables de reconnaître non seulement les visages, mais aussi divers objets, objets et scènes , y compris les vues . Maintenant, ils peuvent reconnaître environ 10 000 catégories, et la vision industrielle fonctionne parfois mieux que l'homme.



C'est ma fille en 2012, en 2015 et 2018. Si je ne la connaissais pas personnellement, je n’avais probablement pas immédiatement compris qu’il s’agissait d’une seule et même personne. Et le réseau neuronal a pu correspondre et comprendre.



Ici, la fille se détourna et plissa les yeux, et le garçon en général dans une casquette avec une ombre sur la moitié de son visage. Mais en même temps, le réseau de neurones les a reconnus avec précision, malgré des conditions aussi difficiles. Naturellement, la technologie qui se développe au sein de l'entreprise ne pouvait que trouver un support dans les services internes.

Notre intranet


Notre intranet s'appelle sys. Il s'agit d'une sorte de réseau social (nous en avons peu). Dans ce document, les employés téléchargent des photos de divers événements.



Lorsque plusieurs centaines de photos sont présentées lors de l'événement, il est assez difficile de s'y retrouver. Par conséquent, nous avons la vision industrielle connectée à ces albums, qui directement sur l'intranet, en un seul endroit, montre les photographies dans lesquelles je suis représenté. Ici, le système m'a vu à l'une des fêtes d'entreprise d'été.



Le réseau de neurones m'a reconnu même au crépuscule de profil, et il y a beaucoup plus de gens sur la photo.

Supports de conférence


Plus tard, nous avons fait des supports de conférence. J'ai écrit un logiciel pour l'iPad, qui est installé à l'intérieur du rack, mais en général, je suis un développeur iOS et je n'ai rien à voir avec la vision par ordinateur, j'aide simplement de manière conviviale.



Quelle est l'essence de ce rack? Tout au long de l'événement - une réunion, une conférence, une fête d'entreprise ou au moins un anniversaire - vous êtes photographié par un photographe. De temps en temps, il dépose les images accumulées dans le cloud. Vous pouvez vous rendre au comptoir à tout moment, prendre une photo et cliquer sur le bouton «Find Me». Et le rack affichera immédiatement toutes les photos dans lesquelles vous êtes capturé, ou dira que rien n'a été trouvé jusqu'à présent, si le système n'a pas encore réussi à indexer les images, et vous invite à entrer un e-mail. Et après l'événement, vous recevrez un lien par courrier électronique vers le dossier dans le Cloud avec toutes les photos sur lesquelles vous vous trouvez. C'est l'une des applications du service Vision.

Système d'accès


Naturellement, je voulais utiliser ces capacités de reconnaissance faciale non seulement pour rechercher ma physionomie dans des images d'entreprise, mais aussi pour quelque chose de plus pratique. Par exemple, pour un système de débit automatique. Appliquer un laissez-passer à chaque entrée de votre étage n'est pas très pratique: vous oubliez souvent le laissez-passer, et pour les filles en vêtements légers en été, il n'y a pas de place pour réparer le laissez-passer.

Par conséquent, nous avons décidé d'expérimenter. Nous avons toutes les conditions pour cela: nous n'avons besoin de demander la permission à personne, un service administratif très réactif, qui dit en soupirant: "D'accord. Fixez vos caméras. Mais pas à la porte. Les portes concernent la sécurité incendie. » Nous sommes: «Eh bien, alors. Nous attacherons sur le côté. " Nous avons aussi des collègues patients, ils ont souffert de nous.

L'architecture


À première vue, l'architecture du système d'accès semble très simple: la caméra prend des photos, les envoie à Vision, et Vision ouvre la porte. Mais quand nous avons commencé à peindre avec des collègues comment faire cela, nous avons alors obtenu un tel schéma:



Le bloc à droite, nous appelons la «caméra» - c'est le module qui se bloque sur la porte. Il se compose de trois parties. Le Raspberry Pi reçoit la vidéo d'une caméra USB, encode avec FFmpeg et envoie. Nous avons testé plusieurs caméras IP d'une gamme de prix raisonnable, et tout le monde avait un retard notable d'environ 0,5 s. Et comme nous avons des retards à d'autres stades, lorsqu'une personne se lève, regarde la caméra et que pendant quelques secondes rien ne se passe, elle veut déjà faire une passe. Par conséquent, nous avons réduit les délais autant que possible, et le Raspberry Pi avec une caméra USB s'est avéré être plus rapide que de nombreuses caméras IP commerciales. Un autre Arduino avec une LED multicolore et un squeaker est également connecté au Raspberry. La LED par défaut est rouge. Lorsqu'une personne se lève et est reconnue, le vert s'allume.

Ainsi, le Raspberry Pi transmet le flux vidéo, qui via Ethernet filaire entre dans le serveur. Nous avons une salle de serveurs à chaque étage, dans laquelle il y a des commutateurs, des câbles de connexion aux bureaux des employés et un système de contrôle d'accès à temps plein - un système de contrôle et de gestion des accès.

Nous avons mis un autre Raspberry Pi dans la salle des serveurs, qui reçoit le flux vidéo en temps réel et le fait passer par OpenCV. Pourquoi avons-nous besoin d'OpenCV? Nous devons déterminer s'il y a un visage dans l'image. Un réseau de neurones qui définit une personne sur une photo fonctionne un peu plus longtemps, et il est trop coûteux de lui envoyer un flux vidéo en permanence. Par conséquent, via OpenCV, nous déterminons la présence d'un visage, et s'il apparaît, nous l'envoyons à Vision. Le service répond qu'il n'a pas trouvé cet employé ou envoie l'identifiant de l'employé dans la base de données RH. Avec cet identifiant d'employé, nous allons sur l'intranet associé à l'ACS, et il nous renvoie l'identifiant du pass. De plus, nous jetons cet identifiant de passe dans Arduino, qui le transmet à l'ACS. Pour un système de contrôle d'accès, cela équivaut à une personne appliquant un laissez-passer. Autrement dit, nous ne modifions en aucun cas l'AEC; il enregistre toujours l'entrée et la sortie des employés.

Comment avons-nous intégré notre système à ACS? Dans notre bureau, des appareils Bolid C2000-2 sont utilisés.



Il s'agit d'un système de contrôle d'accès national. Très probablement, vous pouvez vous connecter à ces appareils via la 485e interface, mais nous nous sommes connectés via le protocole Wiegand.



Nous avons connecté l'Arduino, qui agit comme un proxy, au lecteur de laissez-passer installé près de la porte.



La photo montre la connexion électrique et deux lignes de données du lecteur de laissez-passer. Le pad est utilisé pour une connexion plus pratique.

Arduino reçoit le numéro de passe soit du lecteur ou du Raspberry Pi via USB, et le donne à l'ACS. L'ACS ne sait même pas d'où vient le numéro de passe.

Wiegand


Il s'agit d'un protocole standard pour les systèmes de contrôle d'accès, il est pris en charge par la plupart des lecteurs. Le protocole est très simple: deux lignes de données, une ligne de zéros et une ligne d'unités. Dès que vous connectez la ligne zéro à la terre, le lecteur comprend que le zéro est transmis, de même avec les unités. Autrement dit, le protocole n'a pas de temporisations standardisées, et le numéro de saut est facile à lire à travers une interruption sur l'Arduino, il est facile de le représenter comme une séquence de données. Et comme l'enregistrement nécessite une certaine synchronisation, je me suis concentré sur ces valeurs:



Il existe déjà une bibliothèque prête à l'emploi pour Arduino. Elle peut lire différents formats Wiegand, mais ses capacités sont limitées à cela. Et je devais encore transmettre. Par conséquent, j'ai écrit ma bibliothèque, qui ne fonctionne qu'avec le format Wiegand-26. 26 est le nombre de bits: 3 octets du numéro de saut et 2 bits de parité. De plus, dans toute la documentation et les articles, il est écrit que, très probablement, votre contrôleur moderne ignorera les bits de parité, donc je suis paresseux et ne les compte pas, mais envoie toujours zéro. ACS le perçoit normalement.

Nous avons eu un autre problème: si quelqu'un est apparu devant la caméra, puis, sans attendre l'opération, a appliqué un laissez-passer, une situation de course s'est produite: en même temps, le numéro de passe provenait du lecteur et de la reconnaissance. ACS n'a pas pu faire face à cela et n'a pas laissé entrer les gens. Par conséquent, j'ai dû ajouter un tampon en anneau avec 4 codes à la bibliothèque. Peu importe d'où viennent les codes, ils sont placés dans le tampon, puis avec un timeout de 0,5 s sont transmis à l'ACS. Depuis lors, les collègues ont cessé de se plaindre qu'ils ne sont pas autorisés.

Banc d'essai




Le premier prototype a été assemblé à partir de quelque chose d'horrible. Le Raspberry Pi était accroché dans une boîte sur un rack ridicule, et un appareil photo était collé sur un ruban adhésif double face. Arduino se bloque sur les chapes latérales. En général, tout ce que nous aimons est très bricolage.

Bien sûr, sous cette forme il était impossible de partir, il fallait s'organiser magnifiquement. Nous avons discuté avec plusieurs entrepreneurs, ils nous ont promis de commander des échantillons en Chine, mais tous les délais convenus sont passés et personne ne nous a rien offert.

Les produits personnalisés ont un problème - toutes les solutions sont hautement spécialisées, elles seraient faites spécialement pour nous. Premièrement, nous devenons dépendants du fournisseur. Deuxièmement, il s'avère une conception de circuit unique avec une petite circulation, ce qui signifie que le coût d'une pièce sera élevé. Troisièmement, le temps de production est suffisamment long et si une copie échoue, nous ne pourrons pas acheter rapidement un remplaçant dans le magasin, nous devrons attendre la prochaine impression et si nous le faisons immédiatement, les copies restantes seront dépoussiérées dans l'entrepôt.

Après que tous les partenaires potentiels nous aient laissé tomber, je suis allé voir un collègue de Vision et lui ai dit: "Volodya, laissez-moi imprimer un étui sur votre imprimante 3D pour le rendre beau." Il soupira et dit: «Allez. Que faire? "

Camera V 1




Dans Fusion, j'ai dessiné un tel monstre de Frankenstein. Dans le coin était censé être un Raspberry Pi avec une entrée pour un câble Ethernet. Entrée latérale pour le pouvoir. Le «deuxième étage» était une caméra. Le résultat était une grande structure, et je l'ai même imprimée avec une fine couche afin de ne pas dépenser beaucoup de plastique. Cela avait l'air terrible, et le suspendre était encore plus embarrassant.



De plus, un collègue m'a envoyé une telle référence, disent-ils, nous aimerions cela. J'ai répondu que je ne pouvais pas faire cela, mais j'ai décidé de concevoir un autre bâtiment.



Le nouveau boîtier avait un diamètre de 11 cm, plus petit que le CD. Le placement du remplissage est également à deux couches. Après avoir imprimé la première version, j'ai réalisé que cela n'avait aucun sens de mettre la caméra USB entièrement dans son boîtier d'origine. Je l'ai démonté soigneusement et il s'est avéré qu'il avait 4 trous d'atterrissage sur le panneau avant. J'ai combiné ce panneau avec une caméra dans un assemblage commun avec un tweeter et une LED.



Tout d'abord, nous avons essayé de générer un grincement sur le Raspberry Pi via gpio. Cela s'est avéré extrêmement mauvais. Par conséquent, nous avons décidé de prendre cette fonction séparément du Raspberry Pi en connectant un petit arduino (en fait Iskra mini), auquel le squeaker et la LED ont été soudés, via TTL directement au bloc.

Voici à quoi cela ressemblait au combat:


Nous avons accroché l'appareil au sol. Sous cette forme, elle a vécu assez longtemps. Grinçant, magnifiquement brillant, ouvrant la porte, cependant, pas à chaque fois. Des collègues se sont toutefois plaints que la LED était trop lumineuse. J'ai dû l'affaiblir 4 fois.

Camera V 2


Ensuite, ils ont fait cette option:



Il a été inspiré par la conception du moyeu Xiaomi, avec un anneau lumineux autour du périmètre. C'est très beau. Le logo Vision est composé de pièces individuelles imprimées dans des plastiques de différentes couleurs. Voici le modèle:





Cette fois, j'ai placé le grinceur sur le mur arrière, monté la LED dans un anneau transparent autour du périmètre, imprimé à partir d'un PLA transparent. Le décor s'est presque immédiatement effondré à l'intérieur, car il était à l'origine simplement inséré par friction, et j'ai dû le mettre sur de la colle.

Problèmes de caméra


Nous avons eu l'idée de reproduire cette décision dans tout le bâtiment. Mais il y a un problème: presque tous les étages ont deux portes, et chacune devrait avoir deux caméras, seulement 96 caméras pour une seule de nos tours, et maintenant la deuxième est en cours de développement actif. Il est possible d'imprimer autant de cas, mais cela semble déjà compliqué. De plus, nous avons plusieurs composants dans l'appareil, ce qui signifie de nombreux points de défaillance. Si nous adaptons la solution à l'ensemble du bâtiment, nous maintiendrons constamment ces caméras. Encore une fois, la complexité du remplacement rapide, car chaque caméra est un appareil monobloc. Et vous devez soit en imprimer un grand nombre, avec une marge, soit, si quelque chose s'est produit, puis exécuter immédiatement, imprimer et collecter un nouveau. Nous avons réalisé que les solutions de bricolage sont cool, mais vous avez besoin de quelque chose de plus pratique dans la réplication. Et l'idée est venue de tout transférer sur l'iPad.

IPad


L'iPad présente plusieurs avantages. Le premier est l'écran. Les collègues se sont plaints du manque de rétroaction, ils conviennent et ne comprennent pas si la reconnaissance a commencé ou non, attendez-les ou n'attendez pas.

Deuxièmement, iOS a une fonction de reconnaissance faciale intégrée. La fonction effectuée par OpenCV a été transmise à l'iPad. Un cadre est affiché à l'écran, et la personne doit venir si loin que le visage s'insère dans ce cadre. Après cela, le système commence à le reconnaître automatiquement, vous n'avez pas besoin d'appuyer sur quoi que ce soit.

Troisièmement, l'iPad est un produit de masse. S'il échoue, nous en définissons un autre. Bien que la tablette elle-même coûte environ 20 000 roubles, elle est toujours moins chère que les caméras personnalisées que nos partenaires nous ont proposées. De plus, plus rapide et plus fiable.

Nouvelle architecture




L'iPad a repris la plupart des fonctionnalités. Sur le Raspberry Pi, qui se trouve dans la salle des serveurs, il n'y a en fait qu'un hôte HTTP qui accepte une demande GET avec un ID de passe. Il a immédiatement mandaté le code dans Arduino, et elle a mandaté dans ACS.

Dans la première version, Raspberry Pi était très chargé, car OpenCV y travaillait constamment. Il n'était plus possible d'y connecter un deuxième appareil photo, il n'y aurait pas assez de puissance de calcul. Nous avons déjà pensé à y installer un ordinateur honnête, qui analyserait 4 fils de deux portes. Mais ce n'est pas arrivé à cela. Maintenant, la recherche de visage dans l'image est effectuée indépendamment sur chaque iPad. Dans la croix, il y a deux Arduino, un pour chaque porte. Les deux panneaux fonctionnent avec des laissez-passer d'entrée et de sortie. Pourquoi est-il important de travailler avec des laissez-passer d'entrée et de sortie? Premièrement, lorsque le visage est reconnu et que la porte s'ouvre, le voyant vert du lecteur de carte s'allume et les collègues comprennent que vous pouvez sortir. Deuxièmement, ACS enregistre les entrées et les sorties. En émulant l'entrée et la sortie séparément, nous ne cassons pas le schéma de fonctionnement ACS.

Naturellement, les designers se sont ressaisis qui nous ont dessiné une belle interface. Voici à quoi cela ressemble maintenant sur l'un des étages de notre bureau:



Travailler avec Vision


Malgré le fait que MCS soit un produit professionnel, les amateurs peuvent également l'utiliser. Le service offre à chacun 5 000 transactions gratuites par mois, soit 166 par jour. Par conséquent, vous pouvez appliquer pour vos besoins domestiques, si vous vous adaptez à la limite, bien sûr. Comment cela peut-il se faire?

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 

Prenez une photo et envoyez-la à Vision avec notre jeton d'accès. Nous indiquons que nous travaillons avec le premier espace et définissons create_new - alors le système créera un nouvel identifiant pour chaque personne inconnue. Voici ce que nous obtenons en réponse:

 { "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 } 

J'ai un peu formaté JSON. La réponse contient l'identifiant de la personne, les coordonnées du visage sur la photo et deux paramètres: dans quelle mesure le visage est reconnu et dans quelle mesure cette personne correspond à la norme. Vous pouvez envoyer une requête POST avec une image dans votre langage de programmation, obtenir du JSON et analyser la réponse.

Si vous avez une grande croix et que vous devez déterminer seulement une douzaine de personnes, vous pouvez les définir manuellement. Ensuite, le système distribuera des identifiants pour les personnes familières et indéfinis pour les inconnus. Les personnes peuvent également être supprimées de manière sélective, par exemple, si un employé quitte.

Des idées


Dans quels projets pouvez-vous utiliser la reconnaissance faciale? Si vous souhaitez implémenter un système de bande passante, vous devez vous soucier de l'anti-spoofing. Par exemple, ajouter une caméra infrarouge pour déterminer s'il s'agit d'une photographie ou d'une personne vivante. Ou en mettant deux caméras pour déterminer la profondeur de l'objet, cela peut être fait en utilisant OpenCV.

Vous pouvez organiser la reconnaissance des personnes dans l'entrée. Si ce sont vos voisins, alors tout est en ordre, et si quelqu'un est un étranger, vous pouvez vous envoyer une alerte. Nous avons un tel problème dans notre maison, des étrangers viennent régulièrement et laissent beaucoup de déchets après eux sur le palier.

Si vous fabriquez un «miroir intelligent», vous pouvez alors l'équiper de la reconnaissance des membres de la famille, afin que chacun puisse montrer ce qui l'intéresse. Dis, le miroir me montrera le programme des rendez-vous d'aujourd'hui, et avec ma fille elle me saluera gaiement et proposera de me brosser les dents, et pas vite, comme d'habitude, mais deux minutes.

Une autre idée est la reconnaissance d'une plaque d'immatriculation par un portail automatique dans le pays. Afin de ne pas sortir ou d'appuyer sur le porte-clés, vous pouvez mettre une caméra qui supprimera votre numéro, et le portail s'ouvrira automatiquement.

Source: https://habr.com/ru/post/fr473828/


All Articles