Cuprins:

Recunoașterea stelelor folosind viziunea computerizată (OpenCV): 11 pași (cu imagini)
Recunoașterea stelelor folosind viziunea computerizată (OpenCV): 11 pași (cu imagini)
Anonim
Recunoașterea stelelor folosind viziunea computerizată (OpenCV)
Recunoașterea stelelor folosind viziunea computerizată (OpenCV)

Această instrucțiune vă va descrie cum să creați un program de viziune pe computer pentru a identifica automat modelele de stele dintr-o imagine. Metoda utilizează biblioteca OpenCV (Open-Source Computer Vision) pentru a crea un set de cascade HAAR instruite care pot fi utilizate pentru a recunoaște tipare stelare specifice. Deși acest ghid se află în contextul recunoașterii tiparului de stele, procesul OpenCV pe care îl descriu poate fi aplicat și altor aplicații - așa că sperăm că va fi util!

Proiectul este rezumat în acest videoclip:

De ce am scris acest lucru instructabil?

  1. Metoda de identificare a modelului stelar pe care o dezvolt, cred că are potențialul de a fi aplicată la o gamă largă de proiecte de astronomie amator - indiferent dacă este vorba de orientarea telescopului, clasificarea automată a imaginilor sau chiar în cele din urmă un senzor de stea pe o sursă deschisă sau CubeSat amator.
  2. Există o mulțime de instrumente OpenCV bune aici, dar chiar și așa mi s-a părut un proces foarte dificil de învățat inițial, așa că sper că acest ghid va fi o bună referință pentru alte persoane care doresc să instruiască clasificatori HAAR pentru OpenCV (nu neapărat de a face cu astronomie poate!).
  3. Eu nu sunt un programator instruit, așa că acest proiect mi-a împins cu adevărat înțelegerea. Sperăm că, scriind acest Instructable, alți producători mai experimentați vor fi inspirați să lucreze la acest concept și să contribuie la GitHub și acest instructable prin comentarii pe această pagină.
  4. Astronomia amatorilor și metodele de orientare sunt un mare interes pentru mine, vezi instrucțiunile mele anterioare cu un Arduino Star-Finder for Telescopes.

Fotografia de copertă a acestui Instructable este de un concept 3U CubeSat design la care am participat la proiectare. L-am folosit pentru a ilustra acest lucru instructiv, deoarece aplicația originală a sistemului de recunoaștere a stelelor de vedere pe computer trebuia să fie pentru un senzor de orientare pentru CubeSats fabricate de amatori, folosind o cameră Raspberry Pi V2. Cred că există multe alte aplicații potențiale de recunoaștere a stelelor de viziune pe computer, dar cred că aceasta este cea mai tare!

Un mic glosar:

Învățarea despre viziunea pe computer este făcută mai lent de cantitatea stupidă de termeni speciali folosiți, așa că voi defini câțiva aici:

Cascadă - Un clasificator instruit pentru a identifica un anumit obiect țintă.

Marker fiducial - Un marker care adaugă un punct de referință vizual la o imagine.

HAAR - Caracteristicile asemănătoare Haar sunt un tip de caracteristică de imagine folosită pentru instruirea clasificatorilor.

OpenCV - Open Source Computer Vision, o bibliotecă de instrumente de viziune computerizată.

Stellarium - Software de astronomie Open Source.

Pasul 1: Cerințe

OpenCV este o bibliotecă bazată pe Linux, așa că, deși se presupune că este posibil să o operați bine pe Windows, veți avea mult mai ușor să o rulați într-un mediu Linux (luați-o de la mine și multe zile încercând să o funcționați complet pe Windows!). Ca experiment, am descărcat și am rulat OpenCV pe Raspberry Pi 3B +, ceea ce a avut succes, deși instruirea clasificatorilor este un proces foarte intensiv în RAM, așa că, dacă doriți să o faceți cu orice viteză, ruta recomandată este să angajați un server virtual Linux. (care poate fi în mod surprinzător de ieftin) pentru câteva zile / săptămâni / luni și folosiți-l ca mediu dedicat în care să efectuați instruirea clasificatorului. Veți putea controla serverul de pe un PC Windows utilizând un client SSH, cum ar fi Putty. Odată ce cascadele sunt instruite folosind VPS, acestea pot fi descărcate pe computerul dvs. Windows, iar Python poate fi utilizat pentru a rula programul de recunoaștere a imaginilor într-un mediu Windows.

