Tartalomjegyzék:

Csillagfelismerés a Computer Vision (OpenCV) segítségével: 11 lépés (képekkel)
Csillagfelismerés a Computer Vision (OpenCV) segítségével: 11 lépés (képekkel)

Videó: Csillagfelismerés a Computer Vision (OpenCV) segítségével: 11 lépés (képekkel)

Videó: Csillagfelismerés a Computer Vision (OpenCV) segítségével: 11 lépés (képekkel)
Videó: Leap Motion SDK 2024, November
Anonim
Csillagfelismerés a Computer Vision (OpenCV) segítségével
Csillagfelismerés a Computer Vision (OpenCV) segítségével

Ez az útmutató leírja, hogyan hozhat létre számítógépes látóprogramot a kép csillagmintáinak automatikus azonosítására. A módszer az OpenCV (nyílt forráskódú számítógépes látás) könyvtárat használja fel arra, hogy képzett HAAR kaszkádokat hozzon létre, amelyekkel fel lehet ismerni bizonyos csillagmintákat. Bár ez az útmutató a csillagminta -felismerés kontextusába tartozik, az általam leírt OpenCV folyamat más alkalmazásokra is alkalmazható - tehát remélhetőleg hasznos lesz!

A projekt összefoglalója ebben a videóban:

Miért írtam ezt tanulságosnak?

  1. Úgy gondolom, hogy az általam kifejlesztett csillagminta -azonosítási módszer számos amatőrcsillagászati projektben alkalmazható - legyen szó távcső -orientációról, automatikus képminősítésről vagy akár végső soron csillagérzékelőről nyílt forráskódú vagy amatőr CubeSat -on.
  2. Sok jó OpenCV utasítást találhat itt, de még így is nagyon nehéznek találtam a kezdeti tanulást, ezért remélem, hogy ez az útmutató jó referencia lesz azok számára, akik HAAR osztályozókat szeretnének képezni OpenCV -re (nem feltétlenül köze ehhez) talán csillagászat!).
  3. Jómagam nem vagyok képzett programozó, ezért ez a projekt nagyon erősítette a megértésemet. Remélhetőleg, ha más, tapasztaltabb, készítőket is megír, inspirációt kap, hogy dolgozzon ezen a koncepción, és ezen az oldalon található megjegyzésekkel járuljon hozzá a GitHubhoz és ehhez az útmutatáshoz.
  4. Az amatőr csillagászat és a tájékozódási módszerek nagy érdeklődést mutatnak számomra, lásd korábbi utasításomat, amelyben egy Arduino Star-Finder for Telescopes szerepel.

Ennek az Instructable -nek a címlapfotója egy 3U CubeSat koncepció, amelynek tervezésében részt vettem. Ennek az oktathatónak a szemléltetésére használtam, mivel a számítógépes látáscsillag-felismerő rendszer eredeti alkalmazásának egy Raspberry Pi V2 kamerát használó amatőr gyártmányú CubeSats tájolásérzékelőjének kellett lennie. A számítógépes látás csillagfelismerésének számos más lehetséges alkalmazása is létezik, de azt hiszem, ez a legmenőbb!

Egy kis szószedet:

A számítógépes látás elsajátítását lassítja az alkalmazott speciális kifejezések ostoba mennyisége, ezért itt definiálok néhányat:

Kaszkád - Egy meghatározott célobjektum azonosítására kiképzett osztályozó.

Fiducial Marker - Jelölő, amely vizuális hivatkozási pontot ad a képhez.

HAAR - A Haar -szerű funkciók egyfajta képi funkciók, amelyeket osztályozó képzésre használnak.

OpenCV - Nyílt forráskódú számítógépes látás, számítógépes látóeszközök könyvtára.

Stellarium - nyílt forráskódú csillagászati szoftver.

1. lépés: Követelmények

Az OpenCV egy Linux alapú könyvtár, így bár állítólag lehetséges jól működtetni Windows rendszeren, sokkal könnyebben fogod futtatni Linux környezetben (ezt tőlem és sok napig próbáld meg teljesen működtetni) Ablakok!). Kísérletként letöltöttem és futtattam az OpenCV -t a Raspberry Pi 3B+készüléken, ami sikeres volt, bár az osztályozó tréning nagyon RAM -igényes folyamat, így ha bármilyen sebességgel szeretné megtenni, az ajánlott útvonal egy Linux virtuális szerver felvétele (ami valójában meglepően olcsó is lehet) néhány nap/hét/hónap alatt, és használja ezt a dedikált környezetet az osztályozó képzés lebonyolításához. A kiszolgálót Windows PC -ről vezérelheti egy SSH -ügyfél, például a Putty használatával. Miután a kaszkádokat a VPS segítségével betanították, letölthetők a Windows PC -re, és a Python segítségével futtatható a képfelismerő program Windows környezetben.

Linux virtuális szerver:

A Linux Virtual Server (VPS) szükséges a HAAR kaszkád képzési folyamatok végrehajtásához. Kezdetben béreltem egy szervert 8 GB RAM -mal és Ubuntu 16.04.6 (LTS) x64 -el, később pedig egy másodikat, hogy megduplázzam a kaszkádok betanításának sebességét, bár csak egyre lesz szüksége

Szoftver:

  • Stellarium - ez egy virtuális planetárium/csillagászati szoftver, szabadon hozzáférhető. Szimulált csillagképek összegyűjtésére szolgál a teszteléshez.
  • Putty - Ez egy SSH kliens, amely a VPS vezérlésére szolgál parancssoron keresztül.
  • WinSCP - a fájlok átvitelére szolgál a Windows PC -ről.

2. lépés: VPS beállítás

Van egy kis beállítási folyamat a VPS üzembe helyezéséhez. Az első alkalommal eltarthat egy ideig, de nem túl bonyolult, ha alaposan követi a lépéseket. Ez az oktatóanyag nagyszerű referencia volt számomra, azt javaslom, hogy ezt is olvassa el, miközben átdolgozza ezt az oktatható anyagot. Soronként ismerteti a linux parancsok sajátosságait, amelyeket betű szerint követni kell.

Nagyjából a folyamat a következőket foglalja magában:

  1. Linux szerver létrehozása a megfelelő Ubuntu verzióval.
  2. A szerver frissítése és frissítése.
  3. Munkaterület -könyvtár létrehozása, amelybe az OpenCV telepítve van.
  4. Néhány alapvető elem telepítése, nevezetesen fordító, különböző könyvtárak és Python -kötések.

Ezen szakasz után készen áll a felkészülésre a képzési folyamatra.

3. lépés: A folyamat

A HAAR kaszkádokat használó számítógépes látás teljes folyamata kezdetben meglehetősen zavaros, ezért ez a lépés egy kicsit részletesebben leírja a logikát:

Alapfolyamat

  1. Létezik egy negatív képadatkészlet, amely több ezer olyan képből áll, amelyek nem tartalmazzák az érdeklődés tárgyát. Ezt fel kell tölteni a VPS -be.
  2. Egyetlen pozitív kép jön létre, amely tartalmazza az érdeklődés tárgyát. Ezt is fel kell tölteni a VPS -be.
  3. Az egyetlen pozitív képet a kiválasztott paraméterek halmaza torzítja, vetemedik, forgatja stb., És ráhelyezi a negatív képek kiválasztására. Ez egy mesterséges módja annak, hogy egyetlen képből nagy pozitív adathalmazt hozzunk létre. (Más valós alkalmazásokhoz, például egy macska azonosításához egyszerűen használhat több ezer macskaképet, de ez a módszer nem mindig megfelelő, ha nincs ilyen nagy számú pozitív képe. Az itt használt mesterséges megközelítés kevésbé lesz hatékony, de ez az egyetlen lehetőség az ilyen esetekben).
  4. Egy képzési folyamat fut, amely szakaszosan működik. Minden szakasz kaszkádot képez, hogy azonosítsa a képkészleteken belüli különböző HAAR típusú jellemzőket. Mindegyik szakasz exponenciálisan hosszabb ideig tart, és az osztályozó hatékonysága minden alkalommal növekszik (az is lehetséges, hogy túledzik a tudást!).
  5. Egyetlen betanított kaszkád képes egyetlen célobjektumot keresni. Ha több egyedi objektumot szeretne azonosítani, mindegyikhez képzett kaszkádra lesz szüksége. Ebben az esetben körülbelül 50 különböző kaszkádot képeztem ki egyedi csillagfoszlányok számára, hogy létrehozzak egy készletet, amely lefedi az északi égi féltekét.
  6. Végül egy észlelési programot használunk, amely egy halmaz minden kaszkádját egy bemeneti kép ellen futtatja. A kaszkád megkeresi az adott célobjektumot a bemeneti képen belül.
  7. Ha sikeres, a célobjektum azonosításra kerül a bemeneti képen belül.

n.b. ha például műholdas tájolású kontextusban használják, a képet egy fedélzeti kamerával rögzítik. Azon a képen a legfényesebb csillagok kerülnek azonosításra, és ezeken a helyeken jelölők vannak. Ezt a képet ezután bemutatják a betanított kaszkádoknak, amelyek megvizsgálják, hogy a bemeneti kép tartalmaz -e valamelyik célobjektumot. Ha valódi pozitívumot észlelünk, akkor egy ismert konstelláció szöghelyzetét fedezjük fel a műhold testének tengelyeihez képest.

