Inhaltsverzeichnis:

Sternerkennung mit Computer Vision (OpenCV) - Gunook
Sternerkennung mit Computer Vision (OpenCV) - Gunook

Video: Sternerkennung mit Computer Vision (OpenCV) - Gunook

Video: Sternerkennung mit Computer Vision (OpenCV) - Gunook
Video: Astrofotografie Tutorial Teil 1: Stacking / Stacken mit DSS DeepSkyStacker 2024, Dezember
Anonim
Sternerkennung mit Computer Vision (OpenCV)
Sternerkennung mit Computer Vision (OpenCV)

Dieses anweisbare beschreibt Ihnen, wie Sie ein Computer-Vision-Programm erstellen, um automatisch Sternmuster in einem Bild zu identifizieren. Die Methode verwendet die OpenCV-Bibliothek (Open-Source Computer Vision), um eine Reihe trainierter HAAR-Kaskaden zu erstellen, mit denen bestimmte Sternenmuster erkannt werden können. Obwohl diese Anleitung im Kontext der Sternmustererkennung steht, kann das von mir beschriebene OpenCV-Verfahren auch auf andere Anwendungen angewendet werden - es wird also hoffentlich nützlich sein!

Das Projekt ist in diesem Video zusammengefasst:

Warum habe ich dieses instructable geschrieben?

  1. Die Methode zur Identifizierung von Sternenmustern, die ich entwickle, hat meiner Meinung nach das Potenzial, auf eine Vielzahl von Amateurastronomieprojekten angewendet zu werden - sei es die Teleskopausrichtung, die automatische Bildklassifizierung oder letztendlich sogar ein Sternsensor auf einem Open Source- oder Amateur-CubeSat.
  2. Es gibt hier viele gute OpenCV-Instructables, aber trotzdem fand ich es anfangs sehr schwierig zu lernen, daher hoffe ich, dass dieser Leitfaden eine gute Referenz für andere Leute ist, die HAAR-Klassifikatoren für OpenCV trainieren möchten (nicht unbedingt mit Astronomie vielleicht!).
  3. Ich bin selbst kein ausgebildeter Programmierer, daher hat dieses Projekt mein Verständnis wirklich gefördert. Hoffentlich werden durch das Schreiben dieses Instructable andere, erfahrenere Hersteller inspiriert, an diesem Konzept zu arbeiten und zum GitHub und diesem instructable über Kommentare auf dieser Seite beizutragen.
  4. Amateurastronomie und Orientierungsmethoden sind ein großes Interesse von mir, siehe meine vorherige Anleitung mit einem Arduino Star-Finder für Teleskope.

Das Titelbild dieses Instructable ist von einem Konzept 3U CubeSat-Design, an dessen Design ich teilgenommen habe. Ich habe es verwendet, um dieses instructable zu veranschaulichen, da die ursprüngliche Anwendung des Computer Vision Star-Erkennungssystems für einen Orientierungssensor für Amateur-CubeSats mit einer Raspberry Pi V2-Kamera sein sollte. Ich glaube, es gibt viele andere potenzielle Anwendungen für die Erkennung von Computer-Vision-Stars, aber ich denke, dies ist das Coolste!

Ein kleines Glossar:

Das Erlernen von Computer Vision wird durch die dumme Menge an verwendeten Fachbegriffen verlangsamt, daher werde ich hier einige für uns definieren:

Kaskade – Ein Klassifikator, der darauf trainiert ist, ein bestimmtes Zielobjekt zu identifizieren.

Bezugsmarkierung - Eine Markierung, die einem Bild einen visuellen Bezugspunkt hinzufügt.

HAAR - Haarähnliche Merkmale sind eine Art von Bildmerkmal, das für das Klassifikatortraining verwendet wird.

OpenCV - Open Source Computer Vision, eine Bibliothek von Computer Vision Tools.

Stellarium - Open Source Astronomie-Software.

Schritt 1: Anforderungen

OpenCV ist eine Linux-basierte Bibliothek. Obwohl es angeblich möglich ist, sie unter Windows gut zu betreiben, wird es Ihnen viel leichter fallen, sie in einer Linux-Umgebung auszuführen (nehmen Sie dies von mir und versuchen Sie viele Tage lang, sie vollständig zum Laufen zu bringen Fenster!). Als Experiment habe ich OpenCV heruntergeladen und auf meinem Raspberry Pi 3B+ ausgeführt, was erfolgreich war, obwohl das Klassifikatortraining ein sehr RAM-intensiver Prozess ist (was tatsächlich überraschend günstig sein kann) für ein paar Tage/Wochen/Monate und verwenden Sie dies als dedizierte Umgebung, in der das Klassifikator-Training durchgeführt wird. Sie können den Server von einem Windows-PC aus mit einem SSH-Client wie Putty steuern. Sobald die Kaskaden mit dem VPS trainiert wurden, können sie auf Ihren Windows-PC heruntergeladen werden, und Python kann verwendet werden, um das Bilderkennungsprogramm in einer Windows-Umgebung auszuführen.

Virtueller Linux-Server:

Ein virtueller Linux-Server (VPS) wird benötigt, um die HAAR-Kaskaden-Trainingsprozesse durchzuführen. Anfangs habe ich einen Server mit 8 GB RAM und Ubuntu 16.04.6 (LTS) x64 gemietet und später einen zweiten, um die Geschwindigkeit zu verdoppeln, mit der ich Kaskaden trainieren konnte, obwohl Sie nur mindestens einen benötigen

Software:

  • Stellarium - dies ist eine virtuelle Planetariums-/Astronomie-Software, die frei verfügbar ist. Es wird verwendet, um simulierte Sternbilder für die Verwendung in Tests zu sammeln.
  • Putty - Dies ist ein SSH-Client, der verwendet wird, um den VPS über die Befehlszeile zu steuern.
  • WinSCP - wird verwendet, um die Dateiübertragung vom Windows-PC durchzuführen.

Schritt 2: VPS-Setup

Es gibt einen kleinen Einrichtungsprozess, um den VPS zum Laufen zu bringen. Das erste Mal kann es für Sie etwas dauern, aber es ist nicht zu schwierig, wenn Sie die Schritte genau befolgen. Dieses Tutorial war eine großartige Referenz für mich, ich würde Ihnen empfehlen, dies auch zu lesen, während Sie dieses instructable durcharbeiten. Es behandelt die Besonderheiten der Linux-Befehle Zeile für Zeile, die buchstabengetreu befolgt werden müssen.

Grob umfasst der Prozess:

  1. Erstellung eines Linux-Servers mit korrekter Ubuntu-Version.
  2. Upgrade und Update des Servers.
  3. Erstellung eines Workspace-Verzeichnisses, in das OpenCV installiert wird.
  4. Installation einiger Essentials, nämlich eines Compilers, verschiedener Bibliotheken und Python-Bindungen.

Nach dieser Phase sind Sie bereit, sich auf den Schulungsprozess vorzubereiten.

Schritt 3: Der Prozess

Der gesamte Prozess der Computer Vision mit HAAR-Kaskaden ist zunächst ziemlich verwirrend, daher beschreibt dieser Schritt die Logik etwas detaillierter:

Grundlegender Prozess

  1. Es existiert ein negativer Bilddatensatz, der aus mehreren Tausend Bildern besteht, die das interessierende Objekt nicht enthalten. Diese muss auf den VPS hochgeladen werden.
  2. Es wird ein einzelnes positives Bild erstellt, das das interessierende Objekt enthält. Dies muss auch auf den VPS hochgeladen werden.
  3. Das einzelne positive Bild wird durch einen Satz gewählter Parameter verzerrt, verzerrt, gedreht usw. und einer Auswahl der negativen Bilder überlagert. Dies ist eine künstliche Methode, um aus einem einzigen Bild einen großen positiven Datensatz zu erstellen. (Für andere reale Anwendungen, wie die Identifizierung einer Katze, könnten Sie einfach mehrere tausend Bilder von Katzen verwenden, aber diese Methode ist nicht immer geeignet, wenn Sie nicht so viele positive Bilder haben. Der hier verwendete künstliche Ansatz weniger effektiv, aber es ist die einzige Option für einen solchen Anwendungsfall).
  4. Es wird ein Trainingsprozess durchgeführt, der in Etappen abläuft. Jede Stufe trainiert eine Kaskade, um verschiedene HAAR-artige Merkmale in den Bildsätzen zu identifizieren. Jede Stufe dauert exponentiell länger und die Effektivität des Klassifikators steigt jedes Mal (es ist auch möglich, zu viel zu trainieren, nur damit Sie es wissen!).
  5. Eine einzelne trainierte Kaskade kann nach einem einzelnen Zielobjekt suchen. Wenn Sie mehrere eindeutige Objekte identifizieren möchten, benötigen Sie für jedes eine trainierte Kaskade. In diesem Fall habe ich etwa 50 verschiedene Kaskaden für einzigartige Sternenmuster trainiert, um ein Set zu erstellen, das die nördliche Himmelshalbkugel abdecken könnte.
  6. Schließlich wird ein Erkennungsprogramm verwendet, das jede Kaskade eines Satzes gegen ein Eingabebild ausführt. Die Kaskade sucht im Eingabebild nach ihrem angegebenen Zielobjekt.
  7. Bei Erfolg wird das Zielobjekt im Eingabebild identifiziert.

n.b. bei Verwendung in einem Kontext zur Satellitenausrichtung würde ein Bild beispielsweise mit einer Bordkamera aufgenommen. Die hellsten Sterne in diesem Bild werden identifiziert und Markierungen werden an diesen Positionen überlagert. Dieses Bild wird dann dem Satz trainierter Kaskaden präsentiert, die testen, ob das Eingabebild eines der Zielobjekte enthält. Wenn ein echtes Positives erkannt wird, wird die Winkelposition einer bekannten Konstellation relativ zu den Achsen des Satellitenkörpers erkannt.

Schritt 4: Negatives und Positives

Negative

Ein wirklich wichtiger Aspekt des Kaskadentrainings besteht darin, einen möglichst großen Datensatz an Negativbildern zu haben. Wir sprechen von Tausenden, idealerweise von Zehntausenden von Bildern. Es spielt keine Rolle, was sie enthalten, das Ziel besteht nur darin, eine Vielzahl von visuellen Informationen bereitzustellen. Der Ordner Classifier Training enthält eine Vielzahl unterschiedlicher Negativbilddatensätze, die ich zusammengestellt habe. Anfangs bestanden diese ausschließlich aus simulierten Sternenfeldbildern von Stellarium, aber später erweiterte ich den Datensatz mit so vielen zufälligen Bildern, wie ich finden konnte (ja, einschließlich meiner Urlaubsfotos …). Der größte Datensatz dort umfasst fast 9000 Bilder, was der größte war, den ich bisher erstellt habe. Dadurch ersparen Sie sich das Kompilieren Ihrer eigenen.

Positives

Das positive Bild (das ist das Zielsternmuster, auf dessen Erkennung die Kaskade trainiert wird) beginnt als Screenshot eines Sternmusters in Stellarium. Ein Python-Programm identifiziert dann die hellsten Sterne im Bild und überlagert Marker (die später in dieser Anleitung erklärt werden) auf diese Sternpositionen. Dieses Bild wird dann auf 50x50 Pixel verkleinert. Dies ist klein, aber die für die Kaskaden erforderliche Trainingszeit wird mit zunehmender Größe exponentiell ansteigen, und dies ist daher ein guter Kompromiss zwischen Qualität und Zeit.

Schritt 5: Stellarium-Steuerung

Stellarium-Steuerung
Stellarium-Steuerung
Stellarium-Steuerung
Stellarium-Steuerung

Der Ordner Stellarium Scripts des GitHub-Repository enthält drei Programme, die ich geschrieben habe, um die Verwendung von Stellarium zu steuern. Um sie zu verwenden, legen Sie sie im Ordner scripts Ihres Stellarium-Installationsordners ab. Um sie auszuführen, können Sie das Skriptfenster aus dem Stellarium-Menü heraus öffnen oder einfach durch Doppelklick auf das Programm im Skriptordner, wodurch Stellarium gestartet und das ausgewählte Programm sofort ausgeführt wird.

thesis_4 und thesis_5 nehmen jeweils etwa 2000 Bilder der nördlichen bzw. südlichen Himmelshalbkugel auf. Diese wurden verwendet, um Datenbanken von Negativbildern zu bilden, um das Positivbild zu trainieren. Die Unterscheidung zwischen Nord und Süd war ein einfacher Weg, um sicherzustellen, dass das (positive) Sternmuster des Ziels nicht im negativen Datensatz vorhanden war, indem die Sternmuster der nördlichen Hemisphäre mit dem Bilddatensatz der südlichen Himmelshalbkugel trainiert wurden und umgekehrt. (Wenn auch ein positives Bild im negativen Bilddatensatz vorhanden ist, beeinflusst dies die Qualität des Klassifikators).

Auch thesis_setup ist nützlich - dies stellt Stellarium so ein, dass es für die Aufnahme von Bildern geeignet ist - die Bilder, die verwendet werden, um eine Ansicht aus dem Weltraum zu simulieren. Es führt Aktionen wie das Ausblenden von Menüs, Gitternetzlinien, Beschriftungen usw. automatisch aus, um Ihnen jedes Mal, wenn Sie ein Bild aufnehmen möchten, die Notwendigkeit zu ersparen.

Schritt 6: Raketenmann

Raketenmann
Raketenmann

Die ersten von mir trainierten Kaskaden waren nicht in der Lage, Sternenmuster richtig zu erkennen. Sie waren sehr unzuverlässig und sehr anfällig für Fehlalarme. Meine Annahme war, dass die Sternfeldbilder von Stellarium (im Grunde nur weiße Punkte auf schwarzem Hintergrund) einfach nicht genügend visuelle Informationen enthielten, um genügend HAAR-artige Merkmale für ein erfolgreiches Klassifikatortraining zu enthalten. Ich glaube, es war spät in der Nacht, aber ich beschloss, die Idee zu versuchen, ein Programm zu schreiben, das automatisch ein kleines Miniaturbild über der Position jedes hellen Sterns in einem Sternfeldbild platziert.

Elton

Dies war ein alberner Test, aber indem man jedem hellen Stern ein kleines Bild von Elton Johns Gesicht hinzufügte, den Klassifikator gegen dieses positive Bild trainierte und dann die Kaskaden gegen das Originalbild durchführte, war es viel effektiver, das richtige Bild zu finden richtiges Muster. Ich wusste, ich war auf etwas!

Schritt 7: Passermarken

Passermarken
Passermarken

Obwohl die 'Eltons' die Theorie bewiesen, brauchte ich einen Marker mit voller Rotationssymmetrie, damit das Sternenmuster unabhängig von der Ausrichtung gleich erscheint. Ich habe eine Reihe von Markierungstypen getestet und festgestellt, dass der Typ unten rechts mit den kontrastierenden schwarzen und weißen Ringen am effektivsten war. Das Python-Programm, das im positiven Ordner des GitHub-Repositorys präsentiert wird, zeigt, wie die hellsten Sterne in einem bestimmten Bild identifiziert werden, und diese Markierungen werden automatisch an diesen Positionen überlagert. Wir haben jetzt eine Darstellung der wichtigsten Sternenmuster erstellt, gegen die trainiert werden kann.

Schritt 8: Verwenden der Kaskaden

Verwenden der Kaskaden
Verwenden der Kaskaden

Wenn Sie eine Reihe von Kaskaden trainiert haben, müssen Sie wissen, wie Sie sie verwenden, um ein Objekt in einem Bild zu identifizieren!

Schauen Sie im Star Identification-Ordner des GitHub nach, wo Sie das Programm cascade_test19.py finden. Dieses Programm mit dem eingängigen Namen nimmt eine Reihe von Kaskaden aus einem bestimmten Ordner und führt sie alle gegen ein Eingabebild aus und meldet die vorgenommenen Erkennungen. Die Funktion 'detectMultiScale' ist der Kern davon und benötigt eine Vielzahl von Argumenten, die den Erkennungsprozess definieren. Diese zu ändern ist entscheidend für die Leistung des Kaskadenklassifikators, und weitere Diskussionen dazu finden Sie im folgenden Schritt, in dem wir uns ansehen, wie man falsch positive Ergebnisse eliminieren kann.

Dies könnte in einem Satelliten-Orientierungssystem angewendet werden, indem der Pixelwert in der Mitte des Begrenzungsrahmens mit der Ra/Dec-Himmelskoordinate des identifizierten Sternmusters korreliert und dann mit der Winkelverschiebung von der Bildmitte (Kamera Achse). Daraus kann unter Verwendung eines Verständnisses der Linsenverzerrung (angenähert an eine gnomonische Projektion) der Winkel des Satelliten aus nur zwei positiven Identifizierungen ermittelt werden.

Schritt 9: So bleiben Sie bei falsch positiven Ergebnissen positiv

So bleiben Sie bei falsch positiven Ergebnissen positiv
So bleiben Sie bei falsch positiven Ergebnissen positiv
So bleiben Sie bei falsch positiven Ergebnissen positiv
So bleiben Sie bei falsch positiven Ergebnissen positiv

Diese beiden Bilder zeigen die Ergebnisse des Tests des Kaskadensatzes mit einem identischen Bild, jedoch mit unterschiedlichen Parametern. Offensichtlich enthält das erste Bild die wahre Identifizierung, aber auch eine enorme Anzahl von falsch positiven Ergebnissen, während das zweite Bild nur die richtige Identifizierung enthält.

Das Programm cascade_test19.py im Star Identification-Ordner des GitHub-Repositorys verwendet zwei Methoden, um die Ergebnisse zu sortieren. Erstens setzt die Funktion detectMultiScale eine minimale und maximale Größe des gefundenen Ergebnisses, was sinnvoll ist, als ungefähre Größe des Zielsternmusters innerhalb des Fensters (für die gegebene Linse und Vergrößerung - meine simulierten Stellarium-Bilder verwenden die Eigenschaften von die Raspberry Pi V2-Kamera) ist bekannt. Zweitens wählt der Code das Ergebnis mit dem größten Begrenzungsrahmen (innerhalb der vorherigen Grenzen) aus. In Tests wurde festgestellt, dass dies das wahre Positive war. Drittens legt das Programm einen minimalen 'levelWeights' (effektiv 'Konfidenzwert') fest, der erforderlich ist, um diese ID als richtig positiv zu behandeln. Durch diese Methode waren die Kaskaden effektiv, um das richtige Ergebnis zu finden.

Neben den Sternenfeldbildern habe ich dies auch mit Bildern von meinem Schreibtisch getestet, zum Beispiel Trainingskaskaden, um mein Notizbuch, meine Tasse usw. zu identifizieren, um das Eliminieren von Fehlalarmen zu üben. Die oben genannten Methoden funktionierten unter allen Umständen gut, was ermutigend war.

Schritt 10: Diskussion

Diskussion
Diskussion
Diskussion
Diskussion
Diskussion
Diskussion

Verbesserungswürdige Bereiche

Dies war ein komplexes Projekt für mich und hat mein Verständnis des Themas wirklich vorangetrieben. Es hat insgesamt mehrere Monate fast Vollzeitarbeit gekostet, um das Projekt so weit zu bringen, dass ich es mit Ihnen teilen kann, aber es gibt noch viel zu tun, um die Leistung der Methode zu verbessern. So wie es aussieht, kann es innerhalb bestimmter Einschränkungen gut funktionieren. Ich habe daran gearbeitet, herauszufinden, in welchen Bereichen zusätzliche Arbeit erforderlich ist, und werde hoffentlich in den kommenden Monaten Zeit aufwenden können, um diese anzugehen. Sie sind:

Winkel - Dies ist ein komplexer Bereich, die Idee, dass die Ergebnisse der Klassifikatoren rotationsinvariant sein müssen, d. Eine Kaskade, die unter Verwendung eines Eingabebilds bei einer einzelnen Ausrichtung trainiert wird, kann dieses Bild nicht in zufälligen Ausrichtungen identifizieren, daher muss eine Varianz des positiven Bildwinkels in den Trainingsprozess eingeführt werden, um Kaskaden zu trainieren, die einen Bereich von Eingabewinkeln akzeptieren können. Der Parameter 'maxzangle' in den Kaskaden-Trainingsbefehlen verwendet ein Argument im Bogenmaß, das eine Grenze des Winkels steuert, in dem das eingegebene positive Bild den bereitgestellten negativen Bildern überlagert wird, sodass der resultierende positive Bildsatz einen Ausrichtungsbereich von. enthält das positive Bild. Mit zunehmendem Maxzangle nimmt jedoch die Akzeptanzrate (im weiteren Sinne die Qualität) der Kaskade stark ab. Ich glaube, die Lösung besteht darin, Kaskaden mit einer wesentlich größeren Datenbank von Negativbildern zu trainieren, als ich verwendet habe, um sicherzustellen, dass ein Kaskadenklassifikator von guter Qualität erstellt werden kann, selbst wenn er eine große Orientierungsstreuung enthält.

Eine andere mögliche Lösung wäre, eine Reihe von Kaskaden für ein bestimmtes Ziel zu trainieren, wobei jede Kaskade einen bestimmten Teil einer vollen 360-Grad-Drehung regelt. Auf diese Weise kann die Qualität der einzelnen Kaskaden auf einem hohen Niveau gehalten werden, andererseits entstehen dadurch jedoch weit mehr Kaskaden und damit der Identifikationsprozess langsamer.

Der Parameter 'levelWeight', ein Wert, der von der Funktion 'detectMultiScale' bereitgestellt wird, ist analog zu einem Vertrauenswert in der durchgeführten Erkennung. Um dies zu studieren, wurde die obige Grafik erstellt, die zeigt, wie das Vertrauen der positiven Identifizierung mit zunehmender Ausrichtung des Bildes in beide Richtungen stark abnimmt, was die Gedanken bestätigt, dass dies ein Schwachpunkt ist.

Pixelplatzierung - Ein viel einfacherer, aber auch problematischer Punkt ist der der Pixelplatzierung, veranschaulicht durch die folgenden beiden Bilder, die eine vergrößerte Ansicht eines Sternbildes zeigen, so dass die einzelnen Pixel zweier Sterne deutlich zu sehen sind. Der Erosionsprozess, der im Programm verwendet wird, um alle Sterne außer den hellsten aus dem Bild zu entfernen, behält den ersten Stern bei und verwirft den zweiten, obwohl sie die gleiche Helligkeit haben. Der Grund dafür ist, dass der erste Stern auf einem Pixel zentriert ist, während der zweite nicht so ist. Die Erosionsfunktion entfernt konzentrische Pixelringe um das zentrale Pixel einer Gruppe herum, so dass das zentrale Pixel des ersten Sterns die Erosionsfunktion überlebt, der zweite Stern jedoch vollständig aus dem Bild entfernt wird. Daher werden Passermarken nur auf dem ersten Stern platziert und nicht auf dem zweiten. Dies führt zu Inkonsistenzen in Bezug darauf, welche hellen Sterne in einem bestimmten Sternenfeld Markierungen erhalten (und daher mit den trainierten Klassifikatoren verglichen werden) - daher ist es möglich, dass eine korrekte positive Beobachtung nicht möglich ist.

Schritt 11: Letztes Wort

Letztes Wort
Letztes Wort

Vielen Dank für das Lesen meiner instructable, ich hoffe, dass Sie dieses Projekt faszinierend fanden. Es war ein sehr interessanter Prozess, daran zu arbeiten, es ist über ein Jahr her, seit ich mit der Arbeit an dem Konzept begonnen habe, und ich bin von den Ergebnissen bis zu diesem Punkt ermutigt. Aus der Literatur, die ich gelesen habe, ist dies ein ziemlich originelles Konzept, und mit mehr Entwicklung kann es sicherlich in einer Reihe von Anwendungen für die Amateurastronomie oder mehr angewendet werden.

Dieses Projekt war für mich eine steile Lernkurve, und daher hoffe ich, dass einige Leser mit mehr Programmiererfahrung inspiriert werden, über die GitHub-Seite zur Fortsetzung des Projekts beizutragen und wir dieses Open-Source-Tool weiter entwickeln können. Ich freue mich darauf, Ihre Kommentare zu lesen, aber bitte stellen Sie nicht zu viele schwierige Fragen!

Weltraumherausforderung
Weltraumherausforderung
Weltraumherausforderung
Weltraumherausforderung

Zweiter Platz bei der Weltraum-Herausforderung

Empfohlen: