Eine praktische Anleitung zur Erzeugung künstlicher Daten mit Unity Perception
Jeder, der schon einmal ein Modell für maschinelles Lernen trainiert hat, wird Ihnen sagen, dass es die Daten sind, die das Modell ausmachen, und dass im Allgemeinen mehr Daten und Kennzeichnungen zu einer besseren Leistung führen. Das Sammeln von Daten und vor allem deren Beschriftung ist zeitaufwändig und daher teuer. Daher suchen Fachleute für maschinelles Lernen zunehmend nach effizienteren Möglichkeiten, ihren Datenbestand zu erweitern, indem sie künstlich erzeugte Variationen von Datenproben verwenden, aber auch zunehmend auf hybride oder vollständig synthetische Daten zurückgreifen.
Das Spiele-Engine-Unternehmen Unity bietet ein Tool namens Unity Perception an, mit dem Sie Objekte auf verschiedene Weise simulieren und virtuelle Bilder von Ihren Simulationen machen können. Auf diese Weise ist es möglich, aus Ihren Objekt-Scans eine große Anzahl von beschrifteten Bildern zu erzeugen, die als Trainingsdaten verwendet werden können.
In diesem Blogpost stelle ich die Ergebnisse meines Praktikums bei ML6 vor, in dessen Verlauf ich die Verwendung von Unity Perception zur Erzeugung von Trainingsdaten für ein Objekterkennungsmodell untersucht habe. Genauer gesagt werde ich beschreiben, wie ich:
Um Objektnetze zu erstellen, habe ich eine App namens Scaniverse auf einem Telefon mit Lidar-Kamera verwendet. Um dies gut zu machen, gibt es einige Voraussetzungen. Sie müssen in der Lage sein, das Objekt von allen Seiten zu erfassen, und Sie benötigen eine gute und gleichmäßige Beleuchtung in allen Winkeln des Objekts
Also habe ich die Objekte auf ein Podest mit guter Beleuchtung gestellt, die Objekte mit der App gescannt und anschließend ein separates Bild von der Unterseite gemacht, um es dem Objektmesh in Blender hinzuzufügen. Mit Scaniverse kannst du deine Objekte als fbx- oder obj-Dateien exportieren, beide funktionieren mit Blender und Unity.
Allerdings war nicht jedes Objekt leicht zu scannen. Besonders Objekte mit spiegelnden Oberflächen, dünnen oder durchsichtigen Segmenten waren mit dieser Methode problematisch zu scannen. Wenn die Scans nicht gut sind, gibt es immer noch die Möglichkeit, sie nachträglich mit Blender zu bearbeiten.
Vor allem, um sie zu beschneiden und neu zu zentrieren oder um sie mit einer Unterseite zu kombinieren, um ein vollständiges Objekt zu erhalten.
Ich machte auch mehrere Scans für jedes Objekt, um die Variation der Objekte in den synthetischen Bildern zu erhöhen, und machte etwa 200 Bilder von jedem Objekt, das ich in verschiedenen Räumen und Positionen scannte. Ich habe versucht, die Objekte an verschiedenen Orten zu platzieren und sie aus unterschiedlichen Winkeln zu fotografieren. Ich habe dafür gesorgt, dass die Bilder manchmal unscharf waren oder das Objekt nur teilweise zeigten, um die Variation weiter zu erhöhen.
Unten sind Scans der 3 Objekte, mit denen ich gearbeitet habe: ein Schuh, eine Coca-Cola-Dose und eine Kellogg's-Müslischachtel.
Ich habe diese Objekte ausgewählt, weil:
Unity Perception ist ein Toolkit zur Erstellung von Datensätzen. Es ist relativ neu und funktioniert derzeit nur für kamerabasierte Anwendungsfälle. Es ist ein Plugin für Unity, eine Spiel-Engine und plattformübergreifende IDE.
Zur Erzeugung von Trainingsbildern habe ich eine Simulation verwendet, die Ihre Objekte mit zufälligen Drehungen, Skalierungen und Positionen vor einem Hintergrund und vor einer Lichtquelle und einer Kamera positioniert. Die Objekte wurden mit gleicher Wahrscheinlichkeit gezeichnet; jede Klasse war gleich stark vertreten.
Für mehr Abwechslung habe ich die Beleuchtungsintensität randomisiert und verschiedene Glätteeigenschaften für die Objekte und verschiedene Arten der Hintergrundgenerierung verwendet. Ich habe das gleiche Hintergrundgenerierungsschema verwendet, wie es von Unity in ihrem Tutorial für Unity Perception verwendet wird, bestehend aus zufälligen Objekten mit zufälligen Texturen als Hintergrund. Dies gewährleistet einen sehr unterschiedlichen Hintergrund für jede Simulation ohne andere erkennbare Objekte neben den Objektklassen. Für allgemeine Zwecke ist dies eine gute Ausgangsbasis (diese Situation wird in der Grafik unten als Simulation 1 bezeichnet).
Das Training nur mit diesen Bildern brachte jedoch keine sehr guten Ergebnisse, also habe ich versucht, stattdessen ein zufälliges Hintergrundbild zu verwenden. Diese Hintergrundbilder wurden aus einem Online-Datensatz von Innenraumszenen entnommen. Dies führte zu einer drastischen Verbesserung der Ergebnisse, wie ich im folgenden Diagramm zeigen werde. Der Datensatz, aus dem diese Hintergrundbilder entnommen werden, sollte je nach dem natürlichen Kontext Ihrer Objektklasse ausgewählt werden.
Um die Szene weiter zu verbessern, habe ich zufällige Objekte hinzugefügt, jetzt aber in geringerer Anzahl und im Vordergrund. Diese Objekte verdecken zum Teil die Klassen und sorgen für eine abwechslungsreichere Szene.
Eine weitere Verbesserung, die ich vorgenommen habe, ist die Verwendung mehrerer Objektnetze für dieselbe Objektklasse. Dadurch werden die Ergebnisse für komplexere Objekte verbessert.
Ich habe die Tensorflow Object Detection API verwendet, um die Modelle zu trainieren. Ich importierte vortrainierte Modelle aus dem Tensorflow-Modell-Zoo und stimmte sie dann auf meine Daten ab. Ich entschied mich, mit einem Mobilet zu arbeiten, da es ein relativ schnelles Modell ist, mit dem ich in kurzer Zeit gute Ergebnisse erzielen kann.
Beim Fotografieren habe ich die Objekte für jedes Bild an einen anderen Ort gebracht und aus vielen Winkeln fotografiert. Ich habe auch Bilder gemacht, bei denen die Objekte entweder teilweise verdeckt oder nicht ganz im Bild waren; alle Bilder wurden mit demselben Telefon in derselben Qualität aufgenommen.
Ich habe LabelImg verwendet, um die Bilder manuell zu beschriften, bevor ich sie in eine Trainings- (80 %), eine Validierungs- (10 %) und eine Testmenge (10 %) aufgeteilt habe. Der Validierungssatz wurde für die Auswahl der Hyperparameter des Modells und der Testsatz für die endgültige Bewertung verwendet. Die Bilder für den Testsatz wurden in anderen Räumen aufgenommen als die Bilder für den Trainingssatz; dasselbe gilt für den Validierungssatz.
Ich stellte sicher, dass jede Klasse in allen Partitionen gleich stark vertreten war. Ich fügte die synthetischen Bilder zum Trainingssatz hinzu; die Validierungs- und Testsätze bestanden nur aus realen Bildern.
Um die Leistung der Modelle zu messen, habe ich die mittlere durchschnittliche Genauigkeit (mAP) bei 0,5 Schnittpunkten über dem Unionswert und den durchschnittlichen Wiedererkennungswert (AR) bei 10 Vorhersagen verwendet (True Positive, wenn das Objekt in den ersten 10 Vorhersagen erkannt wurde).
Mit dem mAP lässt sich gut messen, wie genau die Entdeckungen sind. Der AR misst, wie gut das Modell alle Positivmeldungen findet (siehe auch hier).
Ich habe Modelle nur mit realen Bildern, nur mit synthetischen Bildern oder mit einer Mischung aus beidem trainiert. Durch den Vergleich der Ergebnisse zeige ich den Nutzen der Hinzufügung synthetischer Bilder und die beste Aufteilung zwischen realen und synthetischen Bildern für das Training. Die gemischten Modelle wurden mit demselben Stichprobenverfahren für reale und synthetische Bilder trainiert. Mit unterschiedlichen Sampling-Schemata können Sie wahrscheinlich noch bessere Modelle erstellen. Der Einfachheit halber habe ich jedoch das gleiche Sampling verwendet.
Eine andere Möglichkeit, diese Modelle zu trainieren, besteht darin, sie zunächst nur mit synthetischen Daten zu trainieren und sie dann mit realen Daten zu verfeinern. Bei mir führte dies zu ähnlichen, aber etwas schlechteren Ergebnissen. Allerdings waren die Modelle recht einfach, und ich bin sicher, dass man sie noch verbessern kann.
Ich habe gemischte Modelle für die 4 verschiedenen Arten von Hintergrundsimulationen trainiert, die im vorherigen Abschnitt gezeigt wurden. In der folgenden Tabelle sind die mAP/AR-Ergebnisse für diese Simulationen zusammengefasst:
Zunächst wollte ich sehen, wie gut die rein synthetischen Modelle sind und wie viele reale Bilder man am wenigsten braucht, um gute Ergebnisse zu erzielen. Ich habe die rein synthetischen Modelle mit 1000/2000/5000/100000 synthetischen Bildern trainiert; alle hatten ungefähr die gleiche Punktzahl von 0,3 mAP@0.5IoU, was nicht besonders gut ist. Einige Beispielergebnisse für die verschiedenen Modelle sind in den Bildern am Ende dieses Blogposts zu sehen.
Dann habe ich Modelle mit 0, 30, 100, 300 und 530 realen Bildern zusätzlich zu den 1000 synthetischen Bildern trainiert und die Ergebnisse verglichen.
Ich stellte fest, dass die mAP- und AR-Werte stiegen, je mehr Bilder aus der realen Welt ich dem Trainingssatz hinzufügte, bis ich 300 Bilder aus der realen Welt hinzugefügt hatte; die zusätzlichen 230 Bilder im letzten Modell mit 530 Bildern aus der realen Welt schienen nicht viel zu helfen. Das Modell mit 1000 synthetischen/300 realen Bildern konnte die meisten Objekte in den Bildern erkennen, wobei vor allem einige der Schuh-Erkennungen fehlten.
Bisher habe ich nur gezeigt, dass eine Mischung aus beiden besser ist als nur synthetische Daten, aber nicht, wie sehr die synthetischen Daten unsere Modelle verbessern. Daher habe ich ein Modell nur mit den 300 realen Bildern trainiert. Dieses Modell schnitt sehr schlecht ab, sogar noch schlechter als das rein synthetische Modell. Bei der Auswertung dieses Modells fiel mir auf, dass das Modell fast ausschließlich die Coca-Cola-Dosen erkannte, was mir zeigte, dass 100 Bilder zwar ausreichen, um ein Objekterkennungsmodell für Coca-Cola-Dosen zu trainieren, aber nicht für die anderen beiden Klassen. Zu Testzwecken verwendete ich jedoch weiterhin dieselbe Trainingsmenge von etwa 100 Bildern für jede Klasse.
Ich fügte dann nur 300 synthetische Bilder zum Trainingssatz hinzu und bemerkte bereits, dass sich die Ergebnisse mehr als verdoppelten. Als ich jedoch immer mehr synthetische Daten hinzufügte, begannen die Modelle schlechter abzuschneiden. Vielleicht könnte ich mit einem anderen Stichprobenverfahren für die realen Daten mehr synthetische Bilder zum Trainingssatz hinzufügen.
Bei der manuellen Auswertung der Modelle bemerkte ich große Unterschiede in der Erkennungsgenauigkeit einiger Modelle bei den Klassen. Daher habe ich sie für jede Klasse getrennt ausgewertet und die Ergebnisse betrachtet.
Die Schuhklasse schneidet bei den meisten Modellen schlecht ab. Es ist das komplexeste Objekt, das ich verwendet habe, und auch das am wenigsten farbenfrohe, was zu seiner geringen Punktzahl beitragen kann. Mit komplex meine ich, dass er aus jedem Blickwinkel anders aussieht und einige dünne Segmente in den Schnürsenkeln hat, die beweglich sind.
Die realen Modelle erkennen die Coca-Cola-Dosen sehr gut, bei den anderen Klassen versagen sie jedoch. Bei Verwendung der synthetischen Modelle werden die Cola-Dosen jedoch nicht so leicht erkannt. Das kann an ihren reflektierenden Eigenschaften liegen, die in Unity Perception nicht gut simuliert werden. Allerdings gibt es in Unity Optionen zur besseren Simulation von Reflexionen, die ich nicht vollständig genutzt habe, die aber hier sicherlich helfen könnten.
Die Kellogg's-Müslischachtel ist ein "einfacheres" Objekt und schneidet in rein synthetischen Daten sehr gut ab; dies zeigt, dass ein rein synthetischer Datensatz für diese Art von Objekten bereits gute Ergebnisse liefern kann.
In diesem Beitrag habe ich gezeigt, dass das Hinzufügen synthetischer Bilder zu Objekterkennungsmodellen Ihre Modelle erheblich verbessern kann. Ich habe Schritt für Schritt erklärt, wie man das macht, vom Scannen der Objekte bis zum Training der Objekterkennungsmodelle. Ich habe gezeigt, dass die besten Ergebnisse mit einem Modell erzielt werden, das mit einer Mischung aus realen und synthetischen Bildern trainiert wurde, und dass man bereits mit wenigen realen Bildern annehmbare Ergebnisse erzielen kann, wenn man synthetische Daten hinzufügt. Ich kam auch zu dem Schluss, dass einfache Objekte, wie die Kellogg's Box, stark von der Hinzunahme synthetischer Bilder profitieren. Bei Objekten mit dünnen, durchsichtigen oder spiegelnden Segmenten ist es schwieriger, repräsentative Netze zu erhalten, aber selbst Modelle, die auf diesen Objekten trainiert wurden, erzielen bessere Ergebnisse, wenn synthetische Daten hinzugefügt werden.
Bei Modellen mit einem sehr großen Satz qualitativer Bilder aus der realen Welt führt die Hinzufügung synthetischer Daten vielleicht nicht zu Verbesserungen. Bei Modellen mit wenigen qualitativen Bildern aus der realen Welt, wie in meinem Beispiel, führt die Hinzufügung synthetischer Daten jedoch zu einer erheblichen Verbesserung der Ergebnisse. Abschließend kann ich sagen, dass ich mit den Ergebnissen zufrieden bin, da die Verbesserungen durch die Hinzufügung synthetischer Daten noch größer waren als erwartet. Ich hoffe, dass dieser Beitrag für Sie nützlich ist und Sie dazu anregt, dies auszuprobieren und die Simulationen weiter zu verbessern, um noch bessere Ergebnisse zu erzielen!