Server virtual Linux:

Un Linux Virtual Server (VPS) este necesar pentru a efectua procesele de instruire în cascadă HAAR. Inițial am angajat un server cu 8 GB RAM și Ubuntu 16.04.6 (LTS) x64, iar mai târziu un al doilea pentru a dubla rata la care aș putea antrena cascade, deși veți avea nevoie doar de minimum unul

Software:

  • Stellarium - acesta este un software virtual pentru planetariu / astronomie, disponibil gratuit. Acesta va fi folosit pentru a aduna imagini stelare simulate pentru a fi utilizate la testare.
  • Putty - Acesta este un client SSH care este utilizat pentru a controla VPS prin linia de comandă.
  • WinSCP - este utilizat pentru a efectua transferul de fișiere de pe computerul Windows.

Pasul 2: Configurare VPS

Există un mic proces de configurare pentru a pune în funcțiune VPS. Prima dată poate dura ceva timp pentru dvs., dar nu este prea dificil dacă urmați pașii îndeaproape. Acest tutorial a fost o referință excelentă pentru mine, aș recomanda să citiți și acest lucru în timp ce lucrați cu acest instructable. Acesta acoperă specificul comenzilor linux linie cu linie, care este necesar pentru a fi urmat la literă.

Aproximativ, procesul implică:

  1. Crearea unui server Linux cu versiunea corectă Ubuntu.
  2. Actualizarea și actualizarea serverului.
  3. Crearea unui director al spațiului de lucru, în care este instalat OpenCV.
  4. Instalarea unor elemente esențiale, și anume un compilator, diverse biblioteci și legături Python.

După această etapă, sunteți gata să începeți pregătirea pentru procesul de instruire.

Pasul 3: Procesul

Întregul proces de viziune pe computer folosind cascade HAAR este destul de confuz la început, așa că acest Pas descrie logica cu puțin mai detaliat:

Proces de bază

  1. Există un set de date cu imagini negative, format din câteva mii de imagini care nu conțin obiectul de interes. Acest lucru va trebui încărcat pe VPS.
  2. Se creează o singură imagine pozitivă care conține obiectul de interes. Acest lucru va trebui, de asemenea, să fie încărcat pe VPS.
  3. Imaginea pozitivă unică este distorsionată, deformată, rotită etc., de un set de parametri aleși și suprapusă la o selecție a imaginilor negative. Acesta este un mod artificial de a crea un set de date pozitiv mare dintr-o singură imagine. (Pentru alte aplicații din lumea reală, cum ar fi identificarea unei pisici, puteți utiliza pur și simplu câteva mii de imagini cu pisici, dar această metodă nu este întotdeauna adecvată dacă nu aveți un set atât de mare de imagini pozitive. Abordarea artificială utilizată aici va fi mai puțin eficientă, dar este singura opțiune pentru un caz de utilizare ca acesta).
  4. Se desfășoară un proces de formare care funcționează în etape. Fiecare etapă va antrena o cascadă pentru a identifica diferite caracteristici de tip HAAR din seturile de imagini. Fiecare etapă durează exponențial mai mult pentru a fi finalizată, iar eficacitatea clasificatorului crește de fiecare dată (este, de asemenea, posibil să vă antrenați prea mult pentru a ști!).
  5. O singură cascadă antrenată va putea căuta un singur obiect țintă. Dacă doriți să identificați mai multe obiecte unice, veți avea nevoie de o cascadă antrenată pentru fiecare. În acest caz, am antrenat aproximativ 50 de cascade diferite pentru modelele de stele unice, pentru a crea un set care ar putea acoperi emisfera cerească nordică.
  6. În cele din urmă, este utilizat un program de detectare care rulează fiecare cascadă a unui set pe o imagine de intrare. Cascada își va căuta obiectul țintă dat în imaginea de intrare.
  7. Dacă are succes, obiectul țintă va fi identificat în imaginea de intrare.

n.b. dacă este utilizată într-un context de orientare prin satelit, de exemplu, o imagine ar fi capturată folosind o cameră de la bord. Cele mai strălucitoare stele din acea imagine vor fi identificate, iar marcajele suprapuse în acele poziții. Această imagine este apoi prezentată setului de cascade antrenate, care va testa pentru a vedea dacă imaginea de intrare conține vreunul dintre obiectele țintă. Dacă este detectat un adevărat pozitiv, atunci poziția unghiulară a unei constelații cunoscute este descoperită în raport cu axele corpului satelit.

Pasul 4: negative și pozitive

Negative

Un aspect cu adevărat cheie al antrenamentului în cascadă este de a avea un set de date cât mai mare de imagini negative. Vorbim despre mii, ideal zeci de mii de imagini. Nu contează cu adevărat ce conțin, scopul este doar să ofere o varietate de informații vizuale. Dosarul Classifier Training conține o varietate de seturi de date de imagini negative negative pe care le-am compilat. Inițial acestea erau compuse exclusiv din imagini simulate pe câmp stelar culese din Stellarium, dar ulterior am mărit setul de date cu câte imagini randomizate am putut găsi (da, inclusiv fotografiile mele de vacanță …). Cel mai mare set de date de acolo include aproape 9000 de imagini, care a fost cel mai mare pe care l-am creat până acum. Folosind acest lucru, veți economisi compilarea propriilor dvs.

Pozitive

Imaginea pozitivă (adică tiparul de stea țintă pe care cascada va fi antrenată să o recunoască) începe ca o captură de ecran a unui model de stea în Stellarium. Un program python identifică apoi cele mai strălucitoare stele din imagine și suprapune markere (explicate mai târziu în acest instructable) pe aceste poziții stelare. Această imagine este apoi micșorată la 50x50 pixeli. Acest lucru este mic, dar timpul de antrenament necesar pentru cascade va crește exponențial pe măsură ce această dimensiune crește, deci acesta este un compromis bun între calitate și timp.

Pasul 5: Controlul Stellarium

Controlul Stellarium
Controlul Stellarium
Controlul Stellarium
Controlul Stellarium

Dosarul Stellarium Scripts al depozitului GitHub conține trei programe pe care le-am scris pentru a controla utilizarea Stellarium. Pentru a le utiliza, plasați-le în folderul de scripturi din folderul de instalare Stellarium. Pentru a le rula, puteți deschide fereastra de scripturi din meniul Stellarium sau doar făcând dublu clic pe programul din folderul de scripturi, care va lansa Stellarium și va rula imediat programul selectat.

teză_4 și teză_5 captează aproximativ 2000 de imagini fiecare din emisfera cerească nordică și respectiv sudică. Acestea au fost utilizate pentru a forma baze de date de imagini negative, pentru a antrena imaginea pozitivă împotriva. Distincția între nord și sud a fost o modalitate simplă de a se asigura că modelul stelelor țintă (pozitive) nu ar fi prezent în setul de date negativ prin antrenarea modelelor de stele din emisfera nordică împotriva setului de date de imagine din emisfera cerească sudică și invers. (Dacă o imagine pozitivă este prezentă și în setul de date cu imagini negative, aceasta va afecta calitatea clasificatorului).

thesis_setup este, de asemenea, util - aceasta configurează Stellarium pentru a fi adecvat pentru captarea imaginilor - imaginile utilizate pentru a simula o vedere din spațiu. Face acțiuni cum ar fi ascunderea automată a meniurilor, a liniilor de rețea, a etichetelor, etc.

Pasul 6: Rocket Man

Omul Racheta
Omul Racheta

Primele cascade pe care le-am antrenat nu au putut identifica corect niciun tipar de stea. Nu erau foarte fiabili și erau foarte predispuși la falsuri pozitive. Presupunerea mea a fost că efectiv imaginile câmpului stelar de la Stellarium (practic doar puncte albe pe un fundal negru) pur și simplu nu conțineau suficiente informații vizuale pentru a conține suficiente caracteristici de tip HAAR pentru o formare de succes a clasificatorilor. Cred că a fost târziu noaptea, dar am decis să încerc ideea de a scrie un program pentru a plasa automat o mică imagine miniaturală peste locația fiecărei stele strălucitoare într-o imagine de câmp stelar.

Elton

Acesta a fost un test prostesc, dar prin adăugarea unei mici imagini a feței lui Elton John la fiecare locație a stelei strălucitoare, antrenând clasificatorul împotriva acestei imagini pozitive și apoi rulând cascadele împotriva imaginii originale, a fost mult mai eficient în găsirea corectă a model corect. Știam că sunt pe ceva!

Pasul 7: Markeri fiduciali

Markeri fiduciali
Markeri fiduciali

Deși „Eltonii” au dovedit teoria, aveam nevoie de un marker care să aibă simetrie de rotație completă, astfel încât modelul stelar să apară la fel indiferent de ce orientare a fost prezentat. Am testat o serie de tipuri de markeri și am constatat că tipul din dreapta jos era cel mai eficient, cu inele alb-negru contrastante. Programul Python prezentat în folderul pozitiv al repo GitHub arată cum sunt identificate cele mai strălucitoare stele dintr-o anumită imagine, iar acești markeri se suprapun automat în acele poziții. Acum am creat o reprezentare a modelelor cheie de stele împotriva cărora se poate antrena.

Pasul 8: Utilizarea cascadelor

Utilizarea cascadelor
Utilizarea cascadelor

Când ați antrenat un set de cascade, trebuie să știți cum să le folosiți pentru a identifica un obiect dintr-o imagine!

Uitați-vă la folderul Identificare stea al GitHub, unde veți găsi programul cascade_test19.py. Acest program cu nume captivant preia un set de cascade dintr-un folder dat și le rulează pe toate împotriva unei imagini de intrare și raportează detecțiile făcute. Funcția „detectMultiScale” este esența acestui lucru și necesită o varietate de argumente care definesc procesul de detectare. Modificarea acestora este esențială pentru performanța clasificatorului în cascadă și mai multe discuții despre acest lucru pot fi găsite în pasul următor, unde ne uităm la modul de eliminare a falsului pozitiv.

Acest lucru ar putea fi aplicat într-un sistem de orientare prin satelit prin corelarea valorii pixelilor din centrul casetei de delimitare cu coordonata cerească Ra / Dec a modelului stelar identificat și apoi corelarea acestuia cu deplasarea unghiulară din centrul imaginii (camera axă). Din aceasta, folosind o înțelegere a distorsiunii obiectivului (aproximativă la o proiecție gnomonică), unghiul satelitului poate fi găsit doar din două identificări pozitive.

Pasul 9: Cum să rămâneți pozitiv cu privire la pozitivele false

Cum să rămâneți pozitiv cu privire la pozitivele false
Cum să rămâneți pozitiv cu privire la pozitivele false
Cum să rămâneți pozitiv cu privire la pozitivele false
Cum să rămâneți pozitiv cu privire la pozitivele false

Aceste două imagini arată rezultatele testării setului de cascadă pe o imagine identică, dar cu parametri diferiți. În mod clar, prima imagine conține adevărata identificare, dar și un număr enorm de falsuri pozitive, în timp ce a doua imagine conține doar identificarea corectă.

Programul cascade_test19.py din folderul Identificare stea al repo GitHub utilizează două metode pentru a sorta rezultatele. În primul rând, funcția detectMultiScale stabilește o dimensiune minimă și maximă a rezultatului care poate fi găsit, ceea ce este sensibil, ca dimensiune aproximativă a modelului de stea țintă din fereastră (pentru obiectivul și mărirea date - imaginile mele Stellarium simulate folosesc proprietățile camera Raspberry Pi V2) este cunoscută. În al doilea rând, codul va selecta rezultatul cu cea mai mare casetă de delimitare (în limitele anterioare). În testare, s-a constatat că acesta este adevăratul pozitiv. În al treilea rând, programul stabilește un „levelWeights” minim (efectiv „valoare de încredere”) care este necesar pentru a trata acest ID ca pe un adevărat pozitiv. Prin această metodă, cascadele au fost eficiente pentru a găsi rezultatul corect.

Pe lângă imaginile din câmpul stelelor, am testat acest lucru și cu imaginile biroului meu, de exemplu, antrenând cascade pentru a-mi identifica notebook-ul, cana etc., pentru a practica eliminarea falsurilor pozitive. Metodele de mai sus au funcționat bine în toate circumstanțele, ceea ce a fost încurajator.

Pasul 10: Discuție

Discuţie
Discuţie
Discuţie
Discuţie
Discuţie
Discuţie

Domenii de îmbunătățire

Acesta a fost un proiect complex pentru mine și mi-a împins cu adevărat înțelegerea subiectului. A implicat un număr de câteva luni de lucru aproape cu normă întreagă pentru a duce proiectul la acest punct, când îl pot împărtăși cu dvs., dar mai sunt multe lucruri de făcut pentru a îmbunătăți performanța metodei. În starea actuală, poate funcționa bine în anumite constrângeri. Am lucrat pentru a identifica domeniile care au nevoie de muncă suplimentară și, sperăm, voi putea petrece timp abordând aceste probleme în lunile următoare. Sunt:

Unghiul - Aceasta este o zonă complexă, ideea că rezultatele clasificatorilor trebuie să fie invariante rotațional, adică ar trebui să identifice fiabilitatea modelului stelelor țintă indiferent de unghiul la care este prezentată imaginea care conține steaua țintă. O cascadă antrenată folosind o imagine de intrare la o singură orientare nu va putea identifica acea imagine la orientări aleatorii, astfel încât varianța unghiului pozitiv al imaginii trebuie introdusă în procesul de instruire pentru a antrena cascade care pot accepta o gamă pe unghiurile de intrare. Parametrul „maxzangle” din comenzile de antrenament în cascadă ia un argument în radiani, care controlează o limită a unghiului în care imaginea pozitivă de intrare va fi suprapusă peste imaginile negative furnizate, astfel încât setul de imagini pozitive rezultate va conține o serie de orientări ale imaginea pozitivă. Cu toate acestea, pe măsură ce acest maxzangle crește, raportul de acceptare (în linii mari, calitate) al cascadei se va reduce brusc. Cred că soluția este de a antrena cascade folosind o bază de date semnificativ mai mare de imagini negative decât ceea ce foloseam pentru a se asigura că un clasificator de cascadă de bună calitate poate fi creat chiar și încorporând o largă orientare.

O altă soluție potențială ar fi antrenarea unui număr de cascade pentru o anumită țintă, fiecare cascadă guvernând o anumită porțiune a unei rotații complete de 360 de grade. În acest fel, calitatea fiecărei cascade poate fi menținută la un nivel ridicat, dar, pe de altă parte, aceasta va avea ca rezultat mult mai multe cascade și, prin urmare, procesul de identificare va fi mai lent.

Parametrul „levelWeight”, care este o valoare furnizată de funcția „detectMultiScale”, este analog cu o valoare de încredere în detectarea care a fost făcută. Studiind acest lucru, a fost creat graficul de mai sus, care arată cum încrederea identificării pozitive scade brusc pe măsură ce orientarea imaginii crește în ambele direcții, confirmând gândurile că acesta este un punct slab.

Plasarea pixelilor - Un punct mult mai simplu, dar și problematic, este cel al plasării pixelilor, ilustrat de următoarele două imagini, care arată o vedere mărită a unei imagini stelare, astfel încât pixelii individuali ai două stele să poată fi văzuți clar. Procesul de eroziune folosit în program pentru a curăța toate, cu excepția celor mai strălucitoare stele din imagine, va păstra prima stea și o va arunca pe a doua, în ciuda faptului că acestea au luminozități egale. Motivul este că prima stea este centrată pe un pixel, în timp ce a doua nu este ca atare. Funcția de eroziune înlătură inele concentrice de pixeli din jurul pixelului central al unui grup, astfel încât prima stea va avea pixelul central care va supraviețui funcției de eroziune, dar a doua stea va fi complet eliminată din imagine. Prin urmare, markerii fiduciali vor fi așezați numai pe prima stea și nu pe a doua. Acest lucru va provoca neconcordanțe cu privire la care stelele strălucitoare dintr-un câmp stelar dat vor primi markeri (și, prin urmare, vor fi comparate cu clasificatorii instruiți) - de aceea este posibil să nu fie posibilă o observare pozitivă corectă.

Pasul 11: Ultimul Cuvânt

Ultimul cuvant
Ultimul cuvant

Mulțumesc că mi-ai citit instructivul, sper că ți s-a părut interesant acest proiect. A fost un proces foarte interesant de lucru, a trecut peste un an de când am început să lucrez la concept și sunt încurajat de rezultate până în acest moment. Din literatura pe care am citit-o, acesta este un concept destul de original și, cu o mai mare dezvoltare, poate fi aplicat cu siguranță într-o serie de aplicații pentru astronomie amator sau mai mult.

Acest proiect a fost o curbă de învățare abruptă pentru mine, așa că sper că unii cititori cu mai multă experiență în programare pot fi inspirați să contribuie la continuarea proiectului prin pagina GitHub și putem continua să dezvoltăm acest instrument open-source. Aștept cu nerăbdare să citesc orice comentarii pe care le aveți, dar vă rog să nu puneți prea multe întrebări dificile!

Provocarea spațială
Provocarea spațială
Provocarea spațială
Provocarea spațială

Runner Up în Space Challenge

Recomandat: