Sisukord:
Video: Tähtede äratundmine arvuti nägemise (OpenCV) abil: 11 sammu (piltidega)
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Selles juhendis kirjeldatakse teile, kuidas luua arvutinägemisprogramm, et pildil olevad tähemustrid automaatselt tuvastada. Meetod kasutab OpenCV (Open-Source Computer Vision) raamatukogu, et luua treenitud HAAR-kaskaadide komplekt, mida saab kasutada konkreetsete tähemustrite äratundmiseks. Kuigi see juhend on tähtmustri tuvastamise kontekstis, saab minu kirjeldatud OpenCV -protsessi rakendada ka teiste rakenduste puhul - seega on see loodetavasti kasulik!
Projekt on kokku võetud selles videos:
Miks ma selle õpetliku kirjutasin?
- Minu arvates arendatav tähemustri tuvastamise meetod on potentsiaalne rakendamiseks paljudele amatöör -astronoomiaprojektidele - olgu see siis teleskoobi orientatsioon, automaatne pildiklassifikatsioon või isegi lõpp -täheandur avatud lähtekoodiga või amatöör CubeSat.
- Siin on palju häid OpenCV juhendeid, kuid sellegipoolest pidasin seda esialgu väga keeruliseks õppimiseks, nii et loodan, et see juhend on hea viide teistele inimestele, kes soovivad HAAR -klassifikaatoreid OpenCV jaoks koolitada (mitte tingimata Võib -olla astronoomia!).
- Ma ei ole ise koolitatud programmeerija, nii et see projekt tõstis mu arusaamist tõepoolest. Loodetavasti inspireerivad seda juhendatavat teist kogenumad tegijad selle kontseptsiooni kallal töötama ning annavad oma panuse GitHubi ja selle juhendamisse selle lehe kommentaaride kaudu.
- Amatöör-astronoomia ja orienteerumismeetodid pakuvad mulle suurt huvi, vaadake minu eelmist juhendit, mis sisaldab teleskoopide Arduino täheotsijat.
Selle Instructable'i kaanefoto on kontseptsiooni 3U CubeSat kujundusest, mille kujundamisel osalesin. Kasutasin seda selle juhendamise illustreerimiseks, kuna arvuti nägemistähtede tuvastamise süsteemi algne rakendus pidi olema amatööride valmistatud CubeSatsi orientatsiooniandur, kasutades Raspberry Pi V2 kaamerat. Usun, et arvuti nägemise tähe äratundmisel on palju muid potentsiaalseid rakendusi, kuid minu arvates on see kõige lahedam!
Väike sõnastik:
Arvutinägemise tundmaõppimise muudab aeglasemaks kasutatud loll hulk spetsialiseeritud termineid, seega määratlen mõned neist siin:
Kaskaad - klassifikaator, mis on koolitatud konkreetse sihtobjekti tuvastamiseks.
Võrdlusmarker - marker, mis lisab pildile visuaalse viitepunkti.
HAAR - Haar -sarnased funktsioonid on teatud tüüpi pildifunktsioonid, mida kasutatakse klassifikaatorite koolitamiseks.
OpenCV - avatud lähtekoodiga arvutinägemine, arvutite nägemise tööriistade kogu.
Stellarium - avatud lähtekoodiga astronoomiatarkvara.
Samm: nõuded
OpenCV on Linuxil põhinev raamatukogu, nii et kuigi seda on väidetavalt võimalik opsüsteemis Windows hästi kasutada, on teil Linuxi keskkonnas selle käitamine palju lihtsam (võtke see minult ja palju päevi, et see täielikult tööle saada Aknad!). Eksperimendina laadisin alla ja käivitasin oma Raspberry Pi 3B+OpenCV, mis õnnestus, kuigi klassifikaatoritreening on väga RAM -i nõudev protsess, nii et kui soovite seda teha mis tahes kiirusel, on soovitatav marsruut rentida Linuxi virtuaalserver (mis võib tegelikult olla üllatavalt odav) mõneks päevaks/nädalaks/kuuks ja kasutage seda spetsiaalse keskkonnana klassifikaatoritreeningu läbiviimiseks. Saate serverit juhtida Windowsi arvutist, kasutades SSH -klienti, näiteks Putty. Kui kaskaadid on VPS -i abil treenitud, saab need teie Windowsi arvutisse alla laadida ja Pythonit saab kasutada pildituvastusprogrammi käitamiseks Windowsi keskkonnas.
Linuxi virtuaalserver:
HAAR kaskaadi koolitusprotsesside läbiviimiseks on vaja Linuxi virtuaalserverit (VPS). Esialgu palkasin serveri, millel oli 8 GB muutmälu ja Ubuntu 16.04.6 (LTS) x64, ja hiljem teise, et kahekordistada kaskaadide treenimise kiirust, ehkki vajate ainult ühte
Tarkvara:
- Stellarium - see on virtuaalne planetaarium/astronoomiatarkvara, mis on vabalt saadaval. Seda kasutatakse simuleeritud tähepiltide kogumiseks testimiseks.
- Putty - See on SSH -klient, mida kasutatakse VPS -i juhtimiseks käsurealt.
- WinSCP - seda kasutatakse failide edastamiseks Windowsi arvutist.
Samm: VPS -i seadistamine
VPS -i käivitamiseks on väike seadistusprotsess. Esimesel korral võib teie jaoks veidi aega kuluda, kuid see pole liiga keeruline, kui järgite täpselt samme. See õpetus oli minu jaoks suurepärane viide, soovitan teil ka seda juhendit lugedes lugeda. See hõlmab rida -realt linuxi käskude eripära, mida on vaja tähe järgi järgida.
Ligikaudu hõlmab protsess järgmist:
- Linuxi serveri loomine õige Ubuntu versiooniga.
- Serveri uuendamine ja uuendamine.
- Tööruumi kataloogi loomine, kuhu OpenCV on installitud.
- Mõnede oluliste asjade, nimelt kompilaatori, erinevate teekide ja Pythoni sidumiste installimine.
Pärast seda etappi olete valmis alustama koolitusprotsessi ettevalmistamist.
3. samm: protsess
Kogu arvutinägemise protsess HAAR -kaskaade kasutades on esialgu üsna segane, nii et see samm kirjeldab loogikat veidi üksikasjalikumalt:
Põhiprotsess
- Olemas on negatiivne pildiandmekogum, mis koosneb mitmest tuhandest pildist, mis ei sisalda huvipakkuvat objekti. See tuleb üles laadida VPS -i.
- Luuakse üks positiivne kuvand, mis sisaldab huvipakkuvat objekti. See tuleb ka VPS -i üles laadida.
- Üksainus positiivne pilt on valitud parameetrite kogumi tõttu moonutatud, väändunud, pööratud jne. See on kunstlik viis ühest pildist suure positiivse andmestiku loomiseks. (Muude reaalmaailma rakenduste puhul, näiteks kassi tuvastamine, võite lihtsalt kasutada mitu tuhat kassi pilti, kuid see meetod pole alati sobiv, kui teil pole nii palju positiivseid pilte. Siin kasutatud kunstlik lähenemine on vähem tõhus, kuid see on ainus võimalus selliseks kasutamiseks.)
- Käivitatakse koolitusprotsess, mis toimib etappide kaupa. Iga etapp treenib kaskaadi, et tuvastada pildikomplektides erinevad HAAR-tüüpi funktsioonid. Iga etapi läbimine võtab eksponentsiaalselt kauem aega ja klassifikaatori efektiivsus suureneb iga korraga (võimalik on ka üle treenida, et sa seda teaksid!).
- Üksainus treenitud kaskaad suudab otsida ühte sihtobjekti. Kui soovite tuvastada mitu ainulaadset objekti, vajate igaühe jaoks koolitatud kaskaadi. Sel juhul koolitasin umbes 50 erinevat kaskaadi ainulaadsete tähepatterite jaoks, et luua komplekt, mis võiks katta põhjapoolse taevakera.
- Lõpuks kasutatakse tuvastusprogrammi, mis juhib komplekti iga kaskaadi sisendpildi vastu. Kaskaad otsib sisestatud pildilt selle sihtobjekti.
- Kui see õnnestub, tuvastatakse sihtobjekt sisendpildis.
n.b. kui seda kasutatakse näiteks satelliidi orientatsiooni kontekstis, jäädvustatakse pilt pardakaamera abil. Selle pildi eredamad tähed tuvastatakse ja nendes positsioonides asetatakse markerid. Seejärel esitatakse see pilt treenitud kaskaadide komplektile, mis kontrollib, kas sisendpilt sisaldab mõnda sihtobjekti. Kui tuvastatakse tõeline positiivne, avastatakse teadaoleva tähtkuju nurgaasend satelliidi keha telgede suhtes.
Samm: negatiivsed ja positiivsed küljed
Negatiivsed
Kaskaaditreeningu tõepoolest võtmetähtsusega aspekt on võimalikult suur negatiivsete piltide andmestik. Me räägime tuhandetest, ideaalis kümnetest tuhandetest piltidest. Pole tegelikult oluline, mida need sisaldavad, eesmärk on lihtsalt pakkuda mitmesugust visuaalset teavet. Kaust Classifier Training sisaldab erinevaid minu koostatud negatiivse pildi andmekogumeid. Algselt koosnesid need ainult Stellariumist kogutud simuleeritud täheväljapiltidest, kuid hiljem täiendasin andmekogumit nii paljude juhuslikult valitud piltidega (jah, sealhulgas minu puhkusefotod …). Suurim andmekogum sisaldab peaaegu 9000 pilti, mis oli suurim, mille olen seni loonud. Selle kasutamine säästab teie koostamist.
Positiivsed
Positiivne pilt (see on sihtmärgi tähtmuster, mida kaskaadi hakatakse ära tundma) algab Stellariumi tähemustri ekraanipildina. Seejärel tuvastab püütoniprogramm pildi heledamad tähed ja katab nendele tähtede positsioonidele markerid (selgitatakse hiljem selles juhendis). Seejärel vähendatakse seda pilti 50x50 pikslini. See on väike, kuid kaskaadide jaoks vajalik treeninguaeg suureneb selle suuruse kasvades plahvatuslikult ja seega on see hea kompromiss kvaliteedi ja aja vahel.
Samm: Stellariumi kontroll
GitHubi hoidla kaust Stellarium Scripts sisaldab kolme programmi, mille kirjutasin Stellariumi kasutamise kontrollimiseks. Nende kasutamiseks paigutage need oma Stellariumi installikausta skriptide kausta. Nende käivitamiseks saate avada skriptide akna Stellariumi menüüst või lihtsalt topeltklõpsates skriptide kaustas programmil, mis käivitab Stellariumi ja käivitab valitud programmi kohe.
thesis_4 ja thesis_5 jäädvustavad umbes 2000 pilti vastavalt põhja- ja lõunapoolkeradest. Neid kasutati negatiivsete piltide andmebaaside moodustamiseks, positiivse kuvandi vastu võitlemiseks. Põhja- ja lõunaosa eristamine oli lihtne viis tagada, et sihtmärk (positiivne) tähemudel ei oleks negatiivses andmekogumis olemas, koolitades põhjapoolkera tähemustreid lõunapoolkera kujutise andmestiku vastu ja vastupidi. (Kui negatiivse pildi andmekogumis on ka positiivne pilt, mõjutab see klassifikaatori kvaliteeti).
kasulik on ka thesis_setup - see seab Stellariumi sobivaks piltide jäädvustamiseks - need on kujutised, mida kasutatakse kosmosest avaneva vaate simuleerimiseks. See teeb automaatselt selliseid toiminguid nagu menüüde, ruudustiku, siltide jms peitmine, et säästa vajadust iga kord, kui soovite pilti haarata.
6. samm: rakettmees
Esimesed treenitud kaskaadid ei suutnud tähemustreid õigesti tuvastada. Nad olid väga ebausaldusväärsed ja altid valepositiivsetele tulemustele. Minu eeldus oli, et Stellariumi tähevälja pildid (põhimõtteliselt lihtsalt valged täpid mustal taustal) lihtsalt ei sisaldanud piisavalt visuaalset teavet, et sisaldada piisavalt HAAR-tüüpi funktsioone edukaks klassifikaatoritreeninguks. Ma arvan, et see oli hilisõhtul, kuid otsustasin proovida programmi kirjutamise ideed, et paigutada automaatselt väike pisipilt iga tähevälja kujutise ereda tähe asukoha kohale.
Elton
See oli rumal test, kuid lisades igasse ereda tähe asukohta väikese pildi Elton Johni näost, koolitades klassifikaatorit selle positiivse pildi vastu ja käivitades seejärel kaskaadid algse pildi vastu, oli see palju tõhusam õige õige muster. Ma teadsin, et olen millegi kallal!
7. samm: tugimarkerid
Kuigi "Eltonid" tõestasid teooriat, vajasin täispöörleva sümmeetriaga markerit, nii et tähemuster tunduks sama, olenemata sellest, millises orientatsioonis see esitati. Testisin erinevaid markeritüüpe ja leidsin, et paremal all olev tüüp oli kõige tõhusam, kontrastsed mustad ja valged rõngad. GitHubi repo positiivses kaustas esitatav püütoniprogramm näitab, kuidas antud pildil eredamad tähed tuvastatakse ja need markerid nendes positsioonides automaatselt kattuvad. Oleme nüüd loonud võtmetähtede mustrite esituse, mille vastu saab treenida.
8. samm: Kaskaadide kasutamine
Kui olete treeninud kaskaadide komplekti, peate teadma, kuidas neid pildil oleva objekti tuvastamiseks kasutada!
Vaadake GitHubi kausta Star Identification, kust leiate programmi cascade_test19.py. See meeldejääva nimega programm võtab antud kaustast kaskaadide komplekti ja käivitab need kõik sisendpildi vastu ning annab aru tehtud avastustest. Funktsioon „detectMultiScale” on selle tuum ja selle tuvastamiseks on vaja erinevaid argumente. Nende muutmine on kaskaadiklassifikaatori toimimise seisukohalt kriitilise tähtsusega ning rohkem arutelu selle kohta leiate järgmisest sammust, kus vaatame, kuidas valepositiivseid tulemusi kõrvaldada.
Seda saab rakendada satelliidi orientatsioonisüsteemis, korreleerides piirangukasti keskel asuva pikslite väärtuse tuvastatud tähekujulise Ra/Dec taevase koordinaadiga ja korreleerides selle pildi keskpunkti nurganihkega (kaamera telg). Sellest tulenevalt, kasutades objektiivi moonutuste mõistmist (ligikaudne gnomoonprojektsioon), saab satelliidi nurga leida vaid kahest positiivsest identifitseerimisest.
Samm: kuidas jääda valepositiivsete suhtes positiivseks
Need kaks pilti näitavad kaskaadikomplekti testimise tulemusi identse pildi, kuid erinevate parameetritega. On selge, et esimene pilt sisaldab tõelist identifitseerimist, aga ka tohutul hulgal valepositiivseid tulemusi, teine aga ainult õiget identifitseerimist.
Programm cascade_test19.py GitHubi repos kausta Star Identification kasutab tulemuste sortimiseks kahte meetodit. Esiteks määrab funkton detektMultiScale tulemuseks minimaalse ja maksimaalse tulemuse, mis on leitav, mis on mõistlik, kuna aknas oleva sihtmärgi ligikaudne suurus (antud objektiivi ja suurenduse puhul - minu simuleeritud Stellariumi pildid kasutavad Raspberry Pi V2 kaamera). Teiseks valib kood suurima piirangukastiga tulemuse (eelmistes piirides). Testimisel leiti, et see on tõeline positiivne. Kolmandaks määrab programm minimaalse „levelWeights“(tegelikult „usaldusväärtuse“), mis on vajalik selle ID käsitlemiseks tõelise positiivsena. Selle meetodi abil olid kaskaadid efektiivsed õige tulemuse leidmisel.
Lisaks täheväljapiltidele testisin seda ka näiteks oma laua piltidega, treenides kaskaade märkmiku, kruusi jms tuvastamiseks, et harjutada valepositiivsete tulemuste kõrvaldamist. Ülaltoodud meetodid toimisid hästi igas olukorras, mis oli julgustav.
10. samm: arutelu
Parandamise valdkonnad
See on olnud minu jaoks keeruline projekt ja tõstis minu arusaamist teemast. See on kokku viinud mitu kuud peaaegu täistööajaga tööd, et projekt jõuaks selleni, kui saan seda teiega jagada, kuid meetodi toimivuse parandamiseks tuleb veel palju tööd teha. Praegusel kujul võib see teatud piirangute piires hästi toimida. Olen töötanud selle nimel, et teha kindlaks, millised valdkonnad vajavad lisatööd, ja loodetavasti saan järgnevatel kuudel aega nendega tegeleda. Nemad on:
Nurk - see on keeruline ala, idee, et klassifikaatorite tulemused peavad olema pöörlemiselt muutumatud, st see peaks usaldusväärselt tuvastama sihtmärgi tähemustri olenemata sellest, millise nurga all see sihtmärgi tähepilti sisaldav pilt esitatakse. Kaskaad, mis on treenitud sisendkujutist kasutades ühes orientatsioonis, ei suuda seda pilti juhuslikes orientatsioonides tuvastada, seega tuleb positiivse pildinurga dispersioon lisada koolitusprotsessi, et treenida kaskaade, mis suudavad sisestusnurkade vahemikku vastu võtta. Kaskaadi treeningkäskude parameeter „maxzangle” võtab argumendi radiaanides, mis kontrollib nurga piiri, mille korral sisestatud positiivne kujutis esitatavatele negatiivsetele piltidele kaetakse, nii et tulemuseks olev positiivne pildikomplekt sisaldab erinevaid suundi positiivne kuvand. Selle maksimaalse nurga suurenemisega väheneb aga kaskaadi vastuvõetavuse suhe (laias laastus kvaliteet) järsult. Usun, et lahendus on kaskaadide treenimine, kasutades oluliselt suuremat negatiivsete piltide andmebaasi kui see, mida kasutasin, et tagada hea kvaliteediga kaskaadide klassifikaatori loomine isegi suure orientatsiooniga.
Teine võimalik lahendus oleks treenida konkreetse sihtmärgi jaoks mitmeid kaskaade, kusjuures iga kaskaad reguleerib teatud osa 360 -kraadisest pöörlemisest. Nii saab iga kaskaadi kvaliteeti hoida kõrgel tasemel, kuid teisest küljest toob see kaasa palju rohkem kaskaade ja seega on identifitseerimisprotsess aeglasem.
Parameeter „levelWeight”, mis on funktsiooni „detectMultiScale” väärtus, on analoogne tuvastamise usaldusväärtusega. Seda uurides loodi ülaltoodud graafik, mis näitab, kuidas positiivse identifitseerimise usaldus väheneb järsult, kui pildi orientatsioon suureneb kummaski suunas, kinnitades mõtteid, et see on nõrk koht.
Pikslite paigutus - palju lihtsam, kuid ka problemaatiline punkt on pikslite paigutus, mida illustreerivad järgmised kaks pilti, mis näitavad tähekujutise suurendatud vaadet, nii et kahe tähe üksikud pikslid on selgelt nähtavad. Programmis kasutatud erosiooniprotsess kõigi, välja arvatud pildilt eredamate tähtede nühkimiseks, säilitab esimese tähe ja loobub teisest, vaatamata sellele, et need on võrdselt heledad. Selle põhjuseks on asjaolu, et esimene täht keskendub pikslile, teine aga mitte. Erosioonifunktsioon eemaldab kontsentrilised pikslirõngad rühma keskpiksli ümbert ja nii jääb esimese tähe keskpiksel erosioonifunktsiooni ellu, kuid teine täht eemaldatakse pildilt täielikult. Seetõttu paigutatakse võrdlusmarkerid ainult esimesele tähele, mitte teisele. See põhjustab vastuolusid seoses sellega, millised heledad tähed antud täheväljal saavad markerid (ja seega võrreldakse neid koolitatud klassifikaatoritega) - seega on võimalik, et õige positiivne vaatlus pole võimalik.
11. samm: viimane sõna
Täname, et lugesite minu juhendit, loodan, et leidsite selle projekti huvitavaks. Sellega töötamine on olnud väga huvitav protsess, kontseptsiooni kallal töötamise algusest on möödas juba üle aasta ja tulemused on mind siiani julgustanud. Kirjandusest, mida ma lugesin, on see üsna originaalne kontseptsioon ja suuremat arengut saab kindlasti rakendada mitmesugustes amatöör -astronoomia rakendustes.
See projekt oli minu jaoks järsk õppimiskõver ja seega loodan, et mõned lugejad, kellel on rohkem programmeerimiskogemust, võivad saada innustust GitHubi lehe kaudu projekti jätkamisse panustada ning saame seda avatud lähtekoodiga tööriista edasi arendada. Ootan huviga teie kommentaare, kuid palun ärge esitage liiga palju keerulisi küsimusi!
Runner Up in the Space Challenge