
Heute werde ich Ihnen erzählen, wie wir im Büro ein Zugangskontrollsystem basierend auf dem
Vision- Gesichtserkennungsdienst hergestellt haben. Zunächst ein kleiner Hintergrund. Wie bei jedem E-Mail-Dienst haben wir ein Anti-Spam-System erstellt. Solche Systeme werden jetzt auf der Grundlage von maschinellem Lernen hergestellt. Wir haben ein starkes Team, das dafür verantwortlich ist. Und wo maschinelles Lernen stattfindet, gibt es Computer Vision. Daher entstand der Vision-Service ganz natürlich und natürlich.
Parallel dazu haben wir vor einigen Jahren die Cloud eingeführt, einen zuverlässigen Dateispeicher mit Geoverteilung an Rechenzentren, der sowohl von Einzelpersonen als auch von Unternehmen verwendet werden kann. Im Laufe der Zeit haben wir eine "Cloud for Business" erhalten, in der nicht nur Dateien gespeichert werden, sondern auch virtuelle Maschinen bestellt werden können. Allmählich wurde daraus MCS - Mail.ru Cloud Solutions, bei denen Vision organisch in einen der Services passt.
Wolke
Unsere neuronalen Netze können nicht nur Gesichter erkennen, sondern auch verschiedene
Objekte, Objekte und Szenen , einschließlich
Sehenswürdigkeiten . Jetzt können sie ungefähr 10.000 Kategorien erkennen, und Bildverarbeitung funktioniert manchmal besser als Menschen.

Dies ist meine Tochter in 2012, in 2015 und 2018. Wenn ich sie nicht persönlich kannte, verstand ich wahrscheinlich nicht sofort, dass dies ein und dieselbe Person ist. Und das neuronale Netzwerk konnte übereinstimmen und verstehen.

Hier wandte sich das Mädchen ab und blinzelte, und der Junge im Allgemeinen in einer Mütze mit einem Schatten auf der Hälfte seines Gesichts. Gleichzeitig erkannte das neuronale Netzwerk sie trotz dieser schwierigen Bedingungen genau. Natürlich konnte die Technologie, die sich innerhalb des Unternehmens entwickelt, nicht anders, als Unterstützung bei internen Diensten zu finden.
Unser Intranet
Unser Intranet heißt sys. Dies ist eine Art soziales Netzwerk (wir haben nur wenige davon). Darin laden Mitarbeiter Fotos von verschiedenen Veranstaltungen hoch.

Wenn mehrere hundert Fotos von der Veranstaltung ausgelegt sind, ist es ziemlich schwierig, sich dort zu finden. Daher haben wir mit diesen Alben eine Bildverarbeitung verbunden, die direkt im Intranet an einem einzigen Ort die Fotos zeigt, auf denen ich abgebildet bin. Hier hat mich das System auf einer der Sommer-Firmenfeiern gesehen.

Das neuronale Netzwerk hat mich sogar in der Dämmerung im Profil erkannt, und auf dem Foto sind viel mehr Personen zu sehen.
Konferenzregale
Später machten wir Konferenzregale. Ich habe Software für das iPad geschrieben, die im Rack installiert ist, aber im Allgemeinen bin ich ein iOS-Entwickler und habe nichts mit Computer Vision zu tun. Ich helfe nur auf freundliche Weise.

Was ist die Essenz dieses Racks? Während der gesamten Veranstaltung - einem Meeting, einer Konferenz, einer Firmenfeier oder zumindest einem Geburtstag - werden Sie von einem Fotografen fotografiert. Von Zeit zu Zeit werden akkumulierte Bilder in die Cloud verschoben. Sie können jederzeit zum Schalter gehen, ein Bild aufnehmen und auf die Schaltfläche „Find Me“ klicken. Das Rack zeigt entweder sofort alle Fotos an, auf denen Sie aufgenommen wurden, oder sagt, dass bisher nichts gefunden wurde, wenn das System die Bilder noch nicht indiziert hat, und fordert Sie auf, eine E-Mail einzugeben. Und nach der Veranstaltung erhalten Sie per E-Mail einen Link zu dem Ordner in der Cloud mit allen Fotos, auf denen Sie sich befinden. Dies ist eine der Anwendungen des Vision-Dienstes.
Zugangssystem
Natürlich wollte ich solche Gesichtserkennungsfunktionen nutzen, um nicht nur nach meiner Physiognomie in Unternehmensbildern zu suchen, sondern auch nach etwas Praktischerem. Zum Beispiel für ein automatisches Durchsatzsystem. Das Anbringen eines Passes an jedem Eingang Ihrer Etage ist nicht sehr praktisch: Sie vergessen oft den Pass, und für Mädchen in leichter Kleidung im Sommer gibt es keinen Platz, um den Pass zu reparieren.
Deshalb haben wir uns entschlossen zu experimentieren. Wir haben alle Voraussetzungen dafür: Wir müssen niemanden um Erlaubnis bitten, eine sehr reaktionsschnelle Verwaltungsabteilung, die seufzend sagt: „Okay. Bringen Sie Ihre Kameras an. Nur nicht an der Tür. Türen beziehen sich auf den Brandschutz. “ Wir sind: „Na dann. Wir werden an der Seite befestigen. " Wir haben auch geduldige Kollegen, die unter uns gelitten haben.
Architektur
Auf den ersten Blick scheint die Architektur des Zugangssystems sehr einfach zu sein: Die Kamera nimmt Bilder auf, sendet sie an Vision und Vision öffnet die Tür. Aber als wir anfingen, mit Kollegen zu malen, wie das eigentlich geht, bekamen wir ein solches Schema:

