Kazalo:

Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV): 11 korakov (s slikami)
Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV): 11 korakov (s slikami)

Video: Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV): 11 korakov (s slikami)

Video: Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV): 11 korakov (s slikami)
Video: Война на денежные средства 2024, December
Anonim
Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV)
Prepoznavanje zvezd z uporabo računalniškega vida (OpenCV)

Ta navodila vam bodo opisala, kako ustvariti program za računalniški vid za samodejno prepoznavanje vzorcev zvezd na sliki. Metoda uporablja knjižnico OpenCV (Open-Source Computer Vision) za ustvarjanje nabora usposobljenih HAAR kaskad, ki jih je mogoče uporabiti za prepoznavanje določenih vzorcev zvezd. Čeprav je ta priročnik v kontekstu prepoznavanja zvezdnih vzorcev, lahko postopek OpenCV, ki ga opisujem, uporabimo tudi za druge aplikacije - zato bo, upajmo, koristen!

V tem videu je povzetek projekta:

Zakaj sem napisal to navodilo?

  1. Metoda identifikacije vzorca zvezd, ki jo razvijam, je po mojem mnenju potencialna za uporabo pri številnih amaterskih astronomskih projektih - ne glede na to, ali gre za usmerjenost teleskopa, samodejno klasifikacijo slik ali celo na koncu za senzor zvezd na odprtokodnem ali amaterskem CubeSat.
  2. Tukaj je veliko dobrih navodil za OpenCV, vendar kljub temu se mi je na začetku zelo težko naučiti, zato upam, da bo ta vodnik dobra referenca za druge ljudi, ki želijo usposobiti klasifikatorje HAAR za OpenCV (ni nujno, da gre za Mogoče astronomija!).
  3. Tudi sam nisem usposobljen programer, zato mi je ta projekt resnično pomagal razumeti. Upajmo, da bodo drugi, bolj izkušeni ustvarjalci s pisanjem tega Instructablea navdihnili delo na tem konceptu in prispevali k GitHubu in temu navodilu s komentarji na tej strani.
  4. Ljubezenska astronomija in orientacijske metode so moje veliko zanimanje, glej moj prejšnji pouk z Arduino Finderjem zvezd za teleskope.

Naslovna fotografija tega Instructable je koncepta 3U CubeSat, pri katerem sem sodeloval. Uporabil sem ga za ponazoritev tega navodila, saj naj bi bila prvotna uporaba sistema za prepoznavanje zvezd računalniškega vida namenjena za orientacijski senzor za amatersko izdelane CubeSats z uporabo kamere Raspberry Pi V2. Verjamem, da obstaja še veliko drugih možnih aplikacij za prepoznavanje zvezd računalniškega vida, vendar mislim, da je to najbolj kul!

Majhen slovarček:

Učenje o računalniškem vidu se zaradi neumne količine specializiranih izrazov upočasni, zato bom tukaj opredelil nekaj:

Kaskada - klasifikator, usposobljen za identifikacijo določenega ciljnega predmeta.

Fiducial Marker - Marker, ki sliki doda točko vizualnega sklicevanja.

HAAR - Haar podobne lastnosti so vrsta slikovnih lastnosti, ki se uporabljajo za usposabljanje klasifikatorjev.

OpenCV - odprtokodni računalniški vid, knjižnica orodij za računalniški vid.

Stellarium - odprtokodna programska oprema za astronomijo.

1. korak: Zahteve

OpenCV je knjižnica, ki temelji na Linuxu, zato, čeprav naj bi jo bilo mogoče dobro upravljati v operacijskem sistemu Windows, jo boste veliko lažje zagnali v okolju Linux (vzemite to od mene in veliko dni se trudim, da bi v celoti deloval) Windows!). Kot poskus sem prenesel in zagnal OpenCV na svojem Raspberry Pi 3B+, kar je bilo uspešno, čeprav je usposabljanje za razvrščevalce zelo intenziven proces, zato če želite to narediti pri kateri koli hitrosti, priporočamo, da najamete Linux Virtual Server (kar je lahko presenetljivo poceni) nekaj dni/tednov/mesecev in ga uporabite kot namensko okolje, v katerem lahko izvajate usposabljanje za razvrščevalce. Strežnik boste lahko upravljali z računalnikom z operacijskim sistemom Windows s odjemalcem SSH, kot je Putty. Ko so kaskade usposobljene z uporabo VPS, jih lahko prenesete v računalnik z operacijskim sistemom Windows, Python pa lahko uporabite za zagon programa za prepoznavanje slik v okolju Windows.

Navidezni strežnik Linux:

Za izvajanje procesov kaskadnega usposabljanja HAAR je potreben navidezni strežnik Linux (VPS). Sprva sem najel strežnik z 8 GB RAM -a in Ubuntu 16.04.6 (LTS) x64, kasneje pa še drugega, da podvojim hitrost, s katero bi lahko treniral kaskade, čeprav boste potrebovali le enega

Programska oprema:

  • Stellarium - to je programska oprema za virtualni planetarij/astronomijo, ki je na voljo brezplačno. Uporabil se bo za zbiranje simuliranih zvezdnih slik za uporabo pri testiranju.
  • Putty - To je odjemalec SSH, ki se uporablja za nadzor VPS prek ukazne vrstice.
  • WinSCP - uporablja se za prenos datotek iz računalnika z operacijskim sistemom Windows.

Korak: Nastavitev VPS

Za zagon in delovanje VPS je majhen postopek nastavitve. Prvič vam bo morda vzelo nekaj časa, vendar ni preveč zapleteno, če natančno sledite korakom. Ta vadnica je bila zame odlična referenca, priporočam, da to preberete tudi med delom po tem navodilu. Zajema posebnosti ukazov linux po vrsticah, kar je treba dosledno upoštevati.

Približno postopek vključuje:

  1. Ustvarjanje strežnika Linux s pravilno različico Ubuntu.
  2. Nadgradnja in posodobitev strežnika.
  3. Ustvarjanje imenika delovnega prostora, v katerega je nameščen OpenCV.
  4. Namestitev nekaterih osnovnih stvari, in sicer prevajalnika, različnih knjižnic in vezav Python.

Po tej stopnji ste pripravljeni na priprave na proces usposabljanja.

3. korak: Postopek

Celoten proces računalniškega vida z uporabo HAAR kaskad je sprva precej zmeden, zato ta korak opisuje logiko nekoliko podrobneje:

Osnovni proces

  1. Obstaja negativen niz slik, ki ga sestavlja več tisoč slik, ki ne vsebujejo predmeta, ki nas zanima. To bo treba naložiti v VPS.
  2. Ustvari se ena sama pozitivna podoba, ki vsebuje predmet, ki nas zanima. To bo treba naložiti tudi v VPS.
  3. Posamezna pozitivna slika je popačena, deformirana, zasukana itd. Z nizom izbranih parametrov in prekrita z izbiro negativnih slik. To je umetni način ustvarjanja velikega pozitivnega nabora podatkov iz ene same slike. (Za druge aplikacije v resničnem svetu, kot je identifikacija mačke, bi lahko preprosto uporabili več tisoč podob mačk, vendar ta metoda ni vedno primerna, če nimate tako velikega nabora pozitivnih slik. Tu je uporabljen umetni pristop. bo manj učinkovit, vendar je edina možnost za primer uporabe, kot je ta).
  4. Izvaja se proces usposabljanja, ki deluje v fazah. Vsaka stopnja bo usposabljala kaskado za prepoznavanje različnih značilnosti tipa HAAR znotraj naborov slik. Vsaka stopnja traja eksponentno dlje časa, učinkovitost klasifikatorja pa se vsakič poveča (možno je tudi pretreniranje, samo da veste!).
  5. Ena sama usposobljena kaskada bo lahko iskala en sam ciljni objekt. Če želite identificirati več edinstvenih predmetov, boste za vsakega potrebovali usposobljeno kaskado. V tem primeru sem treniral približno 50 različnih kaskad za edinstvene zvezdnike, da bi ustvaril niz, ki bi lahko pokrival severno nebesno poloblo.
  6. Nazadnje se uporablja program za odkrivanje, ki vodi vsako kaskado niza proti vhodni sliki. Kaskada bo v vhodni sliki poiskala svoj ciljni predmet.
  7. Če je uspešen, bo ciljni objekt identificiran znotraj vhodne slike.

n.b. če se na primer uporablja v kontekstu satelitske orientacije, bi bila slika posneta z vgrajeno kamero. Najsvetlejše zvezde na tej sliki bodo identificirane in na teh mestih so prekrivani označevalci. Ta slika je nato predstavljena nizu usposobljenih kaskad, ki bodo preizkusile, ali vhodna slika vsebuje katerega od ciljnih objektov. Če se odkrije pravi pozitivni rezultat, se odkrije kotni položaj znanega ozvezdja glede na osi telesa satelita.

4. korak: Negativne in pozitivne strani

Negativno

Resnično ključni vidik kaskadnega usposabljanja je imeti čim večji nabor negativnih slik. Govorimo o tisočih, idealno na desetine tisoč slik. Ni pomembno, kaj vsebujejo, cilj je le zagotoviti različne vizualne informacije. Mapa za usposabljanje razvrščevalnika vsebuje različne nabore negativnih slik, ki sem jih sestavil. Sprva so bile te sestavljene samo iz simuliranih slik zvezdnega polja, pridobljenih iz Stelarija, kasneje pa sem nabor podatkov razširil s toliko randomiziranimi slikami, kot sem jih našel (da, vključno s fotografijami s počitnic …). Največji nabor podatkov vključuje skoraj 9000 slik, kar je bilo največje, kar sem jih ustvaril doslej. Z uporabo tega boste prihranili pri sestavljanju svojega.

Pozitivni

Pozitivna slika (to je vzorec ciljne zvezde, ki jo bo kaskada naučila prepoznati) se začne kot posnetek zaslona vzorca zvezde v Stellariumu. Program python nato identificira najsvetlejše zvezde na sliki in na te položaje zvezd položi označevalce (razloženo kasneje v tem navodilu). Ta slika se nato skrči na 50x50 slikovnih pik. To je majhno, vendar se bo čas usposabljanja, potreben za kaskade, z naraščanjem te velikosti eksponentno povečal, zato je to dober kompromis med kakovostjo in časom.

5. korak: Nadzor stelarija

Nadzor stelarija
Nadzor stelarija
Nadzor stelarija
Nadzor stelarija

Mapa Stellarium Scripts v skladišču GitHub vsebuje tri programe, ki sem jih napisal za nadzor uporabe Stellariuma. Če jih želite uporabiti, jih vstavite v mapo skripti v namestitveni mapi Stellarium. Če jih želite zagnati, lahko odprete okno skriptov v meniju Stellarium ali pa samo dvokliknete program v mapi Skripte, ki zažene Stellarium in takoj zažene izbrani program.

thesis_4 in thesis_5 zajemata približno 2000 slik vsake severne oziroma južne nebesne poloble. Ti so bili uporabljeni za oblikovanje zbirk negativnih slik, za usposabljanje pozitivne podobe. Razlikovanje med severom in jugom je bilo na preprost način zagotoviti, da ciljni (pozitivni) vzorec zvezde ne bo prisoten v negativnem naboru podatkov, tako da se vzorci zvezd na severni polobli ujemajo z nizom slik na južni nebesni polobli in obratno. (Če je pozitivna slika prisotna tudi v nizu negativnih slik, bo to vplivalo na kakovost klasifikatorja).

uporabna je tudi thesis_setup - s tem je Stellarium primeren za zajem slik - slik, ki se uporabljajo za simulacijo pogleda iz vesolja. Samodejno izvede dejanja, kot so skrivanje menijev, mrežnih črt, nalepk itd., Da shrani vaše potrebe vsakič, ko želite zajeti sliko.

6. korak: Rocket Man

Rocket Man
Rocket Man

Prve kaskade, ki sem jih treniral, niso mogle pravilno prepoznati vzorcev zvezd. Bili so zelo nezanesljivi in zelo nagnjeni k lažno pozitivnim rezultatom. Moja domneva je bila, da slike zvezdnega polja iz Stelarija (v bistvu le bele pike na črnem ozadju) preprosto niso vsebovale dovolj vizualnih informacij, ki bi vsebovale dovolj lastnosti tipa HAAR za uspešno usposabljanje klasifikatorjev. Mislim, da je bilo pozno ponoči, vendar sem se odločil preizkusiti idejo o pisanju programa, ki bi samodejno postavil majhno sličico na mesto vsake svetle zvezde na sliki zvezdnega polja.

Elton

To je bil neumni preizkus, vendar je bilo z dodajanjem majhne slike obraza Eltona Johna na vsako lokacijo svetle zvezde, usposabljanjem klasifikatorja proti tej pozitivni podobi in nato kaskadami proti prvotni sliki veliko bolj učinkovito pri pravilnem iskanju pravi vzorec. Vedel sem, da sem na nečem!

7. korak: Fiducialni označevalci

Fiducialni označevalci
Fiducialni označevalci

Čeprav so "Eltoni" dokazali teorijo, sem potreboval označevalnik s popolno rotacijsko simetrijo, tako da bi bil vzorec zvezde enak, ne glede na to, v kakšni orientaciji je predstavljen. Preizkusil sem vrsto tipov označevalcev in ugotovil, da je tip spodaj desno najučinkovitejši s kontrastnimi črno -belimi obroči. Program python, predstavljen v pozitivni mapi repo GitHub, prikazuje, kako so identificirane najsvetlejše zvezde na dani sliki in ti označevalci se samodejno prekrivajo na teh mestih. Zdaj smo ustvarili predstavitev ključnih zvezdniških vzorcev, proti katerim se je mogoče naučiti.

8. korak: Uporaba kaskad

Uporaba kaskad
Uporaba kaskad

Ko ste trenirali niz kaskad, morate vedeti, kako jih uporabiti za prepoznavanje predmeta na sliki!

Oglejte si mapo Star Identification na GitHubu, kjer boste našli program cascade_test19.py. Ta privlačno imenovan program vzame niz kaskad iz dane mape in jih vse požene proti vhodni sliki ter poroča o izvedenih zaznavah. Jedro tega je funkcija 'detectionMultiScale' in potrebuje različne argumente, ki opredeljujejo postopek odkrivanja. Njihovo spreminjanje je ključnega pomena za delovanje kaskadnega klasifikatorja, o tem pa lahko več razpravljamo v naslednjem koraku, kjer preučimo, kako odpraviti lažno pozitivne rezultate.

To bi lahko uporabili v satelitskem orientacijskem sistemu tako, da vrednost pikslov v središču omejevalne škatle primerjamo z nebesno koordinato Ra/Dec identificiranega zvezdnega vzorca, nato pa to povežemo s kotnim premikom od središča slike (kamera os). Na podlagi tega je mogoče razumeti popačenje leče (približno gnomonični projekciji), kot satelita pa je mogoče najti le iz dveh pozitivnih identifikacij.

9. korak: Kako ostati pozitiven glede lažnih pozitivnih rezultatov

Kako ostati pozitiven glede lažnih pozitivnih rezultatov
Kako ostati pozitiven glede lažnih pozitivnih rezultatov
Kako ostati pozitiven glede lažnih pozitivnih rezultatov
Kako ostati pozitiven glede lažnih pozitivnih rezultatov

Ti dve sliki prikazujeta rezultate testiranja kaskadnega niza na enaki sliki, vendar z različnimi parametri. Jasno je, da prva slika vsebuje resnično identifikacijo, hkrati pa tudi ogromno lažno pozitivnih rezultatov, druga slika pa le pravilno identifikacijo.

Program cascade_test19.py v mapi Star Identification v repo GitHub uporablja dva načina za razvrščanje rezultatov. Prvič, funkcija detectMultiScale določi najmanjšo in največjo velikost rezultata, ki ga je mogoče najti, kar je smiselno, kot približno velikost vzorca ciljne zvezde v oknu (za dano lečo in povečavo - moje simulirane slike Stellarium uporabljajo lastnosti kamera Raspberry Pi V2) je znana. Drugič, koda bo izbrala rezultat z največjim omejevalnim poljem (v prejšnjih mejah). Pri testiranju je bilo to resnično pozitivno. Tretjič, program določa najnižjo vrednost "levelWeights" (dejansko "vrednost zaupanja"), ki je potrebna za obravnavo tega ID -ja kot pravega pozitivnega. S to metodo so bile kaskade učinkovite pri iskanju pravilnega rezultata.

Poleg slik zvezdnega polja sem to preizkusil tudi na primer s slikami svoje mize, kaskadami za usposabljanje za identifikacijo mojega zvezka, skodelice itd., Za vadbo odpravljanja lažno pozitivnih rezultatov. Zgornje metode so v vseh okoliščinah dobro delovale, kar je bilo spodbudno.

10. korak: Pogovor

Diskusija
Diskusija
Diskusija
Diskusija
Diskusija
Diskusija

Področja za izboljšanje

To je bil zame kompleksen projekt in resnično spodbudil moje razumevanje teme. Skupaj je trajalo več mesecev skoraj polnega delovnega časa, da je projekt prišel do te točke, ko ga lahko delim z vami, vendar je za izboljšanje učinkovitosti metode potrebno še veliko dela. V sedanjem stanju lahko dobro deluje v določenih omejitvah. Delal sem, da bi ugotovil, katera področja potrebujejo dodatno delo, in upam, da bom v naslednjih mesecih lahko porabil čas za njihovo reševanje. So:

Kot - To je zapleteno področje, ideja, da morajo biti rezultati klasifikatorjev rotacijsko nespremenljivi, to pomeni, da mora zanesljivo identificirati vzorec ciljne zvezde ne glede na kot, pod katerim je predstavljena slika, ki vsebuje ciljno zvezdo. Kaskada, usposobljena z uporabo vhodne slike pri eni orientaciji, te slike ne bo mogla identificirati v naključnih usmeritvah, zato je treba v proces usposabljanja vnesti variacijo pozitivnega kota slike, da se urijo kaskade, ki lahko sprejmejo razpon vhodnih kotov. Parameter 'maxzangle' v ukazih za kaskadno usposabljanje sprejme argument v radianih, ki nadzoruje omejitev kota, na katerega bo vhodna pozitivna slika prekrivana na podanih negativnih slikah, zato bo nastali niz pozitivnih slik vseboval vrsto orientacij pozitivno podobo. Ko pa se ta maksimum poveča, se bo sprejemljivo razmerje (na splošno gledano, kakovost) kaskade močno zmanjšalo. Menim, da je rešitev v treniranju kaskad z uporabo bistveno večje baze negativnih slik od tiste, ki sem jo uporabil za zagotovitev, da je mogoče ustvariti kakovostni kaskadni klasifikator, ki vključuje tudi velik orientacijski razpon.

Druga možna rešitev bi bila usposabljanje številnih kaskad za določeno tarčo, pri čemer vsaka kaskada ureja določen del celotnega vrtenja za 360 stopinj. Tako se lahko kakovost vsake kaskade ohrani na visoki ravni, po drugi strani pa bo to povzročilo veliko več kaskad, zato bo postopek identifikacije počasnejši.

Parameter "levelWeight", ki je vrednost, ki jo zagotavlja funkcija "detektiraj večstopenjsko", je analogen vrednosti zaupanja v izvedenem zaznavanju. Ob preučevanju tega je bil ustvarjen zgornji graf, ki prikazuje, kako se zaupanje pozitivne identifikacije močno zmanjša, ko se orientacija slike poveča v obe smeri, kar potrjuje misli, da je to šibka točka.

Postavitev slikovnih pik - Precej enostavnejša, a tudi problematična točka je postavitev slikovnih pik, prikazana na naslednjih dveh slikah, ki prikazuje povečan pogled na sliko zvezde, tako da je mogoče jasno videti posamezne slikovne pike dveh zvezd. Postopek erozije, uporabljen v programu za brisanje vseh, razen najsvetlejših zvezd s slike, bo obdržal prvo zvezdo, drugo pa zavrgel, kljub temu, da sta enaki svetlosti. Razlog za to je, da je prva zvezda v središču piksla, druga pa kot taka. Funkcija erozije odstrani koncentrične obroče slikovnih pik okoli osrednjega slikovnega pika skupine, zato bo prva zvezda imela osrednjo slikovno piko, da bo preživela funkcijo erozije, druga zvezda pa bo popolnoma odstranjena s slike. Zato bodo fiducialni označevalci postavljeni samo na prvo zvezdo in ne na drugo. To bo povzročilo nedoslednosti, v zvezi s katerimi bodo svetle zvezde v določenem zvezdnem polju prejele oznake (in jih zato primerjali z usposobljenimi klasifikatorji) - zato je možno, da pravilno pozitivno opazovanje ne bo mogoče.

11. korak: Zadnja beseda

Zadnja beseda
Zadnja beseda

Hvala, ker ste prebrali moj pouk, upam, da se vam je ta projekt zdel zanimiv. Delo na tem področju je bilo zelo zanimivo, minilo je več kot eno leto, odkar sem začel delati na konceptu, in rezultati do te točke me navdušujejo. Iz literature, ki sem jo prebral, je to precej izviren koncept in z večjim razvojem se zagotovo lahko uporablja v različnih aplikacijah za amatersko astronomijo ali več.

Ta projekt je bil zame strma krivulja učenja, zato upam, da bodo nekateri bralci z več izkušnjami s programiranjem morda navdihnjeni, da prispevajo k nadaljevanju projekta na strani GitHub, zato bomo lahko še naprej razvijali to odprtokodno orodje. Veselim se branja vaših komentarjev, vendar prosim, ne postavljajte preveč težkih vprašanj!

Space Challenge
Space Challenge
Space Challenge
Space Challenge

Podprvak v vesoljskem izzivu

Priporočena: