
Das Taxi sollte bequem und sicher sein. Dies hängt nicht nur von der Qualität des Fahrzeugs und des Service ab, sondern auch von der Konzentration der Aufmerksamkeit des Fahrers, die bei Überlastung abfällt. Daher begrenzen wir auf Serviceebene die Zeit, die der Fahrer hinter dem Lenkrad verbringt.
Aber manchmal sind die Fahrer schon müde in der Leitung - zum Beispiel war eine Person den ganzen Tag mit einem anderen Job beschäftigt und entschied sich abends, zu „lenken“. Was tun? Wie kann man verstehen, dass der Fahrer eingreift, ohne den Schlaf zu ändern? Sie können beispielsweise versuchen, zu beurteilen, wie genau er die Straße überwacht, und Anzeichen von Müdigkeit erkennen, z. B. anhand der Art des Blinkens. Klingt das einfach? Alles ist komplizierter als es scheint.
Heute werden wir den Lesern von Habr zunächst erzählen, wie wir auf eine Kamera gekommen sind, die dies kann.
Es ist also gegeben: Die Häufigkeit und Dauer von Blinzeln hängt vom Ermüdungsgrad ab. Wenn wir müde sind, ist der Kopf weniger beweglich, die Blickrichtung ändert sich seltener, wir blinken häufiger und lassen unsere Augen für längere Zeit geschlossen - der Unterschied kann in Bruchteilen einer Sekunde oder mehreren Rotationsgraden gemessen werden, existiert aber. Unsere Aufgabe war es, ein Gerät zu entwickeln, mit dem wir Blinzeln sowie die Blickrichtung, das Gähnen und die Kopfbewegungen analysieren können, um den Grad der Aufmerksamkeit und Müdigkeit des Fahrers zu beurteilen.
Zuerst haben wir uns entschieden: Lassen Sie uns eine Laptop-Anwendung erstellen, sie den Freiwilligen unter den Mitarbeitern zur Verfügung stellen und die eingebaute Kamera verwenden, um die von uns benötigten Zeichen zu verfolgen. So werden wir sofort eine große Menge an Informationen zur Analyse sammeln und unsere Hypothesen schnell testen.
Spoiler: nichts ist passiert! Ziemlich schnell wurde klar, dass die meisten Leute, die an einem Computer arbeiten, ständig auf die Tastatur schauen und den Kopf neigen. Das heißt, die Augen sind nicht sichtbar und es ist nicht einmal klar, ob sie geschlossen oder geöffnet sind, eine Person blinkt oder schaut einfach vom Bildschirm zur Tastatur und umgekehrt.

Dann wurde uns klar, dass wir selbst für die Herstellung eines Prototyps eine Art Gerät benötigen. Wir haben das erste verfügbare IP-Kameramodell gekauft, das im Infrarotbereich funktioniert.
Warum brauchen wir Infrarot? Die Beleuchtung kann unterschiedlich sein, manchmal befindet sich der Benutzer im Schatten, manchmal kommt das Licht von hinten, von oben oder es gibt überhaupt keine. Wenn wir ein Messgerät herstellen, sollte es unter allen Umständen gleich funktionieren.
Für das Experiment kam eine ziemlich beliebte Kamera von Xiaomi - CHUANGMI.

