Wie man Objekte mit tiefem Lernen (tatsächlich) leicht erkennt

Ich stieß auf einen beliebten Beitrag in Hackernews mit dem Titel Wie man Objekte mit Deep Learning auf Raspberry Pi einfach erkennt. Der Artikel beschreibt das YOLO-Objekterkennungsmodell, das zur Echtzeit-Objekterkennung und -klassifizierung verwendet werden kann. In dem Artikel wird das Modell auf hoher Ebene erörtert und ein Dienst ausgewählt, der die Objekterkennung über die API durchführt.

Der Artikel bietet einen allgemeinen Überblick über das YOLO-Modell, aber meine Reaktion nach dem Lesen des Artikels lässt sich am besten mit einem Kommentar aus dem Hackernews-Beitrag zusammenfassen:

Wie zeichnet man eine Eule?

Dies ist der Beitrag, den ich über das YOLO-Modell lesen wollte.

Du siehst nur einmal aus (YOLO)

Vor YOLO verwendeten die meisten Objekterkenner Schiebefenster, um Objekte zu erkennen. Das bedeutet im Grunde, dass ein Algorithmus sie mit Fenstern beliebiger Größe abtastet und prüft, ob sich ein Objekt befindet, das von ihm erkannt wird.

Schiebefenster zum Scannen eines Bildes

Das Problem mit dem Schiebefenster besteht darin, dass die Fenstergröße bestimmt werden muss, und um Objekte unterschiedlicher Größe erkennen zu können, müssen wahrscheinlich mehrere Fenstergrößen vorhanden sein. Ganz zu schweigen von der Ineffizienz, den gleichen Bereich mehrmals scannen zu müssen. Aus diesen Gründen machen Schiebefenster die Objekterkennung in Echtzeit unpraktisch und unflexibel.

YOLO verfolgt einen anderen Ansatz. Das YOLO-Modell nimmt das Bild als Eingabe und gibt eine Reihe von Koordinaten für Objekte mit ihren jeweiligen Konfidenzniveaus und Klassenwahrscheinlichkeiten aus.

Die technischen Details der internen Abläufe des Modells sind nicht so wichtig wie das Verständnis der Ausgabe. Aber wenn Sie es wissen müssen, hier ist die Architektur von YOLO v1:

Die Ausgabe des YOLO v3-Modells ist eine faltungsförmige Schicht (19, 19, 425). Die (19, 19) sind die Anzahl der Quadrate, in die das Bild unterteilt ist. Die letzte Einheit (425) ist eine Verkettung der einzelnen Bonding-Box-Parameter, Konfidenzintervalle und Klassenwahrscheinlichkeiten.

Ein Begrenzungsrahmen wird durch 5 Parameter definiert: x, y, Breite, Höhe und Vertrauenswert. Die Anzahl der Klassen (C) ist ein One-Hot-Vektor mit der Anzahl der Klassen, in denen das Netzwerk trainiert wurde (in diesem Fall 80). Die Anzahl der Bounding-Boxen (B) wird zum Zeitpunkt des Trainings festgelegt (in diesem Fall 5 - siehe Bemaßungen der Clustering-Boxen mit Ankern). Die 425-Größe in der Ausgabeebene ist also (B * (5 + C)) oder (5 * (5 + 80)) oder 425. Die Ausgabe kann dann basierend auf Klasse und Zuverlässigkeit analysiert und gefiltert werden. Von dort aus können Sie bestimmen, welches Konfidenzniveau Sie für eine Übereinstimmung halten möchten. Durch Ändern dieses Werts wird geändert, wie viele Objekte erkannt werden. Unten sehen Sie eine Schwelle von 0:

Das YOLO-Modell weist einige interessante Eigenschaften auf, die es sich zu untersuchen lohnt.

Offsets

Anstatt die absoluten Koordinaten des Begrenzungsrahmens vorherzusagen, sagt YOLO Versätze basierend auf dem Gitterquadrat voraus. Es verwendet eine Sigmoid-Funktion, um die x- und y-Offsets zwischen 0 und 1 zu halten, wobei (0, 0) oben links im Quadrat und (1, 1) unten rechts stehen. Ohne diese Einschränkung kann jedes Bounding-Box-Zentrum an einer beliebigen Stelle im Bild landen, unabhängig davon, woher es stammt.

Clustering-Box-Dimensionen mit Ankern

YOLO bietet einige Anfangswerte (Anker) an, um das Erlernen der richtigen Abmessungen für jede Box zu erleichtern. Wie oben erwähnt, gibt es für jede Ausgabe 5 Begrenzungsrahmen. Die Ausgaben für die Höhe und Breite dieser Werte werden mit den jeweiligen Ankern multipliziert, um die endgültigen Boxabmessungen zu bestimmen. Hier sind die Anker:

Array ([[0.57273, 0.677385],
       [1.87446, 2.06253],
       [3.33843, 5.47434],
       [7.88282, 3.52778],
       [9.77052, 9.16828]])

Um die zu verwendenden Ankerwerte zu bestimmen, verwendete das Team k-means-Clustering, um die relativen Objektdimensionen zu berechnen. Sie entschieden sich für die Verwendung von 5 Clustern als Kompromiss zwischen Leistung und Komplexität.

Multi-Scale-Training

Wie bei den meisten Erkennungsmethoden verwendet YOLO vorgefertigte Schichten von ImageNet. Die Verwendung von vorgefertigten Faltungsebenen spart viel Zeit, da ein Modell einfache Kanten und Grundfunktionen abgleichen kann, ohne von vorne zu beginnen. Die meisten vorab trainierten Netzwerke werden jedoch auf Bilder mit Abmessungen von weniger als 256 x 256 trainiert, während YOLO eine Eingabe von 448 x 448 verwendet, obwohl dies flexibel ist. Um sich an die größeren Bilddimensionen anzupassen, wird das vorab trainierte Basisnetzwerk für 10 Epochen auf die größere Bildgröße abgestimmt und trainiert.

Da das YOLO-Modell nur Faltungsschichten verwendet, kann sich die Eingabe ändern. Während des Trainings änderte das Team alle 10 Chargen die Eingabedimensionen. Da das Modell um den Faktor 32 verkleinert wurde, wurden Bildabmessungen verwendet, die ein Vielfaches von 32 sind, wobei die kleinste Größe 320 x 320 und die größte 608 x 608 beträgt. Dies half beim Aufbau eines robusteren Modells.

Schulung zur Klassifizierung und Erkennung

Während des Trainings mischte das Team sowohl Erkennungs- als auch Klassifizierungsdatensätze. Bei der Rückübertragung wurden je nach Aufgabe unterschiedliche Verlustfunktionen verwendet. Dadurch konnte das Modell aus einem viel größeren Datensatz lernen. Die Datensätze enthalten jedoch Unterschiede in der Bezeichnung von Objekten. Beispielsweise haben Erkennungsdatensätze allgemeine Bezeichnungen wie „Hund“ oder „Boot“. ImageNet hat jedoch spezifischere Klassifikationen wie „Norfolk Terrier“. Das Team verwendete WordNet, eine Sprachdatenbank, die Wörter strukturiert und wie sie sich beziehen. Ein "Norfolk-Terrier" und ein "Yorkshire-Terrier" sind beide Hyponyme von "Terrier", einer Art "Jagdhund", einer Art "Hund", und so weiter.

Durch gemeinsames Training sucht YOLO anhand des COCO-Datensatzes nach Objekten und klassifiziert diese anhand von Daten aus ImageNet.

Laufen YOLO

Die Echtzeit-Objekterkennung erfordert eine GPU, die Erkennung von Objekten in einem einzelnen Bild ist jedoch auf Grund der besprochenen Effizienz auf einer CPU möglich. Die YOLO-Site bietet einen guten Leitfaden:

Git-Klon https://github.com/pjreddie/darknet
cd darknet
machen
wget https://pjreddie.com/media/files/yolov3.weights
./darknet ermitteln cfg / yolov3.cfg yolov3.weights data / dog.jpg

Es gibt auch eine Mini-Version mit einem Gewicht von nur 4,8 MB, die angeblich auf einem Himbeer-Pi laufen kann, aber ich habe es nicht zum Laufen gebracht.

Wenn Sie es an ein System anschließen möchten, das mehr als nur Begrenzungsrahmen zeichnet, müssen Sie einige Arbeiten ausführen. Wenn Sie jedoch verstehen, wie die Ausgabe analysiert wird, ist dies kein Problem. Model Depot bietet eine gute Anleitung zum Laden des Modells und einen Link zu den Gewichten. Möglicherweise schreibe ich einen zukünftigen Beitrag über die Anbindung dieses Modells, um die grundlegende Objektortung durchzuführen.

Abschließende Gedanken

Das Beeindruckendste an YOLO ist die Tatsache, dass es funktioniert. Die Architektur macht für mich Sinn. Es bietet alles, was Sie von einer modernen Bildklassifizierungsarchitektur erwarten: Faltungs-2D-Layer, Leaky Relu, Batch-Normalisierung und Max-Pooling. Tatsächlich handelt es sich bei einem Großteil des Modells um eine fein abgestimmte Version von Darknet-19. YOLO hat jedoch einige kreative Akzente.

Ich war beeindruckt von der Idee, das Bild aufzuteilen und den Versatz und die Größe der Begrenzungsrahmen zu lernen. Auch die Idee von Ankern zum Erlernen der Abmessungen von Begrenzungsrahmen war sehr klug. Die größere Ausgabe tauscht Größe / Komplexität gegen eine Erhöhung der Geschwindigkeit aus.

Aber das wahrscheinlich beeindruckendste ist die Verlustfunktion. Das Modell kann nur mit einer effektiven Verlustfunktion lernen, was Sie wollen. Mit einfachen Bildklassifizierungsmodellen können Sie eine einfache Verlustfunktion wie den kategorialen Kreuzentropieverlust verwenden. Aber bei dieser Art von Modell muss man kreativ sein. Ich würde argumentieren, dass eine effektive Verlustfunktion viel wichtiger ist als die genaue Architektur. Tatsächlich verfügt YOLO über Modelle, die auf weniger Schichten trainiert sind und eine ähnliche Genauigkeit bei geringerer Komplexität und erforderlicher Verarbeitungsleistung bieten.

Jeremy Howard von Fast.ai sprach auch darüber. Die Bestimmung von Verlustfunktionen ist eher eine Kunst als eine Wissenschaft. Es schmerzt mich zu überlegen, wie viel Zeit das YOLO-Team wahrscheinlich für die Ermittlung der richtigen Verlustfunktion aufgewendet hat, um gute Ergebnisse zu erzielen. Außerdem mussten sie beim Training auf den beiden verschiedenen Datensätzen (COCO und ImageNet) abwägen, wie viel Gewicht jeder Verlust haben soll.

Ich konnte mich nicht mit der Verlustfunktion von YOLO v3 befassen, aber hier ist die Verlustfunktion für Version 1:

Besonders beeindruckend fand ich auch die Integration mit WordNet. Ich bin nicht sicher, ob die Technik vom YOLO-Team entwickelt wurde, aber es ist wahrscheinlich, dass sie in Zukunft kopiert wird.

Das YOLO-Modell ist sowohl in der Leistung als auch im Einfallsreichtum sehr beeindruckend. Aber am überraschendsten ist es auch intuitiv.