Wie man Schrauben erkennt

Logo
Text

Als nächstes wollen wir uns ein einfaches, fiktives Anwendungs-Szenario ansehen, um zu verstehen, wie man KI-Systeme - und speziell Neuronale Netze - zur Lösung von Problemen einsetzt. Dazu sei vorab gesagt, dass das Szenario sehr einfach ist und es auch Methoden gibt, wie man das vorgestellte Problem ohne Neuronale Netze lösen kann

Das Szenario

Es soll eine Maschine entwickelt werden in der zwei Arten von Schrauben sortiert werden, die sich nur durch ihre Länge unterscheiden. Dazu werden die Schrauben einzeln auf eine weiße, von unten beleuchtete Platte fallen gelassen. Je nach Länge der Schraube soll die Platte anschließend nach links oder rechts gekippt werden, damit die Schraube in den entsprechenden Sammelbehälter fällt.

Für die Ermittlung der Länge wird von einer senkrecht über der Fläche montierten Kamera ein Bild gemacht. Ein solches Bild ist rechts zu sehen. Durch den hohen Kontrast ist es sehr leicht möglich die Bounding Box der Schraube in dem Bild zu ermitteln, d.h. ein zu den Bildkanten paralleles Rechteck, dass die Schraube möglichst eng umschließt. ein solches Beispiel ist im unteren Bild zu sehen. Für das weitere Vorgehen benötigt man die Breite ww und Höhe hh dieser Bounding Box.

Das Problem

Um unser Problem zu lösen, benötigen wir eine Funktion f(w,h)f(w,h), die die Breite und die Höhe der Bounding Box als Argumente erhält mit:

f(w,h)={0 falls es eine kurze Schraube ist1 falls es eine lange Schraube ist f(w,h) = \begin{cases} 0 & \text{ falls es eine kurze Schraube ist} \\ 1 & \text{ falls es eine lange Schraube ist} \end{cases}

Ein erster Blick auf die Daten

Um ein Gefühl für die Daten zu erhalten, wurden eine Reihe von Aufnahmen gemacht, die Breite und Höhe der Boundingbox ermittelt und protokolliert ob es sich um eine kurze (laenge = 0) oder lange (laenge=1) Schraube handelt.

Um ein paar Symmetrien auszuschließen wurde außerdem

x=max(w,h) und y=min(w,h) x = max(w,h) \text{ und } y = min(w,h)
gesetzt. D.h. der größere der beiden Werte ist x, der kleinere y. Die resultierenden Datensätze sind unten dargestellt. Und rechts sieht man den Scatter Plot der Datensätze. Rote Punkte stehen für kurze Schrauben, blaue für lange.

Eine einfache Lösung

Betrachtet man den Scatter Plot, kann man sofort eine Lösung für unser Problem ermitteln. Welche?

Aber wir wollen aus Prinzip ein Neuronales Netz verwenden (um sagen zu können, dass wir es mit KI gelöst haben).

Die Trainingsdaten

Um die Daten für das Training eines Neuronalen Netzes aufzuarbeiten, ist es günstig, dass wir die Input-Werte auf den Zahlenbereich von -1 bis 1 normieren. Das liegt einfach daran, dass der Computer in diesem Wertebereich am genauesten Rechnen kann. Größere Werte und das Verrechnen von großen und kleinen Zahlen, führen aus technischen Gründen zu größeren Ungenauigkeiten. (Das hängt im Wesentlichen damit zusammen, dass wir nur eine beschränkte Anzahl von Bits pro Zahl verwenden).

Betrachtet man alle Werte für die Breite und Höhe, sieht man, dass sie alle zwischen 1327 und 2307 liegen. Wir runden diese obere und untere Grenze etwas ab- bzw. auf und verwenden das Intervall von 1200 bis 2500.

Eine kurze Frage

Warum nehmen wir eine etwas kleinre untere und eine etwas größere obere Grenze?

Mit diesen beiden Grenzen Normieren wir die Werte der Datensätze nach der folgenden Formel:

norm(x)=x120025001200=x12001300 norm(x) = \frac{x-1200}{2500-1200} = \frac{x-1200}{1300}
Damit wird 1200 zu 0 und 2500 zu 1. Die resultierenden Datensätze sieht man rechts.

Das Neuronale Netzwerk

Als nächstes legen wir das neuronale Netz fest. Es benötigt zwei Inputs und einen Output. Außerdem verwenden wir eine versteckte Schicht mit vier Neuronen. Diese Zahl ist ziemlich beliebig gewählt. Dabei sollte man darauf achten, dass es nicht zu wenige und auch nicht zu viele Neuronen sind.

Nimmt man zu wenige Neuronen kann das neuronale Netz unter Umständen gar nicht unsere Zielfunktion lernen (siohe XOR). Sind es zu viele Neuronen, dauert das Lernen unter Umständen viel länger.

Das Training

Version 0.0