Satura rādītājs:

Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV): 11 soļi (ar attēliem)
Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV): 11 soļi (ar attēliem)

Video: Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV): 11 soļi (ar attēliem)

Video: Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV): 11 soļi (ar attēliem)
Video: Computer Vision with Python! Grayscaling Images 2024, Novembris
Anonim
Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV)
Zvaigžņu atpazīšana, izmantojot datora redzi (OpenCV)

Šajā pamācībā tiks aprakstīts, kā izveidot datora redzes programmu, lai attēlā automātiski identificētu zvaigžņu rakstus. Metode izmanto OpenCV (Open-Source Computer Vision) bibliotēku, lai izveidotu apmācītu HAAR kaskāžu kopumu, ko var izmantot, lai atpazītu konkrētus zvaigžņu modeļus. Lai gan šī rokasgrāmata ir saistīta ar zvaigžņu raksta atpazīšanu, manis aprakstīto OpenCV procesu var attiecināt arī uz citām lietojumprogrammām - tāpēc, cerams, tas būs noderīgi!

Projekts ir apkopots šajā video:

Kāpēc es uzrakstīju šo pamācošo?

  1. Es uzskatu, ka zvaigžņu raksta identifikācijas metode, kuru es izstrādāju, ir potenciāli piemērojama plašam amatieru astronomijas projektu klāstam - neatkarīgi no tā, vai tā ir teleskopa orientācija, automātiska attēlu klasifikācija vai pat galu galā zvaigžņu sensors atklātā pirmkoda vai amatieru CubeSat.
  2. Šeit ir daudz labu OpenCV pamācību, taču pat tad man šķita, ka sākotnēji to bija ļoti grūti apgūt, tāpēc es ceru, ka šī rokasgrāmata būs laba atsauce citiem cilvēkiem, kuri vēlas apmācīt HAAR klasifikatorus OpenCV (ne vienmēr tas ir saistīts ar varbūt astronomija!).
  3. Es pats neesmu apmācīts programmētājs, tāpēc šis projekts patiešām virzīja manu izpratni. Cerams, ka, rakstot šo pamācību, citi, pieredzējušāki, veidotāji tiks iedvesmoti strādāt pie šīs koncepcijas un sniegt savu ieguldījumu GitHub un šajā pamācībā, izmantojot komentārus šajā lapā.
  4. Amatieru astronomija un orientēšanās metodes mani ļoti interesē, skatiet manu iepriekšējo pamācību, kurā ir Arduino Star-Finder teleskopiem.

Šīs pamācības vāka fotoattēls ir ar 3U CubeSat dizaina koncepciju, kuras projektēšanā es piedalījos. Es to izmantoju, lai ilustrētu šo pamācību, jo datora redzes zvaigžņu atpazīšanas sistēmas sākotnējais pielietojums bija paredzēts orientācijas sensoram amatieru izgatavotiem CubeSats, izmantojot Raspberry Pi V2 kameru. Es uzskatu, ka ir daudz citu potenciālu datoru redzes zvaigžņu atpazīšanas pielietojumu, taču, manuprāt, tas ir foršākais!

Neliels glosārijs:

Mācības par datora redzi ir lēnākas, jo tiek lietots tik daudz speciālistu terminu, tāpēc es šeit definēšu dažus:

Kaskāde - klasifikators, kas apmācīts noteikt konkrētu mērķa objektu.

Atsauces marķieris - marķieris, kas attēlam pievieno vizuālās atsauces punktu.

HAAR - Haar līdzīgas funkcijas ir attēla funkciju veids, ko izmanto klasifikatora apmācībai.

OpenCV - atvērtā koda datorvīzija, datora redzes rīku bibliotēka.

Stellarium - atvērtā koda astronomijas programmatūra.

1. darbība. Prasības

