Obsah:

Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV): 11 krokov (s obrázkami)
Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV): 11 krokov (s obrázkami)

Video: Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV): 11 krokov (s obrázkami)

Video: Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV): 11 krokov (s obrázkami)
Video: Обучение Paddle OCR на пользовательском наборе данных | YOLOv7 + OCR на Google Colab 2023 2024, November
Anonim
Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV)
Rozpoznávanie hviezd pomocou počítačového videnia (OpenCV)

Tento návod vám popíše, ako vytvoriť program počítačového videnia na automatickú identifikáciu vzorov hviezd na obrázku. Metóda používa knižnicu OpenCV (Open-Source Computer Vision) na vytvorenie sady vyškolených kaskád HAAR, ktoré je možné použiť na rozpoznanie konkrétnych hviezdnych vzorov. Aj keď je táto príručka v kontexte rozpoznávania vzorov hviezd, proces OpenCV, ktorý popisujem, je možné použiť aj na iné aplikácie - takže bude dúfajme užitočný!

Projekt je zhrnutý v tomto videu:

Prečo som napísal tento návod?

  1. Metóda identifikácie hviezdneho vzoru, ktorú vyvíjam, verím, že má potenciál byť uplatnená v celom rade amatérskych astronomických projektov - či už je to orientácia teleskopu, automatická klasifikácia obrazu alebo dokonca v konečnom dôsledku hviezdny senzor na otvorenom zdroji alebo amatérskom CubeSat.
  2. Je tu veľa dobrých inštrukcií pre OpenCV, ale aj napriek tomu som sa na začiatku učil ako veľmi ťažký proces, takže dúfam, že táto príručka bude dobrou referenciou pre ostatných ľudí, ktorí chcú trénovať klasifikátory HAAR pre OpenCV (nemusí to nevyhnutne súvisieť s možno astronómia!).
  3. Sám nie som vyštudovaný programátor, takže tento projekt skutočne posunul moje porozumenie. Našťastie sa písaním tohto návodu, iného, skúsenejšieho, tvorcovia budú inšpirovať k práci na tomto koncepte a prispejú k GitHubu a tomuto návodu prostredníctvom komentárov na tejto stránke.
  4. Amatérska astronómia a orientačné metódy sú mojim veľkým záujmom, pozri môj predchádzajúci návod s Arduino Star-Finderom pre teleskopy.

Titulná fotografia tohto Instructable má koncept 3U CubeSat, na ktorom som sa podieľal. Použil som to na ilustráciu tohto návodu, pretože pôvodná aplikácia systému rozpoznávania hviezd počítačového videnia mala byť pre orientačný senzor pre amatérsky vyrobený CubeSats pomocou kamery Raspberry Pi V2. Verím, že existuje mnoho ďalších potenciálnych aplikácií rozpoznávania hviezd počítačového videnia, ale myslím si, že toto je to najlepšie!

Malý glosár:

Učenie sa o počítačovom videní je spomalené hlúpym množstvom použitých odborných termínov, takže niektoré pre nás definujem tu:

Cascade - klasifikátor vyškolený na identifikáciu konkrétneho cieľového objektu.

Fiducial Marker - Značka, ktorá k obrázku pridáva bod vizuálnej referencie.

HAAR - Haarské funkcie sú typom obrazovej funkcie používanej na výcvik klasifikátorov.

OpenCV - Open Source Computer Vision, knižnica nástrojov počítačového videnia.

Stellarium - softvér s otvoreným zdrojovým kódom pre astronómiu.

Krok 1: Požiadavky

OpenCV je knižnica založená na Linuxe, takže aj keď je údajne možné ju dobre prevádzkovať v systéme Windows, budete ju mať v prostredí Linuxu oveľa jednoduchšie (vezmite to odo mňa a veľa dní sa snažte, aby to fungovalo naplno) Windows!). Ako experiment som si stiahol a spustil OpenCV na svojom Raspberry Pi 3B+, ktorý bol úspešný, aj keď školenie klasifikátora je veľmi náročný na pamäť RAM, takže ak to chcete urobiť akoukoľvek rýchlosťou, odporúčanou cestou je najať virtuálny server Linux (čo môže byť v skutočnosti prekvapivo lacné) na niekoľko dní/týždňov/mesiacov a použite to ako vyhradené prostredie, v ktorom spustíte výcvik klasifikátora. Server budete môcť ovládať z počítača so systémom Windows pomocou klienta SSH, ako je napríklad Putty. Akonáhle sú kaskády vyškolené pomocou VPS, je možné ich stiahnuť do počítača so systémom Windows a Python je možné použiť na spustenie programu rozpoznávania obrázkov v prostredí Windows.

Virtuálny server Linux:

Na vykonávanie kaskádových tréningových procesov HAAR je potrebný virtuálny server Linux (VPS). Pôvodne som najal server s 8 GB RAM a Ubuntu 16.04.6 (LTS) x64 a neskôr druhý, aby som zdvojnásobil rýchlosť, ktorou by som mohol trénovať kaskády, aj keď budete potrebovať iba jednu

Softvér:

  • Stellarium - je to softvér virtuálneho planetária/astronómie, voľne dostupný. Bude použitý na zhromaždenie simulovaných obrazov hviezd pre použitie v testovaní.
  • Putty - Toto je klient SSH, ktorý sa používa na ovládanie VPS pomocou príkazového riadka.
  • WinSCP - používa sa na prenos súborov z počítača so systémom Windows.

Krok 2: Nastavenie VPS

Na spustenie VPS existuje malý proces nastavenia. Prvýkrát to môže chvíľu trvať, ale nie je to príliš zložité, ak budete dôsledne postupovať podľa uvedených pokynov. Tento tutoriál bol pre mňa veľkým odkazom. Odporúčame vám, aby ste si ho prečítali aj pri práci s týmto návodom. Riadok po riadku pokrýva špecifiká príkazov linux, ktoré je potrebné do bodky dodržať.

Tento proces zhruba zahŕňa:

  1. Vytvorenie servera Linux so správnou verziou Ubuntu.
  2. Aktualizácia a aktualizácia servera.
  3. Vytvorenie adresára pracovného priestoru, do ktorého je nainštalované OpenCV.
  4. Inštalácia niektorých náležitostí, konkrétne kompilátora, rôznych knižníc a väzieb Pythonu.

Po tejto fáze ste pripravení začať s prípravou na tréningový proces.

Krok 3: Proces

Celý proces počítačového videnia pomocou kaskád HAAR je spočiatku dosť mätúci, takže tento krok popisuje logiku trochu podrobnejšie:

Základný postup

  1. Existuje negatívny súbor údajov o obrázku, ktorý pozostáva z niekoľkých tisíc obrázkov, ktoré neobsahujú predmet záujmu. Toto bude potrebné nahrať do VPS.
  2. Vytvorí sa jeden pozitívny obrázok, ktorý obsahuje predmet záujmu. Toto bude tiež potrebné nahrať do VPS.
  3. Jediný pozitívny obraz je skreslený, zdeformovaný, otočený atď. O sadu vybraných parametrov a prekrytý výberom negatívnych obrazov. Toto je umelý spôsob vytvárania veľkého pozitívneho súboru údajov z jedného obrázku. (Na iné aplikácie v reálnom svete, ako je identifikácia mačky, môžete jednoducho použiť niekoľko tisíc obrázkov mačiek, ale táto metóda nie je vždy vhodná, ak nemáte taký veľký súbor pozitívnych obrázkov. Tu použitý umelý prístup bude menej účinný, ale je to jediná možnosť pre takýto prípad použitia).
  4. Spustí sa tréningový proces, ktorý funguje postupne. Každá fáza bude trénovať kaskádu na identifikáciu rôznych funkcií typu HAAR v súboroch snímok. Dokončenie každej etapy trvá exponenciálne dlhšie a účinnosť klasifikátora sa zakaždým zvyšuje (je tiež možné pretrénovať, aby ste vedeli!).
  5. Jedna trénovaná kaskáda bude schopná hľadať jeden cieľový objekt. Ak chcete identifikovať viac jedinečných predmetov, pre každý budete potrebovať vyškolenú kaskádu. V tomto prípade som vycvičil asi 50 rôznych kaskád na jedinečné hviezdne vzory, aby som vytvoril súbor, ktorý by mohol pokryť severnú nebeskú pologuľu.
  6. Nakoniec sa použije detekčný program, ktorý spustí každú kaskádu sady proti vstupnému obrazu. Kaskáda bude vo vstupnom obrázku hľadať svoj cieľový objekt.
  7. Ak bude úspešný, cieľový objekt bude identifikovaný vo vstupnom obrázku.

