Azure Custom Vision – Technology deep-dives Part 2

[Reading Time: 13 minutes]

Einleitend – Ich erkenne ein Postauto!

Warum geht es in diesem Post um ein Postauto? Was ist Custom Vision? Long story short: Ich will wissen, wann der Postbote kommt bzw. da war. Und zwar ohne, dass ich ständig aus dem Fenster schauen muss. Das soll eine Maschine für mich machen! Für mich gibt es dafür mehrer Gründe. Hier zwei, die dir vielleicht einleuchten 🙂

Du hast kleine Kinder, die ein Nachmittagsschläfchen halten sollten und dabei besser nicht gestört werden, weil sonst der heimische Frieden gefährdet ist. … Der Postbote interessiert sich nicht für dein Leid (Klingel).
Die Sendungsverfolgung zeigt eine Zustellung an, aber dein Paket ist nirgendwo zu finden.

Was das angeht, fallen mir noch viele weitere gute Gründe ein, warum man seine häusliche Umgebung automatisiert scannen sollte (hier erstmal nur Postboten).
Falls du noch ein paar coole Ideen hast, gib gern deinen Kommentar unten dazu!

Um ein System zu bauen, dass den Postboten/Postauto erkennt, braucht es etwas mehr als nur eine Videokamera. Ich wollte den Menschen vor der Kamera ersetzen, und das geht mit KI – besser, mit einer Teildisziplin davon, dem Machine Learning. Und da kommt die Custom Vision ins Spiel.

Azure Cognitive Services

Das ist ein Dienst der Azure Cognitive Services und macht damit Machine Learning (ML) Modelle per API nutzbar. Es gibt für unterschiedliche Domänen, verschiedene Services, die teilweise einfach nur konsumiert werden müssen, um respektable Ergebnisse zu erlangen. Die Azure Cognitive Services bestehen aus derzeit fünf Segmenten (Decision, Speech, Language, Vision, Search). Für mich ist derzeit jedoch die Kategorie “Vision”, die interessanteste in diesem Projekt.

Ein Service, den ich experimentell für ein älteres Postboten-Projekt verwendet hatte, ist die Computer Vision API. Diese kann auf generelle Modelle, also fertig trainierte Modelle keiner speziefischen Domäne zugreifen. Eine Domäne ist eine Art “Fachbereich” oder Disziplin (ansonsten hilft dir sicher Wikipedia weiter 😉 ). In Kombination mit dem Tool ISpy, war das ein sehr gutes Konstrukt (Schau dir den Link hier unbedingt einmal an! Wenn du C# kannst, ist das was für dich).
Nur leider weiß die Computer Vision API nicht, was ein Postbote ist. Daher habe ich mir die Custom Vision API genauer angeschaut.

Custom Vision API

Die Custom Vision API kann, wie die Computer Vision API, generelle Bilder erkennen/verarbeiten, jedoch zusätzlich, wie der Name schon nahe legt, die ML-Modelle eben auch spezialisieren. Die Modelle der Custom Vision API sind vortrainiert und können durch mehr oder weniger geringen Aufwand eigene Klassen oder Objekte erlernen. Damit kann ich also der Maschine beibringen, was ein Postbot, respektive Postauto, ist.
Los geht es! Bauen wir uns ein ML-Modell für Postautos!

Service erstellen

Im Azure Portal erstellst du dir einen Cognitive Service (“Custom Vision”).

Im Portal suchst du nach Custom Vision und bestätigst in der erscheinenden Maske mit “Create”.

Anschließend fülle das Formular aus.

Für erste Experimente reichen die F0 Pläne.

Nachdem der Service angelegt wurde, kannst du mit Klick auf den Link bei Punkt 2 “Custom Vision Portal” in dieses springen.

Alternativ kannst du auch im Browser die URL https://customvision.ai/ eingeben und dich mit deinem Azure Account anmelden.

Im Custom Vision Portal legst du nun ein neues Projekt an.

Für unser Projekt erstellen wir eine Object Detection, da wir in einem Bild ein oder mehrere spezifische Objekte erkennen wollen.

Als Domäne nehmen wir ein generell vortrainiertes Modell.

Anschließend erstellst du das Projekt mit “Create Project”

Vorbereitung ist das α und Ω …

Jetzt können wir loslegen, unser Postauto anzulernen. Was benötigen wir dazu? Bilder! Normalerweise benötigt man für ein richtig gutes Ergebnis viele Bilder… sehr viele Bilder. Der Custom Vision Service gibt sich aber erstaunlicherweise mit verhältnismäßig wenig Bildern zufrieden und liefert dafür passable Ergebnisse.

Für ein gutes Ergebnis solltest du vorab einiges beachten:

Besorg dir trotzdem viele Bilder
schau, dass du unterschiedliche Bilder hast
du benötigst Bilder mit verschiedenen Perspektiven auf dein Postauto und die Umgebung
es sollten auch verschiedene Witterungsbedingungen zu erkennen sein
die Qualität der Bilder sollte vielleicht auch variieren
Vieles bekommst du mit ein bißchen experimentieren selbst heraus

Hier habe ich mal einen Screenshot meines Services von hoch geladenen Bildern. Du wirst erkennen, dass ich auch andere Objekte mit in mein Modell mit einbaue. So kann ich auch mehr, als nur Postauto in meiner Umgebung identifizieren und das Modell bekommt ein besseres Trainingsergebnis. Wichtig dabei ist jedoch, dass du immer in etwa gleich viele Bilder jeder Kategorie hast, sonst kommt am Ende kein gutes Ergebnis raus.

Wir benötigen als Basissetup mindestens zwei Tags (ein Tag bezeichnet eine Kategorie von Objekten und wird oft auch Label genannt).
Postauto
NoPost
Damit kann die Maschine zwischen zwei verschiedenen Objekten unterscheiden. Alternativ kannst du auch, wie ich, mehrere andere Tags vergeben (die du dann natürlich mit entsprechenden Bildern befüllen kannst). Der Anlernaufwand ist damit aber höher und du musst mehr Zeit für dein Projekt investieren!

Und so gehst du vor:
Lade nun ein oder mehrere Bilder aus deiner Bildersammlung hoch.

Tipp: präpariere deine Ordnerstruktur so, dass die Tags hier abgebildet sind.

Anschließend bekommst du eine Oberfläche mit geladenem Bild angeboten. In diesem markierst du das entsprechende Objekt und vergibst das Tag. Wiederhole dies für jedes Bild, das du hochgeladen hast.

Markieren eines Objektes (Ground Box)

Wenn du damit fertig bist, verstehst du, was die Hauptarbeit eines Data Scientiests ist.

Ein Data Scientist beschäftigt sich mit dem Aufbereiten von Daten, die zum Beispiel als Grundlage für ML dienen. AI-Developer/Engineers aber auch Data Scientists erstellen aus diesen Daten Machine Learning Modelle anhand verschiedener ML-Algorithmen (Das Thema ist viel zu groß, um hier genauer drauf ein zu gehen).

Unser Custom Vision Service abstrahiert die Arbeitsschritte zu einem großen Teil so, dass ein Software-Entwickler sich fast allein auf das Konsumieren des Modells konzentrieren kann. Das ist die wahre Macht der Cognitive Services.

Erfolg durch Training … nicht nur im Sport

Nun geht es weiter. Nachdem wir unsere Bilder und Tags organisiert haben, überlassen wir dem Services alles Weitere. Dazu wechsel im Portal auf die Performanceansicht (oben im Menü).

Was du hier noch beeinflussen kannst ist die Wahrscheinlichkeit (im Bild oben “Probability Threshold”), mit der die Maschine das Trainingsergebnis prüft und als akzeptabel anerkennt. In meinem Beispiel sind es 70%.

Der Schieberegler darunter – bei mir ist es “Overlap Threshold” – bestimmt, wie hoch die Abweichung zwischen der definierten und der erkannten Bounding Box ist – es geht hier schließlich um Objekterkennung in einer Szene. Bildlich beschrieben, ist die Bounding Box das Rechteck, dass das Objekt im Bild markiert (siehe Screenshot oben).
Die Auswahl der Objekte, die du in den vorhergehenden Schritten vorgenommen hast, wird also gegen das, von der Maschine erkannte Rechteck validiert.

Das Trainieren eines ML-Modells funktioniert immer (bei supervised learning Ansätzen) – grob gesehen – nach dem selben Prinzip. Datensätze (hier Bilder) werden in Trainingsdaten und Testdaten aufgeteilt. Die prozentuale Verteilung der Daten liegt oft in der Größenordnung 70 : 30. Im Anschluss an das Training wird evaluiert, wie gut das Ergebnis ist. Dabei werden dann die Testdaten, die das System noch nicht kennt, gegen das erzeugte Modell geprüft. Auf mein Beispiel angewendet: wenn das Ergebnis meiner Testdaten, eine 70%ige Trefferquote auf Postauto hat, ist es ein valides Ergebnis – sprich: ein Ergebnis, dass die Maschine als Postauto akzeptiert.

Nachdem du nun deine Werte gesetzt hast (ich empfehle dir die Voreinstellung so zu belassen), kannst du auf den Button “Train” klicken.

Im nachfolgenden Dialog konfigurierst du die Trainingsresourcen. Da dies ein intensiver mathematischer Prozess ist, benötigst du normalerweise viel Power, sprich eine gute Hardware, wenn du nicht ewig auf dein fertiges Modell warten möchtest und ein gute Qualität erwartest. Über den Dialog kannst du nun, die Entscheidung treffen, ob es schnell gehen soll (weniger gute Ergebnisse), oder du Rechenpower zur Verfügung stellst, und damit auch bessere Ergebnisse erwarten kannst (dauert länger). Da wir uns hier in der Cloud befinden, wirst du Resourcen in Form von VMs bereitstellen müssen. Der Vorteil eines Platform/Software as a Service (Paas/Saas), ist jedoch, dass du davon nicht viel mitbekommst und dafür viele Schieberegler erhälst.
Die Erstellung eines Modells ist ein iterativer Prozess, der aus vielen Wiederholungen mit verschiedenen variierenden Parametern besteht. Für einen ersten Wurf, reicht es i.d.R. aus, das schnelle Training an zu werfen. So erhältst du eine Indikation und kannst mit etwas Erfahrung an unterschiedlichen Parametern (Dauer, Bildanzahl, -qualität,….) nachbessern.

Nach dem Training ist vor dem Training

Auswertung der Prediction-Qualität des ML-Modells

Vielleicht bekommst du ja so etwas wie oben als Ergebnis präsentiert; vielleicht weichen deine Zahlen ab. Dies ist abhängig von deinen gewählten Bilder, der Dauer uvm. . Was du aber mitnehmen kannst, ist eine Aussage darüber, wie gut dein Ergebnis (dein trainiertes ML-Modell) ist. Daher kurz zu dem, was die einzelnen Statistiken aussagen:

  • Precision
    Diese Grafik zeigt dir, mit welcher Wahrscheinlichkeit/ Genauigkeit dein Modell, wenn es Objekte in einem der Testdaten-Bilder erkannt hat, richtig erkannt worden (unabhängig davon, ob das Objekt wirklich ein Postauto oder etwas anderes war). Bsp: hat ein Bild 10 Postautos und wurden davon 5 wirkliche, sowie 3 LKWs fälschlicherweise als Postauto erkannt, dann habe ich eine Precision von 5 / (5+3) = 62,5%
  • Recall
    Der Recall verrät dir, wie wahrscheinlich dein Modell ein richtiges Postauto von allen möglichen Postautos in deiner Bildersammlung findet. (einfach: wie gut ist dein Modell)
    Bsp: wie Precision (5 echte Postautos + 3 LKWs [als falsche Postauto] bei insgesamt 10 zuerkennenden, echten Postautos) 5/10 = 20%
  • mAP (mean Average Precision)
    Einfach gesagt, und so kann man es auch beim Hovern über das Info-Icon im Portal lesen, gibt dieser Wert die Performance des Objektdetektors wieder.
    Wenn du dich damit genauer befassen möchtest, kannst du zum Beispiel hier nachlesen.
    Im Grunde geht es darum, wie genau der Detector die erkannte Bounding Box zur festgelegten Box (die, die man im Portal “gemalt” hat) als erkannt wahrnehmen kann. Das wird mehrmals mit unter verschiedenen Parametern ausgewertet und gemittelt.

Für mein Projekt hatte ich mehrere Tags verwendet; und so sah das Ergebnis dafür aus:

Was du sehen kannst, ist die Einzelbewertung der Tags. Ich habe, entgegen meiner Empfehlung, nicht die gleiche Anzahl an Bildern für jedes Tag verwendet. Ich habe in einer Iteration (Trainingslauf) nur Postautos trainiert und dafür alle anderen Objekte nicht berücksichtigt.

Den Prozess des Trainierens kannst und solltest du nun mit verschiedenen Variationen von Bildern und Parametern wiederholen, bis du ein gutes Ergebnis hast. Gern kannst du auch mal die “Advanced Training” Option anwenden.

VORSICHT! Es kann mitunter ins Geld gehen.

Bevor du dein Modell nun wirklich verwenden kannst, solltest du es noch veröffentlichen. Mit diesem Schritt kannst du auf dein Modell auch ohne das Custom Vision Portal zugreifen.

Dazu klickst du oben links im Menü auf “Publish” und selektierst im darauffolgenden Dialog noch deinen Custom Vision Service, den du ganz zum Anfang angelegt hattest (“PostCarService”). Damit erhält deine Iteration den Badge “Published”.

Klicke als nächstes auf “Predictions” im Menü oben. Hier bekommst du zwei Möglichkeiten zum Weiterarbeiten angeboten.
Zum einen kannst du die öffentlichen Endpoints für deinen Postcar-Service anzeigen lassen und zum anderen einen “Quick Test” über die Oberfläche machen. Bei diesem Test hast du die Möglichkeit, Bilder, die nicht Teil deines Trainings- und Testdatensatzes sind, über die UI gegen dein Modell zu testen. Probiers doch mal aus!

Anwenden des trainierten Modells

Damit wären wir nun auch endlich mit einem verwendbaren Modell fertig. Was nun bleibt ist das Ansprechen und Abfragen. In diesem Beitrag erkläre ich dir, wie du generelle Abfragen an dein Modell machen kannst. In einem Anderen zeige ich dir noch, wie du, in Kombination mit ISpy, das ML-Modell verwendest, um eine Postboten-Erkennung (o.Ä.) zu bauen. Du kannst gespannt sein!

Jetzt aber erstmal zum Ansprechen. Klickst du auf “View Endpoint”, öffnet sich ein Dialog, der dir zwei URLs anbietet. Das ist die API/Schnittstelle für die Erkennung. Du kannst einmal ein Bild über einen Request an die API senden, oder aber auch einen Link auf ein Bild.

Der Dialog verrät dir ausserdem, wie du deinen Request formulieren musst, um die jeweilige API an zu sprechen.

Ich gehe mal davon aus, dass du weißt, wie man einen Request an eine API absetzt. Falls nicht, empfehle ich dir, mal einen Blick auf das Thema REST und den Tools Postman oder die Powershell. Alternativ, besuche auch die Docs von Microsoft. Hier gibt es noch unmengen an Anleitungen.

Wenn du einen Request erfolgreich abgesetzt hast, bekommst du von der API einen Response, der in etwa dem nachfolgenden gleicht.

{
    "id": "0fbda4ee-8956-4979-bf57-a252441af98d",
    "project": "9ca4032b-beeb-40ad-9396-1c3fcfd9ba89",
    "iteration": "27c85265-a158-4fc4-b22a-d535dd758d80",
    "created": "2018-06-11T09:34:29.9496528Z",
    "predictions": [
        {
            "probability": 0.7702891214,
            "tagId": "677afcf8-bc4a-493f-b588-707663286125",
            "tagName": "Postauto",
            "boundingBox": {
                "left": 0.2889924,
                "top": 0.0169312358,
                "width": 0.7007024,
                "height": 0.8284572
            }
        },
        {
            "probability": 0.012788726,
            "tagId": "ca844f08-b6c0-4d9a-9010-73945d442708",
            "tagName": "Volvo V40",
            "boundingBox": {
                "left": 0.304018974,
                "top": 0.413163722,
                "width": 0.299461246,
                "height": 0.436399817
            }
        },
...]
}

Mit dem Json kannst du dann alles mögliche machen. Zum Einen erhälst du die Information, was in deinem Bild alles erkannt wurde und welche Wahrscheinlichkeit es das richtige ist. Außerdem bekommst du zusätzlich die Positionen der erkannten Objekte. Damit kannst du also in jeder Programmiersprache/Interpreter, zum Beispiel das Objekt mit einem Rechteck markieren oder eine “Bestandsliste” der im Bild erkannten Objekte führen. Deiner Kreativität sind damit keine Grenzen gesetzt.

In einem nächsten Post möchte ich dir gern meine IoT (Internet of Things) Variante eines Postboten-Erkennungssystems vorstellen. Und damit die bereits in Teil 1 angekündigten Deep-dives weiter vertiefen.

Das hier vorgestellte Vorgehen wird später nochmal aufgegriffen. Es wird darum gehen, unser KI Modell auch als Offline-Version auf einem Gerät zum Laufen zu bekommen, um nicht immer in der Cloud zu arbeiten.

Stay tuned!

Von Thomas

Als Chief Technology Officer bei Xpirit Deutschland. Ich bin dafür verantwortlich, die Produktivität unserer Kunden durch einen Full-Stack von Dev und Technologie in der heutigen Zeit zu steigern. Dabei kümmere ich mich nicht nur um Technologien aus Microsofts Stack wie Azure, AI und IoT, sondern auch um die Bereitstellung von Qualität und Expertise mit DevOps

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.