FX KI-basierter PRPD-Klassifikator – Übersicht
Übersicht
Ab der BATCAM FX Firmware v1.0.3c ist eine von uns selbst entwickelte KI-basierte Teilentladungsklassifikation in die Firmware integriert. Diese Funktion nutzt CUDA und ONNX Runtime und ist so ausgelegt, dass Teilentladungstypen in Echtzeit innerhalb des Geräts klassifiziert werden können.
PRPD (Phase-Resolved Partial Discharge) ist ein Diagnoseverfahren für Teilentladungen, bei dem die Teilentladungssignale bezogen auf die Phase der Netzspannung analysiert werden; der KI-Klassifikator der BATCAM FX bestimmt anhand dieser PRPD-Daten als Eingabe den Typ der Teilentladung.
Dieses Dokument beschreibt, wie Anwender dieser Funktion die KI-basierten Klassifikationsergebnisse empfangen und nutzen können. Die Firmware unterstützt insgesamt vier Klassifikationsergebnisse (Corona, Floating, Surface, Noise), wobei für jeden LPoint-Audiokanal (CH0~CH2) ein eigenes Ergebnis bereitgestellt wird.
| Klasse | Beschreibung |
|---|---|
corona | Typ Koronaentladung (Corona discharge) |
floating | Entladungstyp an freischwebender Elektrode (Floating electrode) |
surface | Oberflächenentladungstyp (Kriechentladung, Surface) |
noise | Hintergrundgeräusche bzw. Signale, die keine Teilentladung sind |
Die Klassifikationsergebnisse werden über zwei Kanäle bereitgestellt: ROS 2 und WebSocket. Für jeden LPoint-Audiokanal wird je unterstütztem Teilentladungstyp ein Logit-Score bereitgestellt, auf dessen Basis Anwender das Klassifikationsergebnis ableiten können.
💡 Hinweis: Dieses Dokument bezieht sich auf die BATCAM FX. Informationen zu den KI-Funktionen der BATCAM FX2 finden Sie im Dokument Geräte-Manager — Künstliche Intelligenz.
Voraussetzungen
-
Firmware-Version: BATCAM FX Firmware v1.0.3c oder höher. Die ROS 2-Ausgabe wurde erstmals in v1.0.3b hinzugefügt; der vollständige Funktionsumfang einschließlich der WebSocket-Ausgabe steht ab v1.0.3c zur Verfügung. Die ausführliche Änderungshistorie finden Sie in den Firmware-Release-Notes.
-
Versionsprüfung: Rufen Sie im Browser die Seite
{CAMERA_IP}/setting/statusauf oder prüfen Sie in der Antwort der REST APIGET /setting/statusden Wertfirmware_version. (siehe FX API Playground) -
ROS 2-Umgebung auf Empfängerseite: Die ROS 2-Funktionen der BATCAM FX basieren auf ROS 2 Humble Hawksbill; das Nachrichtenpaket fx-stream-msgs wurde unter der Voraussetzung der Verwendung mit Humble mit Python 3.10.16 unter ROS 2 Jazzy (Ubuntu 24.04) gebaut und verifiziert. (siehe ROS-Übersicht)
-
Übereinstimmende ROS_DOMAIN_ID: Die Standard-ROS_DOMAIN_ID der Kamera ist
123. Die Empfängerumgebung muss denselben Wert verwenden, damit die Topics sichtbar sind. (siehe ROS Domain ID einstellen)
Datenempfang
ROS 2-Topics
Die BATCAM FX erzeugt das Topic für die PRPD-Klassifikationsergebnisse auf Basis der Hardware-ID der Kamera.
| Element | Wert |
|---|---|
| Topic-Name | /fx_{hardware_id}/prpd |
| Nachrichtentyp | fx_stream_msgs/msg/Prpd |
| Nachrichtengröße | 52 B/Nachricht |
| Durchschnittliche Bandbreite | ca. 220 B/s |
Die Prpd-Nachricht stellt für jede der vier Klassen ein Array der Länge 3 bereit, das die Logit-Werte je Kanal (CH0~CH2) enthält.
| Feld | Typ | Beschreibung |
|---|---|---|
noise | float32[3] | Logit der Klasse noise für die Kanäle CH0~CH2 (dimensionsloser Score) |
corona | float32[3] | Logit der Klasse corona für die Kanäle CH0~CH2 (dimensionsloser Score) |
floating | float32[3] | Logit der Klasse floating für die Kanäle CH0~CH2 (dimensionsloser Score) |
surface | float32[3] | Logit der Klasse surface für die Kanäle CH0~CH2 (dimensionsloser Score) |
Die Logit-Werte sind nicht normalisierte Scores und können sowohl positiv als auch negativ sein, weshalb sie anhand ihrer relativen Größe interpretiert werden müssen.
Die vollständige Liste der ROS 2-Topics und die Nachrichtendefinitionen sind im Abschnitt zu den Nachrichtendefinitionen der ROS-Übersicht zusammengefasst; die Originaldefinition des Nachrichtenformats finden Sie im Repository SMI OSS - fx-stream-msgs.
WebSocket-Stream (Protobuf)
Ab Firmware v1.0.3c werden dieselben Klassifikationsergebnisse auch als WebSocket-basierter Protobuf-Stream bereitgestellt. Über den Abonnementkanal werden mit der Subscribe ID 3 die Prpd-Ereignisse empfangen; bei der BATCAM FX erfolgt der Versand mit ca. 4 Hz.
Ein Python-Beispiel für den gesamten Ablauf von WebSocket-Verbindung, Abonnement und Parsing finden Sie im Dokument Python-Protobuf-Beispiel. In diesem Dokument sind auch die Unterschiede zwischen FX und FX2 zusammengefasst.
Klassifikationsverfahren
Für jeden Kanal wählen Sie unter den Logit-Werten der vier Klassen den Eintrag mit dem höchsten Wert (argmax) aus. Wenn Sie zusätzlich die Wahrscheinlichkeit für jedes Ergebnis berechnen möchten, müssen Sie aus jedem Kanal die zum jeweiligen Eintrag passenden Werte entnehmen und darauf softmax anwenden.
| Kanal | noise (Logit) | corona (Logit) | floating (Logit) | surface (Logit) | Klassifikationsergebnis (argmax) | Wahrscheinlichkeit (softmax) |
|---|---|---|---|---|---|---|
| ch0 | -0.96 | 2.98 | -3.55 | 0.30 | corona | 0.918 ( 91.8 % ) |
| ch1 | 4.48 | 5.88 | -5.45 | -1.51 | corona | 0.802 ( 80.2 % ) |
| ch2 | -6.54 | -1.39 | 0.73 | 0.45 | floating | 0.533 ( 53.3 % ) |
💡 Hinweis zur Interpretation: Die softmax-Wahrscheinlichkeit ist die relative Konfidenz zwischen den vier Klassen. Wenn die höchste Wahrscheinlichkeit niedrig ausfällt (53.3 %) wie bei ch2 im Beispiel, bedeutet dies, dass der Logit-Unterschied zwischen floating (0.73) und surface (0.45) gering ist und die beiden Klassen miteinander konkurrieren. Das Beurteilungskriterium (der Schwellenwert) dafür, ob ein Klassifikationsergebnis übernommen wird, hängt vom Anwendungsbereich und von den Bedingungen vor Ort ab; definieren und verwenden Sie es daher entsprechend den Anforderungen des eingesetzten Systems.
Softmax
Die softmax-Funktion wandelt einen Logit-Vektor in eine Wahrscheinlichkeitsverteilung um; die allgemeine Formel lautet:
Sind die Logit-Werte jedoch zu groß oder zu klein, kann ein Überlauf (Overflow) oder Unterlauf (Underflow) auftreten, weshalb üblicherweise mit der folgenden normalisierten Form gerechnet wird:
Wenn Sie die untenstehende Formel nach Python übertragen, ergibt sich das folgende Beispiel:
Python-Implementierung
import numpy as np
def softmax(logits): logits = np.array(logits) exps = np.exp(logits - np.max(logits)) # stabilisierter Softmax return exps / np.sum(exps) # Wahrscheinlichkeitswerte zurückgebenCommon Lisp-Implementierung
(defun softmax (logits) "Nimmt Liste oder Vektor LOGITS entgegen und gibt den softmax-Wahrscheinlichkeitsvektor zurück" (let* ((vec (coerce logits 'vector)) (maxval (reduce #'max vec)) (exps (map 'vector (lambda (x) (exp (- x maxval))) vec)) (sum (reduce #'+ exps))) (map 'vector (lambda (x) (/ x sum)) exps)))Vollständiges Beispiel: rclpy-Subscriber-Node
Nachfolgend finden Sie einen vollständigen Python-Node (rclpy), der das PRPD-Topic abonniert und die Klassifikationsergebnisse sowie die Wahrscheinlichkeiten je Kanal als Log ausgibt. Sie können ihn als eine einzelne Datei (prpd_subscriber.py) speichern und unverändert ausführen.
💡 Hinweis: Der Topic-Name
/fx_276730383020104/prpdim Code ist ein Beispiel und muss an die Hardware-ID der verwendeten Kamera angepasst werden. Den tatsächlichen Topic-Namen können Sie mit dem Befehlros2 topic listermitteln.
import numpy as npimport rclpyfrom rclpy.node import Node
from fx_stream_msgs.msg import Prpd
# Labels in derselben Reihenfolge wie die Felder von Prpd.msgLABELS = ['noise', 'corona', 'floating', 'surface']
def softmax(logits): logits = np.array(logits) exps = np.exp(logits - np.max(logits)) # stabilisierter Softmax return exps / np.sum(exps)
class PrpdSubscriber(Node): def __init__(self): super().__init__('prpd_subscriber') # Topic-Namen an die Hardware-ID der verwendeten Kamera anpassen. self.subscription = self.create_subscription( Prpd, '/fx_276730383020104/prpd', self.listener_callback, 10)
def listener_callback(self, msg: Prpd): results = []
# Bezogen auf 3 Kanäle (CH0 ~ CH2) for ch in range(3): logits = [ msg.noise[ch], msg.corona[ch], msg.floating[ch], msg.surface[ch], ] probs = softmax(logits) idx = int(np.argmax(probs)) results.append({ 'channel': f'CH{ch}', 'label': LABELS[idx], 'probability': round(float(probs[idx]), 3), })
# Log-Ausgabe for result in results: self.get_logger().info( f"{result['channel']}: {result['label']} " f"({result['probability'] * 100:.1f}%)" )
def main(args=None): rclpy.init(args=args) node = PrpdSubscriber() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown()
if __name__ == '__main__': main()Ausführung
Führen Sie das Programm aus, nachdem Sie die ROS 2-Umgebung und den Workspace, in dem das Nachrichtenpaket fx-stream-msgs gebaut wurde, gesourct haben. Dabei muss dieselbe ROS_DOMAIN_ID wie bei der Kamera (Standardwert 123) verwendet werden.
source /opt/ros/humble/setup.bash# Auch den Workspace sourcen, in dem das Nachrichtenpaket fx-stream-msgs gebaut wurde.export ROS_DOMAIN_ID=123python3 prpd_subscriber.pyErwartete Ausgabe
Unter der Annahme, dass die oben im Abschnitt „Klassifikationsverfahren“ genannten Beispiel-Logit-Werte empfangen wurden, wird das folgende Log ausgegeben:
[INFO] [1748324429.123456789] [prpd_subscriber]: CH0: corona (91.8%)[INFO] [1748324429.123512345] [prpd_subscriber]: CH1: corona (80.2%)[INFO] [1748324429.123556789] [prpd_subscriber]: CH2: floating (53.3%)Common Lisp-Referenzimplementierung
Dies ist eine Common Lisp-Referenzimplementierung derselben Klassifikationslogik (softmax + argmax). Der Empfangsteil für die Nachrichten muss an die verwendete Umgebung angebunden werden; der folgende Code setzt voraus, dass msg für (noise corona floating surface) jeweils einen Vektor der Länge 3 enthält.
; Define labels for the discharge types(defparameter *labels* #("noise" "corona" "floating" "surface"))
; Softmax function(defun softmax (logits) "Nimmt Liste oder Vektor LOGITS entgegen und gibt den softmax-Wahrscheinlichkeitsvektor zurück" (let* ((vec (coerce logits 'vector)) (maxval (reduce #'max vec)) (exps (map 'vector (lambda (x) (exp (- x maxval))) vec)) (sum (reduce #'+ exps))) (map 'vector (lambda (x) (/ x sum)) exps)))
(defun classify-channel (noise corona floating surface) "Nimmt die Logit-Werte eines Kanals entgegen und gibt Label/Wahrscheinlichkeit zurück" (let* ((logits (vector noise corona floating surface)) (probs (softmax logits)) (idx (position (reduce #'max probs) probs))) (list :label (aref *labels* idx) :probability (aref probs idx))))
(defun listener-callback (msg) "Annahme: msg enthält für (noise corona floating surface) je einen Vektor der Länge 3" (loop for ch from 0 below 3 for result = (classify-channel (aref (getf msg :noise) ch) (aref (getf msg :corona) ch) (aref (getf msg :floating) ch) (aref (getf msg :surface) ch)) do (format t "CH~A: ~A (~,1F%)~%" ch (getf result :label) (* (getf result :probability) 100))))Fehlerbehebung (Troubleshooting)
-
Wenn das Topic
prpdnicht sichtbar ist:-
Prüfen Sie, ob die Firmware-Version v1.0.3c oder höher ist. Rufen Sie im Browser
{CAMERA_IP}/setting/statusauf oder prüfen Sie beiGET /setting/statusden Wertfirmware_version; bei einer älteren Version aktualisieren Sie die Firmware über das Web-Update oder das Shell-Update. -
Prüfen Sie, ob die
ROS_DOMAIN_IDauf der Empfängerseite mit der der Kamera übereinstimmt. Der Standardwert der Kamera ist123; ab Firmware 1.0.3 kann er über die REST API (/ros/domain) abgefragt und geändert werden. (siehe FX API Playground, ROS Domain ID einstellen) -
Prüfen Sie mit
ros2 topic listerneut, ob das Topic/fx_{hardware_id}/prpderscheint.
-
-
Wenn der Fehler
ModuleNotFoundError: No module named 'fx_stream_msgs'auftritt:- Der Workspace, in dem das Nachrichtenpaket fx-stream-msgs gebaut wurde, ist nicht gesourct. Sourcen Sie die
setup.bashdes Workspace und führen Sie das Programm erneut aus.
- Der Workspace, in dem das Nachrichtenpaket fx-stream-msgs gebaut wurde, ist nicht gesourct. Sourcen Sie die
-
Wenn bei der softmax-Berechnung Overflow-/Underflow-Warnungen auftreten:
- Exponenzieren Sie die Logit-Werte nicht unverändert, sondern verwenden Sie die normalisierte Form aus dem obigen Abschnitt „Softmax“ (Exponenzierung nach Abzug von
np.max).
- Exponenzieren Sie die Logit-Werte nicht unverändert, sondern verwenden Sie die normalisierte Form aus dem obigen Abschnitt „Softmax“ (Exponenzierung nach Abzug von
-
Wenn die höchste Wahrscheinlichkeit niedrig ausfällt:
- Dies ist kein Fehler, sondern bedeutet, dass die Logits von zwei oder mehr Klassen ähnlich sind und miteinander konkurrieren. Beachten Sie den Hinweis zur Interpretation im obigen Abschnitt „Klassifikationsverfahren“.
Verwandte Dokumente
-
ROS-Übersicht — Vollständige Topic-Liste, Nachrichtendefinitionen, Hinweise
-
ROS Domain ID einstellen — Vorgehen zum Ändern der Domain-ID
-
Listening Point-Koordinaten — Konzept der LPoint-Kanäle und Einschränkungen der Einstellung
-
Firmware-Release-Notes — Änderungshistorie der PRPD-Funktion nach Version
-
Python-Protobuf-Beispiel — Beispiel für das Abonnieren des WebSocket-Streams (gemeinsam für FX/FX2)
-
FX API Playground — REST-API-Referenz für
/setting/status,/ros/domainusw.