OpenCV ir uz Linux balstīta bibliotēka, tāpēc, lai gan it kā ir iespējams to labi darbināt operētājsistēmā Windows, jums būs daudz vieglāk to palaist Linux vidē (ņemiet to no manis un daudzas dienas, mēģinot to pilnībā izmantot) Windows!). Kā eksperiments es lejupielādēju un palaidu OpenCV savā Raspberry Pi 3B+, kas bija veiksmīgs, lai gan klasifikatoru apmācība ir ļoti RAM ietilpīgs process, tādēļ, ja vēlaties to darīt jebkurā ātrumā, ieteicamais maršruts ir nolīgt Linux virtuālo serveri (kas patiesībā var būt pārsteidzoši lēti) dažas dienas/nedēļas/mēnešus un izmantojiet to kā īpašu vidi, kurā veikt klasifikatora apmācību. Jūs varēsit vadīt serveri no Windows datora, izmantojot SSH klientu, piemēram, Putty. Kad kaskādes ir apmācītas, izmantojot VPS, tās var lejupielādēt jūsu Windows datorā, un Python var izmantot, lai palaistu attēlu atpazīšanas programmu Windows vidē.

Linux virtuālais serveris:

Lai veiktu HAAR kaskādes apmācības procesus, ir nepieciešams Linux virtuālais serveris (VPS). Sākotnēji es nolīgu serveri ar 8 GB RAM un Ubuntu 16.04.6 (LTS) x64, un vēlāk otru, lai dubultotu ātrumu, ar kādu es varētu apmācīt kaskādes, lai gan jums būs nepieciešams tikai viens

Programmatūra:

  • Stellarium - šī ir virtuāla planetārija/astronomijas programmatūra, kas ir brīvi pieejama. To izmantos, lai apkopotu simulētus zvaigžņu attēlus izmantošanai testēšanā.
  • Putty - Šis ir SSH klients, ko izmanto, lai kontrolētu VPS, izmantojot komandrindu.
  • WinSCP - tas tiek izmantots failu pārsūtīšanai no Windows datora.

2. darbība: VPS iestatīšana

Lai sāktu darboties VPS, ir jāveic neliels iestatīšanas process. Pirmo reizi tas var aizņemt nedaudz laika, taču tas nav pārāk sarežģīti, ja rūpīgi sekojat soļiem. Šī apmācība man bija lieliska atsauce, es ieteiktu jums izlasīt arī šo, vienlaikus strādājot ar šo pamācību. Tas aptver Linux komandu specifiku pa rindām, kas ir jāievēro burtiski.

Aptuveni process ietver:

  1. Linux servera izveide ar pareizu Ubuntu versiju.
  2. Servera jaunināšana un atjaunināšana.
  3. Darba vietas direktorija izveide, kurā ir instalēts OpenCV.
  4. Dažu būtisku lietu, proti, kompilatora, dažādu bibliotēku un Python stiprinājumu instalēšana.

Pēc šī posma jūs esat gatavs sākt gatavoties apmācības procesam.

3. solis: process

Viss datora redzes process, izmantojot HAAR kaskādes, sākumā ir diezgan mulsinošs, tāpēc šis solis nedaudz sīkāk apraksta loģiku:

Pamata process

  1. Pastāv negatīva attēla datu kopa, kas sastāv no vairākiem tūkstošiem attēlu, kuros nav interesējošā objekta. Tas būs jāaugšupielādē VPS.
  2. Tiek izveidots viens pozitīvs tēls, kas satur interesējošo objektu. Tas arī būs jāaugšupielādē VPS.
  3. Atsevišķs pozitīvs attēls tiek izkropļots, deformēts, pagriezts utt., Ko nosaka izvēlēto parametru kopums, un tas tiek pārklāts, atlasot negatīvos attēlus. Tas ir mākslīgs veids, kā no viena attēla izveidot lielu pozitīvu datu kopu. (Citās reālās pasaules lietojumprogrammās, piemēram, kaķa identificēšanā, jūs varētu vienkārši izmantot vairākus tūkstošus kaķu attēlu, taču šī metode ne vienmēr ir piemērota, ja jums nav tik daudz pozitīvu attēlu. Šeit izmantotā mākslīgā pieeja būs mazāk efektīva, taču tā ir vienīgā iespēja šādam lietošanas gadījumam).
  4. Tiek veikts apmācības process, kas darbojas pakāpeniski. Katrs posms apmācīs kaskādi, lai attēlu kopās identificētu dažādas HAAR tipa funkcijas. Katra posma pabeigšana prasa eksponenciāli ilgāku laiku, un klasifikatora efektivitāte ar katru reizi palielinās (ir iespējams arī pārmērīgi trenēties, lai jūs to zinātu!).
  5. Viena apmācīta kaskāde varēs meklēt vienu mērķa objektu. Ja vēlaties identificēt vairākus unikālus objektus, jums katram būs nepieciešama apmācīta kaskāde. Šajā gadījumā es apmācīju apmēram 50 dažādas kaskādes unikālām zvaigžņu skropstām, lai izveidotu komplektu, kas varētu aptvert ziemeļu debess puslodi.
  6. Visbeidzot, tiek izmantota noteikšanas programma, kas katru kopas kaskādi vada pret ievades attēlu. Kaskāde ievadīto attēlu meklēs tā noteikto mērķa objektu.
  7. Ja tas izdosies, mērķa objekts tiks identificēts ievades attēlā.

