TinySewer – Low Power Sewer Faults Detection System

Einführung

In den USA gibt es im ganzen Land rund 2 Millionen Kilometer Abwasserrohre, die 240 Millionen US-Bürger versorgten. Jedes Jahr werden in den Vereinigten Staaten mindestens 23.000–75.000 Abwasserrohrausfälle gemeldet, wodurch bis zu 3–10 Milliarden Gallonen unbehandeltes Abwasser in die Umwelt gelangen. Dies führt zu hohen wirtschaftlichen Verlusten, Wasserverschmutzung und gefährdet die Gesundheit der Bevölkerung.

Diese Abwasserrohre müssen jährlich gewartet werden, um ihre ordnungsgemäße Funktion aufrechtzuerhalten und ein Überlaufen des Abwasserkanals zu verhindern. In den meisten Fällen wird die Kanalinspektion vor Ort von einem fachkundigen Inspektor durchgeführt, der in der Regel einen ferngesteuerten Roboter mit Kamera verwendet, um die innere Struktur des Kanals manuell zu inspizieren. Dieser Vorgang ist zeitaufwändig und kann aufgrund der schwierigen und mühsamen Art der Arbeit oft zu fehlerhaften Inspektionen des Abwasserrohrs führen.

TinySewer

TinySewer ist ein unabhängiges Kameramodul, das Kanaldefekte mithilfe von tinyML erkennt. Dieses Modul soll auf einer vorhandenen Roboterplattform für die Kanalinspektion installiert werden, um der Plattform die Möglichkeit zu geben, Kanalfehler während des Inspektionsprozesses mithilfe maschineller Bildverarbeitung zu erkennen.

TinySewer auf einem Roboterauto installiert

Dieses Modul ermöglicht eine autonome Kanalinspektion und reduziert die Arbeitsbelastung des Inspektors. Der Prüfer kann das Auto einfach langsam fahren und auf dem Bildschirm nach Erkennungen durch die TinySewer-Anwendung Ausschau halten, oder er kann anhalten und manuell prüfen. Darüber hinaus zeigt TinySewer genau an, welche Art von Fehler vorliegt, so dass kein Bedarf besteht, einen erfahrenen Kanalinspektor zu haben, ein Generalinspektor oder sogar ein Einsteigerinspektor reicht aus.

Um die autonome Inspektion weiter zu unterstützen, zeichnet die TinySewer-Clientanwendung das gesamte Filmmaterial mit Erkennungskennzeichnungen auf der Videozeitleiste auf, damit der Inspektor das Filmmaterial überprüfen und problemlos den Zeitpunkt ermitteln kann, an dem der Fehler auftritt. Dies ermöglicht es dem Inspektor, sich während der laufenden Kanalinspektion anderen Aufgaben zu widmen.

Skalierbarkeit

Im Hinblick auf die Skalierbarkeit ist TinySewer einfach günstig, da es nur etwa 150 USD pro Einheit kostet und problemlos in ein bestehendes Robotersystem oder ein Kanalinspektionstool integriert werden kann. Darüber hinaus ermöglicht das leistungsstarke Fehlererkennungssystem TinySewer die Schaffung eines größeren Systems, in dem autonome Kanalinspektionsroboter, die routinemäßig Kanalinspektionen durchführen und Filmmaterial mit Defektbericht an einen einzelnen Großrechner senden, verschiedene Kanalfehlerberichte sortieren und Personal mit der Reparatur des defekten Abwasserkanals beauftragen können .

Autonomes Kanalinspektionssystem mit TinySewer als Bildverarbeitungssystem

Leistungsfähigkeit bei geringem Stromverbrauch

TinySewer verwendet den Arduino Portenta H7 als Hauptrecheneinheit. Der Arduino Portenta H7 verfügt über einen Dual-Core-Cortex-M7-Prozessor mit geringem Stromverbrauch, der zur Reduzierung des Stromverbrauchs beiträgt.

Demonstration der Low-Power-Funktionalität

Darüber hinaus ermöglicht TinySewer dem Bediener, die Kamera auszuschalten, wenn sich die Inspektion im Standby-Modus befindet oder beendet ist. Dadurch werden insgesamt ca. 40mA eingespart. Schließlich besteht für den Bediener die Möglichkeit, den Tiny Sewer herunterzufahren, wodurch das Gerät in den Tiefschlafmodus versetzt wird, bis eine externe Unterbrechung zum Aufwecken erfolgt.

Schaltpläne

Das TinySewer-Modul enthält einen Arduino Portenta-Mikrocontroller mit Peripheriegeräten, einschließlich eines Vision Shied, der über einen High-Density-Anschluss für die Kameraübertragung angeschlossen ist. Und zwei weiße LEDs, die direkt mit dem Arduino Portenta PH15-Pin verbunden sind und per PWM gesteuert werden. Alles wird von einer tragbaren Batterie mit 5 V und 2,4 Ampere mit Strom versorgt.

Gehäuse

