Sadržaj:

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

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

Video: Prepoznavanje zvijezda pomoću računalnog vida (OpenCV): 11 koraka (sa slikama)
Video: Veliki KVIZ o ZASTAVAMA - Možete li pogoditi svih 50 zastava? 2024, Studeni
Anonim
Prepoznavanje zvijezda pomoću računalnog vida (OpenCV)
Prepoznavanje zvijezda pomoću računalnog vida (OpenCV)

Ova instrukcija će vam opisati kako stvoriti program za računalni 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 zvjezdanih uzoraka. Iako je ovaj vodič u kontekstu prepoznavanja zvjezdanih uzoraka, postupak OpenCV 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 amaterskih astronomskih projekata - bilo da se radi o orijentaciji teleskopa, automatskoj klasifikaciji slika ili čak u konačnici senzoru zvijezde na otvorenom kodu ili amaterskom CubeSat -u.
  2. Ovdje ima mnogo dobrih instrukcija za OpenCV, ali čak i tako mi je bilo jako teško naučiti proces u početku, pa se nadam da će ovaj vodič biti dobra referenca za druge ljude koji žele obučavati HAAR klasifikatore za OpenCV (ne mora nužno imati veze s možda astronomija!).
  3. I sam nisam obučeni programer, pa mi je ovaj projekt zaista potisnuo razumijevanje. Nadajmo se da će pisanjem ovog Instructable -a 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 sudjelovao. Koristio sam ga za ilustraciju ovog uputstva jer je izvorna primjena sustava za prepoznavanje zvijezda računalnog vida trebala biti za orijentacijski senzor za amaterske CubeSats, koristeći Raspberry Pi V2 kameru. Vjerujem da postoje mnoge druge potencijalne primjene prepoznavanja zvijezda računalnog vida, ali mislim da je ovo najhladnije!

Mali rječnik:

Učenje o računalnom 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 vizualnom referencom.

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

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

Stellarium - softver za astronomiju otvorenog koda.

Korak 1: Zahtjevi

OpenCV je knjižnica temeljena na Linuxu, pa iako je navodno moguće dobro upravljati njome u sustavu Windows, bit će vam puno lakše pokrenuti je u Linux okruženju (uzmite ovo od mene i puno dana pokušavam je potpuno uraditi) Windows!). Kao eksperiment, preuzeo sam i pokrenuo OpenCV na svom Raspberry Pi 3B+, što je bilo uspješno, iako je obuka za klasifikatore vrlo intenzivan proces na RAM -u, pa ako to želite raditi bilo kojom brzinom, preporučena ruta je unajmiti Linux virtualni poslužitelj (što zapravo može biti iznenađujuće jeftino) nekoliko dana/tjedana/mjeseci i koristiti to kao namjensko okruženje za izvođenje obuke klasifikatora. Moći ćete kontrolirati poslužitelj s računala sa sustavom Windows pomoću SSH klijenta kao što je Putty. Nakon što se kaskade obuče pomoću VPS -a, mogu se preuzeti na vaše računalo sa sustavom Windows, a Python se može koristiti za pokretanje programa za prepoznavanje slika u Windows okruženju.

Linux virtualni poslužitelj:

Linux Virtualni poslužitelj (VPS) potreban je za izvođenje HAAR kaskadnih procesa obuke. U početku sam unajmio poslužitelj 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 naredbenog retka.
  • WinSCP - koristi se za prijenos datoteka s računala sa sustavom Windows.

Korak 2: VPS postavljanje

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

Otprilike, proces uključuje:

  1. Stvaranje Linux poslužitelja s ispravnom verzijom Ubuntu.
  2. Nadogradnja i ažuriranje poslužitelja.
  3. Stvaranje direktorija radnog prostora u koji je instaliran OpenCV.
  4. Instalacija nekih bitnih stvari, naime prevoditelj, razne knjižnice i Python povezivanja.

Nakon ove faze spremni ste za početak priprema za trenažni proces.

Korak 3: Proces

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

Osnovni proces

  1. Postoji skup negativnih slika koji se sastoji od nekoliko tisuća slika koje ne sadrže objekt od interesa. Ovo će se morati učitati na VPS.
  2. Stvara se jedna pozitivna slika koja sadrži objekt od interesa. Ovo će također trebati 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, jednostavno biste mogli upotrijebiti nekoliko tisuća slika mačaka, ali ova metoda nije uvijek prikladna ako nemate tako veliki skup pozitivnih slika. Umjetni pristup koji se ovdje koristi bit će manje učinkovit, ali to je jedina mogućnost za ovakav slučaj uporabe).
  4. Provodi se proces obuke koji radi u fazama. Svaka će faza trenirati kaskadu za identifikaciju različitih značajki tipa HAAR unutar skupova slika. Za svaku fazu potrebno je eksponencijalno više vremena da se završi, a učinkovitost klasifikatora se povećava svaki put (također je moguće pretjerano trenirati 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 trenirao 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 zadani ciljani objekt unutar ulazne slike.
  7. Ako uspije, ciljni objekt bit će identificiran unutar ulazne slike.

n.b. ako se na primjer 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 se slika zatim prezentira skupu istreniranih kaskada, koje će provjeriti sadrži li ulazna slika bilo koji od ciljnih objekata. Ako se detektira pravi pozitivan položaj, tada se otkriva kutni položaj poznatog sazviježđa u odnosu na osi tijela satelita.

Korak 4: Negativi i pozitivi

Negativne

Doista ključni aspekt kaskadne obuke je imati što veći skup negativnih slika. Govorimo o tisućama, idealno desecima tisuća slika. Nije važno što sadrže, cilj je samo pružiti različite vizualne informacije. Mapa Classifier Training sadrži niz različitih skupova negativnih slika koje sam sastavio. U početku su se oni sastojali samo od simuliranih slika zvjezdanog polja prikupljenih iz Stelarija, ali sam kasnije povećao skup podataka sa onoliko nasumičnih slika koliko sam mogao pronaći (da, uključujući moje fotografije s odmora …). Najveći skup podataka sadrži gotovo 9000 slika, što je najveći koji sam dosad stvorio. Korištenjem ovoga uštedjet ćete sastavljanje vlastitog.

Pozitivne

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

Korak 5: Kontrola stelarija

Kontrola stelarija
Kontrola stelarija
Kontrola stelarija
Kontrola stelarija

Mapa Stellarium Scripts u spremištu GitHub sadrži tri programa koja sam napisao za kontrolu korištenja Stellariuma. Da biste ih koristili, stavite ih u mapu skripti svoje instalacijske mape 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.

teze_4 i teze_5 snimaju oko 2000 slika svake od sjevernih i južnih hemisfera. 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 trenirajući uzorke 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 prikladnim za snimanje slika - slika koje se koriste za simulaciju pogleda iz svemira. On automatski radi radnje poput skrivanja izbornika, linija rešetke, oznaka itd. Kako bi vam uštedio svaki put kada želite snimiti sliku.

Korak 6: Rocket Man

Rocket Man
Rocket Man

Prve kaskade koje sam trenirao nisu mogle ispravno identificirati nikakve uzorke zvijezda. Bili su vrlo nepouzdani i bili su skloni lažno pozitivnim rezultatima. Moja je pretpostavka bila da slike zvjezdanog polja iz Stellariuma (u osnovi samo bijele točkice na crnoj podlozi) jednostavno ne sadrže dovoljno vizualnih informacija da sadrže dovoljno značajki 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 svako mjesto 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 se zvjezdani uzorak pojavljivao isti bez obzira na to u kojem je usmjerenju predstavljen. Testirao sam niz markera i otkrio da je tip u donjem desnom kutu najučinkovitiji, s kontrastnim crno -bijelim prstenovima. Python program predstavljen u pozitivnoj mapi GitHub repo prikazuje kako se identificiraju najsvjetlije zvijezde na datoj slici, a ti se markeri automatski prekrivaju na tim pozicijama. Sada smo stvorili prikaz ključnih zvijezdanih obrazaca protiv kojih se može vježbati.

Korak 8: Korištenje 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 GitHubu, 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 zajedno sa ulaznom slikom i izvješćuje o otkrivenjima. Srž toga je funkcija 'detectionMultiScale', koja zahtijeva različite argumente koji definiraju proces otkrivanja. Izmjena ovih stavki ključna je za izvedbu kaskadnog klasifikatora, a više rasprave o tome može se pronaći u sljedećem koraku, gdje razmatramo kako eliminirati lažno pozitivne rezultate.

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

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

Kako ostati pozitivan u vezi lažno pozitivnih rezultata
Kako ostati pozitivan u vezi lažno pozitivnih rezultata
Kako ostati pozitivan u vezi lažno pozitivnih rezultata
Kako ostati pozitivan u vezi lažno pozitivnih rezultata

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 mape 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 ciljanog uzorka zvijezde unutar prozora (za datu leću 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' (zapravo 'vrijednost povjerenja') koja je potrebna za tretiranje ovog ID -a kao istinskog pozitivnog. Ovom metodom kaskade su bile učinkovite u pronalaženju točnog rezultata.

Osim slika zvjezdanih polja, ovo sam testirao i na slikama svog stola, na primjer, kaskadama za obuku za identifikaciju moje bilježnice, šalice 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: Rasprava

Rasprava
Rasprava
Rasprava
Rasprava
Rasprava
Rasprava

Područja za poboljšanje

Ovo je za mene bio složen projekt i jako me potisnuo u razumijevanje teme. Ukupno je bilo potrebno nekoliko mjeseci rada s punim radnim vremenom kako bi se projekt doveo do ove točke kada ga mogu podijeliti s vama, ali potrebno je još puno posla za poboljšanje izvedbe metode. U takvom stanju može dobro funkcionirati unutar određenih ograničenja. Radio sam na identificiranju 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, tj. Trebali bi pouzdano identificirati uzorak ciljane zvijezde bez obzira na kut pod kojim je prikazana 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 treninga 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, pa će rezultirajući skup pozitivnih slika sadržavati raspon orijentacija pozitivna slika. 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 kvalitetni kaskadni klasifikator čak i s velikim rasponom orijentacije.

Drugo potencijalno rješenje bilo bi osposobljavanje 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 kvaliteta svake kaskade može se održati na visokoj razini, no s druge strane to će rezultirati daleko većim kaskadama, pa će i proces identifikacije biti sporiji.

Parametar 'levelWeight', koji je vrijednost koju pruža funkcija 'detektiraj višestruku skalu', 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 točka.

Postavljanje piksela - Mnogo jednostavnija, ali i problematična točka je postavljanje piksela, ilustrirano na sljedeće dvije slike, koje pokazuju uvećan prikaz slike zvijezde, tako da se pojedini pikseli dviju zvijezda mogu jasno vidjeti. Postupak erozije koji se koristi u programu za brisanje svih osim najsjajnijih zvijezda sa slike zadržat će prvu zvijezdu, a drugu će odbaciti, unatoč 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 tako prva zvijezda središnji piksel 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 time koje će svijetle zvijezde u danom zvjezdanom polju dobiti oznake (i stoga ih se usporediti s obučenim klasifikatorima) - stoga je moguće da ispravno pozitivno promatranje neće biti moguće.

Korak 11: Posljednja riječ

Zadnja riječ
Zadnja riječ

Hvala vam što ste pročitali moje upute, nadam se da vam se ovaj projekt učinio zanimljivim. 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 točke. Iz literature koju sam pročitao ovo je prilično originalan koncept, a s većim se razvojem zasigurno 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 nadahnuti 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!

Svemirski izazov
Svemirski izazov
Svemirski izazov
Svemirski izazov

Drugoplasirani u svemirskom izazovu

Preporučeni: