Wie und warum ich eine Raucherkennungsbibliothek erstellt habe

Über mich

Ich bin ein Doktorand, der seit 2010 an Computer-Vision-Problemen arbeitet

Das Problem, das ich lösen wollte

Als Teilnehmer an einem Regierungsprojekt musste ich einen Algorithmus entwickeln, um Rauch zu erkennen, der von einer Überwachungskamera aufgenommen wurde. Der Algorithmus hätte mit C++ implementiert und in eine Lösung mit GUI eingebettet werden sollen, die von einem anderen Softwareentwickler erstellt wurde.
Eine der Einschränkungen war die begrenzte Verarbeitungsleistung eines einzelnen CPU-Kerns, während das Ziel darin bestand, eine Leistung von mindestens fünf Bildern pro Sekunde zu erreichen.

Was ist eine Raucherkennungsbibliothek?

Das von mir erstellte Programm konnte eine Folge von Einzelbildern von einer Kamera empfangen und erkennen, ob Rauch darauf auftauchte.

Tech-Stack

Ich habe Microsoft Visual Studio verwendet, um den C++-Code zu schreiben und zu kompilieren.
Die OpenCV-Bibliothek wurde verwendet, um die E/A zu vereinfachen und das Datenformat zu standardisieren, um mit anderen Entwicklern zusammenzuarbeiten.

Der Prozess des Aufbaus einer Raucherkennungsbibliothek

Ganz am Anfang habe ich damit begonnen, hochmoderne Forschungsartikel zu lesen, in denen verschiedene Ansätze zur Lösung meines Problems erläutert wurden.
Ich habe den Algorithmus gewählt, den ich für schnell genug hielt.

Ich fing an, einen Algorithmus zu entwickeln und ihn in Matlab zu implementieren. Es funktionierte sehr langsam, aber die Erkennungsrate war akzeptabel. Ich habe auch meine eigenen Filter hinzugefügt, wie z. B. Kantendichte, da Rauch normalerweise eine unterschiedliche Dichte hat und mehrere Kanten in sich selbst verursacht.

Der nächste Schritt war die Neuimplementierung des Algorithmus in C++ und OpenCV. Alle Daten wurden im Mat-Typ und in der Datenstruktur vector gespeichert.
Nachdem ich den Algorithmus getestet hatte, konnte ich fünf fps erreichen, aber es begann bei neuen Testsets zu scheitern. Meine handgefertigten Funktionen und Entscheidungsregeln sind fehlgeschlagen. Ich habe dann weitere Daten mit Haar-ähnlichen Funktionen hinzugefügt und alles in AdaBoost eingespeist, in der Hoffnung, dass es die Eingabe gut verallgemeinern kann. AdaBoost erreichte eine Genauigkeit von über 90 %, was für das Projekt ausreichte.

Herausforderungen, denen ich mich gestellt habe

Der schwierige Teil war die Kommunikation mit anderen Entwicklern, die OOP noch nie verwendet haben und funktionale Programmierung bevorzugen. Ich musste die gesamte Struktur der Lösung mit allen Klassen entwickeln, die von dynamischen Bibliotheken bereitgestellt wurden.

Schlüsselqualifikationen

In dem Projekt haben wir kein Versionskontrolltool wie Git verwendet. Alle neuen Versionen des Quellcodes wurden in verschiedenen Ordnern gespeichert, was die endgültige Sammlung von Änderungen zu einem Albtraum machte.
Ich habe auch mein Wissen über STL verbessert.

Tipps und Ratschläge

Verwenden Sie die Versionskontrolle.
Schreiben Sie Tests (TDD hilft, insbesondere wenn Randbedingungen überprüft werden).
Versuchen Sie, Code auf mehreren Sätzen zu testen, um eine Überanpassung Ihres Ansatzes zu vermeiden.

Abschließende Gedanken und nächste Schritte

Dieses Projekt war hilfreich für das Verständnis von Teamarbeit und die Implementierung verschiedener Algorithmen.
Ich glaube, ich hatte genug von handgefertigten Features. Deep Learning eröffnet Möglichkeiten zur Verbesserung der Gesamtgenauigkeit, wenn es möglich ist, große Datensätze zu erhalten. Es ist jetzt meine Leidenschaft.

Similar Posts

Leave a Reply

Your email address will not be published.