TinySewer Das Gehäuse besteht aus PLA-Filament und kann mit der in diesem Beitrag bereitgestellten Datei problemlos mit einem 3D-Drucker gedruckt werden. Das Gehäuse umfasst eine Oberseite, eine Unterseite und eine Kappe.

Das Gerät wird wie folgt zusammengebaut: Zuerst wird der Arduino Portenta H7 eingesetzt, dann werden die beiden LEDs in die oberen beiden mittleren Löcher gesteckt und mit den Drähten des Arduino Portenta H7 verbunden. Platzieren Sie dann das Oberteil über dem Unterteil und befestigen Sie dann 4 M3-Schrauben an den 4 Ecken. Setzen Sie abschließend die Kappe über den freiliegenden Stiftbereich, um zu verhindern, dass Wasser und Staub in das Innere des Geräts gelangen.

Das Modell

TinySewer nutzt eine Deep-Learning-Architektur eines neuronalen Netzwerks zur Klassifizierung und Identifizierung verschiedener Arten von Kanalfehlern. Derzeit kann TinySewer die vier häufigsten Kanalfehlertypen (Risse, Wurzeleinbrüche, Verstopfungen, Verschiebungen) mit einer Sicherheit von mindestens 85 % erkennen

Arten von Kanalfehlern, die TinySewer erkennen kann. (a) Obstruktion, (b) Wurzeleinbruch, (c) Verschiebung, (d) Riss

Das Modell wird mit erstellt Kantenimpuls Plattform für maschinelles Lernen. Zuerst bekomme ich die Bilder von Wissenschaftsdaten. Der Datensatz wird mit einer CSV-Datei geliefert, die den Bildnamen und seinen Fehlertyp enthält. Ich erstelle einfach ein einfaches Python-Skript, das diese CSV liest und das Bild in den entsprechenden Fehlerordner sortiert. Diese Bilder werden dann zur Schulung auf Edge Impluse hochgeladen. Insgesamt hatten wir fünf verschiedene Klassen für unser Modell: Normal, Risse-Breche-Zusammenbrüche, Hindernis, Wurzel und Verschiebung.

Als Nächstes erstelle ich eine Impulsseite, um den Workflow einzurichten. Wählen Sie 96×96 als Bildbreite x Höhe, Verarbeitungsblock als Bild, übertragen Sie das Lernbild und klicken Sie dann auf „Parameter generieren“.

Gehen Sie als Nächstes zur Registerkarte „Bild“, um die Feature-Parameter zu generieren. Denken Sie daran, Graustufen für die Farbtiefe auszuwählen, da es sich beim Arduino Portenta Vision Shield um eine Monochromkamera handelt.

Wählen Sie abschließend die Registerkarte „Lernen übertragen“, um Ihr Modell zu trainieren. Für TinySewer verwende ich MobileNetV2 mit einer Lernrate von 0,35 und 40 Neuronen für die letzten Schichten.

Das Modell wird in 50 Epochen mit aktivierter Datenerweiterung trainiert. Die Gesamtgenauigkeit des Modells beträgt rund 94 %.

Zum Schluss die Modelldatei und die Etikettendatei für den Arduino Portenta generieren. Ich gehe zur Registerkarte „Bereitstellung“, wähle „OpenMV“ aus und klicke auf „Erstellen“. Dadurch wird eine ZIP-Datei generiert, die Folgendes enthält label.txt (Etikettendatei), train.tflite (Modelldatei) und ei_image_classification.py (Python-Klassifizierungsskript). Kopieren und einfügen label.txt Und train.tflite in den internen Speicher von Arduino Portenta. Das Skript muss geändert werden, um WLAN-, Video- und Datenübertragungsfunktionen bereitzustellen. Diese Änderungen werden im Abschnitt „Firmware“ besprochen

Firmware

Die Firmware wird mit MicroPython erstellt, einer einfachen Implementierung von Python3 mit einer Teilmenge von Standard-Python-Bibliotheken, die für die Ausführung auf einem Mikrocontroller optimiert ist.

Zunächst muss das WLAN eingerichtet werden, was ganz einfach mit der WLAN-Methode erledigt werden kann. Erstellen Sie dann einen Socket-Port, damit der Client mit TinySewer im selben Netzwerk kommunizieren kann.

# Server-Socket erstellen
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# Binden und zuhören
drucken(PORT)
s.bind([HOST, PORT])
s.listen(5)

# Setzen Sie den Server-Socket auf Blockieren
s.setblocking(True)

# Server-Socket erstellen
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# Binden und zuhören
drucken(PORT)
s.bind([HOST, PORT])
s.listen(5)

Als nächstes initiiert das Programm das Kameraobjekt und das MQTT-Objekt und legt die Variablenlast auf Modell und Beschriftung fest

# Kamera initialisieren
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.GRAYSCALE)

# Modell und Beschriftungen laden
net = “trained.tflite”
Etiketten = [line.rstrip(‘n’) for line in open(“labels.txt”)]

#MQTT einrichten
payload = MQTTClient(“openmv”, “test.mosquitto.org”, port=1883)
payload.connect()

Als nächstes definieren wir die Streaming-Funktion, die den Video-Feed von der TinySewer-Kamera mithilfe des MJPEG-Protokolls zurück in die Client-Anwendung streamt.

def start_streaming(s):
print ('Warten auf Verbindungen..')
client, addr = s.accept()
# Client-Socket-Timeout auf 5 Sekunden setzen
client.settimeout(5.0)
print ('Verbunden mit ' + Adr[0] + ':' + str(adr[1]))
# Leseanforderung vom Client
data = client.recv(1024)
# Sollte die Clientanfrage hier analysieren
# Mehrteiligen Header senden
client.sendall(“HTTP/1.1 200 OKrn”
„Server: OpenMVrn“
„Content-Type: multipart/x-mixed-replace;boundary=openmvrn“
„Cache-Control: kein Cachern“
„Pragma: kein Cachernrn“)
# FPS-Uhr
Uhr = time.clock()
# Beginnen Sie mit dem Streamen von Bildern

while (Wahr):
clock.tick() # Verfolgt die verstrichenen Millisekunden zwischen Snapshots().
Frame = sensor.snapshot()
cframe = frame.compressed(quality=35)
vorhersagen = Vorhersage(Rahmen)
#print(vorhersagen)
header = “rn–openmvrn”
„Inhaltstyp: Bild/JPEGrn“
„Content-Length:“+str(cframe.size())+“rnrn“
client.sendall(header)
client.sendall(cframe)
#client.sendall(bytes('POST /%s HTTP/1.0rnHost: 127.0.0.1:9990rnrn' % (predict), 'utf8'))
payload.publish(“openmv/test”, str(predict))
payload.check_msg() # Umfrage für Nachrichten.
print(clock.fps())

Als Nächstes definiere ich eine Vorhersagemethode, die einfach den aktuellen Frame betrachtet und die Konfidenz jedes Labels mithilfe des tinyML-Modells berechnet. Die Labels und die jeweilige Konfidenz werden zu einer einzigen Zeichenfolge verkettet, die dann über MQTT an die Clientanwendung gesendet wird

Def-Vorhersage(img):
Vorhersage = “”
#print(“Anruf vorhersagen”)
für obj in tf.classify(net, img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):
#print(“**********nVorhersagen unter [x=%d,y=%d,w=%d,h=%d]” % obj.rect())
#frame.draw_rectangle(obj.rect())
# Dies kombiniert die Beschriftungen und Konfidenzwerte in einer Liste von Tupeln
vorhersagen_list = list(zip(labels, obj.output()))
#prediction = Vorhersagen_Liste[0][1] #Defektvertrauen
für i in range(len(predictions_list)):
#print(“%s = %f” % (predictions_list[i][0]Vorhersagen_Liste[i][1]))
label = str(predictions_list[i][0])
secure = str(predictions_list[i][1])
Vorhersage += Label + “:” + zuversichtlich + “,”
#name = (predictions_list[i][0])
#if label != “normal” :
#prediction = Vorhersagen_Liste[i][1]
Rückkehrvorhersage

Dann habe ich eine lightcontrol()-Methode, um die Helligkeit der beiden LEDs zu steuern. Die Methode akzeptiert eine Ganzzahl zwischen 0 und 100, wobei 0 für das hellste und 100 für kein Licht steht

def lightControl(Prozent):
für k, pwm in pwms.items():
tim = Timer(pwm.tim, freq=1000) # Frequenz in Hz
ch = tim.channel(pwm.ch, Timer.PWM, pin=Pin(pwm.pin), pulse_width_percent=percent)

Schließlich gibt es eine Haupt-While-Schleife, die den anfänglichen Lichtwert festlegt und als Videostream-Funktion bezeichnet wird.

while (Wahr):
versuchen:
Lichtsteuerung(50)
start_streaming(s)
print(“Hauptaufruf”)
außer OSError als e:
print(“Socket-Fehler: “, e)
#sys.print_Exception(e)

Die vollständige Implementierung erfolgt auf Github in der Datei „sewer.py“.

Software

Die Software wird mit einem Framework namens Electron erstellt. Electron ermöglicht die Entwicklung von Desktop-GUI-Anwendungen mit Webtechnologien wie z Node.js. Der TinySewer-Client ist in zwei Registerkarten unterteilt. Die erste Registerkarte enthält den Videostream von TinySewer, Schaltflächen zum Aufzeichnen von Videos, eine Schaltfläche zur Lichtsteuerung und ein Anzeigefeld für den aktuellen Kanalfehler und dessen Zuverlässigkeit.

Die zweite Registerkarte dient der Videoanalyse. Der Stream wird automatisch als .mp4-Videodatei gespeichert, die zur weiteren Analyse abgespielt werden kann. Darüber hinaus gibt es auch eine Video-Zeitleiste, die die Dauer hervorhebt, wenn Kanalfehler erkannt werden

TinySewer in Aktion

You might also like

Comments are closed.