Den Block rechts nennen wir die „Kamera“ - dies ist das Modul, das an der Tür hängt. Es besteht aus drei Teilen. Der Raspberry Pi empfängt Videos von einer USB-Kamera, codiert mit FFmpeg und sendet. Wir haben mehrere IP-Kameras einer angemessenen Preisklasse getestet, und jeder hatte eine merkliche Verzögerung von etwa 0,5 s. Und da es in anderen Phasen zu Verzögerungen kommt, wenn eine Person auftaucht, in die Kamera schaut und für einige Sekunden nichts passiert, möchte sie bereits einen Pass machen. Daher haben wir Verzögerungen nach Möglichkeit reduziert, und der Raspberry Pi mit einer USB-Kamera erwies sich als schneller als viele kommerzielle IP-Kameras. Mit der Himbeere ist auch ein kleiner Arduino mit einer mehrfarbigen LED und einem Quietscher verbunden. Die Standard-LED leuchtet rot. Wenn eine Person auftaucht und erkannt wird, leuchtet das Grün auf.
Der Raspberry Pi überträgt also den Videostream, der über kabelgebundenes Ethernet in den Server gelangt. Wir haben auf jeder Etage einen Serverraum, in dem sich Schalter, Verbindungskabel zu den Schreibtischen der Mitarbeiter befinden, und ein Vollzeit-Zugangskontrollsystem - ein Zugangskontroll- und -verwaltungssystem.
Wir haben einen weiteren Raspberry Pi in den Serverraum gestellt, der den Videostream in Echtzeit empfängt und über OpenCV ausführt. Warum brauchen wir OpenCV? Wir müssen feststellen, ob das Bild ein Gesicht enthält. Ein neuronales Netzwerk, das eine Person auf einem Foto definiert, funktioniert etwas länger und es ist zu teuer, ihm ständig einen Videostream zuzuführen. Daher bestimmen wir über OpenCV das Vorhandensein eines Gesichts. Wenn es angezeigt wird, senden wir es an Vision. Der Service antwortet entweder, dass er diesen Mitarbeiter nicht gefunden hat, oder sendet die Mitarbeiterkennung in der HR-Datenbank. Mit dieser Mitarbeiter-ID rufen wir das Intranet auf, das dem ACS zugeordnet ist, und es gibt uns die Pass-ID zurück. Weiter werfen wir diese Pass-ID in Arduino, die sie an das ACS weitergibt. Für ein Zugangskontrollsystem entspricht dies einer Person, die einen Pass beantragt. Das heißt, wir ändern das ACS in keiner Weise, es protokolliert weiterhin den Ein- und Ausstieg von Mitarbeitern.
Wie haben wir unser System in ACS integriert? In unserem Büro werden Bolid C2000-2-Geräte verwendet.

Dies ist ein inländisches Zugangskontrollsystem. Höchstwahrscheinlich können Sie über die 485. Schnittstelle eine Verbindung zu diesen Geräten herstellen, aber wir haben eine Verbindung über das Wiegand-Protokoll hergestellt.

Wir haben den Arduino, der als Proxy fungiert, mit dem Passleser verbunden, der in der Nähe der Tür installiert ist.