n.b. ak sa napríklad použije v kontexte satelitnej orientácie, obrázok by sa zachytil pomocou vstavanej kamery. Na tomto obrázku budú identifikované najjasnejšie hviezdy a v týchto polohách budú prekrývať značky. Tento obrázok je potom predstavený skupine trénovaných kaskád, ktoré otestujú, či vstupný obrázok obsahuje niektoré z cieľových objektov. Ak je detegovaný skutočný pozitívny signál, potom sa uhlová poloha známej konštelácie zistí vzhľadom na osi satelitného telesa.

Krok 4: Negatíva a pozitíva

Negatíva

Skutočne kľúčovým aspektom kaskádového školenia je mať čo najväčší súbor údajov o negatívnych obrazoch. Hovoríme o tisícoch, ideálne o desaťtisícoch obrázkov. Nezáleží na tom, čo obsahujú, cieľom je len poskytnúť množstvo vizuálnych informácií. Priečinok Tréning klasifikátora obsahuje množstvo rôznych súborov údajov o negatívnych obrázkoch, ktoré som zostavil. Spočiatku to boli iba simulované obrázky hviezdneho poľa zozbierané zo Stellaria, ale neskôr som súbor údajov rozšíril o toľko náhodných obrázkov, koľko som mohol nájsť (áno, vrátane mojich fotografií z dovolenky …). Najväčší súbor údajov obsahuje takmer 9 000 obrázkov, čo bol najväčší údaj, ktorý som doteraz vytvoril. Jeho použitím si ušetríte zostavovanie vlastných.

Pozitívne

Pozitívny obraz (tj. Vzor cieľovej hviezdy, ktorý bude kaskáda trénovaná rozpoznávať) začína ako snímka vzoru hviezdy v Stellariu. Program python potom identifikuje najjasnejšie hviezdy na obrázku a na tieto polohy hviezd prekryje značky (vysvetlené ďalej v tomto návode). Tento obrázok sa potom zmenší na 50 x 50 pixlov. Je to malé, ale tréningový čas potrebný na kaskády sa bude exponenciálne zvyšovať, ako sa táto veľkosť zvyšuje, a preto je to dobrý kompromis medzi kvalitou a časom.

Krok 5: Stellarium Control

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

Priečinok Stellarium Scripts úložiska GitHub obsahuje tri programy, ktoré som napísal na kontrolu používania Stellaria. Ak ich chcete použiť, umiestnite ich do priečinka skriptov v priečinku na inštaláciu Stellarium. Na ich spustenie môžete otvoriť okno skriptov z ponuky Stellarium alebo jednoduchým dvojitým kliknutím na program v priečinku skripty spustíte Stellarium a ihneď spustíte zvolený program.

diplomová práca_4 a diplomová práca_5 zachytávajú asi 2 000 snímok na severnej a južnej nebeskej pologuli. Tieto boli použité na vytvorenie databáz negatívnych obrazov, na trénovanie pozitívneho obrazu proti. Rozdiel medzi severom a juhom bol jednoduchým spôsobom, ako zaistiť, aby vzor cieľovej (pozitívnej) hviezdy nebol prítomný v negatívnom súbore údajov trénovaním vzorov hviezd severnej pologule proti súboru údajov o obrázku na južnej nebeskej pologuli a naopak. (Ak je v súbore údajov o negatívnom obraze prítomný aj pozitívny obrázok, ovplyvní to kvalitu klasifikátora).

diplomová práca je tiež užitočná - toto nastavuje Stellarium tak, aby bolo vhodné na zachytávanie obrázkov - obrázky používané na simuláciu pohľadu z vesmíru. Vykonáva činnosti, ako je skrývanie ponúk, mriežky, štítkov atď., Automaticky, aby ste potrebným spôsobom ušetrili vždy, keď chcete zachytiť obrázok.

Krok 6: Rocket Man

Raketový muž
Raketový muž

Prvé kaskády, ktoré som trénoval, neboli schopné správne identifikovať žiadne hviezdne vzorce. Boli veľmi nespoľahliví a boli veľmi náchylní na falošne pozitívne výsledky. Predpokladal som, že obrázky hviezdneho poľa zo Stellaria (v podstate len biele bodky na čiernom pozadí) v skutočnosti neobsahujú dostatočné vizuálne informácie na to, aby obsahovali dostatok funkcií typu HAAR na úspešný výcvik klasifikátora. Myslím, že bolo neskoro v noci, ale rozhodol som sa vyskúšať myšlienku napísať program, ktorý automaticky umiestni malý miniatúrny obrázok na umiestnenie každej jasnej hviezdy na obrázku hviezdneho poľa.

Elton

Bol to hlúpy test, ale pridaním malého obrázku tváre Eltona Johna ku každému umiestneniu jasnej hviezdy, vyškolením klasifikátora proti tomuto pozitívnemu obrazu a spustením kaskád proti pôvodnému obrázku bolo oveľa efektívnejšie správne nájsť správny vzor. Vedel som, že som na niečo!

Krok 7: Východiskové značky

Východiskové značky
Východiskové značky

Aj keď „Eltonovci“potvrdili teóriu, potreboval som marker, ktorý by mal úplnú rotačnú symetriu, aby vzor hviezdy vyzeral rovnako bez ohľadu na to, v akej orientácii bol predstavený. Testoval som celý rad typov markerov a zistil som, že typ v pravom dolnom rohu je najefektívnejší s kontrastnými čiernymi a bielymi krúžkami. Program python uvedený v pozitívnom priečinku repo GitHub ukazuje, ako sú na danom obrázku identifikované najjasnejšie hviezdy, a tieto značky sa v týchto polohách automaticky prekrývajú. Teraz sme vytvorili reprezentáciu kľúčových vzorov hviezd, proti ktorým sa dá trénovať.

Krok 8: Použitie kaskád

Použitie kaskád
Použitie kaskád

Keď máte natrénovanú sadu kaskád, musíte vedieť, ako ich použiť na identifikáciu objektu na obrázku!

Pozrite sa do priečinka Star Identification na GitHub, kde nájdete program cascade_test19.py. Tento príťažlivo pomenovaný program prevezme sadu kaskád z daného priečinka a všetky ich spustí na vstupnom obrázku a poskytne správy o vykonaných detekciách. Jadrom toho je funkcia „detectMultiScale“, ktorá definuje proces detekcie pomocou rôznych argumentov. Ich zmena je rozhodujúca pre výkon kaskádového klasifikátora a ďalšie informácie o tom možno nájsť v nasledujúcom kroku, v ktorom sa pozrieme na to, ako odstrániť falošne pozitívne výsledky.

Toto by sa dalo použiť v satelitnom orientačnom systéme koreláciou hodnoty pixelov v strede ohraničujúceho rámčeka s nebeskou súradnicou Ra/Dec identifikovanej hviezdy a následnou koreláciou s uhlovým posunom od stredu obrazu (kamera) os). Z tohto dôvodu, pomocou porozumenia skreslenia šošovky (približného ku gnomonickej projekcii), možno uhol satelitu zistiť iba z dvoch pozitívnych identifikácií.

Krok 9: Ako si udržať pozitívny postoj k falošným pozitívam

Ako zostať pozitívny o falošných pozitívach
Ako zostať pozitívny o falošných pozitívach
Ako zostať pozitívny o falošných pozitívach
Ako zostať pozitívny o falošných pozitívach

Tieto dva obrázky zobrazujú výsledky testovania kaskádovej sady na identickom obrázku, ale s rôznymi parametrami. Je zrejmé, že prvý obrázok obsahuje skutočnú identifikáciu, ale tiež obrovský počet falošných poplachov, zatiaľ čo druhý obrázok obsahuje iba správnu identifikáciu.

Program cascade_test19.py v priečinku Star Identification repo GitHub používa na triedenie výsledkov dve metódy. Po prvé, funkcia detectMultiScale nastaví minimálnu a maximálnu veľkosť výsledku, ktorý je možné nájsť, čo je rozumné, ako približnú veľkosť vzoru cieľovej hviezdy v okne (pre daný objektív a zväčšenie - moje simulované obrázky Stellarium využívajú vlastnosti Raspberry Pi V2 Camera) je známy. Za druhé, kód vyberie výsledok s najväčším ohraničovacím rámcom (v rámci predchádzajúcich limitov). Pri testovaní sa zistilo, že je to skutočne pozitívne. Po tretie, program stanovuje minimálnu „levelWeights“(v skutočnosti „hodnotu spoľahlivosti“), ktorá je potrebná na to, aby sa s týmto ID považovalo ako so skutočne pozitívnym. Touto metódou boli kaskády účinné pri hľadaní správneho výsledku.

Rovnako ako obrázky hviezdneho poľa som to testoval napríklad aj na obrázkoch svojho stola, na cvičných kaskádach na identifikáciu môjho notebooku, hrnčeka atď., Aby som si precvičil odstránenie falošných poplachov. Vyššie uvedené metódy fungovali dobre za každých okolností, čo bolo povzbudzujúce.

Krok 10: Diskusia

Diskusia
Diskusia
Diskusia
Diskusia
Diskusia
Diskusia

Oblasti na zlepšenie

Bol to pre mňa komplexný projekt a skutočne posunul moje chápanie tejto témy. Zahŕňalo to niekoľko mesiacov práce na plný úväzok, aby sa projekt dostal do bodu, keď sa oň s vami môžem podeliť, ale je potrebné vykonať ešte veľa práce na zlepšení výkonu metódy. V súčasnom stave môže fungovať dobre v rámci určitých obmedzení. Pracoval som na identifikácii, v ktorých oblastiach je potrebná ďalšia práca, a dúfam, že v nadchádzajúcich mesiacoch budem môcť stráviť čas ich riešením. Oni sú:

Uhol - Toto je komplexná oblasť, myšlienka, že výsledky klasifikátorov musia byť rotačne nemenné, tj. Mala by spoľahlivo identifikovať vzor cieľovej hviezdy bez ohľadu na uhol, v ktorom je zobrazený obrázok obsahujúci vzor cieľovej hviezdy. Kaskáda trénovaná pomocou vstupného obrazu v jednej orientácii nebude schopná identifikovať tento obrázok v náhodných orientáciách, takže do tréningového procesu musí byť zavedená odchýlka pozitívneho uhla obrazu na trénovanie kaskád, ktoré môžu akceptovať rozsah vstupných uhlov. Parameter „maxzangle“v kaskádových tréningových príkazoch má argument v radiánoch, ktorý riadi hranicu uhla, v ktorom bude vstupný pozitívny obraz prekrytý poskytovanými negatívnymi obrazmi, takže výsledná sada pozitívnych obrazov bude obsahovať rozsah orientácií pozitívny obraz. Ako sa však tento maxzangle zvyšuje, pomer akceptovania (v širšom zmysle kvality) kaskády sa výrazne zníži. Verím, že riešením je vycvičiť kaskády pomocou podstatne väčšej databázy negatívnych obrazov, než akú som používal, aby som zaistil, že bude možné vytvoriť kvalitný kaskádový klasifikátor, dokonca aj s veľkým rozpätím orientácie.

Ďalším potenciálnym riešením by bolo vycvičiť niekoľko kaskád na konkrétny cieľ, pričom každá kaskáda by riadila určitú časť úplného otočenia o 360 stupňov. Takýmto spôsobom je možné udržať kvalitu každej kaskády na vysokej úrovni, ale na druhej strane to bude mať za následok oveľa viac kaskád, a preto bude proces identifikácie pomalší.

Parameter „levelWeight“, čo je hodnota poskytovaná funkciou „detectMultiScale“, je analogický s hodnotou spoľahlivosti pri vykonanej detekcii. Po skúmaní tohto bol vytvorený vyššie uvedený graf, ktorý ukazuje, ako dôvera v pozitívnu identifikáciu prudko klesá, keď sa orientácia obrazu zvyšuje v oboch smeroch, čím sa potvrdzujú myšlienky, že ide o slabé miesto.

Umiestnenie pixelov - Oveľa jednoduchším, ale aj problematickým bodom je umiestnenie pixelov, ktoré je znázornené na nasledujúcich dvoch obrázkoch a ktoré ukazujú zväčšený pohľad na obrázok hviezdy, aby bolo možné jasne vidieť jednotlivé pixely dvoch hviezd. Proces erózie použitý v programe na vymazanie všetkých okrem najjasnejších hviezd z obrázku zachová prvú hviezdu a druhú odhodí, napriek tomu, že majú rovnakú jasnosť. Dôvodom je to, že prvá hviezda je sústredená na pixel, zatiaľ čo druhá nie je taká. Funkcia erózie odoberá sústredné prstence pixelov z celého centrálneho pixelu skupiny, takže prvá hviezda bude mať centrálny pixel prežitie funkcie erózie, ale druhá hviezda bude z obrázku úplne odstránená. Preto budú orientačné značky umiestnené iba na prvej hviezde, nie na druhej. To spôsobí nezrovnalosti, ohľadom ktorých jasné hviezdy v danom hviezdnom poli dostanú značky (a teda budú porovnané s vyškolenými klasifikátormi) - preto je možné, že správne pozitívne pozorovanie nebude možné.

Krok 11: Posledné slovo

Posledné slovo
Posledné slovo

Ďakujem, že ste si prečítali môj návod, dúfam, že vás tento projekt zaujal. Bol to veľmi zaujímavý proces, pracujem na tom, je to už viac ako rok, odkedy som začal pracovať na koncepte, a výsledky ma k tomuto bodu povzbudzujú. Z literatúry, ktorú som prečítal, je to celkom originálny koncept a s ďalším vývojom je určite možné uplatniť v rade aplikácií pre amatérsku astronómiu alebo viac.

Tento projekt bol pre mňa strmou krivkou učenia, a preto dúfam, že niektorí čitatelia s bohatšími programátorskými skúsenosťami sa môžu inšpirovať a prispieť k pokračovaniu projektu prostredníctvom stránky GitHub a budeme môcť pokračovať v rozvoji tohto open-source nástroja. Teším sa na prečítanie akýchkoľvek vašich pripomienok, ale prosím, nedávajte príliš veľa zložitých otázok!

Vesmírna výzva
Vesmírna výzva
Vesmírna výzva
Vesmírna výzva

Runner Up in the Space Challenge

Odporúča: