ML PoC für die Analyse der aquatischen Umwelt

ML PoC für die Analyse der aquatischen Umwelt

Itransition lieferte eine PoC-Lösung für die Planktonerkennung und -klassifizierung und bewies damit die Machbarkeit des vorgeschlagenen ML-Ansatzes.

Inhaltsverzeichnis

Kontext

Unser Kunde ist ein in den USA ansässiges Unternehmen, das von einer Gruppe von Wissenschaftlern und Ingenieuren gegründet wurde, um fortschrittliche Unterwassermess- und -beobachtungssysteme zu entwickeln und zu bauen, die auch in den schwierigsten Meeresumgebungen eingesetzt werden können. In dem Bestreben, das Wissen über die aquatische Umwelt unseres Planeten zu erweitern, haben sie integrierte Messplattformen gebaut, um alle Arten von physikalischen und chemischen Parametern in Echtzeit zu beobachten. Anhand dieser Daten erhalten Wissenschaftler und Unternehmen aus verschiedenen Branchen ein besseres Verständnis der komplexen Abhängigkeiten in Ökosystemen und können fundierte Entscheidungen treffen.

Eines der Probleme, mit denen sich der Kunde befasst, ist das Verständnis der Planktonzusammensetzung im Meerwasser durch die Erfassung von Daten über die Menge und Art des Planktons. Die Erkennung, Extraktion und Klassifizierung erfolgte auf der Grundlage eines überwachten Lernmodells unter Verwendung von Faltungsneuronalen Netzen (CNN). Die Aktivitäten erfolgten in Echtzeit auf ihrem eingebetteten NVIDIA Jetson KI-Computer, der mit einer Bildverarbeitungskamera gekoppelt ist. Die von ihnen selbst entwickelte, auf C++ basierende Software zur Erkennung von Plankton begrenzte die Bildverarbeitungsgeschwindigkeit auf 8-10 FPS, obwohl die maximal mögliche Geschwindigkeit der Kamera 30 FPS betrug. Daher war die Genauigkeit der Planktonerkennung, die für das Unternehmen wichtig ist, nicht zufriedenstellend, da das System ältere Versionen von CNN-Algorithmen verwendete.

Angesichts der Herausforderungen, mit denen der Kunde konfrontiert war, wollte er die folgenden Änderungen vornehmen:

  • Verbesserung oder Neugestaltung des Erkennungs- und Klassifizierungsansatzes, um den Anforderungen der Hardware gerecht zu werden, die volle Kompatibilität der App mit dem Computer und der Kamera zu gewährleisten und die Geschwindigkeit der Bildverarbeitung an die Geschwindigkeit der Kamera anzupassen
  • Die Möglichkeiten der Hardware voll ausschöpfen und die Genauigkeit der Erkennungs- und Klassifizierungsprozesse verbessern

Der Kunde war auf der Suche nach einem vertrauenswürdigen und kompetenten Partner, der das Projekt in Angriff nehmen und eine robuste Lösung zur Verbesserung der digitalen Leistung des Unternehmens liefern würde. Schließlich wandte er sich an Itransition, da wir uns aufgrund unserer starken ML-Beratungskompetenz und unserer Erfahrung mit der Lösung ähnlicher Herausforderungen als die richtige Wahl erwiesen.

Lösung

Analytik

Auf der Grundlage der zur Verfügung gestellten Dokumentation und der Codedatei kamen unsere Experten zu dem Schluss, dass es zwei mögliche Wege gibt, das Ziel des Kunden zu erreichen:

  • Verbesserung der bestehenden Lösung
  • Einen effizienteren Ansatz finden und eine neue Lösung von Grund auf entwickeln

Was die Verbesserung der aktuellen Lösung betrifft, haben unsere Experten eine Liste von Empfehlungen zur Beschleunigung des Codes und der Ausführung der Algorithmen erstellt. Dennoch entschieden wir und der Kunde schließlich, dass die Entwicklung eines völlig neuen Systems mit einer neuen Architektur und einem ausgewählten Technologiepaket eine viel schnellere und leichter zu wartende Option war. Sie würde auch die folgenden positiven Veränderungen mit sich bringen:

  • Die meisten Operationen werden im Arbeitsspeicher der Lösung ausgeführt, anstatt mit Dateien zu arbeiten, was die Ausführungszeit reduziert und die Leistung der Lösung beschleunigt
  • Multi-Thread-Verarbeitung ermöglichen (d.h. Aufteilung jedes Prozesses in separate Threads, die unabhängig von anderen Funktionen arbeiten), was die Ausführungszeit ebenfalls beschleunigen würde
  • Anwendung moderner ML-Algorithmen zur Verbesserung der Genauigkeit des Erkennungs- und Klassifizierungsprozesses des Kunden

Neue Lösungsvision und Untersuchung

Nach dem vorgeschlagenen Ansatz erkennt die Lösung Objekte in Bildern mithilfe des YOLO-Objekterkennungssystems. Dann wird das EfficientNet CNN auf die erhaltenen Ergebnisse angewandt und ein Vektor für jedes erkannte Objekt erstellt. Anschließend vergleicht die Lösung die erstellten Vektoren der erkannten Objekte mit den Referenzvektoren, wobei der Faiss- oder Annoy-Algorithmus zum Einsatz kommt, und wählt auf der Grundlage des geringsten Abstands zwischen ihnen aus.

Wir haben uns für Python als Hauptprogrammiersprache entschieden, weil es populär ist und sich im Vergleich zu dem früher verwendeten C++ schneller und einfacher entwickeln lässt, wobei es dennoch vergleichbare Leistungsergebnisse liefern würde.

Für das Training der Erkennungs- und Klassifizierungsmodelle zogen wir Tensorflow, PyTorch und Darknet in Betracht, ein in C und CUDA geschriebenes Open-Source-Framework für neuronale Netzwerke. Zunächst wollten wir die Einheitlichkeit der genutzten Bibliotheken sicherstellen und Tensorflow für beide Fälle verwenden, zumal Darknet leicht in Tensorflow konvertiert werden kann. Dies würde die Konsistenz der Modelltypen sicherstellen, da die Verwendung eines einzigen Frameworks mögliche Risiken reduziert. Sowohl Tensorflow als auch Darknet können mit der Jetson-CPU arbeiten, aber den maximalen Leistungsschub erhält man, wenn sie mit der GPU des Geräts arbeiten.

Nachdem wir die Frameworks jedoch auf dem Jetson-Modul des Kunden getestet hatten, stellten wir fest, dass Tensorflow aufgrund der nicht standardmäßigen ARM-Architektur des Moduls nicht richtig mit der GPU arbeiten konnte. Da es unmöglich war, das Beste aus den Fähigkeiten von Tensorflow herauszuholen, haben wir es zugunsten von Darknet für den Erkennungsprozess verworfen. Für das Training des Klassifizierungsmodells wählten wir PyTorch, da es auf dem Rechner des Kunden gut funktionierte und im Gegensatz zu Tensorflow dessen GPU-Ressourcen nutzen konnte.

Bei der Entscheidung, welchen Algorithmus wir für die Suche nach den nächsten Nachbarn (Nearest Neighbor Search, NNS) einsetzen sollten, hatten wir die Wahl zwischen Annoy und Faiss. Wir testeten beide Optionen und kamen zu dem Schluss, dass Faiss in Anbetracht der Besonderheiten des Unternehmens des Kunden und einer relativ geringen Anzahl von Werten (30+ Klassen mit 100 Bildern für jede Klasse) die bessere Lösung ist.

PoC-Entwicklung

Um den neuen Planktonerkennungsprozess zu evaluieren und die Lösung vor der Entwicklung fein abzustimmen, schlug Itransition vor, einen Proof of Concept (PoC) zu erstellen. Ein PoC hätte es uns ermöglicht, Implementierungsdetails auszuarbeiten, potenzielle Probleme zu lösen, die spezifischen technologischen Anforderungen des Kunden zu erfüllen und den am besten geeigneten technischen Ansatz und das Budget zu vereinbaren. Vor dem Beginn der PoC-Entwicklung hat der Kunde:

  • Bereitstellung von zwei markierten Datensätzen für die Erkennung und Klassifizierung zur Erstellung eines Vektorisierungsreferenzmodells. Wir werden dieses Referenzmodell dann weiter verwenden, um Daten mit dem Faiss-Algorithmus zu analysieren und zu vergleichen.
  • Erlaubte uns, die neue Software aus der Ferne und sicher (über SSH-Zugang) auf ihrem Rechner auszuführen, um die Zeit für die Kommunikation und den Datenaustausch zu verkürzen und die Kompatibilität der Lösung sowohl mit ihrem Computer als auch mit der Kamera sicherzustellen.

Der Hauptzweck des PoC war es, eine zufriedenstellende Interoperabilität zwischen der neuen App und der Hardware des Kunden sicherzustellen. Außerdem wollten wir die ausgewählten CNN-Algorithmen ausprobieren und feststellen, ob die von ihnen gebotene Genauigkeit ausreichend ist. Um die gesetzten Ziele der PoC-Phase zu erreichen, führte unser Team die folgenden Aktivitäten durch:

  • Entwurf einer für die Hardware des Kunden geeigneten Architektur, insbesondere der Module, die die Lösung enthalten sollte, um die erwarteten Erkennungs- und Klassifizierungsprozesse durchzuführen
  • Bereiten Sie Referenzdaten für das Training der Modelle vor, entfernen Sie doppelte, defekte oder unscharfe Bilder aus dem Referenzdatensatz und konvertieren Sie Bilder in ein einheitliches Format für die Frameworks
  • Implementieren von Lösungsmodulen und Installieren neuer Software auf dem Rechner des Kunden
  • Einrichten einer Kameraverbindung mit der PyCapture-Bibliothek und Aktivieren der Lösung, um Bilder von ihr zu erhalten und im RAM zu speichern
  • Prüfen und aktivieren Sie die Ausführung der neuen Software auf der GPU des Kundenrechners
  • Trainieren des YOLO CNN mit Darknet für die Planktonerkennung auf der Grundlage von etwa 1500 Bildern
  • Trainieren Sie das EfficientNet CNN mit PyTorch, um die Bilder mit detektiertem Plankton und Merkmalsvektoren basierend auf den Referenzbildern für die Klassifizierung zu kodieren (ca. 8000 Bilder gruppiert in 30+ Klassen)
  • Auswahl und Implementierung des Algorithmus zur Planktonklassifizierung auf der Grundlage des NNS-Ansatzes unter Verwendung des Faiss-Algorithmus
  • Erstellung von Funktionen zum Speichern der endgültigen Planktonbilder als BMPs und Statistiken in dem vom Kunden genehmigten Format
  • Testen Sie die Lösung auf der Hardware des Kunden und führen Sie die notwendigen Qualitäts- und Leistungsmessungen zur Laufzeit durch und finden Sie Wege, um die maximale Verarbeitungsgeschwindigkeit und Modellgenauigkeit im aktuellen Setup angesichts eines engen Zeitrahmens und begrenzten Budgets zu verbessern

Verfahren

Unser Projektteam bestand aus einem Projektmanager sowie Backend- und ML-Ingenieuren. Außerdem wurde ein Entwickler von der Kundenseite hinzugezogen, wenn wir bei der Arbeit mit der Maschine des Kunden Blockaden hatten. Wir hielten wöchentliche Besprechungen ab, in denen wir Entscheidungen trafen, den Kunden wöchentlich auf dem Laufenden hielten, ihn rechtzeitig über Blockierungen informierten und ihn zu Demos einluden.

Da das PoC-Entwicklungsprojekt viele Unbekannte enthielt, definierten und zerlegten wir den Projektumfang, identifizierten die wichtigsten Meilensteine und legten deren Fristen fest, um die Planung der Aktivitäten zu erleichtern und effizienter und überschaubarer zu gestalten. Vor Beginn der Entwicklung erstellten wir außerdem ein Architekturdiagramm und stimmten es mit dem Kunden ab.

Während des gesamten Projekts führten wir App-Tests auf den Geräten des Kunden durch, um sicherzustellen, dass die Module der Lösung sowohl lokal als auch auf dem Rechner des Kunden ordnungsgemäß funktionierten. Zu diesem Zweck starteten wir die Lösung, sahen uns die Protokolle an, ermittelten die Leistungskennzahlen für jedes Modul, sammelten Statistiken und nahmen bei Bedarf Änderungen und Verbesserungen vor. Zunächst testeten wir die Lösung auf unseren Systemen mit Bildern aus dem Ordner, später schlossen wir uns an die Kamera an und testeten das System mit einem Live-Videostream.

