Prepoznavanje zvijezda pomoću računarskog vida (OpenCV): 11 koraka (sa slikama)
Prepoznavanje zvijezda pomoću računarskog vida (OpenCV): 11 koraka (sa slikama)

Video: Prepoznavanje zvijezda pomoću računarskog vida (OpenCV): 11 koraka (sa slikama)

Video: Prepoznavanje zvijezda pomoću računarskog vida (OpenCV): 11 koraka (sa slikama)
Video: Dubioza kolektiv "Rijaliti" (Official video) 2025, Januar
Anonim
Prepoznavanje zvijezda pomoću računarskog vida (OpenCV)
Prepoznavanje zvijezda pomoću računarskog vida (OpenCV)

Ova instrukcija će vam opisati kako stvoriti program za računarski vid za automatsko prepoznavanje uzoraka zvijezda na slici. Metoda koristi biblioteku OpenCV (Open-Source Computer Vision) za stvaranje skupa obučenih HAAR kaskada koje se mogu koristiti za prepoznavanje određenih uzoraka zvijezda. Iako je ovaj vodič u kontekstu prepoznavanja uzoraka zvijezda, OpenCV proces koji opisujem može se primijeniti i na druge aplikacije - pa će, nadamo se, biti koristan!

Projekt je sažet u ovom videu:

Zašto sam napisao ovo uputstvo?

  1. Metoda identifikacije uzorka zvijezda koju razvijam vjerujem da ima potencijal za primjenu na širokom spektru projekata amaterske astronomije - bilo da je to orijentacija teleskopa, automatska klasifikacija slika ili čak na kraju senzor zvijezde na otvorenom kodu ili amaterski CubeSat.
  2. Ovdje ima mnogo dobrih instrukcija za OpenCV, ali čak i tako mi je u početku bio jako težak proces za učenje, pa se nadam da će ovaj vodič biti dobra referenca za druge ljude koji žele obučiti HAAR klasifikatore za OpenCV (nije nužno da se radi o možda astronomija!).
  3. Ja nisam obučeni programer, pa mi je ovaj projekat zaista potisnuo razumijevanje. Nadajmo se da će pisanjem ovog uputstva drugi, iskusniji proizvođači biti nadahnuti da rade na ovom konceptu i doprinesu GitHub -u i ovom uputstvu putem komentara na ovoj stranici.
  4. Amaterska astronomija i metode orijentacije su moje veliko zanimanje, pogledajte moje prethodne upute koje sadrže Arduino Star-Finder za teleskope.

Naslovna fotografija ovog instruktora je koncept 3U CubeSat dizajna u čijem sam dizajnu ja učestvovao. Koristio sam ga za ilustraciju ovog uputstva jer je originalna primjena sistema za prepoznavanje zvijezda računarskog vida trebala biti za orijentacijski senzor za amaterski proizvedene CubeSats, koristeći Raspberry Pi V2 kameru. Vjerujem da postoje mnoge druge potencijalne primjene prepoznavanja zvijezda računarskog vida, ali mislim da je ovo najhladnije!

Mali rječnik:

Učenje o računarskom vidu usporava se zbog glupe količine korištenih specijalističkih izraza, pa ću ovdje definirati neke:

Kaskada - Klasifikator obučen za identifikaciju određenog ciljnog objekta.

Fiducijalni marker - Marker koji dodaje sliku vizuelnom referencom.

HAAR - Osobine slične Haaru su vrsta slikovne značajke koja se koristi za obuku klasifikatora.

OpenCV - Open Source Computer Vision, biblioteka alata za računarski vid.

Stellarium - softver za astronomiju otvorenog koda.

Korak 1: Zahtjevi

OpenCV je biblioteka zasnovana na Linuxu, pa iako je moguće da se njime može dobro upravljati u sustavu Windows, bit će vam mnogo lakše pokrenuti je u Linux okruženju (uzmite ovo od mene i puno dana pokušavate na njoj potpuno raditi) Windows!). Kao eksperiment, preuzeo sam i pokrenuo OpenCV na svom Raspberry Pi 3B+, koji je bio uspješan, iako je obuka za klasifikator vrlo intenzivan proces na RAM -u, pa ako to želite raditi bilo kojom brzinom, preporučena ruta je da unajmite Linux Virtual Server (što zapravo može biti iznenađujuće jeftino) nekoliko dana/sedmica/mjeseci i koristiti to kao namjensko okruženje za izvođenje obuke o klasifikatorima. Moći ćete kontrolirati poslužitelj s Windows računala pomoću SSH klijenta, poput Puttyja. Nakon što se kaskade obuče pomoću VPS -a, mogu se preuzeti na vaš Windows računar, a Python se može koristiti za pokretanje programa za prepoznavanje slika u Windows okruženju.

Linux virtualni server:

Za izvođenje HAAR kaskadnih procesa obuke potreban je Linux virtualni poslužitelj (VPS). U početku sam unajmio server s 8 GB RAM -a i Ubuntu 16.04.6 (LTS) x64, a kasnije i drugi da udvostručim brzinu kojom mogu trenirati kaskade, iako će vam trebati najmanje jedan

Softver:

  • Stellarium - ovo je softver za virtualni planetarij/astronomiju, slobodno dostupan. Koristit će se za prikupljanje simuliranih slika zvijezda za upotrebu u testiranju.
  • Putty - Ovo je SSH klijent koji se koristi za kontrolu VPS -a putem komandne linije.
  • WinSCP - koristi se za prenos datoteka sa Windows računara.

Korak 2: Postavljanje VPS -a

Postoji mali postupak postavljanja za pokretanje VPS -a. Prvi put će vam možda potrajati, ali nije previše komplicirano ako pomno slijedite korake. Ovaj vodič mi je bio odlična referenca, preporučio bih vam da pročitate i ovo dok radite kroz ovo uputstvo. Obuhvaća specifičnosti linux naredbi liniju po liniju, što je potrebno slijediti do kraja.

Otprilike, proces uključuje:

  1. Kreiranje Linux servera sa ispravnom verzijom Ubuntu -a.
  2. Nadogradnja i ažuriranje servera.
  3. Kreiranje direktorija radnog prostora u koji je instaliran OpenCV.
  4. Instalacija nekih osnovnih stvari, naime kompajler, različite biblioteke i Python veze.

Nakon ove faze, spremni ste za početak priprema za proces obuke.

Korak 3: Proces

Cijeli proces računalnog vida pomoću HAAR kaskada u početku je prilično zbunjujući, pa ovaj korak opisuje logiku malo detaljnije:

Osnovni proces

  1. Postoji negativan skup slika, koji se sastoji od nekoliko hiljada slika koje ne sadrže objekt od interesa. Ovo će morati biti učitano na VPS.
  2. Stvara se jedna pozitivna slika koja sadrži objekt od interesa. Ovo će također morati biti učitano na VPS.
  3. Jedna pozitivna slika je iskrivljena, iskrivljena, rotirana itd., Skupom odabranih parametara i prekrivena izborom negativnih slika. Ovo je umjetan način stvaranja velikog pozitivnog skupa podataka od jedne slike. (Za druge primjene u stvarnom svijetu, poput identifikacije mačke, možete jednostavno upotrijebiti nekoliko tisuća slika mačaka, ali ova metoda nije uvijek prikladna ako nemate tako veliki skup pozitivnih slika. Ovdje se koristi umjetni pristup bit će manje učinkovit, ali to je jedina opcija za ovakve slučajeve upotrebe).
  4. Pokreće se proces obuke, koji radi u fazama. Svaka faza će trenirati kaskadu za identifikaciju različitih karakteristika tipa HAAR unutar skupova slika. Za svaku fazu potrebno je eksponencijalno više vremena da se završi, a efikasnost klasifikatora se povećava svaki put (moguće je i pretjerano vježbanje samo da znate!).
  5. Jedna obučena kaskada moći će tražiti jedan ciljani objekt. Ako želite identificirati više jedinstvenih objekata, trebat će vam obučena kaskada za svaki. U ovom sam slučaju obučio oko 50 različitih kaskada za jedinstvene zvijezde, kako bih stvorio set koji bi mogao pokriti sjevernu nebesku hemisferu.
  6. Na kraju, koristi se program za otkrivanje koji pokreće svaku kaskadu skupa s ulaznom slikom. Kaskada će tražiti dati ciljni objekt unutar ulazne slike.
  7. U slučaju uspjeha, ciljni objekt bit će identificiran unutar ulazne slike.

n.b. na primjer, ako se koristi u kontekstu satelitske orijentacije, slika bi se snimila pomoću ugrađene kamere. Najsvjetlije zvijezde na toj slici bit će identificirane, a oznake postavljene na tim pozicijama. Ova slika se zatim prikazuje skupu istreniranih kaskada, koje će provjeriti da li ulazna slika sadrži bilo koji od ciljnih objekata. Ako se detektira pravi pozitivan položaj, tada se otkriva kutni položaj poznate konstelacije u odnosu na osi tijela satelita.

Korak 4: Negativi i pozitivi

Negatives

Zaista ključni aspekt kaskadne obuke je imati što veći skup negativnih slika. Govorimo o hiljadama, idealno desetinama hiljada slika. Nije važno što sadrže, cilj je samo pružiti različite vizualne informacije. Fascikla Training Classifier sadrži niz različitih skupova negativnih slika koje sam sastavio. U početku su se one sastojale samo od simuliranih slika zvjezdanog polja prikupljenih iz Stelarijuma, ali sam kasnije povećao skup podataka sa onoliko nasumičnih slika koliko sam mogao pronaći (da, uključujući moje fotografije sa odmora …). Najveći skup podataka sadrži gotovo 9000 slika, što je najveći koji sam do sada stvorio. Korištenjem ovoga uštedjet ćete pri sastavljanju vlastitog.

Pozitivne

Pozitivna slika (to je uzorak ciljane zvijezde koju će kaskada naučiti prepoznati) počinje kao snimak ekrana uzoraka zvijezde u Stellariumu. Python program tada identificira najsjajnije zvijezde na slici i postavlja oznake (objašnjene kasnije u ovom uputstvu) na ove pozicije zvijezda. Ova slika se zatim smanjuje na 50x50 piksela. Ovo je malo, ali vrijeme obuke potrebno za kaskade će se eksponencijalno povećavati s povećanjem ove veličine, pa je ovo dobar kompromis između kvalitete i vremena.

Korak 5: Kontrola stelarijuma

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

Fascikla Stellarium Scripts u spremištu GitHub sadrži tri programa koja sam napisao za kontrolu upotrebe Stellariuma. Da biste ih koristili, postavite ih u fasciklu skripti vaše instalacione fascikle Stellarium. Da biste ih pokrenuli, možete otvoriti prozor skripti unutar izbornika Stellarium ili samo dvostrukim klikom na program u mapi Skripte, koji će pokrenuti Stellarium i odmah pokrenuti odabrani program.

thesis_4 i thesis_5 snimaju oko 2000 slika svake sjeverne i južne hemisfere. Oni su korišteni za formiranje baza negativnih slika, za uvježbavanje pozitivne slike. Razlika između sjevera i juga bila je jednostavan način da se osigura da ciljani (pozitivni) uzorak zvijezde neće biti prisutan u negativnom skupu podataka obučavanjem uzoraka zvijezda sjeverne hemisfere prema skupu slika južne nebeske hemisfere i obrnuto. (Ako je pozitivna slika prisutna i unutar skupa negativnih slika, to će utjecati na kvalitetu klasifikatora).

Thesis_setup je također koristan - ovo postavlja Stellarium da bude prikladan za snimanje slika - slika koje se koriste za simulaciju pogleda iz svemira. On automatski izvršava radnje kao što su skrivanje menija, linija mreže, naljepnica itd. Kako bi vam uštedio vaše potrebe pri svakom snimanju slike.

Korak 6: Rocket Man

Rocket Man
Rocket Man

Prve kaskade koje sam trenirao nisu mogle ispravno identificirati bilo kakve uzorke zvijezda. Bili su vrlo nepouzdani i bili su skloni lažno pozitivnim rezultatima. Moja pretpostavka je bila da slike zvjezdanog polja sa Stellariuma (u osnovi samo bijele tačke na crnoj podlozi) jednostavno ne sadrže dovoljno vizuelnih informacija da sadrže dovoljno karakteristika tipa HAAR za uspješnu obuku klasifikatora. Mislim da je bilo kasno u noć, ali odlučio sam isprobati ideju pisanja programa za automatsko postavljanje male sličice iznad lokacije svake svijetle zvijezde na slici zvjezdanog polja.

Elton

Ovo je bio glup test, ali dodavanjem male slike lica Eltona Johna na svaku lokaciju sa sjajnom zvijezdom, uvježbavanjem klasifikatora prema ovoj pozitivnoj slici, a zatim izvođenjem kaskada prema izvornoj slici, bilo je mnogo učinkovitije u ispravnom pronalaženju pravi uzorak. Znao sam da nešto tražim!

Korak 7: Fiducijalni markeri

Fiducijalni markeri
Fiducijalni markeri

Iako su 'Eltonovi' dokazali teoriju, trebao mi je marker s potpunom rotacijskom simetrijom, tako da bi uzorak zvijezde izgledao isto bez obzira na kojoj je orijentaciji predstavljen. Testirao sam niz markera i otkrio da je tip u donjem desnom kutu bio najučinkovitiji, s kontrastnim crno -bijelim prstenovima. Python program predstavljen u pozitivnom folderu GitHub repo -a prikazuje kako se najsvjetlije zvijezde na datoj slici identificiraju, a ti markeri se automatski prekrivaju na tim pozicijama. Sada smo stvorili prikaz ključnih zvijezdanih obrazaca protiv kojih se može vježbati.

Korak 8: Upotreba kaskada

Korištenje kaskada
Korištenje kaskada

Kad ste istrenirali niz kaskada, morate znati kako ih koristiti za identifikaciju objekta na slici!

Pogledajte mapu Star Identification na GitHub -u, gdje ćete pronaći program cascade_test19.py. Ovaj privlačno nazvan program uzima skup kaskada iz određene mape i pokreće ih sve prema ulaznoj slici i izvještava o izvršenim otkrivanjima. Srž toga je funkcija 'detectionMultiScale' i zahtijeva različite argumente koji definiraju proces otkrivanja. Njihova promjena ključna je za performanse kaskadnog klasifikatora, a više rasprave o tome može se pronaći u sljedećem koraku, gdje ćemo pogledati kako ukloniti lažno pozitivne rezultate.

To bi se moglo primijeniti u satelitskom orijentacijskom sistemu korelacijom vrijednosti piksela u središtu graničnog okvira s Ra/Dec nebeskom koordinatom identificiranog uzorka zvijezde, a zatim korelacijom ovoga s kutnim pomakom od središta slike (kamera osa). Iz ovoga, koristeći razumijevanje izobličenja objektiva (približno gnomoničnoj projekciji), kut satelita može se pronaći iz samo dvije pozitivne identifikacije.

Korak 9: Kako ostati pozitivan u vezi s lažno pozitivnim rezultatima

Kako ostati pozitivan u vezi sa lažno pozitivnim rezultatima
Kako ostati pozitivan u vezi sa lažno pozitivnim rezultatima
Kako ostati pozitivan u vezi sa lažno pozitivnim rezultatima
Kako ostati pozitivan u vezi sa lažno pozitivnim rezultatima

Ove dvije slike prikazuju rezultate testiranja kaskadnog seta na identičnoj slici, ali s različitim parametrima. Jasno je da prva slika sadrži pravu identifikaciju, ali i ogroman broj lažno pozitivnih rezultata, dok druga slika sadrži samo ispravnu identifikaciju.

Program cascade_test19.py unutar fascikle Star Identification u GitHub repo -u koristi dvije metode za sortiranje rezultata. Prvo, funkcija function detectMultiScale postavlja minimalnu i maksimalnu veličinu rezultata koji se može pronaći, što je razumno, kao približnu veličinu ciljnog uzorka zvijezde unutar prozora (za dati objektiv i povećanje - moje simulirane slike Stellariuma koriste svojstva kamera Raspberry Pi V2) je poznata. Drugo, kôd će odabrati rezultat s najvećim graničnim okvirom (unutar prethodnih granica). U testiranju je utvrđeno da je to prava pozitiva. Treće, program postavlja minimalne 'levelWeights' (efektivno 'vrijednost povjerenja') koji su potrebni za tretiranje ovog ID -a kao istinskog pozitivnog. Ovom metodom, kaskade su bile efikasne u pronalaženju tačnog rezultata.

Uz slike zvjezdanih polja, ovo sam testirao i na slikama svog stola, na primjer, trenažnim kaskadama za identifikaciju moje bilježnice, šolje itd., Kako bih vježbao uklanjanje lažno pozitivnih rezultata. Gore navedene metode dobro su djelovale u svim okolnostima što je bilo ohrabrujuće.

Korak 10: Diskusija

Diskusija
Diskusija
Diskusija
Diskusija
Diskusija
Diskusija

Područja za poboljšanje

Ovo je za mene bio složen projekt i zaista me potisnuo u razumijevanje teme. Bilo je potrebno ukupno nekoliko mjeseci rada sa punim radnim vremenom kako bi se projekat doveo do ove tačke kada ga mogu podijeliti s vama, ali potrebno je još mnogo posla za poboljšanje performansi metode. U takvom stanju, može dobro funkcionirati unutar određenih ograničenja. Radio sam na identifikaciji područja koja zahtijevaju dodatni rad i nadam se da ću u sljedećim mjesecima moći potrošiti vrijeme na njihovo rješavanje. Oni su:

Kut - Ovo je složeno područje, ideja da rezultati klasifikatora moraju biti rotacijski invarijantni, to jest da bi trebalo pouzdano identificirati uzorak ciljane zvijezde bez obzira na kut pod kojim se prikazuje slika koja sadrži sliku ciljane zvijezde. Kaskada obučena korištenjem ulazne slike u jednoj orijentaciji neće moći identificirati tu sliku u nasumičnim orijentacijama, pa se varijacija pozitivnog kuta slike mora uvesti u proces obuke kako bi se obukle kaskade koje mogu prihvatiti raspon ulaznih kutova. Parametar 'maxzangle' u naredbama za kaskadno vježbanje uzima argument u radijanima, koji kontrolira granicu kuta na koji će se ulazna pozitivna slika preklapati na predviđene negativne slike, tako da će rezultirajući skup pozitivnih slika sadržavati raspon orijentacija pozitivnu sliku. Međutim, kako se ovaj maksimum povećava, omjer prihvaćanja (općenito govoreći, kvaliteta) kaskade će se naglo smanjiti. Vjerujem da je rješenje trenirati kaskade koristeći znatno veću bazu negativnih slika od one koju sam koristio kako bih osigurao da se može stvoriti kvalitetan kaskadni klasifikator čak i sa velikim rasponom orijentacije.

Drugo potencijalno rješenje bilo bi treniranje određenog broja kaskada za određenu metu, pri čemu svaka kaskada upravlja određenim dijelom pune rotacije za 360 stupnjeva. Na taj način se kvaliteta svake kaskade može održati na visokom nivou, ali s druge strane to će rezultirati daleko većim kaskadama, pa će proces identifikacije biti sporiji.

Parametar 'levelWeight', koji je vrijednost koju pruža funkcija 'detektujMultiSkala', analogan je vrijednosti pouzdanosti u otkrivanju koje je izvršeno. Proučavajući ovo, nastao je gornji grafikon koji pokazuje kako se pouzdanost pozitivne identifikacije naglo smanjuje kako se orijentacija slike povećava u bilo kojem smjeru, potvrđujući misli da je to slaba tačka.

Postavljanje piksela - Mnogo jednostavnija, ali i problematična tačka je postavljanje piksela, ilustrirano na sljedeće dvije slike, koje pokazuju uvećan prikaz slike zvijezde, tako da se pojedinačni pikseli dviju zvijezda mogu jasno vidjeti. Proces erozije koji se koristi u programu za brisanje svih osim najsjajnijih zvijezda sa slike zadržat će prvu zvijezdu, a drugu će odbaciti, uprkos tome što su iste svjetline. Razlog tome je što je prva zvijezda centrirana na pikselu, dok druga nije kao takva. Funkcija erozije uklanja koncentrične prstenove piksela oko središnjeg piksela grupe, pa će prva zvijezda imati centralni piksel koji će preživjeti funkciju erozije, ali će druga zvijezda biti potpuno uklonjena sa slike. Stoga će se fiducijalni markeri postaviti samo na prvu zvijezdu, a ne na drugu. To će uzrokovati nedosljednosti u vezi s tim koje će svijetle zvijezde u datom zvjezdanom polju dobiti markere (i stoga ih se može uporediti s obučenim klasifikatorima) - stoga je moguće da ispravno pozitivno promatranje neće biti moguće.

Korak 11: Posljednja riječ

Posljednja riječ
Posljednja riječ

Hvala vam što ste pročitali moje uputstvo, nadam se da vam je ovaj projekt bio intrigantan. Bio je to vrlo zanimljiv proces koji je radio na tome, prošlo je više od godinu dana otkad sam počeo raditi na konceptu, i ohrabren sam rezultatima do ove tačke. Prema literaturi koju sam pročitao, ovo je prilično originalan koncept, a s većim razvojem svakako se može primijeniti u nizu aplikacija za amatersku astronomiju ili više.

Ovaj projekt za mene je bio strma krivulja učenja, pa se nadam da će neki čitatelji s više iskustva u programiranju možda biti inspirirani da doprinesu nastavku projekta putem stranice GitHub, te da možemo nastaviti razvijati ovaj alat otvorenog koda. Radujem se što ću pročitati vaše komentare, ali nemojte postavljati previše teških pitanja!

Space Challenge
Space Challenge
Space Challenge
Space Challenge

Drugoplasirani u svemirskom izazovu