Machine Learning in PLCnext-Controller integrieren
Mittlerweile hat jeder von Machine Learning gehört und wie es alles verändern wird. Doch nur wenige wissen, wie man damit beginnt. Ich hoffe, dass die Schritte in diesem Blog helfen, zu verstehen, wie man mit dem PLCnext-Controller Dinge verändern kann. Es geht um das Training des ersten ML-Modells, die Konvertierung in den ONNX-Standard und die Inferenz auf einem PLCnext-Controller. Zur Veranschaulichung nutzen wir den berühmten Iris-Datensatz.
Vorab: Klare Zielsetzung ist entscheidend. Deshalb eine kurze Erklärung der behandelten Themen. Referenzen finden sich am Ende.
Einführung in Machine Learning
Was ist Machine Learning?
Im Kern geht es darum, Muster in Datensätzen mithilfe von Statistik und Algorithmen zu finden. Man unterscheidet drei Haupttypen: überwachtes, unüberwachtes und bestärkendes Lernen. Überwachtes Lernen ist heute am weitesten verbreitet und wird hier verwendet. Dabei werden Daten gelabelt und der Maschine exakt die gesuchten Muster vorgegeben.
Beim unüberwachten Lernen werden Daten nicht gelabelt; die Maschine sucht selbst nach Mustern – weniger offensichtliche Anwendungen machen es weniger populär.
Beim bestärkenden Lernen lernt ein Algorithmus durch Ausprobieren (Trial and Error), ein Ziel zu erreichen. Belohnung oder Bestrafung zeigen, ob eine Aktion gut oder schlecht war. Googles AlphaGo ist ein berühmtes Beispiel.
Der Iris-Blumendatensatz
Laut Wikipedia enthält der Iris-Datensatz 5 Felder: Kelchblattlänge, Kelchblattbreite, Blütenblattlänge, Blütenblattbreite und Iris-Art. Ziel: Die Art der Irisblume anhand der vier Messwerte klassifizieren. Das ist ein Klassifikationsproblem.
Machine Learning kann auch Werte vorhersagen (Regression) – andere Algorithmen.
Der Algorithmus: Decision Tree Classifier
Wir nutzen den „Decision Tree Classifier“, nicht weil er perfekt ist, sondern weil er intuitiv und ohne komplexe Mathematik verständlich ist. Ein Beispiel für einen Entscheidungsbaum für den Iris-Datensatz:

ONNX
ML-Modelle gibt es in vielen Formaten und für diverse Hardware. Der Open Neural Network Exchange (ONNX) löst dieses Problem. Er wird in Open Office, Azure und unzähligen Anwendungen weltweit eingesetzt – vermutlich auch auf dem Gerät, auf dem Sie dies lesen.
Für ONNX-Modelle benötigt man die ONNX Runtime, was auf ARM-Prozessoren Herausforderungen mit sich bringt. Mit den bereitgestellten Docker-Images sollte es jedoch funktionieren.
Technischer Durchlauf
Voraussetzungen
- AXC F 2152 Controller mit Firmware 2021.0 LTS
- Ubuntu 20.04 VM zum Trainieren des Modells
- Skripte für Training und Inferenz werden bereitgestellt; Einrichtung der Ubuntu VM ist nicht Teil dieses Blogs
- Auf dem PLCnext-Controller: Container-Engine (Anleitung hier)
- Ähnliches Verfahren mit AXC F 3152 möglich
- Grundkenntnisse in Python und Containern erforderlich
Modell trainieren
Inhalt des GitHub-Repositorys herunterladen und sicherstellen, dass alle nötigen Pakete installiert sind. Zuerst das Trainingsskript ausführen, das das Modell an den Iris-Datensatz anpasst und eine .onnx-Datei erstellt.
# Datensatz in Trainings- und Testdaten aufteilen
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, Y_test = train_test_split(X, y)
# Modell definieren und mit Trainingsdaten fitten
clr = DecisionTreeClassifier()
clr.fit(X_train, y_train)
print(clr)
# Modell von sklearn-Format in ONNX konvertieren
initial_type = [('float_input', FloatTensorType([None, 4]))]
onx = convert_sklearn(clr, initial_types=initial_type)
with open("decision_tree_iris.onnx", "wb") as f:
f.write(onx.SerializeToString())
Inferenz auf Ubuntu testen
Modell auf der Entwicklungsmaschine prüfen. Beim Ausführen des Inferenzskripts sollten zwei Integer als Ergebnis erscheinen, die einer Iris-Art entsprechen.
import numpy as np
import onnxruntime as rt
X_test = np.array([[5.8,4.0,1.2,0.2],[7.7,3.8,6.7,2.2]])
sess = rt.InferenceSession("decision_tree_iris.onnx")
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name
pred_onx = sess.run([label_name], {input_name: X_test.astype(np.float32)})[0]
print(pred_onx)
# output: [0 2]
Inferenz auf PLCnext
Per SFTP die .onnx- und inference.py-Datei in /opt/plcnext/onnx auf den PLCnext-Controller kopieren. Als root folgenden Befehl ausführen:
balena-engine run -it --name onnx -v /opt/plcnext/onnx/:/app pxcbe/onnx-runtime-arm32v7
Dann das Python-Inferenzskript ausführen:
cd /app
python3 /app/inference.py
Bei Erfolg erscheint dieselbe Ausgabe wie auf der Ubuntu-VM. Glückwunsch – Sie haben es geschafft! Jetzt Dinge verändern!
Wie in einer Anwendung einsetzen?
Klassifizieren von Irisblumen ist nett, aber für einen logischen Controller kaum praktikabel. Sie benötigen Ihr eigenes Modell und eine API dafür. Daten können via OPC UA oder einen eigenen REST-Endpunkt geliefert werden – zusätzlicher Code ist nötig.
Da das Bauen der Images Tage und eine schlaflose Nacht kostete, empfehle ich, Ihr Image auf dem bereitgestellten Image aufzubauen. In den Referenzen finden Sie eine gute Ressource für Python-Container-Apps.
Referenzen
- What is Machine Learning?
- Iris flower data set
- Decision Tree für Iris
- ONNX
- PLCnext Docker Getting Started
- Containerize Python App in 5 Minutes
- ONNX Models
Industrietechnik
- Machine Learning auf AWS meistern: Ein umfassender Leitfaden
- Die Entwicklung und Fertigung von Nähmaschinen: Von der Innovation des 19. Jahrhunderts zur modernen Automatisierung
- Machine Learning zur Optimierung des MRO Supply Chain Managements nutzen
- KI & Machine Learning im Procurement: Chancen, Herausforderungen & Best Practices
- Machine Learning beschleunigt Pipeline-Sicherheit: Echtzeit-Fehlererkennung spart 10 Mio. $
- Maschinelles Lernen für Predictive Maintenance: Revolution der Asset-Zuverlässigkeit
- Wie KI und Machine Learning die CNC-Zerspanung revolutionieren
- Top 4 Branchen, die durch Machine Learning revolutioniert werden
- 9 wesentliche Machine-Learning-Anwendungen, die Sie kennen müssen
- Präzise Batterielebensdauer-Vorhersage mit KI – DOE Argonne Studie