Das Foto zeigt den Stromanschluss und zwei Datenleitungen vom Passleser. Das Pad wird für eine bequemere Verbindung verwendet.
Arduino empfängt die Passnummer entweder vom Lesegerät oder vom Raspberry Pi über USB und gibt sie an das ACS weiter. Das ACS weiß nicht einmal, woher die Passnummer stammt.
Wiegand
Dies ist ein Standardprotokoll für Zugangskontrollsysteme, das von den meisten Lesern unterstützt wird. Das Protokoll ist sehr einfach: zwei Datenleitungen, eine Zeile mit Nullen und eine Zeile mit Einheiten. Sobald Sie die Nulllinie mit Masse verbinden, versteht der Leser, dass Null übertragen wird, genau wie bei Einheiten. Das heißt, das Protokoll hat keine standardisierten Zeitabläufe, und die Sprungnummer ist leicht durch einen Interrupt auf dem Arduino zu lesen, es ist einfach, sie als Datensequenz darzustellen. Und da die Aufnahme eine Art Timing erfordert, habe ich mich auf folgende Werte konzentriert:

Es gibt bereits eine fertige Bibliothek für Arduino. Sie kann verschiedene Wiegand-Formate lesen, aber ihre Fähigkeiten sind darauf beschränkt. Und ich musste noch senden. Deshalb habe ich meine Bibliothek geschrieben, die nur mit dem Wiegand-26-Format funktioniert. 26 ist die Anzahl der Bits: 3 Bytes der Sprungnummer und 2 Paritätsbits. Darüber hinaus steht in allen Dokumentationen und Artikeln, dass Ihr moderner Controller höchstwahrscheinlich die Paritätsbits ignoriert, sodass ich faul bin und sie nicht zähle, sondern immer Null sende. ACS nimmt dies normal wahr.
Wir hatten ein anderes Problem: Wenn jemand zuerst vor der Kamera erschien und dann, ohne auf die Operation zu warten, einen Pass anwandte, entstand eine Rennsituation: Gleichzeitig kam die Passnummer vom Leser und von der Erkennung. ACS konnte damit nicht umgehen und ließ keine Leute herein. Daher musste ich der Bibliothek einen Ringpuffer mit 4 Codes hinzufügen. Unabhängig davon, woher die Codes kommen, werden sie in den Puffer gestellt und dann mit einer Zeitüberschreitung von 0,5 s an das ACS übertragen. Seitdem haben sich Kollegen nicht mehr darüber beschwert, dass sie nicht erlaubt sind.
Prüfstand

Der erste Prototyp wurde aus etwas Schrecklichem zusammengebaut. Raspberry Pi hing in einer Schachtel an einem lächerlichen Gestell, und eine Kamera wurde auf ein doppelseitiges Klebeband geklebt. Arduino hängt an den Seitenestrich. Im Allgemeinen ist alles, was wir lieben, sehr DIY.
Natürlich war es in dieser Form unmöglich zu gehen, es war notwendig, schön zu arrangieren. Wir haben mit mehreren Auftragnehmern gesprochen, sie haben uns versprochen, Muster in China zu bestellen, aber dann sind alle vereinbarten Fristen abgelaufen, und niemand hat uns etwas angeboten.
Kundenspezifische Produkte haben ein Problem: Alle Lösungen sind hochspezialisiert und werden speziell für uns hergestellt. Erstens werden wir vom Lieferanten abhängig. Zweitens ergibt sich ein einzigartiges Schaltungsdesign mit einer geringen Auflage, was bedeutet, dass die Kosten für ein Stück hoch sind. Drittens ist die Produktionszeit lang genug. Wenn eine Kopie fehlschlägt, können wir keinen Ersatz schnell im Geschäft kaufen. Wir müssen auf die nächste Auflage warten. Wenn wir dies sofort tun, werden die verbleibenden Kopien im Lager abgestaubt.
Nachdem uns alle potenziellen Partner im Stich gelassen hatten, ging ich zu einem Kollegen von Vision und sagte: „Volodya, lassen Sie mich einen Fall auf Ihrem 3D-Drucker drucken, damit er schön aussieht.“ Er seufzte und sagte: „Komm schon. Was zu tun ist?"
Kamera V 1

In Fusion habe ich so ein Frankenstein-Monster gezeichnet. In der Ecke sollte sich ein Raspberry Pi mit einem Eingang für ein Ethernet-Kabel befinden. Seiteneingang für Strom. Der "zweite Stock" war eine Kamera. Das Ergebnis war eine große Struktur, und ich habe sie sogar mit einer dünnen Schicht bedruckt, um nicht viel Plastik auszugeben. Es sah schrecklich aus und das Aufhängen war noch peinlicher.

Außerdem hat mir ein Kollege eine solche Referenz geschickt, sagen sie, das würde uns gefallen. Ich antwortete, dass ich dies nicht tun könne, beschloss aber, ein anderes Gebäude zu entwerfen.

Das neue Gehäuse hatte einen Durchmesser von 11 cm und war kleiner als die CD. Die Platzierung der Füllung erfolgt ebenfalls zweischichtig. Nachdem ich die erste Version gedruckt hatte, wurde mir klar, dass es keinen Sinn macht, die USB-Kamera vollständig in ihre native Hülle zu stecken. Ich habe es vorsichtig zerlegt und es stellte sich heraus, dass es 4 Landelöcher auf der Frontplatte hat. Ich habe dieses Panel mit einer Kamera zu einer gemeinsamen Baugruppe mit Hochtöner und LED kombiniert.

Zuerst haben wir versucht, über gpio ein Quietschen auf dem Raspberry Pi zu erzeugen. Es stellte sich als äußerst schlecht heraus. Aus diesem Grund haben wir uns entschlossen, diese Funktion getrennt vom Raspberry Pi zu übernehmen, indem wir ein kleines Arduino (eigentlich Iskra mini), an das der Quietscher und die LED gelötet wurden, über TTL direkt an den Block angeschlossen haben.
So sah es im Kampf aus:
Wir haben das Gerät auf den Boden gehängt. In dieser Form lebte es lange genug. Quietschend, wunderschön leuchtend, die Tür öffnend jedoch nicht jedes Mal. Die Kollegen beschwerten sich jedoch, dass die LED zu hell sei. Ich musste es 4 mal schwächen.
Kamera V 2
Dann machten sie diese Option:

Es wurde vom Design des Xiaomi-Hubs mit einem leuchtenden Ring um den Umfang inspiriert. Es sieht sehr schön aus. Das Vision-Logo besteht aus einzelnen Teilen, die aus verschiedenfarbigen Kunststoffen gedruckt sind. Hier ist das Modell:


Diesmal habe ich den Quietscher an die Rückwand gestellt, die LED in einem transparenten Ring um den Umfang montiert und aus einem transparenten PLA gedruckt. Das Dekor brach innen fast sofort zusammen, weil es ursprünglich einfach durch Reibung eingesetzt wurde und ich es auf Kleber auftragen musste.
Kameraprobleme
Wir hatten die Idee, diese Entscheidung im gesamten Gebäude zu wiederholen. Aber es gibt ein Problem: Fast alle Stockwerke haben zwei Türen, und jede sollte zwei Kameras haben, nur 96 Kameras für nur einen unserer Türme, und jetzt wird die zweite aktiv entwickelt. Es ist möglich, so viele Fälle zu drucken, aber es scheint bereits kompliziert zu sein. Darüber hinaus haben wir einige Komponenten im Gerät, was viele Fehlerquellen bedeutet. Wenn wir die Lösung auf das gesamte Gebäude skalieren, werden wir diese Kameras ständig warten. Wieder die Komplexität des schnellen Austauschs, da jede Kamera ein Einzelgerät ist. Und Sie müssen entweder viele davon mit einem Rand drucken oder, falls etwas passiert ist, sofort einen neuen ausführen, drucken und sammeln. Wir haben festgestellt, dass DIY-Lösungen cool sind, aber Sie benötigen etwas Bequemeres für die Replikation. Und die Idee kam, alles auf das iPad zu übertragen.
IPad
IPad hat mehrere Vorteile. Der erste ist der Bildschirm. Die Kollegen haben sich über das fehlende Feedback beschwert, sie sind geeignet und verstehen nicht, ob die Anerkennung begonnen hat oder nicht, um auf sie zu warten oder nicht.
Zweitens verfügt iOS über eine integrierte Gesichtserkennungsfunktion. Die von OpenCV ausgeführte Funktion wurde an das iPad übergeben. Auf dem Bildschirm wird ein Rahmen angezeigt, und die Person sollte so weit kommen, dass das Gesicht in diesen Rahmen passt. Danach erkennt das System es automatisch, Sie müssen nichts mehr drücken.
Drittens ist das iPad ein Massenprodukt. Wenn es fehlschlägt, setzen wir einen anderen. Obwohl das Tablet selbst etwa 20.000 Rubel kostet, ist es immer noch billiger als die von Partnern angebotenen kundenspezifischen Kameras. Darüber hinaus schneller und zuverlässiger.
Neue Architektur

Das iPad übernahm die meisten Funktionen. Auf dem Raspberry Pi, der sich im Serverraum befindet, gibt es tatsächlich nur einen HTTP-Host, der eine GET-Anforderung mit einer Pass-ID akzeptiert. Er gibt den Code sofort in Arduino und sie in ACS.
In der ersten Version war Raspberry Pi sehr geladen, da OpenCV ständig daran arbeitete. Es war nicht mehr möglich, eine zweite Kamera daran anzuschließen, da nicht genügend Rechenleistung vorhanden war. Wir haben bereits darüber nachgedacht, dort einen ehrlichen Computer zu installieren, der 4 Threads von zwei Türen aus analysiert. Aber dazu kam es nicht. Jetzt wird die Gesichtssuche im Bild unabhängig auf jedem iPad durchgeführt. Im Kreuz gibt es zwei Arduino, einen für jede Tür. Beide Boards arbeiten mit Ein- und Ausstiegspässen. Warum ist es wichtig, mit Ein- und Ausreisekarten zu arbeiten? Erstens, wenn das Gesicht erkannt wird und sich die Tür öffnet, leuchtet das grüne Licht am Kartenleser auf und die Kollegen verstehen, dass Sie ausgehen können. Zweitens protokolliert ACS Ein- und Ausgänge. Wenn wir die Ein- und Ausgabe getrennt emulieren, wird das ACS-Operationsschema nicht unterbrochen.
Natürlich haben sich Designer zusammengerissen, die uns eine schöne Oberfläche gezeichnet haben. So sieht es jetzt auf einer der Etagen unseres Büros aus:

Arbeiten Sie mit Vision
Trotz der Tatsache, dass MCS ein Geschäftsprodukt ist, können Amateure es auch verwenden. Der Service bietet jedem 5.000 kostenlose Transaktionen pro Monat, das sind 166 pro Tag. Daher können Sie sich für Ihre häuslichen Bedürfnisse bewerben, wenn Sie natürlich in das Limit passen. Wie kann das gemacht werden?
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
Machen Sie ein Foto und senden Sie es zusammen mit unserem Zugriffstoken an Vision. Wir geben an, dass wir mit dem ersten Leerzeichen arbeiten und setzen
create_new
- dann erstellt das System für jede unbekannte Person eine neue Kennung. Folgendes erhalten wir als Antwort:
{ "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 }
Ich habe JSON ein bisschen formatiert. Die Antwort enthält die Kennung der Person, die Koordinaten des Gesichts auf dem Foto und zwei Parameter: Wie gut das Gesicht erkannt wird und inwieweit diese Person dem Standard entspricht. Sie können eine POST-Anfrage mit einem Bild in Ihrer Programmiersprache senden, JSON abrufen und die Antwort analysieren.
Wenn Sie ein großes Kreuz haben und nur ein Dutzend Personen bestimmen müssen, können Sie diese manuell festlegen. Dann gibt das System Kennungen für vertraute Personen und undefinierte für unbekannte Personen aus. Personen können auch selektiv entfernt werden, beispielsweise wenn ein Mitarbeiter gekündigt hat.
Ideen
In welchen Projekten können Sie die Gesichtserkennung verwenden? Wenn Sie ein Bandbreitensystem implementieren möchten, müssen Sie sich um Anti-Spoofing kümmern. Fügen Sie beispielsweise eine Infrarotkamera hinzu, um festzustellen, ob es sich um ein Foto oder eine lebende Person handelt. Oder setzen Sie zwei Kameras ein, um die Tiefe des Objekts zu bestimmen. Dies kann mit OpenCV erfolgen.
Sie können die Erkennung von Personen im Eingang organisieren. Wenn dies Ihre Nachbarn sind, ist alles in Ordnung, und wenn jemand ein Außenseiter ist, können Sie sich selbst eine Warnung senden. Wir haben so ein Problem in unserem Haus, dass Fremde regelmäßig kommen und viel Müll auf der Landung hinter sich lassen.
Wenn Sie einen „intelligenten Spiegel“ herstellen, können Sie ihn mit der Anerkennung von Familienmitgliedern ausstatten, damit jeder zeigen kann, was für ihn interessant ist. Sagen wir, der Spiegel zeigt mir den Zeitplan für die heutigen Treffen, und mit meiner Tochter wird sie mich fröhlich begrüßen und mir anbieten, meine Zähne zu putzen, und zwar nicht schnell, wie üblich, sondern zwei Minuten.
Eine andere Idee ist die Erkennung eines Nummernschilds durch ein automatisches Tor im Land. Um nicht auszugehen oder den Schlüsselanhänger zu drücken, können Sie eine Kamera aufstellen, die Ihre Nummer entfernt, und das Tor öffnet sich automatisch.