Custom Attributes

Mit den Custom Attributes ist es möglich, dem KI-Modell Meta-Informationen mitzugeben, welche zur Laufzeit in der SPS berücksichtigt werden sollen. Das Metadaten-Konzept existiert ähnlich auch in der ONNX, diese können jedoch nicht zur Laufzeit in der SPS ausgewertet werden.

Prinzipiell können Sie beide Metadatenbereiche gleichzeitig nutzen. Unterscheiden Sie dabei in Informationen, die zur Laufzeit in der SPS benötigt werden (Custom Attributes Bereich) und Informationen, die der SPS-Programmierer nur zur Engineering Phase benötigt (ONNX Metadaten oder Custom Attributes).

Ziel ist es in jedem Fall, dass der Ersteller einer ONNX genügend Informationen an den Konsumenten der ONNX weitergeben kann, damit der Konsument das KI-Modell korrekt und effizient nutzen kann.

Custom Attributes zur Bildvorverarbeitung

Im Folgenden wird das Beispiel KI-basierte Bildverarbeitung erweitert. Es werden Informationen über das Eingangsbild hinzugefügt. Ziel ist es, die Bildvorverarbeitung entsprechend den Metainformationen anzupassen.

Umsetzung im TwinCAT Machine Learning Model Manager

In der graphischen Umgebung kann das Configuration Tool genutzt werden, um die Custom Attributes einzupflegen.

Custom Attributes 1:

Umsetzung in Python

Oft ist es vom Workflow her geschickter, alle notwendigen Custom Attributes direkt in Python im Anschluss an das Modelltraining einzutragen.

new_ca = { 'ImageInput' : {'nwidth' : 244, 'nheight' : 244, 'nMaxPixelValue' : 255, 'fMean' : [0.485, 0.456, 0.40], 'fStd' : [0.229, 0.224, 0.225]} }
tb.modify_ca("C:\\models\\lemon_model.json", "C:\\models\\lemon_model.json", new_ca)

Das Ergebnis kann in der JSON im Klartext nachvollzogen werden.

Custom Attributes 2:

Auslesen der Custom Attributes in TwinCAT

Das SPS-Projekt aus dem Beispiel wird im Folgenden erweitert.

Nach erfolgreicher Konfiguration einer Session auf dem TwinCAT Machine Learning Server werden die abgelegten Custom Attributes ausgelesen.

IF fbMlSvr.Configure(nTimeout := 1000, nPriority:=0) THEN
   IF fbMlSvr.nErrorCode <> 0 THEN
      // If nErrorCode -1 is encountered, increase nTimeout
      eState := E_State.eError;
   ELSE
      
      // read all relevant meta information from custom attributes
      IF fbMlSVr.GetCustomAttribute_int64('ImageInput/height', nHeight) THEN
         // check fbMlSVr.nErrorCode for further reference
         eState := E_State.eError;
      END_IF         
      fbMlSVr.GetCustomAttribute_int64('ImageInput/width', nWidth);
      fbMlSVr.GetCustomAttribute_int64('ImageInput/MaxPixelValue', nMaxPixelValue);
      fbMlSVr.GetCustomAttribute_array('ImageInput/Mean', dtypeCustomAttribute, ADR(aMean), SIZEOF(aMean), nLength, ADR(nBytes));
      fbMlSVr.GetCustomAttribute_array('ImageInput/Std', dtypeCustomAttribute, ADR(aStd), SIZEOF(aStd), nLength, ADR(nBytes));
      
      eState := E_State.eImageAcquisition;
   END_IF
END_IF

Danach werden die in SPS-Variablen gespeicherten Custom Attributes in der Vorverarbeitungs-Pipeline genutzt. Hier sind im Wesentlichen nur die notwendigen Typ-Konvertierungen zu beachten.

// Adjust the dimensions of the input image to match the model input requirements
hrVision := F_VN_ResizeImageExp(ipInputImage, ipTensorImage, LINT_TO_UDINT(nWidth), LINT_TO_UDINT(nHeight), eInterpolationType, ePaddingMode, aBlack, hrVision);
// Convert the image to type REAL and scale to the range [0.0, 1.0]
hrVision := F_VN_ConvertElementTypeExp(ipTensorImage, ipTensorImage, TCVN_ET_REAL, 1.0 / LINT_TO_REAL(nMaxPixelValue), 0, hrVision);
// Normalization
hrVision := F_VN_SubtractVectorFromImage(ipTensorImage, aMean, ipTensorImage,hrVision);
hrVision := F_VN_DivideImageByVector(ipTensorImage, aStd, ipTensorImage, hrVision);

Nach Aktivierung der Konfiguration kann im Online View kontrolliert werden, ob die Werte richtig übernommen wurden.

Custom Attributes 3: