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

Python API 1:

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)