Es stellte sich heraus, dass sie mit einer Frequenz von 15 Bildern pro Sekunde schießt, und wir brauchen doppelt so viel: Das Blinken dauert 30 bis 150 ms, bei 15 Bildern pro Sekunde riskierten wir, dass das Blinken kürzer als 60 bis 70 ms ist. Daher mussten wir die Firmware ändern, um die IR-Beleuchtung zwangsweise einzuschalten, direkten Zugriff auf den Videostream zu erhalten und die erforderlichen 30 Bilder pro Sekunde aufzunehmen. Nachdem wir die Kamera an den Laptop angeschlossen und für den Empfang des Videostreams über das RTSP-Protokoll konfiguriert hatten, begannen wir mit der Aufnahme der ersten Videos. Die Kamera wurde 15 cm unter der Kamera des Laptops platziert, wodurch die Augen des Benutzers besser „gesehen“ werden konnten.
Erfolg? Und wieder nein. Nachdem wir mehrere hundert Videos gesammelt hatten, stellten wir fest, dass nichts passierte. Das Verhalten des Laptop-Benutzers während des Tages unterscheidet sich vom Verhalten des Fahrers: Eine Person kann jederzeit aufstehen, einen Bissen nehmen, einfach gehen und sich aufwärmen, während der Fahrer viel mehr Zeit in sitzender Position verbringt. Daher passen solche Daten nicht zu uns.
Es wurde klar, dass der einzige Weg darin besteht, eine geeignete Kamera herzustellen oder zu kaufen und sie im Auto zu installieren.
Es scheint, dass alles elementar ist: Wir kaufen einen DVR, wenden uns dem Fahrer zu, befestigen uns im Auto und holen einmal pro Woche SD-Karten mit Videoaufnahmen ab. Aber hier stellte sich in Wirklichkeit heraus, dass alles nicht so einfach war.
Erstens ist es äußerst schwierig, einen DVR mit IR-Beleuchtung zu finden, und wir müssen das Gesicht besonders nachts gut sehen.
Zweitens verfügen alle DVRs über ein Weitwinkelobjektiv, sodass der Bereich mit dem Gesicht des Fahrers recht klein ist und Sie auf der Aufzeichnung nichts erkennen können. Ja, und Verzerrungen durch das Objektiv beeinträchtigen die Analyse der Position des Kopfes und der Blickrichtung.
Drittens lässt sich dieses Unternehmen auf zehn, einhundert oder mehr Maschinen nicht gut skalieren. Wir müssen viele Daten von verschiedenen Fahrern sammeln, um sie zu analysieren und Schlussfolgerungen zu ziehen. Das manuelle Wechseln der Speicherkarten auf hundert Maschinen pro Woche oder jeden Tag ist eine enorme Zeitverschwendung. Wir haben sogar versucht, eine Kamera zu finden, mit der Videos in die Cloud hochgeladen werden können, aber es gab nichts Vergleichbares auf dem Markt.
Es gab sogar die Idee, "Ihren eigenen DVR" aus dem Raspberry Pi zu machen, einer Kamera mit IR-Beleuchtung und Halterungen.

Das Ergebnis war nicht ganz das, was wir erwartet hatten: umständlich, es ist unmöglich, die Kamera getrennt vom Computer zu installieren. Tatsache ist, dass bei einer Kabellänge von mehr als 50 cm Probleme mit dem Signal auftreten und das CSI-Kabel selbst sehr zerbrechlich, zu breit und daher für die Installation in einer Maschine nicht sehr geeignet ist.
Wir müssen nach Hongkong, beschlossen wir. Der Zweck der Reise war ziemlich abstrakt: zu sehen, was verschiedene Hersteller im Bereich der Analyse des Fahrerverhaltens tun, Produktmuster zu kaufen, wenn wir sie finden, und nach geeigneten technischen Lösungen / Komponenten zu suchen, die wir in Autos einbauen könnten.
Wir gingen sofort zu zwei beliebten Ausstellungen von Elektronik und Komponenten. Im Pavillon für Automobilelektronik sahen wir eine beispiellose Dominanz von Videorecordern, Rückfahrkameras und
ADAS- Systemen, aber fast niemand war mit der Analyse des Fahrerverhaltens beschäftigt. Die Prototypen mehrerer Hersteller stellten fest, dass sie einschliefen, ablenkten, rauchten und telefonierten, aber niemand dachte an Müdigkeit.
Infolgedessen haben wir mehrere Muster von Kameras und Einplatinencomputern gekauft. Es wurde klar, dass 1) es keine geeigneten fertigen Produkte für uns gibt; 2) Der Computer und die Kamera müssen getrennt werden, um die Sicht des Fahrers nicht zu beeinträchtigen. Aus diesem Grund haben wir eine Kamerakarte mit USB-Schnittstelle und als Recheneinheit einen Banana Pi-Computer mit einer Karte sowie mehrere Android-Player mit Amlogic-Prozessoren verwendet.

"Warum sind die Spieler?" - Du fragst. Tatsächlich sind der
S912 und sogar der S905 in Bezug auf die Leistung ziemlich leistungsstark und können Videoaufnahmen für unsere Zwecke problemlos abrufen, selbst wenn die Bildanalyse direkt vor Ort erfolgt. Eine Bildanalyse vor Ort war erforderlich, um nicht den gesamten Videostream an den Server zu senden.
Zählen wir: Eine Minute gut komprimiertes Video in einer H.264-Auflösung von 640 × 480 (30 FPS) benötigt mindestens 5 Megabyte. In einer Stunde sind es also 300 Megabyte und für eine 8-Stunden-Standardschicht etwa 2-3 Gigabyte.
Das tägliche Hochladen von 3 Gigabyte Video mit Hilfe eines LTE-Modems ist sehr „teuer“. Aus diesem Grund haben wir uns entschlossen, regelmäßig 5-minütige Videos aufzunehmen und alles, was im Auto passiert, genau dort zu analysieren und in Form eines analysierten Ereignisstroms auf unsere Server hochzuladen: eine Reihe von Gesichtspunkten, eine Blickrichtung, eine Kopfdrehung usw.
Wir kehrten gut gelaunt von den Ausstellungen zurück, brachten eine Menge notwendigen (und unnötigen) Müll mit und erkannten, wie wir den Prototyp weiter herstellen würden.
Die USB-Kamera, die wir in Hongkong gefunden haben, war fast perfekt für uns: Größe 38 × 38 mm, Standardobjektive (12 mm), die Möglichkeit, IR-Strahler direkt auf die Platine zu löten.

Deshalb haben wir den Hersteller sofort gebeten, uns einen Prototyp mit den notwendigen Komponenten zu machen. Jetzt haben wir verstanden: Wir brauchen eine USB-Kamera mit Hintergrundbeleuchtung und einen Einplatinen-PC für die Videoverarbeitung. Wir beschlossen, alles auszuprobieren, was auf dem Markt präsentiert wurde, und arrangierten eine Einkaufssitzung bei AliExpress. Wir haben vier Dutzend verschiedene Kameras, ein Dutzend Single-Board-PCs, Android-Player, eine Sammlung von 12-mm-Objektiven und viele andere seltsame Geräte gekauft.

Das Problem mit der Hardware wurde behoben. Und was ist mit Software?
Sehr schnell konnten wir einen einfachen Prototyp auf
OpenCV- Basis
erstellen , der ein Video schreibt, das Gesicht des Fahrers findet, es analysiert, 68 wichtige Punkte im Gesicht markiert, Blinken, Gähnen, Drehen des Kopfes usw. erkennt.
Die nächste Aufgabe bestand darin, unseren Prototyp auf einem Einplatinen-PC zum Laufen zu bringen. Raspberry PI fiel sofort ab: Wenige Kerne, ein schwacher Prozessor, mehr als sieben Frames pro Sekunde können nicht herausgezogen werden. Und wie man gleichzeitig ein Video schreibt, ein Gesicht erkennt und analysiert, stand außer Frage. Aus den gleichen Gründen passten Set-Top-Boxen und Single-Board-Computer auf Allwinner (H2, H3, H5), Amlogic S905 und Rockchip RK3328 nicht zu uns, obwohl letztere der gewünschten Leistung sehr nahe kamen. Daher haben wir noch zwei potenzielle SoCs: Amlogic S912 und Rockchip RK3399.
Bei Amlogic war die Auswahl an Geräten gering: eine TV-Box oder Khadas VIM2. Bei der TV-Box und Khadas funktionierte alles gleich, aber die Kühlung der Set-Top-Boxen ließ zu wünschen übrig, und die Konfiguration von Linux auf ihnen ist oft nichts für schwache Nerven: Wi-Fi, BT zum Laufen bringen, das Betriebssystem den gesamten Speicher sehen lassen, - Es ist lang, schwierig und unvorhersehbar. Aus diesem Grund haben wir uns für Khadas VIM2 entschieden: Es verfügt über einen Standardkühler und die Platine ist kompakt genug, um sie hinter dem Armaturenbrett der Maschine zu verstecken.

Zu diesem Zeitpunkt hatte uns der Hersteller der Kamerakarte bereits eine Testcharge von einhundert Stück geschickt, und wir waren gespannt auf den Kampf: einen Prototyp herstellen, ihn in ein Auto stecken und Daten sammeln.
Wir hatten eine Kamera, es gab Software, es gab einen Einplatinen-PC, aber es gab nicht die geringste Idee, wie man all dies in das Auto steckt und es an das Bordnetzteil anschließt.
Offensichtlich brauchte die Kamera einen Körper und eine Halterung. Wir haben zwei 3D-Drucker gleichzeitig gekauft, um Teile zu drucken, und der Auftragnehmer hat uns zum ersten primitiven Modell des Gehäuses gemacht.

Jetzt hat sich die schwierige Aufgabe der Wahl ergeben: Wo muss die Kamera im Auto montiert werden, um ein gutes Bild zu erhalten, ohne die Sicht des Fahrers zu beeinträchtigen? Es gab genau drei Möglichkeiten:
- Mitten auf der Windschutzscheibe.
- Am linken Gestell.
- Auf dem Rückspiegel.

In diesem Moment schien es uns am besten, die Kamera direkt am Rückspiegel anzubringen: Sie ist immer auf das Gesicht des Fahrers gerichtet, damit die Kamera genau das aufnimmt, was wir brauchen. Leider haben die Hersteller von Rückspiegeln nicht sichergestellt, dass etwas bequem und zuverlässig an ihnen befestigt werden kann. Die Kameras hielten nicht gut, fielen und schlossen die Bewertung ab.

Trotzdem haben wir mehrere Maschinen ausgerüstet und begonnen, Daten von ihnen zu sammeln. Es wurde deutlich, dass das Design nicht perfekt war und die Probleme in Bezug auf Leistung und Erwärmung zunahmen, während gleichzeitig das Gesicht aufgezeichnet und analysiert wurde.
Dann haben wir beschlossen, die Kamera auf Augenhöhe am linken Rack zu montieren: Wir schließen den Test weniger und haben einen guten Winkel für die Kamera, damit der Fahrer gesehen werden kann. Das Gehäuse musste erneuert werden, da sich Befestigungselemente mit Scharnieren als äußerst unzuverlässig erwiesen: Sie brechen beim Schütteln auseinander, brechen und die Saugnäpfe lösen sich vom Glas.

Wir haben beschlossen, dass es für den Prototyp und die Datenerfassung besser ist, die Kameras fest am Glas zu befestigen, damit keine Erschütterungen und äußeren Einflüsse ihre Position ändern können. Wir haben das Gehäuse leicht modifiziert und gleichzeitig einen Belastungstest der Installation mit einem speziellen doppelseitigen Klebeband durchgeführt. Zum Testen wurden komplexe und hochpräzise Geräte verwendet.

Aufgrund von Leistungsproblemen haben wir uns entschlossen, den SoC durch einen leistungsstärkeren zu ersetzen. Deshalb haben wir uns für den NanoPI M4-Einplatinen-PC auf dem Rockchip RK3399-Prozessor entschieden.
Im Vergleich zu Khadas VIM2 ist es etwa ein Drittel produktiver, verfügt über Hardwarekomprimierung und Videodecodierung und verhält sich unter schwierigen Temperaturbedingungen viel stabiler. Ja, wir haben versucht, Kameras und Leiterplatten im Gefrierschrank zu betreiben, sie im Ofen zu erhitzen und viele andere unmenschliche Tests durchzuführen.

Da wir Videos nicht nur so aufnehmen, sondern den ganzen Tag über dynamisch, war es wichtig, dass die Systemzeit auf dem Gerät genau war. Leider sind die meisten Einplatinencomputer nicht mit einer Uhr mit eigener Stromversorgung ausgestattet. Wir hatten Glück, dass unser NanoPI einen Batterieanschluss hatte.
Ich musste einen Koffer für einen Computer entwerfen, der ihn physisch schützt und als Halter für WLAN- und BT-Antennen fungiert. Dort haben wir auch einen Platz für die Montage der Uhrenbatterie mit einem Halter bereitgestellt.


Außerdem wollten wir einhundert Maschinen mit Prototypen ausstatten, die Videos aufzeichnen und die gesamte Telemetrie online in die Cloud übertragen: Gibt es einen Fahrer, der so oft und lange blinkt, gähnt, von der Straße abgelenkt wird, den Kopf dreht usw. All dies ( und nicht nur) die Parameter ermöglichen es uns, ein Modell zu trainieren, das bewertet, wie konzentriert der Fahrer auf der Straße ist, ob er abgelenkt oder müde ist. Um dies alles direkt auf dem Gerät im Auto zu tun, mussten wir den Code komplett neu schreiben, Hardware-Videokomprimierung durchführen, Protokolle und Videoaufzeichnungen drehen, ihn regelmäßig an den Server senden, Software aus der Ferne aktualisieren und vieles mehr.
Gleichzeitig wurde uns klar, dass unsere Berechnungen und Algorithmen mit einer genaueren grundlegenden Gesichtsanalyse viel besser funktionieren würden. In den ersten Prototypen verwendeten wir den in OpenCV integrierten Gesichtsdetektor basierend auf dem
Haarkaskadenmodell und das Modell zum Markieren von 68 Gesichtspunkten basierend auf der
dlib- Bibliothek. Wir haben die Position des Kopfes selbst
berechnet, indem wir
die Projektion der Gesichtspunkte auf die Fokusebene
berechnet haben . Open-Source-Lösungen zum Erkennen und Markieren von Gesichtern funktionieren gut bei Bildern, bei denen das Gesicht vor oder im Profil aufgenommen wird, aber unter Zwischenbedingungen sind sie häufig falsch.
Aus diesem Grund haben wir uns entschlossen, eine gute Gesichtserkennungs- und Markierungslösung von Drittanbietern zu lizenzieren - das VisionLabs SDK. Im Vergleich zu früheren Algorithmen ist es ressourcenintensiver, erhöht jedoch die Qualität der Gesichtserkennung und -markierung spürbar, was zu einer genaueren Extraktion von Faktoren für das maschinelle Lernen führt. Mithilfe von Kollegen von VisionLabs konnten wir schnell zu ihrem SDK wechseln und die Leistung erzielen, die wir brauchten: 30 Bilder / Sek. bei einer Auflösung von 640x480.
Das VisionLabs SDK verwendet neuronale Netze zur Gesichtserkennung. Die Technologie verarbeitet jeden Frame, findet das Gesicht des Fahrers darauf und gibt die Koordinaten von Augen, Nase, Mund und anderen wichtigen Punkten aus. Die erhaltenen Daten werden verwendet, um einen normalisierten Rahmen mit einer Größe von 250 x 250 zu erstellen, bei dem sich das Gesicht streng in der Mitte befindet. Dieser Rahmen kann bereits verwendet werden, um die Kopfposition in Grad entlang drei Achsen zu berechnen: Gieren, Neigen und Rollen. Um den Status der Augen des Fahrers zu verfolgen, analysiert das System das Bild der Augen und entscheidet für jedes Auge, ob es geschlossen oder offen ist. Das System kann mithilfe der IR Liveness-Technologie feststellen, ob sich eine lebende Person vor der Kamera befindet oder der Fahrer ein Foto angehängt hat. Für die Analyse wird ein normalisierter Frame verwendet, und am Ausgang erhalten wir das Ergebnis lebendig oder notaliv.
Fazit
Während wir Software umschrieben und debuggten, druckten unsere 3D-Drucker Tag und Nacht Hüllen für Kameras und Single-Board-PCs. Das Drucken des Kits (Kameragehäuse + PC-Gehäuse) dauerte ca. 3-4 Stunden, sodass wir die Produktionskapazitäten erweitern mussten: Wir verwendeten vier Drucker. Aber wir haben es geschafft, alles im Zeitplan zu erledigen.

In zwei Wochen haben wir die ersten hundert Autos in mehreren Taxiflotten - Yandex.Taxi-Partner - vollständig ausgestattet. Jetzt sammeln wir mit ihrer Hilfe Videos, analysieren das Fahrerverhalten, Anzeichen von Müdigkeit, verbessern Algorithmen und trainieren Modelle, die den Grad der Aufmerksamkeit und Müdigkeit bewerten. Und erst danach (unter Berücksichtigung aller Daten, Rückmeldungen von Fahrern und Passagieren) sind wir bereit, mit der nächsten Stufe fortzufahren - der Massenproduktion und -implementierung.
Leider ist die derzeitige technische Lösung aus mehreren Gründen für die Skalierung auf mehrere tausend oder zehntausend Installationen nicht sehr geeignet. Alles, worüber wir in diesem Artikel gesprochen haben, ist ein kurzes Experiment, dessen Zweck es war, schnell zu lernen, wie man Daten direkt von den Maschinen sammelt, um Modelle zu trainieren. Der nächste große Schritt für uns ist die Entwicklung und Produktion eines Geräts mit den gleichen Abmessungen, das jedoch aus einer Einheit besteht: Kamera, Sensoren und Modem werden in einem kompakten Gehäuse untergebracht, das wir massiv in Maschinen installieren werden.