4. lépés: negatív és pozitív

Negatívumok

A kaszkádképzés igazán kulcsfontosságú aspektusa, hogy a lehető legnagyobb méretű negatív képekkel rendelkezzen. Több ezer, ideális esetben tízezer képről beszélünk. Teljesen mindegy, hogy mit tartalmaznak, a cél csupán az, hogy változatos vizuális információkat nyújtsanak. Az Osztályozói képzés mappa sokféle negatív képadat -készletet tartalmaz, amelyeket én állítottam össze. Kezdetben ezek csak a Stellariumból gyűjtött szimulált csillagtérképekből álltak, de később az adathalmazt annyi randomizált képpel bővítettem, amennyit csak találtam (igen, beleértve a nyaralási képeimet is). A legnagyobb adathalmaz közel 9000 képet tartalmaz, ez volt a legnagyobb, amit eddig készítettem. Ennek használatával megspórolhatja a saját fordítását.

Pozitívumok

A pozitív kép (vagyis a célcsillag -minta, amelyet a kaszkád fel fog ismerni) a Stellarium csillagmintájának képernyőképeként kezdődik. A python program ezután azonosítja a kép legfényesebb csillagait, és ráhelyezi a markereket (amelyeket később ismertetünk ebben az utasításban) ezekre a csillagpozíciókra. Ezt a képet ezután 50x50 képpontra zsugorítják. Ez kicsi, de a kaszkádokhoz szükséges edzési idő exponenciálisan növekszik, ahogy ez a méret nő, és ez jó kompromisszum a minőség és az idő között.

5. lépés: Stellarium kontroll

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

A GitHub adattár Stellarium Scripts mappája három programot tartalmaz, amelyeket a Stellarium használatának ellenőrzésére írtam. Használatukhoz helyezze őket a Stellarium telepítési mappájának szkriptek mappájába. Ezek futtatásához nyissa meg a szkriptek ablakot a Stellarium menüből, vagy csak kattintson duplán a programra a parancsfájlok mappában, amely elindítja a Stellariumot és azonnal futtatja a kiválasztott programot.

A tézis_4 és a tézis_5 körülbelül 2000 képet rögzít az északi, illetve a déli féltekén. Ezeket használták negatív képek adatbázisainak kialakítására, a pozitív kép ellen. Az északi és déli megkülönböztetés egyszerű módja annak biztosítására, hogy a cél (pozitív) csillagminta ne legyen jelen a negatív adatállományban azáltal, hogy az északi féltekén lévő csillagmintákat a déli égi félteke képadathalmazával képzi, és fordítva. (Ha pozitív kép is van a negatív kép adatkészletben, az hatással lesz az osztályozó minőségére).

A thesis_setup szintén hasznos - ez beállítja a Stellariumot, hogy megfelelő legyen a képek készítéséhez - az űrből való nézet szimulációjához használt képek. Automatikusan elvégez olyan műveleteket, mint a menük elrejtése, rácsvonalak, címkék stb.

6. lépés: Rakétaember

Rakéta ember
Rakéta ember

Az első képzett kaszkádok nem tudták helyesen azonosítani a csillagmintákat. Nagyon megbízhatatlanok voltak, és nagyon hajlamosak voltak a hamis pozitív eredményekre. Feltételezésem szerint a Stellarium csillagmező képei (alapvetően csak fehér pöttyök fekete alapon) egyszerűen nem tartalmaztak elegendő vizuális információt ahhoz, hogy elegendő HAAR típusú funkciót tartalmazzanak a sikeres osztályozó képzéshez. Azt hiszem, késő este volt, de úgy döntöttem, hogy kipróbálom azt az ötletet, hogy írjak egy programot, amely automatikusan egy kis indexképet helyez el a csillagmező minden egyes fényes csillaga helyén.

Elton

Ez buta teszt volt, de azáltal, hogy minden fényes csillag helyéhez hozzáadtunk egy kis képet Elton John arcáról, kiképeztük az osztályozót a pozitív kép ellen, majd a kaszkádokat az eredeti kép ellen futtattuk, sokkal hatékonyabban találtuk meg a helyes minta. Tudtam, hogy valamihez értek!

7. lépés: Fiducial Markers

Összefoglaló jelzők
Összefoglaló jelzők

Bár az „Eltonok” igazolták az elméletet, szükségem volt egy olyan markerre, amely teljes forgásszimmetriával rendelkezik, így a csillagminta ugyanolyannak tűnik, függetlenül attól, hogy milyen tájolást mutatott be. Kipróbáltam egy sor jelölőtípust, és megállapítottam, hogy a jobb alsó sarokban lévő típus a leghatékonyabb, a kontrasztos fekete -fehér gyűrűkkel. A GitHub repó pozitív mappájában bemutatott python program megmutatja, hogyan azonosítják az adott kép legfényesebb csillagait, és ezek a markerek automatikusan átfedik ezeket a pozíciókat. Most elkészítettük a kulcscsillag -minták ábrázolását, amelyek ellen lehet edzeni.

8. lépés: A kaszkádok használata

A kaszkádok használata
A kaszkádok használata

Amikor betanított egy sor kaszkádot, tudnia kell, hogyan kell ezeket használni a képen lévő tárgyak azonosítására!

Nézze meg a GitHub Star Identification mappáját, ahol megtalálja a cascade_test19.py programot. Ez a tetszetős nevű program egy sor kaszkádot vesz ki egy adott mappából, és mindegyiket egy bemeneti kép ellen futtatja, és jelentést készít az észlelésekről. Ennek lényege a „detectMultiScale” függvény, amely számos érvet tartalmaz, amelyek meghatározzák az észlelési folyamatot. Ezek megváltoztatása kritikus fontosságú a kaszkádosztályozó teljesítménye szempontjából, és erről bővebben a következő lépésben olvashat, ahol megvizsgáljuk, hogyan lehet kiküszöbölni a hamis pozitív eredményeket.

Ezt úgy lehetne alkalmazni egy műholdas orientációs rendszerben, hogy a határoló doboz közepén lévő pixelértéket az azonosított csillagkép Ra/Dec égi koordinátájával korrelálnánk, majd ezt korrelálnánk a kép közepétől mért szögbeli elmozdulással (kamera tengely). Ebből kiindulva, a lencse torzításának megértését (gnomonikus vetítéshez közelítve) a műhold szöge mindössze két pozitív azonosításból állapítható meg.

9. lépés: Hogyan maradjunk pozitívan a hamis pozitívumokkal kapcsolatban

Hogyan lehet pozitívan állni a hamis pozitívokhoz
Hogyan lehet pozitívan állni a hamis pozitívokhoz
Hogyan lehet pozitívan állni a hamis pozitívokhoz
Hogyan lehet pozitívan állni a hamis pozitívokhoz

Ez a két kép a kaszkádkészlet azonos képhez való tesztelésének eredményeit mutatja, de különböző paraméterekkel. Nyilvánvaló, hogy az első kép tartalmazza a valódi azonosítást, de rengeteg hamis pozitív is, míg a második kép csak a helyes azonosítást tartalmazza.

A GitHub repó Star Identification mappájában található cascade_test19.py program két módszert használ az eredmények rendezésére. Először is, a detectMultiScale functon beállítja a találat minimális és maximális méretét, ami ésszerű, mivel az ablakon belüli célcsillag -minta hozzávetőleges mérete (az adott lencséhez és nagyításhoz - a szimulált Stellarium -képeim a a Raspberry Pi V2 kamera) ismert. Másodszor, a kód kiválasztja a legnagyobb határoló mezővel rendelkező eredményt (az előző határokon belül). A tesztelés során kiderült, hogy ez az igazi pozitív. Harmadszor, a program meghatározza a minimális „levelWeights” (ténylegesen „bizalmi érték”) értéket, amely szükséges ahhoz, hogy ezt az azonosítót valódi pozitívként kezeljék. Ezzel a módszerrel a kaszkádok hatékonyan találták meg a helyes eredményt.

A csillagmezős képek mellett ezt is teszteltem az asztalom képeivel, például a notebook, bögre stb. A fenti módszerek minden körülmények között jól működtek, ami biztató volt.

10. lépés: Vita

Vita
Vita
Vita
Vita
Vita
Vita

Fejlesztendő területek

Ez egy összetett projekt volt számomra, és valóban megerősítette a téma megértését. Összesen több hónapos, majdnem teljes munkaidőben végzett munka volt szükséges ahhoz, hogy a projekt idáig eljusson, amikor megoszthatom veletek, de rengeteg további munka vár még a módszer teljesítményének javítására. Jelen állapotában bizonyos korlátok között jól tud működni. Dolgoztam azon, hogy meghatározzam, mely területeken van szükség további munkára, és remélhetőleg az elkövetkező hónapokban tudok majd időt szakítani ezek kezelésére. Ők:

Szög - Ez egy összetett terület, az elképzelés szerint az osztályozók eredményeinek forgásilag invariánsnak kell lenniük, azaz megbízhatóságuknak meg kell határozniuk a célcsillag mintázatot, függetlenül attól, hogy milyen szögben mutatják be a célcsillag mintát tartalmazó képet. Egy bemeneti kép egyetlen tájolásban betanított kaszkádja nem lesz képes azonosítani ezt a képet véletlenszerű tájolásban, ezért a pozitív képszög varianciáját be kell vezetni az edzési folyamatba, hogy olyan kaszkádokat képezzen, amelyek képesek elfogadni a bemeneti szögek tartományát. A "maxzangle" paraméter a kaszkád edzésparancsokban egy argumentumot vesz fel radiánban, ami azt a szöghatárt szabályozza, hogy a bemeneti pozitív kép felül legyen fedve a megadott negatív képeken, így a kapott pozitív képhalmaz számos irányt tartalmaz a pozitív kép. Mivel azonban ez a maxzangle növekszik, a kaszkád elfogadási aránya (nagy vonalakban) minősége jelentősen csökken. Úgy gondolom, hogy a megoldás az, hogy a kaszkádokat a negatív képek adatbázisánál lényegesen nagyobb adatbázis használatával képezzük ki, mint amit én használtam annak biztosítása érdekében, hogy jó irányú kaszkádosztályozó jöjjön létre, még nagy tájolást is alkalmazva.

Egy másik lehetséges megoldás az lenne, ha egy bizonyos célhoz több kaszkádot képeznénk, amelyek mindegyike a teljes 360 fokos elforgatás bizonyos részét szabályozza. Így az egyes kaszkádok minősége magas szinten tartható, másrészt ez sokkal több kaszkádot eredményez, és ezáltal az azonosítási folyamat lassabb lesz.

A „levelWeight” paraméter, amely a „detectMultiScale” függvény által biztosított érték, analóg a létrehozott észlelés megbízhatósági értékével. Ezt tanulmányozva elkészült a fenti grafikon, amely azt mutatja, hogy a pozitív azonosítás magabiztossága meredeken csökken, amikor a kép orientációja mindkét irányba növekszik, megerősítve azokat a gondolatokat, hogy ez egy gyenge pont.

Képpontok elhelyezése - Egy sokkal egyszerűbb, ugyanakkor problémás pont a képpontok elhelyezése, amelyet a következő két kép illusztrál, amelyek egy csillagkép nagyított nézetét mutatják, így két csillag egyes képpontjai jól láthatók. A programban használt eróziós folyamat a kép legfényesebb csillagainak kivételével minden súrolására megtartja az első csillagot, és elveti a másodikat, annak ellenére, hogy azonos fényerősségű. Ennek az az oka, hogy az első csillag középpontjában egy pixel áll, míg a második nem ilyen. Az eróziós funkció leveszi a koncentrikus pixelgyűrűket a csoport központi pixelje körül, és így az első csillag a központi pixelt fogja túlélni az eróziós funkciót, de a második csillag teljesen eltávolításra kerül a képből. Ezért a hivatkozási jelzőket csak az első csillagra kell elhelyezni, a másodikra nem. Ez következetlenségeket fog okozni azzal kapcsolatban, hogy az adott csillagmezőben lévő fényes csillagok milyen markereket kapnak (és ezért összehasonlítják őket a képzett osztályozókkal) - ezért lehetséges, hogy a helyes pozitív megfigyelés nem lesz lehetséges.

11. lépés: Utolsó szó

Utolsó szó
Utolsó szó

Köszönöm, hogy elolvasta az oktatóanyagomat, remélem, hogy érdekesnek találta ezt a projektet. Nagyon érdekes folyamat volt ezen dolgozni, több mint egy év telt el azóta, hogy elkezdtem dolgozni a koncepción, és bátorítanak az eredmények. Az általam olvasott szakirodalomból ez egy meglehetősen eredeti koncepció, és nagyobb fejlődéssel minden bizonnyal alkalmazható az amatőr csillagászat számos alkalmazásában.

Ez a projekt meredek tanulási görbe volt számomra, és ezért remélem, hogy néhány, több programozási tapasztalattal rendelkező olvasó inspirációt kaphat a projekt folytatásához a GitHub oldalon keresztül, és tovább fejleszthetjük ezt a nyílt forráskódú eszközt. Várom a hozzászólásokat, de ne tegyen fel túl sok nehéz kérdést!

Űr Kihívás
Űr Kihívás
Űr Kihívás
Űr Kihívás

Második hely az űrben

Ajánlott: