AdSense

Dienstag, 11. August 2020

Machine Learning für einen Kamera-überwachten 3D-Drucker

(English version) Nach über einem Jahr seit meinem letzten Post möchte ich heute endlich wieder eines meiner Projekte vorstellen. Im letzten Jahr habe ich an einigen Sachen gearbeitet, vor allem dem Upgrade meines Ultimakers 2+ auf 5 verschiedene Farben. Der Post heute tangiert das Thema, ist aber gleichzeitig auch teil meines IoT-Systems: Eine kamerabasierte Überwachung für einen 3D-Drucker mit automatischer Zustandserkennung.

Zuerst zu den Kameras. Ich habe zwei EPS32-Cam module, wie diese programmiert werden ist bereits im Internet ausführlich erklärt. Diese habe ich an meinem 3D-Drucker angebracht, die erste Kamera von oben, mit einem 3D-gedruckten gestell welches man hier herunterladen kann: https://www.thingiverse.com/thing:3899159

Die zweite Kamera is im 3D-Drucker mit Klebeband fixiert und hat unter dem Kameramodul noch einen kleinen 45°-Block um im richtigen Winkel zu stehen.

Die Kameras erzeugen nun etwa alle 3 Minuten ein neues Bild, insofern hat sich inzwischen schon eine gute Menge an Trainingsdaten angesammelt. Die beiden Blickwinkel sehen so aus:



Die Bilder können in verschiedene Kategorien klassifiziert werden:

  1. Leer: Der Druckkopf ist an seiner normalen Position und das Druckbett ist leer
  2. Vorbereiten: Der Druckkopf ist vorne links und der Drucker heizt sich auf
  3. Drucken: Das versteht sich von selbst
  4. Fertig: Der Druckkopf ist an seiner normalen Position und das Druckbett ist nicht leer
  5. Problem: Ein Abstand zwischen Druckbett bzw. Druckobjekt und Düse ist erkennbar
  6. Wartung: Meine Hände sind sichtbar, der Druckkopf ist zerlegt oder nicht an seiner normalen Position
  7. Aus: Alle Lichter sind aus und die Bilder sind schwarz

Kamera 1 kann den Unterschied zwischen Drucken und Problem nicht erkennen, also erkennt diese Kamera die Kategorie "Problem" nicht, Kamera 2 kann nicht zwischen Leer und Fertig unterscheiden, also kann diese Kamera die Kategorie "Fertig" nicht erkennen.

Ich habe die ersten Bilder die ich hatte dann in die 7 Kategorien sortiert und dann ein neuronales Netz darauf trainiert. Meine Architektur des Netzes (in Tensorflow, Python) sieht folgendermaßen aus:

model = models.Sequential()
model.add(layers.Conv2D(32, (5, 5), activation='relu', input_shape=(128, 128, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(7))

Das Netz ist für einen Input mit 128x128 Pixeln mit jeweils 3 Farbkanälen ausgelegt und besitzt 5 convolutional Layers, welche jeweils ein max Pooling nachgeschaltet haben. Danach gibt es noch ein fully connected Layer mit 64 Neuronen welches dann zum output Layer führt, welches 7 neuronen hat.

Um die Erkennung weiter zu verbessern habe ich ein zweites Netz erstellt, welches Bilder der Größe 64x64 nutzt und daher nur 4 convolutional Layers hat. Die Ergebnisse der Netze in Prozent werden dann addiert (und durch 2 gteilt), dies verbessert die Genauigkeit weiter. Am Ende wird nun das Ergebnis beider Kameras addiert, zusätzlich dazu habe ich noch ein Mikrofon im Drucker, welches über eine Messung des Geräuschlevels erkennt, ob der Lüfter im Druckkopf an ist, sodass ich hier noch einen weiteren Input habe. Das Gesamtergebnis aus beiden Kameras und dem Mikrofon liefert mir dann eine Vorhersage für den Status des Druckers. Wie im vorherigen Post erklärt wird dieses Ergebnis dann an mein IoT-System gesendet, welches mir eine Nachricht schickt, falls

  • Der Drucker seinen Status zu "Problem" ändert
  • Der Drucker seinen Status zu "Fertig" ändert

Keine Kommentare:

Kommentar veröffentlichen