Real-Time Object Detection – YOLO
Einleitung
YOLO ist ein modernes Computer-Vision-Modell, das 2015 von Joseph Redmon, Santosh Divvala, Ross Girshick und Ali Farhadi mit dem Papier „You Only Look Once: Unified, Real-Time Object Detection“ veröffentlicht wurde. Das Open-Source-Modell wurde sowohl von den ursprünglichen Autoren als auch von der Community kontinuierlich verbessert, so dass das Modell heute sogar Videos in Echtzeit auf einem NVIDIA Jetson auswerten kann. Wenn nur gelegentlich ein Bild analysiert werden soll, kann das Modell sogar auf einem Raspberry Pi eingesetzt werden. Die Kombination aus hoher Genauigkeit, Geschwindigkeit und Benutzerfreundlichkeit führt zu unzähligen Anwendungsmöglichkeiten.
Da es online diverse Quellen gibt (z.B. viso.ai, medium, oder die angegebenen Papers), welche den Aufbau aller Versionen des Modells in beliebigem Schwierigkeitsgrad erklären, verzichte ich in diesem Blog darauf und gehe stattdessen näher auf die Anwendungsmöglichkeiten des Modells ein und teile meine persönlichen Erfahrungen.
Yolov8
Yolov8 ist die neuste etablierte Yolo Version und wurde von Ultralytics implementiert Das Modell kann sehr einfach durch Nutzung ihrer Python Library verwendet werden. Dadurch wird die Nutzung der vortrainierten Modelle zu einem Kinderspiel. Wenn Python und das Ultralytics-Paket bereits installiert sind, reichen die folgenden Zeilen aus, um ein Bild zu analysieren:
#Import Library from ultralytics import YOLO # Load model and start inference model = YOLO('yolov8n.pt') results = model('path/to/image.jpg')
Yolo wird in erster Linie zur Objekterkennung verwendet, kann aber auch zur Segmentierung, Bildklassifizierung oder Pose-Estimation eingesetzt werden. Zusätzlich zu den klassischen, horizontalen Bounding Boxes zur Objekterkennung bietet Ultralytics mit dem Modell „Oriented Bounding Boxes“ (OOB) die Möglichkeit, gedrehte Objekte genauer zu erkennen. Wie bei den anderen Yolo-Versionen sind vortrainierte Modelle in 5 verschiedenen Grössen verfügbar (yolovn, yolovs, yolovm, yolovl und yolovx). Das Modell sollte entsprechend den Anforderungen an Hardware, Geschwindigkeit und Genauigkeit ausgewählt werden.
Will man ein Modell für einen anderen Task als die Objekterkennung laden, muss ein Postfix hinzugefügt werden. „-seg“ steht für Segmentierung, „-cls“ für Klassifizierung, „-pose“ für Pose-Estimation und „-obb“ für orientierte Bounding Boxes. Zum Beispiel wird „yolovn-cls.pt“ verwendet, um das kleinste Modell für die Klassifizierung zu laden.
Objekterkennung
Die Objekterkennung ist der häufigste Anwendungsfall. Dabei geht es darum, Objekte einer oder mehrerer vordefinierter Klassen in einem Bild oder Video zu erkennen. Wird ein Objekt erkannt, liefert das Modell seine Bounding Box, d.h. den Bildausschnitt, in dem das Objekt zu sehen ist. Dies geschieht im Format X, Y, W, H
, also die Koordinaten des Zentrums sowie die Breite und Höhe der Box.
Das Modell wurde mit dem COCO-Datensatz trainiert, der rund 200.000 gelabelte Bilder aus insgesamt 80 Klassen enthält. Wenn eine dieser Klassen mit Yolo nicht erkannt werden soll, können einfach die Modellargumente angepasst werden. Soll eine zusätzliche Klasse (oder einfach eine spezifische selbst erstellte Klasse) erkannt werden, müssen weitere Bilder gelabelt und das Modell weiter trainiert werden. Aufgrund des Pretrainings reichen jedoch bereits <100 Bilder für eine gute Leistung aus. Das Gleiche gilt natürlich auch, wenn eine bestehende Klasse für bestimmte Umgebungsbedingungen optimiert werden soll.
Segmentierung
Mit dem Segmentation Task beim Yolo ist eine Instance Segmentation gemeint. Dies ist im Grunde eine genauere Objekterkennung. Anstelle eines Begrenzungsrahmens wird für jedes Pixel entschieden, ob es zu einer Instanz der Klasse gehört oder nicht. Dafür gibt es unzählige Anwendungsbereiche. Von der Bestimmung der Grösse eines Tumors bis hin zu selbstfahrenden Autos, die ihre Umgebung verstehen müssen (wo wahrscheinlich hochspezialisierte Modelle verwendet werden), kann das Modell angewendet werden.
Klassifikation
Bei der Klassifikation geht es darum das ganze Bild einer Klasse zuzuordnen und ist die einfachste Aufgabe. Das klassische Schulbeispiel dafür ist die Unterscheidung ob eine Katze oder ein Hund in einem Bild zu sehen ist. Der Classification Task wurde auf dem Image Net trainiert und das vortrainierte Modell enthält dementsprechend 1000 Klassen. Nützlich ist sowas z.B. bei der automatischen Anpassung von Kameraparametern je nachdem ob es sich um ein Landschaftsbild, ein Portrait oder Architektur handelt.
Pose Estimation
Bei der Pose Estimation werden Keypoints des menschlichen Körpers detektiert, sodass Bewegungsmuster analysiert werden können.
Ich selbst habe keine Erfahrung damit. Ein Studienkollege hat allerdings auf Basis von Pose Estimation (Allerdings mit OpenPose und nicht mit Yolo) eine Gerät entwickelt, welche Physioübungen auf Richtigkeit überprüft und Feedback gibt, falls die Übung falsch ausgeführt wird (AI-Physio)
Analog dazu könnte man Bewegungsmuster in den verschiedensten Sportarten analysieren und so Verletzungen vorbeugen.
Persönliche Erfahrungen
Wird ein Bild von einem Computer verarbeitet, ist man oft an der Detektion eines oder mehrer Objekte interessiert. Mit klassischer Bildverarbeitung ist dies allerdings sehr komplex oder gar nicht machbar, da ein Bild ja nichts anderes als ein riesiger Zahlensalat ist. Zusätzlich funktionieren solche Systeme meist nur zuverlässig bei kontrollierten Umgebungsbedingungen. Deep Learning hat zu einem riesigen Fortschritt im Bereich Computer Vision geführt, welcher meiner Meinung nach noch grösser ist als der Fortschritt im Natural Language Processing (mit ChatGPT usw.).
Yolo ist sehr benutzerfreundlich, schnell und perfromant und bietet dadurch eine Alternative für viele Algorithmen in der klassichen Bildverarbeitung. Durch das Pretraining auf hunderttausenden Bildern ist das Modell sehr robust bei verschiedensten Umgebungsbedingungen und kann oft ohne grosse Anpassung verwendet werden.
Nummernschilderkennung ASTRA
Das Strassenverkehrsamt der Schweiz verfügt über unzählige Kameras zur Verkehrsüberwachung. Moderne Kameras mit besserer Auflösung und strengeren Datenschutzauflagen führen dazu, dass Gesichter und Nummernschilder zensiert werden müssen und nur von der Polizei mit richterlichem Beschluss eingesehen werden dürfen.
Im Rahmen eines grossen Innosuisse-Projekts hat das ICAI der Fachhochschule OST im Auftrag des ASTRA Zensur-Software verschiedener Anbieter getestet. Zu diesem Zweck haben wir mit Daten des ASTRA ein YOLOv5 für die Gesichts- und Kennzeichenerkennung trainiert. Mit diesem Modell konnten wir dann die zensierten Videos auf Herz und Nieren prüfen. Da einzelne Nummernschilder trotz Zensur vom YOLO als Nummernschilder erkannt wurden, haben wir das Ganze mit der Tessaract OCR (Optical Character Recognition) kombiniert, um herauszufinden, ob die erkannten Nummernschilder tatsächlich noch lesbar sind.
In einem späteren Schritt sollen die Verkehrsvideos ebenfalls automatisch auf Auffälligkeiten überprüft werden. Dazu gehören zum Beispiel Schwarzfahrer, Unfälle und Staus. Yolov8 kann nicht nur Labels für einzelne Bilder vorhersagen, sondern diese auch über mehrere Bilder hinweg tracken. So könnte also auch die Anomalieerkennung schnell umgesetzt werden.
Bauteiltracking in der Produktion
Bei einem anderen Projekt mussten wir ein Kunststoffteil in unserer Produktionsanlage mit einer Kamera verfolgen können. Auch dafür habe ich Yolo verwendet. Da es sich bei dem Bauteil jedoch um eine Klasse handelt, die von Yolo standardmässig nicht erkannt wird, musste ich eine neue Klasse definieren und das Modell feintunen. Überraschenderweise hat dies bereits mit rund 50 beschrifteten Bildern sehr gut funktioniert, wie im folgenden Video zu sehen ist.
Code Reader
In einem weiteren Schritt musste der DataMatrix-Code auf dem OST-Gadget gelesen werden können.
Die DataMatrix wurde mit klassischer Bildverarbeitung extrahiert. Anschliessend wurde in einem ersten Versuch jedes Codestück durch Helligkeitsvergleiche als 1 oder 0 gelesen und so die DataMatrix ausgewertet. Das Problem dabei war, dass das OST-Gadget in unzähligen Farben erhältlich war und die Helligkeitseinflüsse in der Produktion zu einer unzuverlässigen Auswertung führten. Wir entschieden uns dagegen die Umgebungseinflüsse und suchten stattdessen nach einem robusteren Auswertealgorithmus. Auch hier hat wieder ein Yolo geholfen. Trainiert mit den beiden Klassen 1 und 0 hat das Modell zu einer robusten Auswertung geführt. Das Ganze wurde auf einem Raspberry Pi mit Raspberry Pi Kamera und dem Yolov5 kostengünstig umgesetzt.
In einem solchen Fall wäre auch die „Oriented Bounding Boxes“ vom Yolov8 interessant. Damit könnte man sich die ganze klassischen Bildverarbeitung sparen und direkt den Code direkt mit dem Yolo auswerten.
Generierte Daten
Ein grosser Nachteil KI-basierter Modelle ist oft der Trainingsaufwand. Yolo hat schon sehr viele Klassen standardmässig integriert, will man aber eine eigene Klasse definieren, so benötigt man zusätzliche Traininsdaten. Glücklicherweise muss das Netzwerk nur feingetunet werden und es reichen daher schon wenige Bilder für eine gute Performance aus. Der Labelingaufwand hält sich also in Grenzen. Dennoch gilt: Umso mehr Daten, desto besser die Performance.
Für ein Projekt am IWK mussten wir die genaue Position von Kreisen auf Mikroskopbildern evaluieren. Aufgrund von störenden Lichteinflüssen funktionierten klassische Kreiserkennungsalgorithmen leider nicht robust genug. Daher beschloss ich, schnell ein YOLO für Kreise zu trainieren. Die Labels für das Training mussten sehr genau sein, und ich hatte keine Lust, etliche Bilder pixelgenau zu labeln. Die Lösung: Kreise auf einem ähnlichen Hintergrundbild zu generieren und damit das Modell zu trainieren. So kann man einerseits so viele Bilder wie gewünscht produzieren, andererseits kennt man durch die Platzierung auch die genaue Position der Kreise und kann das Label ebenfalls generieren. Durch Hinzufügen von Rauschen und der Verwendung von verschiedenen Hintergründen funktioniert das Ganze sehr robust und hat alle Kreise auf den ca. 1000 Mikroskopbildern fehlerfrei lokalisiert.
Fazit
Wie bereits erwähnt ist Yolo ist sehr benutzerfreundlich, schnell und perfromant bietet damit eine Alternative für viele Algorithmen der klassischen Bildverarbeitung. Durch Feintuning kann das Modell noch robuster und leistungsfähiger werden.
Der rasante Fortschritt im Bereich Computer Vision bedeutet auch, dass viele Firmen noch nicht von dessen Vorteilen profitieren und ein enormes Potenzial für Automatisierungen vorhanden ist. Die Anwendungen sollten immer intensiv gestestet werden und den AI Act einhalten.