Sisällysluettelo:

Tähtien tunnistus tietokonevision avulla (OpenCV): 11 vaihetta (kuvien kanssa)
Tähtien tunnistus tietokonevision avulla (OpenCV): 11 vaihetta (kuvien kanssa)

Video: Tähtien tunnistus tietokonevision avulla (OpenCV): 11 vaihetta (kuvien kanssa)

Video: Tähtien tunnistus tietokonevision avulla (OpenCV): 11 vaihetta (kuvien kanssa)
Video: Leap Motion SDK 2024, Marraskuu
Anonim
Tähtien tunnistus tietokonevision avulla (OpenCV)
Tähtien tunnistus tietokonevision avulla (OpenCV)

Tässä ohjeessa kuvataan sinulle, miten voit luoda tietokoneen visio -ohjelman, joka tunnistaa automaattisesti tähtikuviot kuvassa. Menetelmä luo OpenCV (Open-Source Computer Vision) -kirjaston avulla joukon koulutettuja HAAR-kaskadeja, joita voidaan käyttää tiettyjen tähtikuvioiden tunnistamiseen. Vaikka tämä opas liittyy tähtikuvioiden tunnistamiseen, kuvaamaani OpenCV -prosessia voidaan soveltaa myös muihin sovelluksiin - joten siitä on toivottavasti hyötyä!

Projekti on tiivistetty tällä videolla:

Miksi kirjoitin tämän ohjeellisen?

  1. Uskon, että kehittämäni tähtikuvion tunnistusmenetelmää voidaan soveltaa monenlaisiin amatööri -tähtitieteen projekteihin - olipa kyseessä teleskooppisuunta, automaattinen kuvan luokittelu tai jopa lopulta tähtianturi avoimessa lähdekoodissa tai amatööri CubeSatissa.
  2. Täällä on paljon hyviä OpenCV -ohjeita, mutta siitä huolimatta minun oli aluksi erittäin vaikea oppia, joten toivon, että tämä opas on hyvä viite muille ihmisille, jotka haluavat kouluttaa HAAR -luokittelijoita OpenCV: lle (ei välttämättä ehkä tähtitiede!).
  3. En ole itse koulutettu ohjelmoija, joten tämä projekti todella lisäsi ymmärrystäni. Toivottavasti kirjoittamalla tämän Instructable -ohjelman muita, kokeneempia tekijöitä inspiroidaan työskentelemään tämän konseptin parissa ja osallistumaan GitHubiin ja tähän ohjeeseen kommentoimalla tätä sivua.
  4. Amatööri-tähtitiede ja suunnistusmenetelmät ovat suuri kiinnostukseni, katso aiemmat ohjeeni, joissa on Arduino Star-Finder teleskooppeja varten.

Tämän Instructablen kansikuva on 3U CubeSat -konseptin konsepti, jonka suunnitteluun osallistuin. Käytin sitä havainnollistamaan tätä opettavaista, koska tietokoneen vision tähden tunnistusjärjestelmän alkuperäinen sovellus oli tarkoitettu suunnistusanturille amatööri-valmistetuille CubeSat-laitteille Raspberry Pi V2 -kameralla. Uskon, että on monia muita mahdollisia sovelluksia tietokonenäön tähden tunnistamiseen, mutta mielestäni tämä on hienoin!

Pieni sanasto:

Tietokonenäön oppimista hidastaa käytetty typerä määrä asiantuntijatermejä, joten määrittelen joitain niistä täällä:

Cascade - luokittelija, joka on koulutettu tunnistamaan tietyn kohdeobjektin.

Viitemerkki - merkki, joka lisää visuaalisen viittauspisteen kuvaan.

HAAR - Haar -kaltaiset ominaisuudet ovat eräänlainen kuvaominaisuus, jota käytetään luokittelijakoulutuksessa.

OpenCV - Open Source Computer Vision, tietokonenäkötyökalujen kirjasto.

Stellarium - avoimen lähdekoodin tähtitiedeohjelmisto.

Vaihe 1: Vaatimukset

