Wie die Gesichtserkennung Ihnen hilft, Testtelefone zu finden

Hallo Habrowsk-Bürger! EastBanc Technologies hat eine Vielzahl von Projekten im Zusammenhang mit der mobilen Entwicklung. In diesem Zusammenhang wird in allen Phasen ein ganzer Zoo von Geräten zum Testen benötigt. Und charakteristischerweise wird jedes einzelne Gerät ständig von einer Vielzahl von Menschen benötigt, und es ist eine ganze Geschichte, es selbst in einer Abteilung für mobile Entwicklung von mehreren Dutzend Menschen zu finden. Ganz zu schweigen davon, dass es am Ende Tester, Designer und PMs gibt!

Und um das Telefon nicht zu verlieren, sondern um klar zu wissen, wo es ist und mit wem, verwenden wir eine Online-Datenbank, die Mitarbeiter an ihren Gesichtern erkennt. Jetzt werden wir erzählen, wie wir dazu gekommen sind und es umgesetzt haben.

Bild

Historischer Kontext


Wir hatten eine Tafel mit „Karten“ von Geräten mit grundlegenden Informationen und einen Platz für einen Magneten, der einen Mitarbeiter anzeigt. Alle haben bemerkt, dass sie das Gerät nehmen.

Bild

Dieses System hat seine Nachteile - nicht kritisch, aber im Allgemeinen unangenehm:

  • Magnete sind nicht so einfach von einem Ort zum anderen zu bewegen.
  • Um sich ein solches Board anzusehen, müssen Sie auf jeden Fall in ein anderes Büro gehen.
  • Und dennoch benötigt jemand möglicherweise viele Geräte gleichzeitig ... Das bedeutet, dass Sie mehrere Magnete pro Mitarbeiter benötigen.
  • Oh ja, manchmal kündigen sogar Mitarbeiter und es kommen neue hinzu, auf denen auch Magnete hergestellt werden müssen.

Mobile App


In einem Unternehmen, das Geschäftsprozesse automatisiert, ist die Verwendung der oben beschriebenen „analogen“ Lösung nicht sehr gesund. Natürlich haben wir uns entschlossen, die Suche nach dem richtigen Gerät zu automatisieren. Der erste Schritt bestand darin, eine mobile Anwendung zu schreiben, die ihren Standort in Räumen über Wi-Fi-Zugangspunkte bestimmen und melden kann. Auf dem Weg dorthin haben sie dem Gerät die Möglichkeit gegeben, den Server über die Betriebssystemversion zu informieren und auch ein so wichtiges Merkmal wie die Akkuladung aufzuzeigen.

Es scheint, dass das Problem gelöst ist. Sie sehen sich die Liste in der Datenbank an, in der Sie das letzte Mal, als das Gerät Wi-Fi sah, dorthin gingen und ...

Im Betrieb stellte sich heraus, dass nicht alles so einfach ist. Wir haben die Anwendung auf Testgeräten installiert und mehrere Monate damit gearbeitet. Es stellte sich heraus, dass diese Option praktisch, aber auch nicht ideal ist.

Geräte werden entladen, einfach ausgeschaltet, Wi-Fi-Zugangspunkte werden von einem Ort zum anderen neu angeordnet, und die Geolokalisierung allein sagt nur aus, dass sich das Gerät im Büro befindet. Vielen Dank, Kapitän!

Sie können natürlich versuchen, das vorhandene System zu optimieren, aber warum nicht auf der Grundlage der Technologie des 21. Jahrhunderts neu erfinden? Kaum gesagt als getan.

Wie wir es wollten


Wir haben ein Konzept für ein System entwickelt, das Mitarbeiter an ihren Gesichtern erkennt, Geräte anhand spezieller Tags testet, die Bestätigung einer Änderung des Gerätestatus anfordert und dann Änderungen an der Online-Datenbank vornimmt, die jeder Mitarbeiter sehen kann, ohne von seinem Stuhl aufzustehen.

Gesichtserkennung


Die Gesichtserkennung als Ganzes löste das Problem im Jahr 2018. Deshalb haben wir das Rad nicht neu erfunden und versucht, unsere eigenen Modelle zu trainieren, sondern eine vorgefertigte Lösung genutzt. Das FaceRecognition- Modul schien die bequemste Option zu sein Es erfordert kein zusätzliches Training und funktioniert sehr schnell, auch ohne Beschleunigung auf der GPU.

Mit der Funktion face_locations wurden Gesichter auf Mitarbeiterfotos erkannt und mit face_encodings wurden Gesichtsmerkmale eines bestimmten Mitarbeiters daraus extrahiert.

Die empfangenen Daten wurden in der Datenbank gesammelt. Um einen bestimmten Mitarbeiter mithilfe der Funktion face_distance zu ermitteln, wurde der „Unterschied“ zwischen der Codierung des erkannten Mitarbeiters und den Codierungen aus der Datenbank berücksichtigt.