n.b. ja to izmanto, piemēram, satelīta orientācijas kontekstā, attēls tiks uzņemts, izmantojot iebūvēto kameru. Tiks identificētas šī attēla spožākās zvaigznes, un šajās pozīcijās tiks pārklāti marķieri. Pēc tam šis attēls tiek parādīts apmācītu kaskāžu kopai, kas pārbaudīs, vai ievades attēlā ir kāds no mērķa objektiem. Ja tiek atklāts patiess pozitīvs, tad zināmā zvaigznāja leņķiskais stāvoklis tiek atklāts attiecībā pret satelīta korpusa asīm.

4. solis: negatīvie un pozitīvie

Negatīvi

Patiešām galvenais kaskādes apmācības aspekts ir pēc iespējas plašāka negatīvo attēlu datu kopa. Mēs runājam par tūkstošiem, ideālā gadījumā desmitiem tūkstošu attēlu. Nav īsti svarīgi, ko tie satur, mērķis ir tikai sniegt daudzveidīgu vizuālo informāciju. Mapē Klasifikatora apmācība ir dažādas manis apkopotās negatīvo attēlu datu kopas. Sākotnēji tie sastāvēja tikai no simulētiem zvaigžņu lauka attēliem, kas iegūti no Stellarium, bet vēlāk es papildināju datu kopu ar tik daudz nejaušinātiem attēliem, cik vien varēju atrast (jā, ieskaitot manas brīvdienu fotogrāfijas …). Lielākajā datu kopā ir gandrīz 9000 attēlu, kas ir lielākais, ko esmu izveidojis līdz šim. Izmantojot šo iespēju, jūs ietaupīsit savu apkopošanu.

Pozitīvi

Pozitīvais tēls (tas ir mērķa zvaigžņu modelis, kas kaskādi tiks apmācīts atpazīt) sākas kā ekrānuzņēmums no zvaigznes modeļa Stellarium. Python programma pēc tam identificē spilgtākās zvaigznes attēlā un pārklāj marķierus (paskaidrots vēlāk šajā pamācībā) uz šīm zvaigžņu pozīcijām. Pēc tam šis attēls tiek samazināts līdz 50x50 pikseļiem. Tas ir mazs, bet kaskadēm nepieciešamais apmācības laiks palielināsies eksponenciāli, palielinoties šim izmēram, un tāpēc tas ir labs kompromiss starp kvalitāti un laiku.

5. solis: Stellarium kontrole

Stellarium kontrole
Stellarium kontrole
Stellarium kontrole
Stellarium kontrole

GitHub krātuves mapē Stellarium Scripts ir trīs programmas, kuras es rakstīju, lai kontrolētu Stellarium lietošanu. Lai tos izmantotu, ievietojiet tos Stellarium instalēšanas mapes skriptu mapē. Lai tos palaistu, varat atvērt skriptu logu no izvēlnes Stellarium vai vienkārši veicot dubultklikšķi uz programmas skriptu mapē, kas palaidīs Stellarium un nekavējoties palaidīs izvēlēto programmu.

tēzes_4 un tēzes_5 uztver aptuveni 2000 attēlu attiecīgi no ziemeļu un dienvidu debess puslodēm. Tos izmantoja negatīvu attēlu datu bāzu veidošanai, lai salīdzinātu pozitīvo tēlu. Atšķirība starp ziemeļiem un dienvidiem bija vienkāršs veids, kā nodrošināt, lai mērķa (pozitīvā) zvaigžņu modelis netiktu iekļauts negatīvajā datu kopā, apmācot ziemeļu puslodes zvaigžņu modeļus pret dienvidu debess puslodes attēlu datu kopu un otrādi. (Ja negatīvā attēla datu kopā ir arī pozitīvs attēls, tas ietekmēs klasifikatora kvalitāti).

Noderīga ir arī thesis_setup - tādējādi tiek iestatīts, ka Stellarium ir piemērots attēlu uzņemšanai - attēli, ko izmanto, lai simulētu skatu no kosmosa. Tā automātiski veic tādas darbības kā izvēlņu, režģlīniju, etiķešu uc slēpšana, lai saglabātu nepieciešamību katru reizi, kad vēlaties paņemt attēlu.

6. solis: Rocket Man

Raķešu cilvēks
Raķešu cilvēks

Pirmās apmācītās kaskādes nespēja pareizi identificēt nevienu zvaigžņu rakstu. Viņi bija ļoti neuzticami un bija ļoti pakļauti viltus pozitīviem rezultātiem. Mans pieņēmums bija, ka faktiski zvaigžņu lauka attēli no Stellarium (būtībā tikai balti punkti uz melna fona) vienkārši nesatur pietiekami daudz vizuālās informācijas, lai tajā būtu pietiekami daudz HAAR tipa funkciju veiksmīgai klasifikatoru apmācībai. Es domāju, ka bija vēls vakars, bet es nolēmu izmēģināt ideju uzrakstīt programmu, lai automātiski novietotu nelielu sīktēlu virs katras spožās zvaigznes atrašanās vietas zvaigznes lauka attēlā.

Eltons

Tas bija muļķīgs tests, bet, pievienojot nelielu Eltona Džona sejas attēlu katrai spilgtas zvaigznes vietai, apmācot klasifikatoru pret šo pozitīvo tēlu un pēc tam veicot kaskādes pret sākotnējo attēlu, tas bija daudz efektīvāks, lai pareizi atrastu pareizais modelis. Es zināju, ka esmu uz kaut ko!

7. solis: atsauces marķieri

Atsauces marķieri
Atsauces marķieri

Lai gan “Eltons” pierādīja teoriju, man bija vajadzīgs marķieris ar pilnu rotācijas simetriju, lai zvaigžņu raksts būtu vienāds neatkarīgi no tā, kādā orientācijā tas tika pasniegts. Es pārbaudīju vairākus marķieru veidus un atklāju, ka veids, kas atrodas labajā apakšējā stūrī, bija visefektīvākais ar kontrastējošiem melnbaltiem gredzeniem. Pithon programma, kas parādīta GitHub repo pozitīvajā mapē, parāda, kā noteiktās attēla spožākās zvaigznes tiek identificētas, un šie marķieri šajās pozīcijās tiek automātiski pārklāti. Tagad mēs esam izveidojuši galveno zvaigžņu modeļu attēlojumu, pret kuriem var trenēties.

8. solis: Kaskādes izmantošana

Kaskādes izmantošana
Kaskādes izmantošana

Kad esat apmācījis kaskādes komplektu, jums jāzina, kā tos izmantot, lai attēlā identificētu objektu!

Apskatiet GitHub mapi Star Identification, kur atradīsit programmu cascade_test19.py. Šī aizraujoši nosauktā programma paņem kaskādes no noteiktas mapes un palaiž tās visas pret ievades attēlu un ziņo par veiktajiem atklājumiem. Funkcija "detectMultiScale" ir tās pamatā, un tai ir nepieciešami dažādi argumenti, kas nosaka noteikšanas procesu. To maiņa ir būtiska kaskādes klasifikatora darbībai, un plašāku diskusiju par to var atrast nākamajā solī, kur mēs aplūkojam, kā novērst viltus pozitīvus rezultātus.

