Zum Inhalt springen

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.

KlasseBeschreibung
coronaTyp Koronaentladung (Corona discharge)
floatingEntladungstyp an freischwebender Elektrode (Floating electrode)
surfaceOberflächenentladungstyp (Kriechentladung, Surface)
noiseHintergrundgerä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/status auf oder prüfen Sie in der Antwort der REST API GET /setting/status den Wert firmware_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.

ElementWert
Topic-Name/fx_{hardware_id}/prpd
Nachrichtentypfx_stream_msgs/msg/Prpd
Nachrichtengröße52 B/Nachricht
Durchschnittliche Bandbreiteca. 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.

FeldTypBeschreibung
noisefloat32[3]Logit der Klasse noise für die Kanäle CH0~CH2 (dimensionsloser Score)
coronafloat32[3]Logit der Klasse corona für die Kanäle CH0~CH2 (dimensionsloser Score)
floatingfloat32[3]Logit der Klasse floating für die Kanäle CH0~CH2 (dimensionsloser Score)
surfacefloat32[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.

Kanalnoise (Logit)corona (Logit)floating (Logit)surface (Logit)Klassifikationsergebnis (argmax)Wahrscheinlichkeit (softmax)
ch0-0.962.98-3.550.30corona0.918 ( 91.8 % )
ch14.485.88-5.45-1.51corona0.802 ( 80.2 % )
ch2-6.54-1.390.730.45floating0.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:

softmax(xi)=exij=1Kexj\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}}

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:

softmax(xi)=eximax(x)j=1Kexjmax(x)\text{softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_{j=1}^{K} e^{x_j - \max(x)}}

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ückgeben

Common 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/prpd im 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 Befehl ros2 topic list ermitteln.

import numpy as np
import rclpy
from rclpy.node import Node
from fx_stream_msgs.msg import Prpd
# Labels in derselben Reihenfolge wie die Felder von Prpd.msg
LABELS = ['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.

Terminal-Fenster
source /opt/ros/humble/setup.bash
# Auch den Workspace sourcen, in dem das Nachrichtenpaket fx-stream-msgs gebaut wurde.
export ROS_DOMAIN_ID=123
python3 prpd_subscriber.py

Erwartete 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 prpd nicht sichtbar ist:

    • Prüfen Sie, ob die Firmware-Version v1.0.3c oder höher ist. Rufen Sie im Browser {CAMERA_IP}/setting/status auf oder prüfen Sie bei GET /setting/status den Wert firmware_version; bei einer älteren Version aktualisieren Sie die Firmware über das Web-Update oder das Shell-Update.

    • Prüfen Sie, ob die ROS_DOMAIN_ID auf der Empfängerseite mit der der Kamera übereinstimmt. Der Standardwert der Kamera ist 123; 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 list erneut, ob das Topic /fx_{hardware_id}/prpd erscheint.

  • 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.bash des Workspace und führen Sie das Programm erneut aus.
  • 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).
  • 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