{"id":473,"date":"2018-06-24T15:28:46","date_gmt":"2018-06-24T15:28:46","guid":{"rendered":"https:\/\/www.wpvs.de\/iot-2018\/?p=473"},"modified":"2021-05-14T10:07:04","modified_gmt":"2021-05-14T08:07:04","slug":"smartlock-7-ai-mit-dem-pi","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2018\/projekt-smart-lock\/smartlock-7-ai-mit-dem-pi\/","title":{"rendered":"SmartLock (7): AI mit dem PI"},"content":{"rendered":"<p>Heute werde ich euch den Aufbau unsere AI Komponenten n\u00e4herbringen und auf ihre Kommunikation untereinander eingehen. Daf\u00fcr m\u00f6chte ich zu Beginn die drei Hauptmodule, die wir nutzen, erl\u00e4utern: Opencv3, Zbar und Face Recognition.<\/p>\n<p>\u201eOpencv3\u201c ist eine Library zur Bild Analyse in C++. Ihre St\u00e4rke liegt dabei im real-time Computer Vision Bereich. In unserem Projekt nutzen wir diese Library zur Modulation der Farben des von der PiCamera aufgenommenen Bildes und zur Bewegungserkennung.<\/p>\n<p>Auf die Bewegungserkennung als solches m\u00f6chte ich an dieser Stelle eingehen. So l\u00e4uft diese wie folgt ab: Es werden die drei zuletzt aufgenommenen Bilder miteinander verglichen. Zu Beginn werden die Bilder in Schwarzwei\u00df umgewandelt (die Farbinformationen w\u00fcrden nur st\u00f6ren und den Vergleich der Bilder erschweren) und in \u201eNumpy Arrays\u201c konvertiert.\u00a0 Im Anschluss daran wird jeweils zwischen Bild 1 und 2, sowie zwischen 2 und 3 die absolute Differenz gebildet (von den Subtraktionsergebnissen wird der Betrag genommen), um die Ver\u00e4nderungen zwischen den Aufnahmen festzustellen. Abschlie\u00dfend wird nun eine bitweise Addition durchgef\u00fchrt, um den Durchschnitt der Ver\u00e4nderung zu bestimmen, dies sorgt f\u00fcr eine robustere Erkennung; \u201eFehlalarme\u201c werden minimiert. Nachdem der Vergleich abgeschlossen ist, werden in dem verkn\u00fcpften \u201eNumpy Array\u201c die Zahlen, die nicht null sind, gez\u00e4hlt. Dieser Wert stellt nun die Ver\u00e4nderung dar. Ist dieser gr\u00f6\u00dfer als ein von uns gesetzter Threshold wird eine Nachricht abgesetzt.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-474\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/1.png\" alt=\"\" width=\"508\" height=\"136\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/1.png 508w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/1-300x80.png 300w\" sizes=\"(max-width: 508px) 100vw, 508px\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-large wp-image-475\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/2.png\" alt=\"\" width=\"750\" height=\"210\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/2.png 973w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/2-300x84.png 300w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/2-768x215.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 1: Code Movement Detection<\/p>\n<p>\u201eZbar\u201c ist eine Library, die es erm\u00f6glicht QR-Codes und Strich-Codes auszulesen. Der Einsatz ist dabei extrem einfach. Es bedarf lediglich einer Zeile Code, um die Funktionalit\u00e4t zu nutzen. \u201eZbar\u201c \u00fcbernimmt dabei nicht nur das Auslesen des Codes sondern auch die Erkennung jenes auf einem Bild.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-476\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/3.png\" alt=\"\" width=\"657\" height=\"51\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/3.png 657w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/3-300x23.png 300w\" sizes=\"(max-width: 657px) 100vw, 657px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 2: Code QR Detection<\/p>\n<p>In der decQR Variable wird nun im Falle der Erkennung eines QR- bzw. Strich-Codes die Daten des selbigen in einer Objektstruktur gespeichert.<\/p>\n<p>Als letztes m\u00f6chte ich noch auf die Gesichtserkunngslibrary eingehen. Wir haben uns ausdr\u00fccklich gegen Haar Cascade entschieden, da diese zwar \u00fcber eine guter Performance verf\u00fcgt, aber eine schlechtere Erkennungsrate, verglichen mit der von uns genutzen auf dlib basierenden \u201eFace Recognition\u201c Library besitzt.\u00a0 So weist der von uns genutzte Algorithmus eine Trefferquote von 99.38% bei dem \u201eLabeled Face in the Wild\u201c Benchmark.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-477\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/4.png\" alt=\"\" width=\"960\" height=\"119\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/4.png 960w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/4-300x37.png 300w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/4-768x95.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 3: Code Facial Detection<\/p>\n<p>Der Code ist dabei denkbar einfach. So beziehen wir in Zeile 35 ein Bild aus einer Pipe, welches wir in Zeile 36 in Graustufen umwandeln. Dank dieser Transformation sind in der Regel h\u00f6here Erkennungsraten m\u00f6glich. Zus\u00e4tzlich fallen die Farbinformationen weg, was die Performance verbessert.\u00a0 Im letzten Schritt wird nun die Library genutzt, um Gesichter zu identifizieren. Diese gibt ein Objekt zur\u00fcck, welches die Koordinaten der einzelnen Gesichter enth\u00e4lt.<\/p>\n<p>Insgesamt zeigt sich, dass es durch die Librarys sehr einfach ist, die M\u00f6glichkeiten von \u201eArtificial Inteligence\u201c zu nutzen. Die Komplexit\u00e4t in unserem Projekt entsteht dabei durch das Zusammenspiel bzw. die Parallelisierung dieser drei Komponenten und der Pipes sowie Queue, die den Datenaustausch regeln. Auf dieses Konstrukt m\u00f6chte ich im Folgenden n\u00e4her eingehen. Dabei ist es wichtig, zuerst die zentralen Unterschiede zwischen Pipes und Queue zu betrachten (Es wird sich hier auf die Implementierung im Multiprocessing Module von Python bezogen, andere Umsetzungen k\u00f6nnen stark davon abweichen). Zwar eignen sich beide zum Transfer von Daten, allerdings sind Pipes ca. 1.5 bis 2-mal schneller als Queues. Mit Pipes ist es lediglich m\u00f6glich zwei Prozesse zu verbinden, auf Queues k\u00f6nnen beliebig viele zugreifen. Auch ist es m\u00f6glich bei Queues einen Buffer einzustellen, also wie viele einzelne Datenteile (Objekt, primitiver Datentyp) sich in der Queue befinden d\u00fcrfen, bei Pipes ist es ausschlie\u00dflich ein Element.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-478\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/5.png\" alt=\"\" width=\"788\" height=\"639\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/5.png 788w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/5-300x243.png 300w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/5-768x623.png 768w\" sizes=\"(max-width: 788px) 100vw, 788px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 4: Aufbau der Thread-Kommunikation<\/p>\n<p>Es wurde bei der Darstellung darauf verzichtet, die Pipes bzw. Queue zu vermerken, die nur dazu dienen einzelne Threads zu beenden (in dem Returns getriggert werden). Nun m\u00f6chte ich auf die einzelnen Elemente eingehen. \u201eGlobalCom\u201c ist wie der Name bereits vermuten l\u00e4sst, der zentrale Kommunikationshub. \u00dcber diese Queue tauschen alle Threads Informationen aus. Beispielsweise, wenn eine Bewegung erkannt wurde, meldet Movement Detektion \u201emovement\u201c. Daraufhin startet Central die Face Detection, diese wiederum meldet bei der Registrierung eines Gesichtes \u201eFace Detected\u201c. Die Pic Queue ist daf\u00fcr zust\u00e4ndig, die erkannten Gesichter und QR-Codes zur\u00fcck an Central zu schicken, wo diese dann \u00fcber Intercom (mittels Unix Pipes) an das Node-Backend weitergeleitet werden. Der Pictureprovider hat die Aufgabe alle drei Detektoren mit Bildern zu versorgen. Dies geschieht im Falle von QR und Facial mittels Pipes f\u00fcr schnellere Zugriffszeiten (Auch kann mittels Pipes einfacher gew\u00e4hrleistet werden, dass sich kein Bild mehr in der Verbindung zwischen den Threads befinden und ggf. zu einem \u00d6ffnen der T\u00fcr f\u00fchren w\u00fcrde, ohne dass jemand davorsteht bzw. nicht dazu berechtigt ist) und bei der Movement Detection mittels einer Queue zur Pufferung.<br \/>\nDas erstellte Gesamtkonstrukt sieht wie folgt aus:<\/p>\n<p>Ich hoffe, ich konnte euch einen kleinen \u00dcberblick \u00fcber unsere AI Landschaft und ihren Betrieb vermitteln. Falls es Fragen geben sollte, stehe ich gerne zur Verf\u00fcgung.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Heute werde ich euch den Aufbau unsere AI Komponenten n\u00e4herbringen und auf ihre Kommunikation untereinander eingehen. Daf\u00fcr m\u00f6chte ich zu Beginn die drei Hauptmodule, die wir nutzen, erl\u00e4utern: Opencv3, Zbar und Face Recognition. \u201eOpencv3\u201c ist eine Library zur Bild Analyse<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/473"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/comments?post=473"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/473\/revisions"}],"predecessor-version":[{"id":653,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/473\/revisions\/653"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/media?parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/categories?post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/tags?post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}