Python API
Installation des Python Package
Das Python Package liegt als whl-Datei im Ordner <TwinCatInstallDir>\Functions\TF38xx-Machine-Learning\Utilities\ModelManagerAPI\PythonPackage.
Um das Package zu installieren, nutzen Sie pip install
<TwinCatInstallDir>\Functions\TF38xx-Machine-Learning\Utilities\ModelManagerAPI\PythonPackage\<whl-file-name>. Der Ordner enthält ggf. unterschiedliche Versionen des Package (nur, wenn Sie ein neues Setup über ein altes TwinCAT Machine Learning Setup installiert haben).
Achten Sie darauf, immer die aktuelle Version zu nutzen.
pip install "C:\TwinCAT\Functions\TF38xx-Machine-Learning\Utilities\ModelManagerAPI\PythonPackage\beckhoff_toolbox-3.1.230205-py3-none-any.whl"
Verwenden der Beckhoff Toolbox
Zur Beschreibung der einzelnen Punkte wie Custom Attributes und Model Description siehe: Konvertieren von ONNX in XML und BML.
Folgender Quellcode ist auch als py-File verfügbar. Siehe dazu: _Beckhoff_ONNX_Samples.zip im Verzeichnis PythonAPI_mllib.
Das Package wird geladen mit
import beckhoff.toolbox as tb
Konvertieren einer ONNX-Datei in XML
tb.onnximport("../decision tree/decisiontree-regressor.onnx", "../decision tree/decisiontree-regressor.xml")
tb.onnximport("../decision tree/decisiontree-regressor.onnx", "../decision tree/decisiontree-regressor.bml")
Anzeigen von Modellinformationen
tb.info("../decision tree/decisiontree-regressor.onnx")
tb.info("../decision tree/decisiontree-regressor.xml")
Custom Attributes hinzufügen
new_ca = { 'nID' : -34234, 'bTested' : True, 'fNum' : 324.3E-12, 'AnotherTreeItem' : { 'fPi' : 3.13412, 'bFalseFlag' : False }}
tb.modify_ca("../decision tree/decisiontree-regressor.xml","../decision tree/decisiontree-regressor-custom.xml", new_ca)
Model Description (Name, Version, Autor usw. eines Modells) hinzufügen
model_description = {
"new_version" : "2.3.1.0",
"new_name" : "CurrentPreControlAxis42",
"new_desc":"This is the most awesome model to control Axis42",
"new_author":"Max",
"new_tags":"awesome, ingenious, astounding",
}
tb.modify_md("../decision tree/decisiontree-regressor-custom.xml", "../decision tree/decisiontree-regressor-md2.xml",
**model_description)
Input- und Output Transformations hinzufügen
Output Transformations nur für ausgesuchte Modelle Während für alle KI-Modelle eine Input-Transformation möglich ist, können Output-Transformations nur für Modelle vom Typ Regression verwendet werden. |
# add input / output scalings (input-output-transformations)
tb.modify_iot("../decision tree/decisiontree-regressor-md.xml", "../decision tree/decisiontree-regressor-iot.xml",
tb.iot_scaled_offset([1.2,3.4,1.0,1.1,1.0,1.0,1.0,1.0,1.0,1.0],[1.2,3.4,1.0,1.1,1.0,1.0,1.0,1.0,1.0,1.0]),
None) # no output transformation
Die Funktion iot_scaled_offset
erwartet eine Liste von offsets und sclaings. Für jeden Input bzw. Output ist ein Wert anzugeben.
def iot_scaled_offset(offsets : list, scalings : list):
Im obigen Beispiel ist die Anzahl der Eingänge 10, daher wird eine Liste von 10 Elementen übergeben. Für decision trees ist keine Output Transformation verfügbar, daher wird hier ein None übergeben.
Multi-Engines erzeugen
Führen Sie mehrere Modelle zusammen zu einem XML-File.
# # Create a Multi-Engine
# merge two XML files - output file is Merged.xml
tb.merge(['KerasMLPExample_sin.xml','KerasMLPExample_cos.xml'],'Merged.xml')
# merge two specific engines from two XML files
tb.merge([tb.input_engine('Merged.xml','mlp_fp32_engine::merge1'),
tb.input_engine('KerasMLPExample_cos.xml','mlp_fp32_engine')],
'DoubleMerged.xml')
# merge two specific engines from two XML files and provide a reference name for both engines in the target file
tb.merge([tb.input_engine('KerasMLPExample_sin.xml','mlp_fp32_engine', 'sine'),
tb.input_engine('KerasMLPExample_cos.xml','mlp_fp32_engine', 'cosine')],
'MergedRef.xml')
# extract a specific engine from a Multi-Engine file
tb.extract(tb.input_reference('MergedRef.xml', 'sine'),'Extract.xml')
Test-Predict der ML-Runtime in Python
Erzeugen einer XML und anschließend Predict-Aufruf der ML-Runtime. Die ML-Runtime ist als DLL kompiliert und wird aus Python heraus als User-Mode Prozess aufgerufen. Es ist keine TwinCAT Runtime erforderlich.
tb.onnximport("../decision tree/decisiontree- regressor.onnx", "../decision tree/decisiontree- regressor.xml")
inp_file_xml = "../decision tree/decisiontree-regressor.xml"
# define input and output format and input values (10 in, 1 out)
prediction = [{'input_type': 'fp64', 'output_type': 'fp64', 'input': [-1.0,-1.0,1.0,1.4,-1.0,-1.0,1.0,1.4,4.2,4.2]}]
# call predict method of Python-ML-Runtime
out = tb.predict(inp_file_xml,prediction)
print(out)
Weiteres Beispiel für einen Classifier.
tb.onnximport("../decision tree/decisiontree-classifier.onnx", "../decision tree/decisiontree-classifier.xml")
inp_file_xml = "../decision tree/decisiontree-classifier.xml"
# define input and output format and input values (4 in, 1 out)
prediction = [{'input_type': 'fp64', 'output_type': 'int32', 'input': [-1.0,-1.0,1.0,1.4]}]
# call predict method of Python-ML-Runtime
out = tb.predict(inp_file_xml,prediction)
print(out)