Im Allgemeinen könnte man in dieser Phase noch weiter gehen und einen Klassifikator erstellen, der beispielsweise auf KNN basiert, so dass das System weniger empfindlich auf die Dynamik der Gesichter der Mitarbeiter reagiert. In der Praxis erfordert dies jedoch erheblich mehr Zeit. Die banale Mittelung der Kodierung des Gesichts einer Person zwischen der jetzt in der Datenbank befindlichen und der vom System festgestellten Änderung des Status des Geräts hat sich als ausreichend erwiesen, um zu vermeiden, dass sich in der Praxis Fehler ansammeln.

Gesichtserkennungscode
face_locations = face_recognition.face_locations(rgb_small_frame) face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) face_names = [] for face_encoding in face_encodings: matches = face_recognition.face_distance( known_face_encodings, face_encoding) name = "Unknown" if np.min(matches) <= 0.45: best_match_index = np.argmin(matches) name = known_face_info[str(best_match_index)]['name'] else: best_match_index = None 


Geräteerkennung


Ursprünglich entstand die Idee, QR-Codes für die Geräteerkennung zu verwenden, um gleichzeitig Informationen über das Gerät einzugeben. Für eine stabile Erkennung des QR-Codes musste dieser jedoch sehr nahe an die Kamera gebracht werden, was unpraktisch ist.

Infolgedessen entstand die Idee, Augmented-Reality-Marker zu verwenden. Sie enthalten weniger Informationen, werden aber viel stabiler erkannt. Während der Experimente wurde von der Kamera ein 30-Millimeter-Marker mit kleinen Abweichungen von der Vertikalen (3-5 Grad) in einem Abstand von bis zu zweieinhalb Metern erkannt.

Diese Option sah schon viel besser aus. ARuco wurde aus dem gesamten Satz von Augmented-Reality- Markern ausgewählt , z Alle für die Arbeit mit ihnen erforderlichen Tools sind in der OpenCV-Contrib-Python-Distribution enthalten .

ARuco Token Erkennungscode
 self.video_capture = cv2.VideoCapture(0) ret, frame = self.video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) markers = cv2.aruco.detectMarkers(gray, self.dictionary) 


Infolgedessen wurde jedem Gerät ein numerischer Index zugewiesen, dem diesem Index ein Marker zugeordnet war.

Ist es eine Hutsache?


Es scheint, dass wir gelernt haben, Geräte und Gesichter zu erkennen, die Arbeit ist erledigt. Fanfare, Applaus! Was könnte noch benötigt werden?

Tatsächlich fängt die Arbeit gerade erst an. Jetzt müssen alle Komponenten des Systems stabil und schnell „im Kampf“ funktionieren.

Es ist notwendig, die Kosten für Serverressourcen im Leerlauf zu optimieren, Benutzerfälle zu durchdenken und zu verstehen, wie sie grafisch aussehen sollten.

Schnittstelle


Der vielleicht wichtigste Punkt bei der Entwicklung solcher Systeme ist die Schnittstelle. Jemand mag argumentieren, aber der Benutzer ist das zentrale Element in dieser Situation.

So schnell wie möglich können Sie den Frontend-Teil mit Tkinter implementieren.

Ein paar Anmerkungen zu Tkinter
  • Achten Sie auf die Einrückungen / Größen der Elemente (relativ oder absolut).
  • Denken Sie daran, dass relative und absolute Einheiten zusammen verwendet werden können (ihre Werte werden einfach summiert).
  • Parameter
     .attributes("-fullscreen", True) 
    Ermöglicht das Erstellen einer Einzelfensteranwendung, die auf den Vollbildmodus erweitert wird, um Benutzer nicht mit Elementen der Systemschnittstelle zu verwechseln.

Die Schnittstelle besteht aus Karten mit Informationen über das Gerät und den Benutzer, der dieses Gerät derzeit verwendet. Der größte Teil des Bildschirms wird vom Kartenkatalog belegt - dem Hauptbuchhaltungstool. Oben befindet sich ein Filter, mit dem Sie das Verzeichnis nach Plattform oder Version des Betriebssystems filtern können.

Bild

Hier sind die Schlüsselkomponenten der Schnittstelle:


  • Gerät
    Die Gerätekarten werden auf dem Bildschirm mit der Version des Betriebssystems, dem Namen und der ID des Geräts sowie dem Benutzer angezeigt, auf dem dieses Gerät derzeit registriert ist.
  • Photofixing
    Auf der rechten Seite befindet sich die Steuereinheit, in der das Bild von der Webcam angezeigt wird, sowie Schaltflächen zum Registrieren und Bearbeiten persönlicher Informationen.

    Wir zeigen das Bild an, um dem Benutzer Feedback zu geben - Sie haben definitiv den Bildschirm mit der Gerätebezeichnung getroffen.
  • Auswahl der Betriebssystemversion
    Wir haben eine Liste mit der Wahl der interessierenden Betriebssystemversion erstellt, weil Zum Testen benötigen Sie häufig kein bestimmtes Gerät, sondern eine bestimmte Version von Android oder iOS. Der Versionsfilter ist horizontal angeordnet, um Platz zu sparen und die Liste der Versionen ohne Bildlauf auf einem Bildschirm zugänglich zu machen.

Optimierung


Ein Durchgang einer Komponente des Systems nimmt nicht zu viel Zeit in Anspruch. Wenn Sie jedoch gleichzeitig mit der Erkennung von Markierungen und Gesichtern beginnen, führt der Versuch, alle 30 von der Kamera bereitgestellten Bilder pro Sekunde zu erkennen, zu einer vollständigen Erschöpfung der Computerressourcen ohne GPU.

Es ist klar, dass das System in 99% der Fälle im Leerlauf arbeitet.

Um dies zu vermeiden, wurden folgende Optimierungsentscheidungen getroffen:

  1. Nur jeder achte Frame wird in die Verarbeitung eingespeist.

    Code
     if self.lastseen + self.rec_threshold > time.time() or self.frame_number != 8: ret, frame = self.video_capture.read() self.frame_number += 1 if self.frame_number > 8: self.frame_number = 8 return frame, None, None, None 

    Die Reaktionsverzögerung des Systems steigt auf ungefähr 8/30 Sekunden, während die menschliche Reaktionszeit ungefähr eine Sekunde beträgt. Dementsprechend ist eine solche Verzögerung für den Benutzer immer noch nicht erkennbar. Und wir haben die Belastung des Systems bereits achtmal reduziert.
  2. Zunächst wird die Gerätemarkierung im Frame durchsucht, und erst wenn sie erkannt wird, wird die Gesichtserkennung gestartet. Da die Suche nach Markierungen im Rahmen ungefähr 300-mal günstiger ist als die Suche nach Gesichtern, haben wir beschlossen, im Standby-Modus nur das Vorhandensein einer Markierung zu überprüfen.
  3. Um die „Bremsen“ bei der Suche nach Gesichtern zu verringern, wenn das Bild keine Gesichter enthält, wurde der Parameter number_of_time_to_upsample in der Funktion face_locations deaktiviert.

    face_locations = face_recognition.face_locations (rgb_small_frame, number_of_times_to_upsample = 0)

    Aus diesem Grund war die Verarbeitungszeit des Rahmens, auf dem keine Flächen vorhanden sind, gleich der Verarbeitungszeit des Rahmens, auf der Flächen leicht erkannt werden können.

Was ist das Ergebnis?


Derzeit wurde das System erfolgreich auf dem MacMini Ende 2009 auf zwei Core 2 Duo-Kernen bereitgestellt. Im Rahmen der Tests funktionierte es sogar auf einem virtuellen Kern mit 1024 Megabyte RAM und 4 Gigabyte Nur-Lese-Speicher im Docker-Container recht erfolgreich. MacMini hat einen Touchscreen angeschlossen, um das Erscheinungsbild minimalistisch zu gestalten.

Jetzt sogar diejenigen Benutzer, die das alte Board nicht begeistert benutzt haben und lächeln, wenn sie Geräte auf sich selbst registrieren, und es gab viel weniger Fälle von erfolglosen Suchvorgängen!

Was weiter?


Es gibt zweifellos noch viel mehr Punkte im gegenwärtigen System, die wir verbessern können und möchten:

  • Stellen Sie sicher, dass die Betriebssystemsteuerelemente nicht angezeigt werden, wenn Dialogfelder angezeigt werden (dies ist jetzt ein Meldungsfeld aus dem Tkinter-Paket).
  • Trennen Sie Berechnungen und Serveranforderungen mit der Schnittstellenverarbeitung in verschiedene Threads (jetzt werden sie im Hauptthread mainloop Tkinter ausgeführt, der die Schnittstelle beim Senden von Anforderungen an die Online-Datenbank einfriert).
  • Bringen Sie die Benutzeroberfläche mit anderen Unternehmensressourcen auf das gleiche Design.
  • Erstellen Sie eine vollständige Weboberfläche für die Remote-Anzeige von Daten.
  • Verwenden Sie die Spracherkennung, um Aktionen zu bestätigen / abzubrechen und Textfelder auszufüllen.
  • Implementieren Sie die Registrierung mehrerer Geräte gleichzeitig.

PS Und so funktioniert es
Video aufgenommen in der Beta-Version der GUI

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


All Articles