OpenCV on Linux -pohjainen kirjasto, joten vaikka sen oletetaan olevan mahdollista käyttää hyvin Windowsissa, sinulla on paljon helpompi ajaa sitä Linux -ympäristössä (ota tämä minulta ja monta päivää yrittäessäsi saada se toimimaan täysin Windows!). Kokeilun vuoksi latasin ja suoritin OpenCV: n Raspberry Pi 3B+-laitteelleni, joka onnistui, vaikka luokittelijakoulutus on erittäin RAM -muistia vaativa prosessi, joten jos haluat tehdä sen millä tahansa nopeudella, suositeltu reitti on vuokrata Linux -virtuaalipalvelin (mikä voi olla yllättävän halpaa) muutaman päivän/viikon/kuukauden ajan ja käytä sitä erityisenä ympäristönä luokittelijakoulutuksen suorittamiseen. Voit hallita palvelinta Windows -tietokoneesta käyttämällä SSH -asiakasta, kuten Putty. Kun kaskadit on koulutettu VPS: n avulla, ne voidaan ladata Windows -tietokoneellesi ja Pythonia voidaan käyttää kuvan tunnistusohjelman suorittamiseen Windows -ympäristössä.

Linuxin virtuaalipalvelin:

Linux Virtual Server (VPS) tarvitaan HAAR -kaskadikoulutusprosessien suorittamiseen. Aluksi palkkasin palvelimen, jossa oli 8 Gt RAM -muistia ja Ubuntu 16.04.6 (LTS) x64, ja myöhemmin toisen, joka kaksinkertaisti nopeuden, jolla voisin kouluttaa kaskadit, vaikka tarvitset vain yhden

Ohjelmisto:

  • Stellarium - tämä on virtuaalinen planetaario-/tähtitiedeohjelmisto, joka on vapaasti saatavilla. Sitä käytetään simuloitujen tähtikuvien keräämiseen testausta varten.
  • Putty - Tämä on SSH -asiakas, jota käytetään ohjaamaan VPS: ää komentorivin kautta.
  • WinSCP - tätä käytetään tiedostonsiirtoon Windows -tietokoneesta.

Vaihe 2: VPS -asennus

On pieni asennusprosessi VPS: n käynnistämiseksi. Ensimmäisellä kerralla se voi kestää jonkin aikaa, mutta se ei ole liian hankalaa, jos noudatat ohjeita tarkasti. Tämä opetusohjelma oli loistava viittaus minulle, suosittelen, että luet tämän myös, kun käsittelet tätä ohjeistusta. Se kattaa linux -komentojen erityispiirteet rivi riviltä, mikä on välttämätöntä noudattaa kirjainta.

Karkeasti ottaen prosessi sisältää:

  1. Linux -palvelimen luominen oikealla Ubuntu -versiolla.
  2. Palvelimen päivittäminen ja päivittäminen.
  3. Luo työtilahakemisto, johon OpenCV on asennettu.
  4. Jotkin olennaiset asiat, nimittäin kääntäjä, eri kirjastot ja Python -sidokset, asennetaan.

Tämän vaiheen jälkeen olet valmis aloittamaan valmistautumisen koulutusprosessiin.

Vaihe 3: Prosessi

Koko tietokoneen näkemisen prosessi HAAR -kaskadien avulla on aluksi melko hämmentävä, joten tässä vaiheessa kuvataan logiikkaa hieman yksityiskohtaisemmin:

Perusprosessi

  1. Negatiivinen kuva -aineisto on olemassa, ja se koostuu useista tuhansista kuvista, jotka eivät sisällä kiinnostavaa kohdetta. Tämä on ladattava VPS: ään.
  2. Luodaan yksi positiivinen kuva, joka sisältää kiinnostavan kohteen. Tämä on myös ladattava VPS: ään.
  3. Yksittäinen positiivinen kuva vääristyy, vääntyy, pyörii jne. Joukon valittuja parametreja ja peittää negatiivisten kuvien valinnan. Tämä on keinotekoinen tapa luoda suuri positiivinen tietojoukko yhdestä kuvasta. (Muissa todellisissa sovelluksissa, kuten kissan tunnistamisessa, voit yksinkertaisesti käyttää useita tuhansia kuvia kissoista, mutta tämä menetelmä ei ole aina sopiva, jos sinulla ei ole niin paljon positiivisia kuvia. Tässä käytetty keinotekoinen lähestymistapa on vähemmän tehokas, mutta se on ainoa vaihtoehto tällaiselle käyttötapaukselle).
  4. Koulutusprosessi suoritetaan vaiheittain. Jokainen vaihe kouluttaa kaskadin tunnistamaan eri HAAR-tyyppiset ominaisuudet kuvajoukoissa. Jokaisen vaiheen suorittaminen kestää eksponentiaalisesti kauemmin, ja luokittelijan tehokkuus kasvaa joka kerta (on myös mahdollista treenata liikaa, jotta tiedät!).
  5. Yksi koulutettu kaskadi pystyy etsimään yhden kohdeobjektin. Jos haluat tunnistaa useita ainutlaatuisia esineitä, tarvitset jokaiselle koulutetun kaskadin. Tässä tapauksessa olen kouluttanut noin 50 erilaista kaskadia ainutlaatuisia tähtikuvioita varten, jotta voisin luoda sarjan, joka voisi kattaa pohjoisen taivaan pallonpuoliskon.
  6. Lopuksi käytetään ilmaisuohjelmaa, joka suorittaa sarjan jokaisen kaskadin syöttökuvaa vastaan. Kaskadi etsii annettua kohdeobjektia syöttökuvasta.
  7. Jos se onnistuu, kohdeobjekti tunnistetaan syöttökuvassa.

Huom. jos sitä käytetään esimerkiksi satelliittisuunnittelussa, kuva otettaisiin sisäisellä kameralla. Kuvan kirkkaimmat tähdet tunnistetaan ja merkit sijoitetaan näihin paikkoihin. Tämä kuva esitetään sitten koulutettujen kaskadien joukolle, joka testaa, onko tulokuvassa jokin kohdeobjekteista. Jos todellinen positiivinen havaitaan, tunnetun tähtikuvion kulma -asema havaitaan suhteessa satelliittirungon akseleihin.

Vaihe 4: Negatiiviset ja positiiviset puolet

Negatiivit

Todella tärkeä osa kaskadikoulutusta on saada mahdollisimman suuri negatiivisten kuvien tietojoukko. Puhumme tuhansista, mieluiten kymmenistä tuhansista kuvista. Sillä ei ole väliä, mitä ne sisältävät, tavoitteena on vain tarjota erilaisia visuaalisia tietoja. Luokittelukoulutus -kansio sisältää useita erilaisia negatiivisia kuva -aineistoja, jotka olen koonnut. Alun perin nämä koostuivat yksinomaan Stellariumista kerätyistä simuloiduista tähtikenttäkuvista, mutta myöhemmin lisäsin tietojoukkoa niin monella satunnaistetulla kuvalla kuin löysin (kyllä, mukaan lukien lomakuvani …). Suurin tietojoukko sisältää lähes 9000 kuvaa, mikä oli suurin tähän mennessä luomani. Tämän avulla säästät oman kokoamisen.

Positiiviset

Positiivinen kuva (eli kohdetähtikuvio, jonka kaskadi opetetaan tunnistamaan) alkaa kuvakaappauksena Stellariumin tähtikuviosta. Python -ohjelma tunnistaa sitten kuvan kirkkaimmat tähdet ja peittää näihin tähtikohtiin merkit (selitetään myöhemmin tässä ohjeessa). Tämä kuva pienennetään sitten 50 x 50 pikseliin. Tämä on pieni, mutta kaskadien vaatima harjoitusaika kasvaa eksponentiaalisesti tämän koon kasvaessa, joten tämä on hyvä kompromissi laadun ja ajan välillä.

Vaihe 5: Stellarium -ohjaus

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

GitHub -arkiston Stellarium Scripts -kansio sisältää kolme ohjelmaa, jotka kirjoitin hallitsemaan Stellariumin käyttöä. Jos haluat käyttää niitä, aseta ne Stellarium -asennuskansion skriptikansioon. Voit suorittaa ne avaamalla skriptit -ikkunan Stellarium -valikosta tai kaksoisnapsauttamalla ohjelmaa komentosarjojen kansiossa, joka käynnistää Stellariumin ja käynnistää valitun ohjelman välittömästi.

thesis_4 ja thesis_5 sieppaavat noin 2000 kuvaa kustakin pohjoisesta ja eteläisestä taivaanpuoliskosta. Niitä käytettiin negatiivisten kuvien tietokantojen muodostamiseen positiivisen kuvan kouluttamiseksi. Erottaminen pohjoisen ja etelän välillä oli yksinkertainen tapa varmistaa, että kohde (positiivinen) tähtikuvio ei ole läsnä negatiivisessa aineistossa kouluttamalla pohjoisen pallonpuoliskon tähtikuvioita eteläisen taivaan pallonpuoliskon kuva -aineistoa vastaan ja päinvastoin. (Jos negatiivisen kuvan tietojoukossa on myös positiivinen kuva, se vaikuttaa luokittelijan laatuun).

thesis_setup on myös hyödyllinen - tämä asettaa Stellariumin sopivaksi kuvien ottamiseen - kuvat, joita käytetään simuloimaan näkymää avaruudesta. Se tekee toimintoja, kuten valikkojen, ruudukon viivojen, tarrojen jne. Piilottamisen automaattisesti säästääksesi tarpeesi aina, kun haluat napata kuvan.

Vaihe 6: Rakettimies

Rakettimies
Rakettimies

Ensimmäiset kouluttamani kaskadit eivät pystyneet tunnistamaan oikein mitään tähtikuvioita. He olivat erittäin epäluotettavia ja alttiita vääriin positiivisille tuloksille. Olettamukseni oli, että tehokkaasti Stellariumin tähtikenttäkuvat (pohjimmiltaan vain valkoisia pisteitä mustalla taustalla) eivät vain sisältäneet tarpeeksi visuaalista tietoa, jotta ne sisältäisivät tarpeeksi HAAR-tyyppisiä ominaisuuksia onnistuneeseen luokittelijakoulutukseen. Luulen, että se oli myöhään yöllä, mutta päätin kokeilla ajatusta ohjelman kirjoittamisesta siten, että se sijoittaa automaattisesti pienen pikkukuvan jokaisen tähtikenttäkuvan kirkkaiden tähtien sijainnin päälle.

Elton

Tämä oli typerä testi, mutta lisäämällä pieni kuva Elton Johnin kasvoista jokaiseen kirkkaaseen tähtikohtaan, kouluttamalla luokittelija tätä positiivista kuvaa vastaan ja sitten suorittamalla kaskadit alkuperäistä kuvaa vastaan, se oli paljon tehokkaampi löytää oikea oikea kuvio. Tiesin, että olin tekemässä jotain!

Vaihe 7: Vertailumerkit

Vertailumerkit
Vertailumerkit

Vaikka 'Eltonit' todistivat teorian, tarvitsin merkin, jolla oli täysi pyörimissymmetria, jotta tähtikuvio näyttäisi samalta riippumatta siitä, missä suunnassa se esitettiin. Testasin useita merkkityyppejä ja huomasin, että oikeassa alakulmassa oleva tyyppi oli tehokkain, kontrastiväriset mustavalkoiset renkaat. GitHub -repon positiivisessa kansiossa esitetty python -ohjelma näyttää, kuinka tietyn kuvan kirkkaimmat tähdet tunnistetaan ja nämä merkit automaattisesti päällekkäin näissä paikoissa. Olemme nyt luoneet esityksen avaintähtimalleista, joita vastaan voidaan kouluttaa.

Vaihe 8: Kaskadien käyttö

Kaskadien käyttö
Kaskadien käyttö

Kun olet kouluttanut kaskadijoukon, sinun on tiedettävä, miten voit käyttää niitä kuvissa olevan kohteen tunnistamiseen!

Katso GitHubin Star Identification -kansio, josta löydät cascade_test19.py -ohjelman. Tämä mukaansatempaava ohjelma ottaa joukon kaskadeja tietystä kansiosta ja suorittaa ne kaikki syöttökuvaa vastaan ja raportoi tehdyistä havainnoista. DetectMultiScale -toiminto on tämän ydin, ja se vaatii erilaisia argumentteja, jotka määrittävät havaitsemisprosessin. Näiden muuttaminen on kriittistä kaskadiluokittelun suorituskyvyn kannalta, ja lisää keskustelua tästä löytyy seuraavasta vaiheesta, jossa tarkastellaan väärien positiivisten poistamista.

Tätä voitaisiin soveltaa satelliitin suuntausjärjestelmässä korreloimalla rajauslaatikon keskellä oleva pikseliarvo tunnistetun tähtikuvion Ra/Dec -taivaankoordinaattiin ja korreloimalla tämä sitten kuvan keskipisteen kulmasiirtymään (kamera akseli). Tästä, käyttämällä objektiivin vääristymän ymmärrystä (likimääräisesti gnomonin projektio), satelliitin kulma voidaan löytää vain kahdesta positiivisesta tunnistuksesta.

Vaihe 9: Kuinka pysyä positiivisena vääriä positiivisia kohtaan

Kuinka pysyä positiivisena vääriä positiivisia kohtaan
Kuinka pysyä positiivisena vääriä positiivisia kohtaan
Kuinka pysyä positiivisena vääriä positiivisia kohtaan
Kuinka pysyä positiivisena vääriä positiivisia kohtaan

Nämä kaksi kuvaa osoittavat kaskadisarjan testaamisen tuloksia saman kuvan kanssa, mutta eri parametreilla. On selvää, että ensimmäinen kuva sisältää todellisen tunnistamisen, mutta myös valtava määrä vääriä positiivisia, kun taas toinen kuva sisältää vain oikean tunnistuksen.

GitHub -repon Star Identification -kansiossa oleva cascade_test19.py -ohjelma lajittelee tulokset kahdella tavalla. Ensinnäkin detectMultiScale -funktio asettaa löydettävän tuloksen pienimmän ja suurimman koon, mikä on järkevää, koska ikkunan kohdetähtikuvion likimääräinen koko (tietylle linssille ja suurennukselle - simuloidut Stellarium -kuvat käyttävät Raspberry Pi V2 -kamera) tunnetaan. Toiseksi koodi valitsee tuloksen, jolla on suurin rajausruutu (edellisissä rajoissa). Testauksessa tämä todettiin todella positiiviseksi. Kolmanneksi ohjelmassa asetetaan vähimmäistaso 'levelWeights' (käytännössä 'luottamusarvo'), joka vaaditaan tämän tunnuksen pitämiseksi todellisena positiivisena. Tällä menetelmällä kaskadit olivat tehokkaita oikean tuloksen löytämisessä.

Tähtikenttäkuvien lisäksi testasin tätä myös työpöydän kuviin, esimerkiksi harjoittelemalla kaskadia muistikirjan, mukin jne. Tunnistamiseksi harjoitellakseni väärien positiivisten poistamista. Edellä mainitut menetelmät toimivat hyvin kaikissa olosuhteissa, mikä oli rohkaisevaa.

Vaihe 10: Keskustelu

Keskustelu
Keskustelu
Keskustelu
Keskustelu
Keskustelu
Keskustelu

Parannettavat alueet

Tämä on ollut minulle monimutkainen projekti, ja se todella lisäsi ymmärrystäni aiheesta. Se on vaatinut yhteensä useita kuukausia lähes kokopäivätyötä saadakseen projektin tähän pisteeseen, jolloin voin jakaa sen kanssanne, mutta menetelmän suorituskyvyn parantamiseksi on vielä paljon tehtävää. Nykyisenä se voi toimia hyvin tietyissä rajoissa. Olen työskennellyt selvittääkseni, mitkä alueet tarvitsevat lisätyötä, ja toivon, että voin käyttää aikaa niiden käsittelyyn tulevina kuukausina. He ovat:

Kulma - Tämä on monimutkainen alue, ajatus siitä, että luokittelijoiden tulosten on oltava kiertovaihtumattomia, toisin sanoen sen pitäisi luotettavasti tunnistaa kohdetähti kuvio riippumatta siitä, missä kulmassa se esitetään kuva, joka sisältää kohdetäpät. Kaskadi, joka on koulutettu käyttämään syöttökuvaa yhdessä suunnassa, ei pysty tunnistamaan kyseistä kuvaa satunnaistetuissa suuntauksissa, joten positiivisen kuvakulman vaihtelu on otettava käyttöön koulutusprosessissa, jotta voidaan kouluttaa kaskadit, jotka voivat hyväksyä tulokulmien alueen. Kaskadiharjoituskomentojen parametri 'maxzangle' ottaa argumentin radiaaneina, joka ohjaa kulman rajaa, jonka tulo positiivinen kuva peitetään tarjotuilla negatiivisilla kuvilla, joten tuloksena oleva positiivinen kuvajoukko sisältää erilaisia suuntauksia positiivinen kuva. Kuitenkin, kun tämä maxzangle kasvaa, kaskadin hyväksymissuhde (yleisesti ottaen laatu) heikkenee jyrkästi. Uskon, että ratkaisu on kouluttaa kaskadeja käyttämällä huomattavasti suurempaa negatiivisten kuvien tietokantaa kuin mitä käytin, jotta voidaan varmistaa, että laadukas kaskadiluokitus voidaan luoda myös suurella suuntausjakaumalla.

Toinen mahdollinen ratkaisu olisi kouluttaa useita kaskadeja tiettyä kohdetta kohden, joista jokainen säätää tietyn osan täydestä 360 asteen kierto. Näin jokaisen kaskadin laatu voidaan pitää korkealla tasolla, mutta toisaalta tämä johtaa paljon enemmän kaskadiin ja siten tunnistamisprosessi hidastuu.

Parametri "levelWeight", joka on "detectMultiScale" -toiminnon antama arvo, on analoginen havaitun luottamusarvon kanssa. Tätä tutkimalla luotiin yllä oleva kaavio, joka osoittaa, kuinka positiivisen tunnistamisen luottamus vähenee jyrkästi, kun kuvan suunta kasvaa kumpaankin suuntaan, mikä vahvistaa ajatukset, että tämä on heikko kohta.

Pikselien sijoittelu - Paljon yksinkertaisempi, mutta myös ongelmallinen kohta on pikselien sijoittelu, jota havainnollistavat seuraavat kaksi kuvaa, joissa näkyy suurennettu kuva tähtikuvasta, jotta kahden tähden yksittäiset pikselit voidaan nähdä selvästi. Eroosio, jota käytetään ohjelmassa kuorimaan kaikki paitsi kuvan kirkkaimmat tähdet, säilyttää ensimmäisen tähden ja hävittää toisen, vaikka ne ovat yhtä kirkkaita. Syynä tähän on se, että ensimmäinen tähti on keskitetty pikseliin, kun taas toinen ei ole sellainen. Eroosio -toiminto irrottaa pikselien samankeskiset renkaat ryhmän keskipikselin ympäriltä, joten ensimmäisen tähden keskimmäinen pikseli selviää eroosio -toiminnosta, mutta toinen tähti poistetaan kokonaan kuvasta. Siksi vertailumerkit sijoitetaan vain ensimmäiseen tähtiin, ei toiseen. Tämä aiheuttaa epäjohdonmukaisuuksia siitä, mitkä kirkkaat tähdet tietyllä tähtikentällä saavat merkkejä (ja siksi niitä verrataan koulutettuihin luokittelijoihin) - siksi on mahdollista, että oikea positiivinen havainto ei ole mahdollinen.

Vaihe 11: Viimeinen sana

Viimeinen sana
Viimeinen sana

Kiitos, että luit ohjeeni, toivon, että pidit projektia mielenkiintoisena. Se on ollut erittäin mielenkiintoinen prosessi sen käsittelemiseksi, on kulunut yli vuosi siitä, kun aloitin konseptin käsittelyn, ja olen innoissani tuloksista tähän asti. Lukemani kirjallisuuden perusteella tämä on melko alkuperäinen käsite, ja sitä voidaan kehittää enemmän, ja sitä voidaan varmasti soveltaa monenlaisiin sovelluksiin amatööri -tähtitieteessä tai enemmän.

Tämä projekti oli minulle jyrkkä oppimiskäyrä, ja siksi toivon, että jotkut lukijat, joilla on enemmän ohjelmointikokemusta, voivat saada inspiraatiota osallistua projektin jatkamiseen GitHub-sivun kautta, ja voimme jatkaa tämän avoimen lähdekoodin työkalun kehittämistä. Odotan innolla kaikkien kommenttien lukemista, mutta älä kysy liikaa vaikeita kysymyksiä!

Avaruushaaste
Avaruushaaste
Avaruushaaste
Avaruushaaste

Runner Up in Space Challenge

Suositeltava: