Technologische Neuigkeiten, Bewertungen und Tipps!

Bildsegmentierung eines rotierenden iPhone mit scikit-image – Auf dem Weg zur KI

Hinweis: Der folgende Artikel hilft Ihnen dabei: Bildsegmentierung eines rotierenden iPhone mit scikit-image – Auf dem Weg zur KI

Ursprünglich veröffentlicht auf Towards AI, dem weltweit führenden Nachrichten- und Medienunternehmen für KI und Technologie. Wenn Sie ein KI-bezogenes Produkt oder eine KI-bezogene Dienstleistung entwickeln, laden wir Sie ein, darüber nachzudenken, KI-Sponsor zu werden. Bei Towards AI helfen wir bei der Skalierung von KI- und Technologie-Startups. Wir helfen Ihnen dabei, Ihre Technologie der breiten Masse zugänglich zu machen.

Bildsegmentierung eines rotierenden iPhone mit Scikit-Bild

Moderne Geräte sind voll von verschiedenen Sensoren: Vorder- und Rückkameras, Beschleunigungsmesser, Gyroskope, Magnetometer, GPS usw. Der intelligente Einsatz dieser Geräte ermöglicht eine Vielzahl interessanter Anwendungen wie Kompass, Standorterkennung und Spiele.

Eine dieser Anwendungen besteht darin, die Ausrichtung eines iPhones im Raum zu ermitteln, was mit Daten vom Beschleunigungsmesser und Gyroskop erreicht werden kann. Im vorherigen Blogbeitrag habe ich über die Erkennung der iPhone-Ausrichtung um eine Achse mit Daten von zwei iPhone-Sensoren geschrieben: Gyroskop und Beschleunigungsmesser. Die Rekonstruktion der iPhone-Ausrichtung wurde mit dem Video verglichen. Die Ergebnisse der mit Sensoren rekonstruierten Orientierung stimmten qualitativ gut mit der im Video dargestellten Orientierung überein:

In diesem Blogbeitrag stelle ich die Möglichkeit vor, den Neigungswinkel des iPhones mithilfe der Bildsegmentierung aus dem Video zu extrahieren. Dann zeige ich den Vergleich eines Fehlers zwischen zwei Messmethoden. Lassen Sie sich von mir begleiten.

Videovorbereitung

Bevor mit der Segmentierung begonnen wird, müssen einige Dinge vorbereitet werden. Mein Video wurde mit einem iPhone aufgenommen und hatte eine variable Bildrate. Um Videouhren mit Sensoruhren zu synchronisieren, ist eine konstante Bildrate vorzuziehen. Der erste Schritt wäre also, das Video auf eine konstante Bildrate zu übertragen. Der nächste Schritt wäre, das Video in Bilder aufzuteilen, wobei jedes Bild einem JPEG-Bild entspricht. Den gesamten Bilddatensatz finden Sie hier.

Deep-Learning-Ansatz mit Mask-R-CNN

Wenn wir über die Segmentierung eines Bildes sprechen, ist die Versuchung groß, einen coolen Deep-Learning-Algorithmus auszuprobieren und zu hoffen, dass er funktioniert. Dieser Versuchung folgend, habe ich vorab trainiertes Mask-RCNN ausprobiert. Glücklicherweise gehört ein Mobiltelefon zu den Klassen, in denen das ursprüngliche Modell trainiert wurde. Das erste Ergebnis war durchaus beeindruckend, wie im Bild unten zu sehen ist:

Bei näherer Betrachtung scheint es jedoch, dass einige Bilder des iPhones falsch identifiziert wurden (siehe Bild unten):

Wie bei vielen realen Data-Science-Projekten sind die Ergebnisse des Deep-Learning-Modells überraschend gut, erfüllen aber nicht ganz die Erwartungen. Zumindest nicht für den gesamten Datensatz. Eine Möglichkeit, diese Herausforderung zu meistern, wäre die Kennzeichnung der Daten und die Feinabstimmung des ursprünglichen Modells. Angesichts der Tatsache, dass es sich um ein rotes iPhone auf einem fast weißen Hintergrund handelt, dürfte es jedoch einige einfachere Möglichkeiten geben. Werfen wir einen Blick auf sie.

Klassischer CV-Ansatz mit RGB-Bild

Um ein Bild zu segmentieren, versuchen wir zunächst, eine 3-Kanal-RGB-Darstellung eines Bildes zu verwenden, das aus Rot, Grün und Blau besteht. Rot würde der ersten Zahl entsprechen, die sehr hoch ist, während die zweite und dritte Zahl voraussichtlich niedrig sind, etwa wie (255,0,0). In diesem Fall können wir einfach alle roten Pixel auswählen und hoffen, dass es das iPhone sein wird. Um mehr Rotschatten einzufangen, habe ich versucht, alle Pixel zu filtern, deren Farbwert für den ersten Kanal (Rot) größer als 130 ist. Für den zweiten und dritten Kanal filtere ich die Pixel, die kleiner als 60 sind. Hier ist der Code.

Ein solcher Ansatz führt zu einigermaßen guten Ergebnissen:

Es gibt auch ein Kamera-„Loch“ im iPhone, das schwarz ist und daher nicht segmentiert wurde. Wir können diese Lücke mit Scikit-Image-Tools schließen:

Man muss den Bereich der zu füllenden Löcher und der herauszufilternden kleinen Objekte festlegen. Als Fläche wähle ich 40000. Jetzt umfasst die Segmentierung auch die Kameras des iPhones:

Daher funktioniert die Segmentierung basierend auf der roten Farbe in der RGB-Darstellung gut für ein Bild. Nachdem ich diesen schwellenwertbasierten Algorithmus jedoch durch alle Bilder laufen ließ, stellte ich fest, dass es einige Ungenauigkeiten bei der Segmentierung gab:

Diese Ungenauigkeiten könnten durch die Manipulation der Schwellenwerte für die Farben Rot, Grün und Blau behoben werden. Wenn wir jedoch die Parameter lockern, fängt die Maske an, braune Farbe einzufangen:

Es ist immer noch möglich, mit den Schwellenwerten in RGB herumzuspielen. Es müssen jedoch mindestens drei Parameter angepasst werden (Schwellenwerte in Rot, Grün und Blau). Viel einfacher wäre es, es auf nur einen einstellbaren Parameter zu reduzieren. Zu diesem Zweck können wir das iPhone-Bild in einer anderen Farbdarstellung betrachten.

Klassischer CV-Ansatz mit HED-Image

In der scikit-image-Bibliothek stehen mehrere Transformationen vom RGB in verschiedene Farbdarstellungen zur Verfügung. Eine der Herausforderungen, die ich bei der Arbeit mit den Bildern rotierender iPhones erlebe, ist die Trennung von Dunkelrot und Braun. Diese Farbtrennung wird im Farbraum Hämatoxylin-Eosin-DAB (HED) gut berücksichtigt, wo Hämatoxylin ein tiefes Blauviolett hat, Eosin rosa und DAB braun ist. Das rote iPhone wird mit dem Eosin-Kanal einer solchen Farbdarstellung recht gut erkannt, wodurch das Problem der Verwechslung mit Braun behoben wird, da Braun als DAB dargestellt wird. In der HED-Darstellung müssen wir nur einen Schwellenwert im Eosin-Kanal einstellen. Die Maske für die Bilder, die für RGB eine Herausforderung darstellen, wird basierend auf dem Eosin-Kanal und dem Schwellenwert von 0,05 korrekt erfasst.

Scikit-image bietet außerdem Tools zum Messen der Eigenschaften der segmentierten Region. Unter anderem ist es möglich, die Ausrichtung des iPhones zu messen:

Der vollständige Segmentierungsalgorithmus würde zu Folgendem führen:

Ein qualitativer Vergleich würde zu Folgendem führen:

Quantitativer Vergleich

Jetzt ist es möglich, den aus der Segmentierung abgeleiteten Neigungswinkel mit dem aus Sensordaten abgeleiteten zu vergleichen. Es ergibt eine gute Übereinstimmung:

Der absolute Fehler zwischen Sensoren und interpolierten Videowerten beträgt:

Wir können sehen, dass eine schnellere Rotation zu höheren Fehlern zwischen den beiden Methoden führt. Das sieht man auch an der Darstellung des gleitenden Mittelwerts der Drehzahl der vorangegangenen 0,5 Sekunden gegenüber dem Fehler:

PS: Ich möchte meiner Frau Katya und Vladyslav Rosov für die Hilfe bei der Erstellung des Beitrags danken.


Die Bildsegmentierung eines rotierenden iPhones mit scikit-image wurde ursprünglich in Towards AI auf Medium veröffentlicht, wo die Leute das Gespräch fortsetzen, indem sie diese Geschichte hervorheben und darauf reagieren.

Veröffentlicht über Towards AI