Maschinelles Lernen von automatisch generierten Daten

Neuronale Netze für die Bilderkennung mit 3D-Modellen trainieren

Als man sich bei Audi mit der automatischen Erkennung von Audis in Bildern beschäftigte, war schnell klar, dass ein Machine-Learning-Ansatz funktionieren muss. Zum einen gibt es eine schier unendliche Anzahl guter Bilder - im Netz und vor allem aber auch in den Datenbanken bei Audi und seinen Händlern. Zum anderen dürstet man ohnehin nach sinnvollen Anwendungen für künstliche Intelligenz in der Enterprise-Welt.

Was nicht so klar war, und was auch schnell als Herausforderung auffiel, war die Frage “Was machen wir mit den neuen Modellen?”. Klar: Je neuer ein Modell ist, desto weniger Bilder gibt es davon. Aber auch klar: Je neuer ein Modell ist, desto relevanter ist es für die Anwendung.

Die Lösung musste über 3D-Modelle führen. Solche sind immer vorhanden. Und zwar nicht nur technische 3D-Modelle aus der Konstruktion, sondern auch ästhetisch ausgereifte. Im Audi-Konfigurator werden ausschließlich Renderings von 3D-Modellen gezeigt. Diese werden teilweise sogar in Echtzeit generiert, wenn ein Benutzer den Konfigurator benutzt (das kann man auch in Product Configurators lesen).

Als Jan, der in der Konfiguratorlandschaft bei Audi Projekte entwickelt, mit dieser Frage auf mich zukam, haben wir zunächst über Lösungen mit Methoden der Computer Vision gesprochen: Mit dem Handy eine Sequenz von Bildern aufnehmen, daraus ein 3D-Modell generieren und dieses mit hinterlegten Modellen abgleichen. Das ist auch ein netter Ansatz, der aber technisch sehr anspruchsvoll ist und Grundlagenentwicklungen erfordert.

Eine Lösung mit Machine Learning wäre einfacher. Man bräuchte keine komplexen Verfahren zu entwickeln, der Rechner löste das Problem von selbst - praktisch. Mangels ausreichender Bilder für das Trainieren eines Klassifikators, drängte sich eine Frage auf: Kann man mit Renderings von 3D-Modellen mittels Deep Learning ein neuronales Netz trainieren, das dann die gelernten Dinge in echten Fotos erkennt?

Wer etwas Erfahrung mit maschinellem Lernen hat, der weiß: Ein Computer, bzw. ein neuronales Netz, sieht die Dinge anders als wir Menschen. Und er ist an anderen Stellen sensibel, als man es zunächst erwartet. Die Abstraktionsleistung, von einem 3D-Modell auf das Foto des realen Dings zu schließen, ergibt sich nicht selbstverständlich. Vielmehr war meine Erwartung, dass ein mit 3D-Modellen trainiertes neuronales Netz zwar sehr gut darin sein würde, 3D-Modelle der Dinge zu erkennen aber nicht die Dinge selbst (in Fotos). Wie sich herausstellen sollte, war meine Erwartung nicht ganz zutreffend.

Versuch

Wir haben es ausprobiert. Exemplarisch an einer simpel anmutenden Aufgabe: der Unterscheidung von Audis und Cola-Dosen. Beides schillernde, metallische Objekte mit Ecken, Kanten und Rundungen. Wenn sich diese mit der Methode von einander unterscheiden ließen, dann wäre gezeigt, dass der Transfer vom 3D-Modell zum echten Bild prinzipiell funktioniert.

Wir haben die Modelle in Blender geladen und ein kleines Python-Skript geschrieben, das ein paar tausend Renderings der Dose und des Autos aus verschiedenen Perspektiven erstellt und als Bild abspeichert. Diese Bilder haben wir verwendet, um mit Tensorflow ein Convolutional Neural Network (CNN) zu trainieren.

Renderings aus verschiedenen Perspektiven

Einen Tag lang wurden auf vier Prozessorkernen Bilder gerendert, das CNN damit gefüttert und siehe da: nichts. Der trainierte Classifier kann ein Auto nicht von einer Dose unterscheiden. Ganz so einfach geht es schonmal nicht.

Also die Gründe untersucht. Eine Idee drängte sich schnell auf: womöglich maß das CNN dem einheitlichen Hintergrund und/oder dem Übergang vom Hintergrund zum Objekt zuviel Gewicht bei. Ähnlich einem Beispiel, das Ribeiro / Singh / Guestrin in einem Paper anführen, das sich mit der Sichtbarmachung der ausschlaggebenden Merkmale von Classifiern befasst. In diesem Beispiel wurde ein Classifier trainiert, der Wölfe erkennt. Bei einem Bild eines Huskys war sich das neuronale Netz absolut sicher, dass es sich um einen Wolf handele. Die Untersuchung mit dem sich im Paper vorgestellten LIME-Verfahren zeigte, dass das neuronale Netz den Schnee, der im Hintergrund des Huskys zu sehen war als relevant und ausschlaggebend erachtete, da unter den Trainingsbildern offenbar zahlreiche einen Wolf ebenfalls im Schnee zeigten.

Um dem (nicht existierenden) Hintergrund unserer 3D-Modelle die Relevanz zu nehmen, galt es also, für Diversität bei den Hintergründen zu sorgen. Um eine größere Ähnlichkeit mit Fotos zu erzielen, haben wir uns entschieden, die Hintergründe nicht abstrakt zu generieren, sondern Fotos zu verwenden. Tausende Fotos. Mit wiederum einem kleinen Python-Skript haben wir unsere 3D-Modelle in die zufälligen Fotos gesetzt. Dabei wurde die Platzierung innerhalb des Bildes zufällig gewählt. Vier dieser Bilder sind im Titelbild abgebildet.

Das neue neuronale Netz war schnell trainiert und tatsächlich: Die Probe mit den verschiedenen Testdatensätzen zeigte, dass in etwa 90% der Fälle korrekt identifiziert wurde, ob auf einem Bild eine Cola-Dose oder ein Audi zu sehen war. Da geht doch was.

Ein Blick auf die falsch klassifizierten Testbilder zeigte auch sofort, woran es noch hakte: Die fälschlich als Cola-Dose erkannten Autos waren fast alle rot! So simpel. Es gibt direkt ein wenig Halt und macht maschinelles Lernen etwas greifbarer, wenn etwas so vordergründigem wie der Farbe eine signifikante Relevanz beigemessen wird.

Also nochmal an die 3D-Modelle ran. Das Skript zum Erzeugen der Renderings wurde erweitert, auch die Außenfarbe des Autos zu verändern. Wieder wurden die Renderings in zufälliger Position auf zufällige Hintergründe geklebt. Und wieder wurde schnell das CNN trainiert. Und voilà: 98% korrekte Klassifikationen über unseren Testdaten.

Verschieden gefärbte Renderings vor zufälligen Hintergrundbildern.

Unter den roten Autos gab es nur noch zwei falsch einsortierte Bilder. Bei genauerer Betrachtung zeigte sich, dass eines davon gar nicht ein Auto sondern ein realistisches Spielzeugmodell des Audis zeigte. Das war mir bei der ersten Sichtung gar nicht aufgefallen. Unserem neuronalen Netz schon.

Teilen