To var pielietot satelīta orientācijas sistēmā, korelējot pikseļu vērtību ierobežojošās kastes centrā ar identificētās zvaigžņu patronas Ra/Dec debesu koordinātu un pēc tam korelējot to ar leņķisko pārvietojumu no attēla centra (kamera ass). No tā, izmantojot izpratni par objektīva izkropļojumiem (tuvināts gnomoniskajai projekcijai), satelīta leņķi var atrast tikai no divām pozitīvām identifikācijām.

9. solis: kā saglabāt pozitīvu attieksmi pret viltus pozitīviem

Kā saglabāt pozitīvu attieksmi pret viltus pozitīviem
Kā saglabāt pozitīvu attieksmi pret viltus pozitīviem
Kā saglabāt pozitīvu attieksmi pret viltus pozitīviem
Kā saglabāt pozitīvu attieksmi pret viltus pozitīviem

Šie divi attēli parāda kaskādes komplekta pārbaudes rezultātus ar identisku attēlu, bet ar dažādiem parametriem. Skaidrs, ka pirmajā attēlā ir patiesa identifikācija, bet arī milzīgs skaits kļūdaini pozitīvu, bet otrajā attēlā ir tikai pareizā identifikācija.

Programma cascade_test19.py GitHub repo mapē Star Identification izmanto divas rezultātu sakārtošanas metodes. Pirmkārt, detektīvs MultiScale funktons nosaka minimālo un maksimālo rezultātu, ko var atrast, kas ir saprātīgi, jo aptuvenais mērķa zvaigznes raksta izmērs logā (dotajam objektīvam un palielinājumam - manos simulētajos Stellarium attēlos tiek izmantotas Raspberry Pi V2 kamera) ir zināma. Otrkārt, kods izvēlēsies rezultātu ar lielāko ierobežojošo lodziņu (iepriekšējos ierobežojumos). Pārbaudot, tas tika atklāts kā patiesi pozitīvs. Treškārt, programmā ir noteikts minimālais “levelWeights” (faktiski “ticamības vērtība”), kas nepieciešams, lai šo ID uzskatītu par patiesu pozitīvu. Izmantojot šo metodi, kaskādes bija efektīvas, lai atrastu pareizo rezultātu.

Tāpat kā zvaigžņu lauka attēlus, es to pārbaudīju arī pret sava galda attēliem, piemēram, apmācot kaskādes, lai identificētu manu piezīmju grāmatiņu, krūzi utt., Lai praktizētu viltus pozitīvu rezultātu novēršanu. Iepriekš minētās metodes labi darbojās visos apstākļos, kas bija iepriecinoši.

10. solis: diskusija

Diskusija
Diskusija
Diskusija
Diskusija
Diskusija
Diskusija

Uzlabošanas jomas

Šis man bija sarežģīts projekts un patiešām veicināja manu izpratni par šo tēmu. Kopā vairākus mēnešus ir bijis gandrīz pilnas slodzes darbs, lai projekts nonāktu līdz šim brīdim, kad varu to kopīgot ar jums, taču vēl ir daudz darāmā, lai uzlabotu metodes darbību. Pašreizējā stāvoklī tas var labi darboties noteiktos ierobežojumos. Esmu strādājis, lai noteiktu, kurās jomās ir nepieciešams papildu darbs, un, cerams, turpmākajos mēnešos varēšu veltīt laiku šo jautājumu risināšanai. Viņi ir:

Leņķis - šī ir sarežģīta joma, ideja, ka klasifikatoru rezultātiem jābūt rotācijas nemainīgiem, t.i., tam vajadzētu ticamībai identificēt mērķa zvaigžņu modeli neatkarīgi no tā, kādā leņķī tam tiek parādīts attēls, kurā ir mērķa zvaigznes patters. Kaskāde, kas apmācīta, izmantojot ievades attēlu vienā orientācijā, nevarēs identificēt šo attēlu nejaušās orientācijās, tāpēc apmācības procesā jāievieš pozitīvā attēla leņķa dispersija, lai apmācītu kaskādes, kas var pieņemt diapazonu no ievades leņķiem. Parametrs “maxzangle” kaskādes apmācības komandās ņem argānus radiānos, kas kontrolē leņķa robežu, kurā ievadītais pozitīvais attēls tiks pārklāts ar sniegtajiem negatīvajiem attēliem, tāpēc iegūtā pozitīvā attēla kopa saturēs dažādas orientācijas pozitīvais tēls. Tomēr, palielinoties šim maksimālajam stūrim, kaskādes pieņemšanas koeficients (vispārīgi runājot, kvalitāte) strauji samazināsies. Es uzskatu, ka risinājums ir apmācīt kaskādes, izmantojot ievērojami lielāku negatīvo attēlu datu bāzi nekā tas, ko es izmantoju, lai nodrošinātu, ka var izveidot labas kvalitātes kaskādes klasifikatoru, pat iekļaujot lielu orientācijas izplatību.

Vēl viens potenciāls risinājums būtu apmācīt vairākas kaskādes konkrētam mērķim, un katra kaskāde regulē noteiktu pilnas 360 grādu rotācijas daļu. Tādā veidā katras kaskādes kvalitāti var uzturēt augstā līmenī, bet, no otras puses, tas radīs daudz vairāk kaskādes, un līdz ar to identifikācijas process būs lēnāks.

Parametrs “levelWeight”, kas ir vērtība, ko nodrošina funkcija “detectMultiScale”, ir analoģisks noteiktās ticamības vērtībai. Pētot to, tika izveidots iepriekš minētais grafiks, kas parāda, kā pozitīvas identifikācijas pārliecība strauji samazinās, palielinoties attēla orientācijai jebkurā virzienā, apstiprinot domas, ka tas ir vājais punkts.

Pikseļu izvietojums - Daudz vienkāršāks, bet arī problemātisks punkts ir pikseļu izvietojums, ko ilustrē šādi divi attēli, parādot palielinātu zvaigznes attēla skatu, lai varētu skaidri redzēt atsevišķus divu zvaigžņu pikseļus. Erozijas process, ko izmanto programmā, lai attīrītu visas, izņemot spilgtākās zvaigznes no attēla, saglabās pirmo zvaigzni un atmetīs otro, neskatoties uz to, ka to spilgtums ir vienāds. Iemesls tam ir tas, ka pirmā zvaigzne ir centrēta uz pikseli, bet otrā nav tāda. Erozijas funkcija noņem koncentriskus pikseļu gredzenus ap grupas centrālo pikseļu, un tādējādi pirmajai zvaigznei centrālais pikselis izdzīvos erozijas funkciju, bet otrā zvaigzne tiks pilnībā noņemta no attēla. Tāpēc atsauces marķieri tiks novietoti tikai uz pirmās zvaigznes, nevis uz otro. Tas radīs neatbilstības attiecībā uz to, kuras spilgtās zvaigznes noteiktā zvaigžņu laukā saņems marķierus (un līdz ar to tiks salīdzinātas ar apmācītajiem klasifikatoriem) - līdz ar to ir iespējams, ka pareizs pozitīvs novērojums nebūs iespējams.

11. solis: pēdējais vārds

Pēdējais vārds
Pēdējais vārds

Paldies, ka izlasījāt manu pamācību, es ceru, ka jums šis projekts šķita intriģējošs. Tas ir bijis ļoti interesants process, strādājot pie tā, ir pagājis vairāk nekā gads, kopš es sāku strādāt pie šīs koncepcijas, un mani uzmundrina rezultāti līdz šim. No literatūras, ko es lasīju, šī ir diezgan oriģināla koncepcija, un, attīstoties vairāk, to noteikti var izmantot dažādās amatieru astronomijas lietojumprogrammās vai vairāk.

Šis projekts man bija stāva mācīšanās līkne, un tāpēc es ceru, ka daži lasītāji ar lielāku programmēšanas pieredzi var iedvesmoties dot ieguldījumu projekta turpināšanā, izmantojot GitHub lapu, un mēs varam turpināt attīstīt šo atvērtā pirmkoda rīku. Es ar nepacietību lasīšu visus jūsu komentārus, bet, lūdzu, neuzdodiet pārāk daudz sarežģītu jautājumu!

Kosmosa izaicinājums
Kosmosa izaicinājums
Kosmosa izaicinājums
Kosmosa izaicinājums

Otrās vietas ieguvējs kosmosa izaicinājumā

Ieteicams: