Sommario:

Riconoscimento delle stelle tramite Computer Vision (OpenCV): 11 passaggi (con immagini)
Riconoscimento delle stelle tramite Computer Vision (OpenCV): 11 passaggi (con immagini)

Video: Riconoscimento delle stelle tramite Computer Vision (OpenCV): 11 passaggi (con immagini)

Video: Riconoscimento delle stelle tramite Computer Vision (OpenCV): 11 passaggi (con immagini)
Video: Introduzione a OpenCV in Python (prima parte) 2024, Novembre
Anonim
Riconoscimento delle stelle tramite visione artificiale (OpenCV)
Riconoscimento delle stelle tramite visione artificiale (OpenCV)

Questo tutorial ti descriverà come creare un programma di visione artificiale per identificare automaticamente i modelli di stelle in un'immagine. Il metodo utilizza la libreria OpenCV (Open-Source Computer Vision) per creare una serie di cascate HAAR addestrate che possono essere utilizzate per riconoscere modelli stellari specifici. Sebbene questa guida sia nel contesto del riconoscimento del modello a stella, il processo OpenCV che descrivo può essere applicato anche ad altre applicazioni, quindi si spera che sia utile!

Il progetto è riassunto in questo video:

Perché ho scritto questo istruibile?

  1. Il metodo di identificazione del modello stellare che sto sviluppando credo abbia il potenziale per essere applicato a una vasta gamma di progetti di astronomia amatoriale, che si tratti dell'orientamento del telescopio, della classificazione automatica delle immagini o anche, in definitiva, di un sensore stellare su un CubeSat open source o amatoriale.
  2. Ci sono molti buoni istruttori OpenCV qui, ma anche così ho trovato un processo molto difficile da imparare inizialmente, quindi spero che questa guida sarà un buon riferimento per altre persone che cercano di addestrare classificatori HAAR per OpenCV (non necessariamente a che fare con astronomia forse!).
  3. Non sono un programmatore esperto, quindi questo progetto ha davvero spinto la mia comprensione. Si spera che scrivendo questo Instructable altri produttori, più esperti, saranno ispirati a lavorare su questo concetto e contribuiranno a GitHub e a questo istruibile tramite commenti su questa pagina.
  4. L'astronomia amatoriale e i metodi di orientamento sono un mio grande interesse, vedi il mio precedente tutorial con un Arduino Star-Finder per telescopi.

La foto di copertina di questo Instructable è di un concept 3U CubeSat design di cui ho partecipato alla progettazione. L'ho usato per illustrare questa istruzione poiché l'applicazione originale del sistema di riconoscimento delle stelle di visione artificiale doveva essere per un sensore di orientamento per CubeSats di fabbricazione amatoriale, utilizzando una fotocamera Raspberry Pi V2. Ci sono molte altre potenziali applicazioni del riconoscimento delle stelle tramite visione artificiale credo, ma penso che questa sia la più bella!

Un piccolo glossario:

L'apprendimento della visione artificiale è reso più lento dalla stupida quantità di termini specialistici utilizzati, quindi ne definirò alcuni qui:

Cascade - Un classificatore addestrato per identificare un oggetto di destinazione specifico.

Marker fiduciario - Un marker che aggiunge un punto di riferimento visivo a un'immagine.

HAAR - Le caratteristiche simili a Haar sono un tipo di caratteristica dell'immagine utilizzata per l'addestramento del classificatore.

OpenCV - Open Source Computer Vision, una libreria di strumenti di visione artificiale.

Stellarium - Software di astronomia Open Source.

Passaggio 1: requisiti

OpenCV è una libreria basata su Linux, quindi sebbene sia presumibilmente possibile farla funzionare bene su Windows, sarà molto più facile eseguirla in un ambiente Linux (prendilo da me e molti giorni cercando di farlo funzionare completamente su Finestre!). Come esperimento, ho scaricato ed eseguito OpenCV sul mio Raspberry Pi 3B+, che ha avuto successo, sebbene l'addestramento del classificatore sia un processo che richiede molta RAM, quindi se desideri farlo a qualsiasi velocità, il percorso consigliato è assumere un server virtuale Linux (che può essere sorprendentemente economico in realtà) per alcuni giorni/settimane/mesi e utilizzarlo come ambiente dedicato in cui eseguire la formazione del classificatore. Sarai in grado di controllare il server da un PC Windows utilizzando un client SSH come Putty. Una volta che le cascate sono state addestrate utilizzando il VPS, possono essere scaricate sul tuo PC Windows e Python può essere utilizzato per eseguire il programma di riconoscimento delle immagini in un ambiente Windows.

Server virtuale Linux:

È necessario un server virtuale Linux (VPS) per eseguire i processi di formazione a cascata HAAR. Inizialmente ho assunto un server con 8 GB di RAM e Ubuntu 16.04.6 (LTS) x64, e successivamente un secondo per raddoppiare la velocità con cui potevo addestrare le cascate, anche se te ne servirebbe solo un minimo

Software:

  • Stellarium - questo è un software planetario/astronomia virtuale, disponibile gratuitamente. Verrà utilizzato per raccogliere immagini di stelle simulate da utilizzare nei test.
  • Putty - Questo è un client SSH che viene utilizzato per controllare il VPS tramite la riga di comando.
  • WinSCP: viene utilizzato per eseguire il trasferimento di file dal PC Windows.

Passaggio 2: configurazione VPS

C'è un piccolo processo di installazione per far funzionare il VPS. La prima volta potrebbe volerci un po' di tempo per te, ma non è troppo complicato se segui attentamente i passaggi. Questo tutorial è stato un ottimo riferimento per me, ti consiglio di leggerlo anche mentre lavori con questo istruibile. Copre le specifiche dei comandi linux riga per riga, che è necessario seguire alla lettera.

In linea di massima, il processo prevede:

  1. Creazione del server Linux con la versione Ubuntu corretta.
  2. Aggiornamento e aggiornamento del server.
  3. Creazione di una directory dello spazio di lavoro, in cui è installato OpenCV.
  4. Installazione di alcuni elementi essenziali, vale a dire un compilatore, varie librerie e collegamenti Python.

Dopo questa fase, sei pronto per iniziare a prepararti per il processo di formazione.

Passaggio 3: il processo

L'intero processo di visione artificiale che utilizza le cascate HAAR è inizialmente piuttosto confuso, quindi questo passaggio descrive la logica in modo un po' più dettagliato:

Processo di base

  1. Esiste un set di dati di immagini negative, costituito da diverse migliaia di immagini che non contengono l'oggetto di interesse. Questo dovrà essere caricato sul VPS.
  2. Viene creata un'unica immagine positiva che contiene l'oggetto di interesse. Anche questo dovrà essere caricato sul VPS.
  3. La singola immagine positiva è distorta, deformata, ruotata, ecc., da un insieme di parametri scelti e sovrapposta a una selezione delle immagini negative. Questo è un modo artificiale per creare un grande set di dati positivi da una singola immagine. (Per altre applicazioni del mondo reale, come l'identificazione di un gatto, potresti semplicemente utilizzare diverse migliaia di immagini di gatti, ma questo metodo non è sempre appropriato se non hai un insieme così ampio di immagini positive. L'approccio artificiale utilizzato qui sarà meno efficace, ma è l'unica opzione per un caso d'uso come questo).
  4. Viene eseguito un processo di formazione, che funziona in più fasi. Ogni fase addestrerà una cascata per identificare diverse caratteristiche di tipo HAAR all'interno dei set di immagini. Ogni fase richiede in modo esponenziale più tempo per essere completata e l'efficacia del classificatore aumenta ogni volta (è anche possibile allenarsi eccessivamente solo per quello che sai!).
  5. Una singola cascata addestrata sarà in grado di cercare un singolo oggetto target. Se desideri identificare più oggetti univoci, avrai bisogno di una cascata addestrata per ciascuno. In questo caso, ho addestrato circa 50 cascate diverse per schemi stellari unici, per creare un set che potesse coprire l'emisfero celeste settentrionale.
  6. Infine, viene utilizzato un programma di rilevamento che esegue ogni cascata di un set su un'immagine di input. La cascata cercherà il suo oggetto target dato all'interno dell'immagine di input.
  7. In caso di successo, l'oggetto target verrà identificato all'interno dell'immagine di input.

n.b. se utilizzato in un contesto di orientamento satellitare, ad esempio, un'immagine verrebbe catturata utilizzando una fotocamera di bordo. Le stelle più luminose in quell'immagine verranno identificate e gli indicatori verranno sovrapposti in quelle posizioni. Questa immagine viene quindi presentata all'insieme di cascate addestrate, che verificheranno se l'immagine di input contiene uno degli oggetti di destinazione. Se viene rilevato un vero positivo, viene rilevata la posizione angolare di una costellazione nota rispetto agli assi del corpo del satellite.

Passaggio 4: aspetti negativi e positivi

negativi

Un aspetto davvero fondamentale dell'addestramento a cascata è disporre di un set di dati il più ampio possibile di immagini negative. Stiamo parlando di migliaia, idealmente decine di migliaia di immagini. Non importa cosa contengano, l'obiettivo è solo quello di fornire una varietà di informazioni visive. La cartella Classifier Training contiene una varietà di diversi set di dati di immagini negative che ho compilato. Inizialmente questi erano costituiti esclusivamente da immagini del campo stellare simulate raccolte da Stellarium, ma in seguito ho aumentato il set di dati con tutte le immagini casuali che ho potuto trovare (sì, comprese le foto delle mie vacanze …). Il set di dati più grande include quasi 9000 immagini, che era il più grande che ho creato finora. Usando questo ti risparmierai la compilazione del tuo.

Positivi

L'immagine positiva (ovvero lo schema stellare target che la cascata sarà addestrata a riconoscere) inizia come screenshot di uno schema stellare in Stellarium. Un programma Python identifica quindi le stelle più luminose nell'immagine e sovrappone i marcatori (spiegati più avanti in questa guida) su queste posizioni delle stelle. Questa immagine viene quindi ridotta a 50x50 pixel. Questo è piccolo, ma il tempo di addestramento richiesto per le cascate aumenterà esponenzialmente all'aumentare di questa dimensione, e quindi questo è un buon compromesso tra qualità e tempo.

Passaggio 5: controllo Stellarium

Controllo Stellarium
Controllo Stellarium
Controllo Stellarium
Controllo Stellarium

La cartella Stellarium Scripts del repository GitHub contiene tre programmi che ho scritto per controllare l'uso di Stellarium. Per usarli, inseriscili nella cartella degli script della tua cartella di installazione di Stellarium. Per eseguirli, puoi aprire la finestra degli script dal menu di Stellarium, o semplicemente facendo doppio clic sul programma nella cartella degli script, che avvierà Stellarium ed eseguirà immediatamente il programma selezionato.

thesis_4 e thesis_5 catturano circa 2000 immagini ciascuno degli emisferi celesti rispettivamente settentrionale e meridionale. Questi sono stati usati per formare database di immagini negative, contro cui addestrare l'immagine positiva. La distinzione tra nord e sud era un modo semplice per garantire che il modello stellare target (positivo) non fosse presente nel set di dati negativo addestrando i modelli stellari dell'emisfero settentrionale contro il set di dati di immagini dell'emisfero celeste meridionale e viceversa. (Se un'immagine positiva è presente anche all'interno del set di dati dell'immagine negativa, influenzerà la qualità del classificatore).

thesis_setup è anche utile - questo imposta Stellarium in modo che sia appropriato per l'acquisizione di immagini - le immagini utilizzate per simulare una vista dallo Spazio. Esegue automaticamente azioni come nascondere menu, griglie, etichette, ecc.

Passaggio 6: Rocket Man

Uomo razzo
Uomo razzo

Le prime cascate che ho addestrato non sono state in grado di identificare correttamente alcun modello di stella. Erano molto inaffidabili ed erano molto inclini a falsi positivi. La mia ipotesi era che effettivamente le immagini del campo stellare di Stellarium (fondamentalmente solo punti bianchi su sfondo nero) non contenessero informazioni visive sufficienti per contenere abbastanza caratteristiche di tipo HAAR per un addestramento di successo dei classificatori. Penso che fosse notte fonda, ma ho deciso di provare l'idea di scrivere un programma per posizionare automaticamente una piccola immagine di anteprima sulla posizione di ogni stella luminosa in un'immagine del campo stellare.

Elton

Questo è stato un test sciocco, ma aggiungendo una piccola immagine del viso di Elton John a ciascuna posizione di una stella luminosa, addestrando il classificatore contro questa immagine positiva e quindi eseguendo le cascate contro l'immagine originale, è stato molto più efficace nel trovare correttamente il modello giusto. Sapevo di essere su qualcosa!

Passaggio 7: marcatori fiduciari

Marcatori fiduciari
Marcatori fiduciari

Sebbene gli "Elton" abbiano dimostrato la teoria, avevo bisogno di un marcatore che avesse una simmetria rotazionale completa, in modo che lo schema delle stelle apparisse lo stesso indipendentemente dall'orientamento in cui era presentato. Ho testato una serie di tipi di pennarelli e ho scoperto che il tipo in basso a destra era più efficace, con gli anelli bianchi e neri a contrasto. Il programma Python presentato nella cartella positiva del repository GitHub mostra come vengono identificate le stelle più luminose in una data immagine e questi indicatori vengono automaticamente sovrapposti in quelle posizioni. Ora abbiamo creato una rappresentazione dei principali modelli di stelle contro i quali è possibile allenarsi.

Passaggio 8: utilizzo delle cascate

Utilizzo delle cascate
Utilizzo delle cascate

Quando hai addestrato una serie di cascate, devi sapere come usarle per identificare un oggetto in un'immagine!

Guarda la cartella Star Identification di GitHub, dove troverai il programma cascade_test19.py. Questo programma dal nome accattivante prende una serie di cascate da una determinata cartella e le esegue tutte su un'immagine di input e riporta i rilevamenti effettuati. La funzione 'detectMultiScale' è il fulcro di questo e richiede una varietà di argomenti che definiscono il processo di rilevamento. La modifica di questi è fondamentale per le prestazioni del classificatore a cascata e ulteriori discussioni su questo possono essere trovate nel passaggio successivo, in cui esaminiamo come eliminare i falsi positivi.

Questo potrebbe essere applicato in un sistema di orientamento satellitare correlando il valore del pixel al centro del riquadro di delimitazione alla coordinata celeste Ra/Dec del pattern stellare identificato, e quindi correlandolo allo spostamento angolare dal centro dell'immagine (fotocamera asse). Da questo, utilizzando una comprensione della distorsione della lente (approssimata a una proiezione gnomonica), l'angolo del satellite può essere trovato da due sole identificazioni positive.

Passaggio 9: come rimanere positivi sui falsi positivi

Come Rimanere Positivo Sui Falsi Positivi
Come Rimanere Positivo Sui Falsi Positivi
Come Rimanere Positivo Sui Falsi Positivi
Come Rimanere Positivo Sui Falsi Positivi

Queste due immagini mostrano i risultati del test del set a cascata rispetto a un'immagine identica, ma con parametri diversi. Chiaramente la prima immagine contiene la vera identificazione, ma anche un enorme numero di falsi positivi, mentre la seconda immagine contiene solo la corretta identificazione.

Il programma cascade_test19.py all'interno della cartella Star Identification del repository GitHub utilizza due metodi per ordinare i risultati. In primo luogo, la funzione detectMultiScale imposta una dimensione minima e massima del risultato che può essere trovato, il che è ragionevole, come la dimensione approssimativa del modello stellare di destinazione all'interno della finestra (per l'obiettivo e l'ingrandimento dati - le mie immagini simulate di Stellarium usano le proprietà di la fotocamera Raspberry Pi V2) è noto. In secondo luogo, il codice selezionerà il risultato con il riquadro di delimitazione più grande (entro i limiti precedenti). Nei test, questo è risultato essere il vero positivo. In terzo luogo, il programma stabilisce un "levelWeights" minimo (effettivamente "valore di confidenza") necessario per trattare questo ID come un vero positivo. Con questo metodo, le cascate erano efficaci nel trovare il risultato corretto.

Oltre alle immagini del campo stellare, ho anche testato questo con le immagini della mia scrivania, ad esempio, addestrando cascate per identificare il mio taccuino, tazza ecc., Per esercitarmi nell'eliminazione dei falsi positivi. I metodi di cui sopra hanno funzionato bene in tutte le circostanze, il che è stato incoraggiante.

Passaggio 10: discussione

Discussione
Discussione
Discussione
Discussione
Discussione
Discussione

Aree di miglioramento

Questo è stato un progetto complesso per me e ha davvero spinto la mia comprensione dell'argomento. Ha richiesto un totale di diversi mesi di lavoro quasi a tempo pieno per portare il progetto a questo punto, quando posso condividerlo con voi, ma c'è ancora molto lavoro da fare per migliorare le prestazioni del metodo. Così com'è, può funzionare bene entro certi limiti. Ho lavorato per identificare quali aree necessitano di ulteriore lavoro e spero di poter dedicare del tempo ad affrontarle nei mesi a venire. Loro sono:

Angolo - Questa è un'area complessa, l'idea che i risultati dei classificatori debbano essere invarianti alla rotazione, cioè, dovrebbe identificare l'affidabilità del modello stellare di destinazione indipendentemente dall'angolo con cui viene presentata l'immagine contenente lo schema stellare di destinazione. Una cascata addestrata utilizzando un'immagine di input con un singolo orientamento non sarà in grado di identificare quell'immagine con orientamenti casuali, quindi la varianza dell'angolo positivo dell'immagine deve essere introdotta nel processo di addestramento per addestrare le cascate che possono accettare un intervallo sugli angoli di input. Il parametro 'maxzangle' nei comandi di addestramento a cascata accetta un argomento in radianti, che controlla un limite dell'angolo in cui l'immagine positiva di input verrà sovrapposta alle immagini negative fornite, quindi l'insieme di immagini positive risultante conterrà una gamma di orientamenti di l'immagine positiva Tuttavia, all'aumentare di questo maxzangle, il rapporto di accettazione (in senso lato, la qualità) della cascata si ridurrà drasticamente. Credo che la soluzione sia addestrare le cascate utilizzando un database significativamente più grande di immagini negative rispetto a quello che stavo usando per garantire che un classificatore a cascata di buona qualità possa essere creato anche incorporando un'ampia diffusione dell'orientamento.

Un'altra potenziale soluzione sarebbe quella di addestrare un numero di cascate per un obiettivo specifico, ciascuna cascata che governa una certa porzione di una rotazione completa di 360 gradi. In questo modo la qualità di ciascuna cascata può essere mantenuta ad un livello elevato, ma d'altro canto ciò si tradurrà in molte più cascate e quindi il processo di identificazione sarà più lento.

Il parametro 'levelWeight', che è un valore fornito dalla funzione 'detectMultiScale', è analogo a un valore di confidenza nel rilevamento che è stato effettuato. Studiando questo, è stato creato il grafico sopra, che mostra come la fiducia nell'identificazione positiva diminuisca bruscamente man mano che l'orientamento dell'immagine aumenta in entrambe le direzioni, confermando i pensieri che questo è un punto debole.

Posizionamento dei pixel - Un punto molto più semplice, ma anche problematico è quello del posizionamento dei pixel, illustrato dalle due immagini seguenti, che mostrano una vista ingrandita di un'immagine di una stella, in modo che i singoli pixel di due stelle possano essere chiaramente visti. Il processo di erosione utilizzato nel programma per eliminare dall'immagine tutte le stelle eccetto le stelle più luminose manterrà la prima stella e scarterà la seconda, nonostante siano di uguale luminosità. Il motivo è che la prima stella è centrata su un pixel, mentre la seconda non lo è. La funzione di erosione rimuove anelli concentrici di pixel attorno al pixel centrale di un gruppo, quindi la prima stella farà sopravvivere il pixel centrale alla funzione di erosione, ma la seconda stella sarà completamente rimossa dall'immagine. Pertanto i marker fiduciali verranno posizionati solo sulla prima stella e non sulla seconda. Ciò causerà incongruenze relative a quali stelle luminose in un dato campo stellare riceveranno marcatori (e quindi saranno confrontate con i classificatori addestrati) - quindi è possibile che una corretta osservazione positiva non sia possibile.

Passaggio 11: ultima parola

Ultima parola
Ultima parola

Grazie per aver letto il mio istruibile, spero che tu abbia trovato questo progetto intrigante. È stato un processo molto interessante lavorarci, è passato più di un anno da quando ho iniziato a lavorare sul concetto, e sono incoraggiato dai risultati fino a questo punto. Dalla letteratura che ho letto, questo è un concetto piuttosto originale, e con maggiore sviluppo può certamente essere applicato in una gamma di applicazioni per l'astronomia amatoriale o altro.

Questo progetto è stato per me una curva di apprendimento ripida, quindi spero che alcuni lettori con più esperienza di programmazione possano essere ispirati a contribuire alla continuazione del progetto attraverso la pagina GitHub, e possiamo continuare a sviluppare questo strumento open source. Non vedo l'ora di leggere eventuali commenti che potresti avere, ma per favore non fare troppe domande difficili!

Sfida spaziale
Sfida spaziale
Sfida spaziale
Sfida spaziale

Secondo classificato nella sfida spaziale

Consigliato: