KI-basierte Bildverarbeitung

In diesem Beispiel wird demonstriert, wie Sie:

Download und Übersicht der Dateien

Das Projekt können Sie hier herunterladen: AI_based_Vision

Voraussetzungen

Installieren Sie folgende Workloads:

Einrichtung des Projekts

Optional: Anpassung der TwinCAT-Vision-Version

Das Beispiel wurde mit der Version 5.6.5.0 erstellt. Wenn Sie eine andere Version nutzen möchten, wählen Sie unter TcCOM Objects > Project Objects manuell die Version aus, die Sie installiert haben und nutzen möchten. Wählen Sie dazu die Version für die entsprechenden Objekte zunächst aus. Mit Rechtsklick auf die OTCID-Spalte öffnet sich ein Kontextmenü. Wählen Sie hier „Reload TMI/TMC Description(s) with changed version“. Siehe dazu auch Dokumentation TwinCAT Vision.

Sollten Sie die Version 5.6.5.0 nicht installiert haben und die Einstellung der aktuell verwendeten Version manuell nicht verändern, bekommen Sie eine Fehlermeldung „Error loading Repository driver“.

Es wird automatisch die neueste auf dem System verfügbare SPS-Bibliotheksversion genutzt.

KI-basierte Bildverarbeitung 1:

Ausführen des Projekts

Starten Sie die Anwendung mit Activate Configuration auf Ihrem Zielsystem. Wenn alle Punkte korrekt eingerichtet sind, sollte der eState nach kurzer Zeit auf eInference stehen und die Variable sLabel das Ergebnis der aktuellen Inferenz anzeigen.

KI-basierte Bildverarbeitung 2:

Sollte ein Fehler aufgetreten sein, steht der eState auf Error. Sie können dann die Instanz fbMlSvr aufklappen und den Error Code auslesen. Nutzen Sie die Tabelle der Error Codes, um das Problem einzugrenzen.

Ausschnitte aus dem SPS-Programm

Deklaration

In der Deklaration sind die wesentlichen Punkte, die den Umgang mit dem TwinCAT Machine Learning Server betreffen, die Eingangs- und Ausgangsdatentypen des KI-Modells sowie die Instanz der Clients zum Machine Learning Server.

stModelInput : ST_lemon_modelInput;      //model input datatype, imported via PlcOpenXml
stModelOutput : ST_lemon_modelOutput;    //model output datatype, imported via PlcOpenXml
fbMlSvr : FB_MlSvrPrediction();   // Instance of Client to TcMlServer

Die Datentypen sind bereits über die PlcOpenXml (siehe Ordner models) in das TwinCAT-Projekt eingelesen. Die Beschreibung finden Sie im Ordner DUTs.

Konfiguration der Session

In diesem Beispiel eröffnet der Client im State E_State.eMlSvrConfiguration eine Session auf dem TwinCAT Maschine Learning Server. Dabei wird spezifiziert, auf welchem System der Server erreichbar ist, welches Modell in der Session geladen und auf welcher Hardware das Modell ausgeführt werden soll.

fbMlSvr.stPredictionParameter.sMlModelFilePath := 'C:\models\lemon_model.json';                            // fullpath to model    
fbMlSvr.stPredictionParameter.sMlSvrNetId := '127.0.0.1.1.1';                                    // Server on local system
fbMlSVr.stPredictionParameter.eExecutionProvider := E_EXECUTIONPROVIDER.CPU;                               // CPU execution

// Submit configuration request to the TcMlServer
// Provide a generous nTimeout, as the configuration can take a substantial amount of time
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
      eState := E_State.eImageAcquisition;
   END_IF
END_IF

Der Aufruf der Methode Configure() sendet die Anfrage zur Eröffnung einer Session an den Server ab. Der Aufruf ist asynchron zur SPS-Task und wird mit einem TRUE quittiert, wenn die Einrichtung der Session erfolgreich abgeschlossen ist.

Ausführen des Modells

Im State E_State.eInference wird der Predict-Aufruf an den Machine Learning Server gesendet. Auch dieser Aufruf ist asynchron zur SPS-Task. Die Methode liefert ein TRUE zurück, wenn das Ergebnis vorliegt.

In diesem Beispiel wird vor dem Inferenz-Aufruf das Bild vom Typ ITcVnImage mit der Funktion F_VN_ExportImage in den Modelleingangsdatentyp kopiert.

F_VN_ExportImage(ipTensorImage, ADR(stModelInput.in_input1), nImageSize, hrVision);
// Submission of the asynchronous inference request to the TcMlServer
IF fbMlSvr.Predict(pDataIn       := ADR(stModelInput), 
               nDataInSize   := SIZEOF(stModelInput), 
               pDataOut    := ADR(stModelOutput), 
               nDataOutSize := SIZEOF(stModelOutput),
               nTimeout    := 100,
               nPriority    := 0) THEN
      IF fbMlSvr.nErrorCode <> 0 AND NOT fbMlSvr.bConfigured  THEN
         // If nErrorCode -1 is encountered, increase nTimeout
          eState := E_State.eError;
      ELSE
         
         // Postprocessing of the inference results
         F_Softmax(stModelOutput.out_367);
         nPredictedClass := F_ArgMax(stModelOutput.out_367);

Das Ergebnis der Inferenz kann nach erfolgreicher Fehlerprüfung verwendet werden.