Während der PoC-Entwicklung passten wir unser Arbeitstempo an die vorgefundenen Komplexitäten an, wie z. B. die Auswahl der notwendigen Bibliotheken für die Bereitstellung der App auf dem Rechner des Kunden und die Verbindung mit der Kamera oder die Auswahl der Frameworks für das Modelltraining. Außerdem haben wir die Geschwindigkeit der verschiedenen Komponenten der Lösung gemessen, um Engpässe zu identifizieren und sie zu optimieren.

Herausforderungen

Herausforderung

Beschreibung

Lösung

Neue Software-Installation und Einrichtung der Umgebung auf dem Rechner des Kunden

Um die Anwendung ausführen zu können, mussten geeignete Bibliotheken und Pakete installiert werden, da der NVIDIA Jetson eine nicht standardisierte ARM-Architektur besitzt.

Bei der Installation der Bibliotheken stießen wir auf mehrere Hindernisse, da nicht alle Versionen unterstützt wurden.

Wir recherchierten und installierten die entsprechenden Bibliotheken (Numpy und Pillow für die Verarbeitung multidimensionaler Arrays, OpenCV für die Größenänderung von Bildern usw.), die für den Rechner des Kunden geeignet waren.

Wir richteten die Umgebung so ein, dass wir diese Bibliotheken nutzen konnten, da sie für die Bildverarbeitung entscheidend waren.

Wir testeten verschiedene Versionen der Bibliotheken, um herauszufinden, welche Version auf dem Gerät des Kunden am besten funktioniert, und sorgten für optimale Konfigurationen der Bibliotheken und des Geräts selbst.

Verbindung zur Kamera herstellen

Wir mussten herausfinden, welche Bibliotheken und deren Versionen von der Kamera unterstützt werden.

Wir recherchierten Bibliotheken und fanden die Versionen, die für die FLIR Grasshopper-Kamera und die entwickelte Lösung geeignet waren. Um Frames von der Kamera auslesen zu können, setzten wir die PyCapture-Bibliothek ein.

Leistungsoptimierung

Bei der Messung der erforderlichen Leistungskennzahlen haben wir mehrere Engpässe festgestellt:

  1. Die Geschwindigkeit des Standard-Algorithmus zur Konvertierung von Bildern in ein geeignetes Format (PyCapture zu numpy.ndarray, Pythons Standard für dreidimensionale Bilder) war zu langsam.

  2. Das Speichern von Planktonbildern war zu langsam.

Wir haben alternative Wege gefunden, um Bilder in ein geeignetes Format zu konvertieren und die Leistung der Lösung zu verbessern.

  1. Nachdem wir das PyCapture-Bildformat untersucht hatten, fanden wir heraus, dass es bereits das ndarray-Feld enthält, das nur leicht angepasst werden muss, anstatt es zusätzlich zu konvertieren.

  2. Wir haben das Konvertierungsformat von PNG auf BMP umgestellt und die Geschwindigkeit der Bildspeicherung versechsfacht.

Einrichtung der Erkennung und Vektorisierung auf der GPU der Kundenmaschine

Wir fanden heraus, dass TensorFlow die GPU schlecht ausnutzte und zu viel RAM benötigte.

Wir entschieden uns, Darknet und PyTorch für die Erkennung und Vektorisierung zu verwenden, da sie schneller laufen und die Ressourcen besser nutzen.

Architektonischer Aufbau

Der verfügbare Arbeitsspeicher führte zu Einschränkungen bei den Warteschlangen der Anwendungen und erforderte einen durchdachten Entwurf der Lösungsarchitektur.

Wir experimentierten mit der Anzahl der Warteschlangeneinheiten und deren Größe, um festzustellen, ob die Lösung ohne Einfrieren und Absturz funktionieren würde. Außerdem entwarfen wir eine Architektur, die es der Anwendung ermöglicht, die RAM-Nutzung zu optimieren.

Erkennung und Klassifizierung

Die gelieferte Lösung umfasst die folgenden Module:

  • Objekterkennung - das YOLO-Modell ermöglicht das Suchen und Finden aller Objekttypen auf einem Bild
  • Vektorisierung - EfficientNet führt den Vektorisierungsprozess für alle erkannten Objekte durch
  • Klassensuche (NNS) - der Faiss-Suchalgorithmus ermöglicht die Unterscheidung der ähnlichsten Vektoren zu einem gegebenen Vektor basierend auf dem Referenzdatensatz
  • Statistik - Erfassung aller für die Ergebnisanalyse erforderlichen Informationen
Plankton detection and classification

Indexerstellung

Dieser Schritt wird vor dem Hauptklassifizierungsschritt durchgeführt, da die Lösung die Klasse des gefundenen Planktons mithilfe des Faiss-Index und der JSON-Datei während des Schritts "Klassensuche" erhält:

  1. Erstellung des Faiss-Index, der ID und Vektorbündel für jedes Bild aus dem Referenzdatensatz enthält.
  2. Erstellen einer JSON-Datei, die ID und Klassenbündel für jedes Bild aus dem Referenzdatensatz enthält.

Objekterkennung

Frames erfassen

Es gibt zwei Quellen, aus denen Bilder geholt werden können - der Ordner mit Bildern und die Kamera:

  1. Der Ordner mit Bildern
    Das System öffnet ein Bild aus dem angegebenen Ordner und fügt es der Erkennungswarteschlange hinzu.
  2. Der Videostrom der Kamera
    Das System findet die Kamera, stellt eine Verbindung zu ihr her und bereitet sie gemäß den festgelegten Einstellungen vor. Dann beginnt die Bildaufnahme und etwa alle 100 ms (10 FPS) wird eine Callback-Funktion ausgelöst, die ein Bild im PyCapture-Bildformat empfängt. Das System konvertiert das Bild in numpy.ndarray (ein dreidimensionaler Array-Typ), um später damit arbeiten zu können, und fügt es der Erkennungswarteschlange hinzu.

Erkennung

  1. Entnahme eines Bildes aus der Erkennungswarteschlange und Skalierung auf 416x416 entsprechend den Anforderungen des Modells, um die Ausführungsgeschwindigkeit zu erhöhen, indem weniger RAM verwendet wird, ohne die Genauigkeit zu beeinträchtigen.
  2. Erkennen von Plankton auf dem komprimierten Bild und Abrufen einer Liste von Bounding-Box-Werten, die die Position des gefundenen Objekts angeben (x- und y-Koordinaten des Zentrums, Breite und Höhe).
  3. Hinzufügen der Bilder mit dem gefundenen Plankton in die Vektorisierungswarteschlange.

Klassifizierung

Vektorisierung

  1. Ein Bild mit einem Planktonobjekt aus der Vektorisierungs-Warteschlange holen und auf das vorgegebene Format 224x224 skalieren
  2. Bildnormalisierung auf das kompatible Format, damit EfficientNet das Bild korrekt verarbeiten kann
  3. Umwandlung des Bildes in das Vektorformat, das die Liste der 672 Float-Elemente darstellt
  4. Hinzufügen des Vektors mit einem Planktonobjekt in die Warteschlange der Klassensuche

Klassensuche

  1. Entnahme eines Bildvektors mit dem identifizierten Planktonobjekt aus der Warteschlange für die Klassensuche.
  2. Suche nach den fünf ähnlichsten Vektoren in der Faiss-Index-Warteschlange unter Verwendung des NNS-Algorithmus. Das Ergebnis ist eine Liste von Nachbar-IDs und eine Liste von Entfernungen zwischen ihnen und dem gegebenen Vektor.
  3. Aus der Liste der nächsten Nachbarn werden die häufigsten IDs ausgewählt und der Referenzvektor gewählt, dessen Abstand am geringsten ist, da er dem erkannten Objekt am ähnlichsten ist.
  4. Bestimmen des Planktonklassennamens anhand der JSON-Datei aus dem Faiss-Index, in der ID- und Klassenbündel gespeichert sind.
  5. Hinzufügen des Begrenzungsrahmens mit einer identifizierten Planktonobjektklasse in die Warteschlange der Statistiksammlung.
Solution architecture

Statistik

Das Statistikmodul ist dafür zuständig, alle Informationen zu sammeln, die zur Laufzeit auf Basis der gefundenen Daten gesammelt werden. Nachdem der Thread initialisiert wurde, finden folgende Aktionen statt:

  1. Holen einer Bounding Box mit einem Planktonobjekt aus der Statistics Collection Queue.
  2. Aufzeichnung der Ergebnisse in der TXT-Datei, einschließlich der ID, des Zeitstempels, der Bounding Box (x_min, y_min, x_max, y_max), der Erkennungswahrscheinlichkeit und einer Klasse für jedes gefundene Plankton.
  3. Speichern des gefundenen Planktons als BMP-Bild.

Roadmaps für Verbesserungen

Itransition definierte die nächsten Verbesserungsschritte für die PoC-Lösung, um die Leistung der Lösung und die Genauigkeit der Erkennungs- und Klassifizierungsmodelle zu erhöhen. Für die Modellgenauigkeit haben wir Folgendes vorgeschlagen:

  • Die Verwendung eines Datensatzes anstelle von zwei markierten Datensätzen sowohl für die Erkennung als auch für die Klassifizierung. Dies würde die Vielfalt der Referenzbeispiele für beide Prozesse vereinheitlichen und dazu beitragen, die Lage möglicher Engpässe und Nachteile besser zu verstehen.
  • Das Erkennungsmodell an einem größeren Datensatz trainieren und einen Algorithmus zur Berechnung des Fokus implementieren, d.h. einen strengen Algorithmus, der definiert, ob ein Objekt im Fokus oder außerhalb des Fokus ist (derzeit wird dies vom CNN entschieden). Wir haben vorgeschlagen, Untersuchungen durchzuführen, die besten Optionen zu finden und den Algorithmus zu implementieren.
  • Implementierung eines neuen Ansatzes zur Beschleunigung des Erkennungsprozesses, bei dem das gesamte Plankton, ob scharf oder unscharf, erkannt wird. Danach definiert ein Filter auf der Grundlage einer vordefinierten Regel, ob Objekte im Fokus sind oder nicht, wobei letztere anschließend entfernt werden.
  • Training des Klassifizierungsmodells mit einem Datensatz, der mehr Klassen und mehr Bilder pro Klasse enthält.

Um die Verarbeitungsgeschwindigkeit zu erhöhen, schlagen wir vor:

  • Untersuchung der Möglichkeiten, Faiss auf der GPU laufen zu lassen.
  • Die Architekturen der Erkennungs- und Klassifizierungsmodelle so umzugestalten, dass sie einen Stapel von Bildern gleichzeitig verarbeiten können und eine Geschwindigkeitssteigerung von 10-15 % ermöglichen, ohne den Arbeitsspeicher zu beeinträchtigen.
  • Die Ersetzung des aktuellen YOLOv4-Modells durch ein neueres YOLOv7, das auf PyTorch basiert, wird in Erwägung gezogen. Dies würde es dem Kunden ermöglichen, die Geschwindigkeit der Lösung und die Genauigkeit der Modelle auf der aktuellen Hardware mit der gleichen Menge an RAM und Rechenressourcen erheblich zu verbessern. Das Unternehmen würde auch die verwendeten Bibliotheken vereinheitlichen, indem es Darknet durch PyTorch ersetzt.

Am Ende der PoC-Entwicklung und nach der abschließenden Demo mit dem Kunden stellten wir ausführbare Dateien und Anweisungen zur Ausführung der App zur Verfügung. Nachdem der Kunde die Lösung in der realen Umgebung ausreichend genutzt und Daten gesammelt hat, werden wir eine vollständige Software-Suite entwickeln.

Ergebnisse

Itransition lieferte eine PoC-Lösung für die Erkennung und Klassifizierung von Plankton. Der PoC ermöglichte es dem Kunden, die Qualität und Leistung des von uns vorgeschlagenen Ansatzes zu testen, ohne in eine umfassende Lösung zu investieren. Durch die Implementierung des PoC konnten wir die Machbarkeit des vorgeschlagenen Ansatzes nachweisen und die gesetzten Ziele erreichen:

  • Gewährleistung der Kompatibilität des Computergeräts und der Kamera des Kunden mit der neuen Software
  • Steigerung der Bildverarbeitungsgeschwindigkeit von 8 FPS auf etwa 15 FPS
  • Erzielung einer 98%igen Genauigkeit der Erkennungs- und Klassifizierungsmodelle
  • Zusammenstellung einer Liste von Maßnahmen zur Verbesserung der Genauigkeit der Erkennungs- und Klassifizierungsmodelle und der Gesamtleistung der Lösung