Obsah:

Rozpoznávání hvězd pomocí počítačového vidění (OpenCV): 11 kroků (s obrázky)
Rozpoznávání hvězd pomocí počítačového vidění (OpenCV): 11 kroků (s obrázky)

Video: Rozpoznávání hvězd pomocí počítačového vidění (OpenCV): 11 kroků (s obrázky)

Video: Rozpoznávání hvězd pomocí počítačového vidění (OpenCV): 11 kroků (s obrázky)
Video: Распознавание номеров авто с YOLOv7 + OCR на Google Colab | Учебник ANPR/ALPR 2023 2024, Listopad
Anonim
Rozpoznávání hvězd pomocí počítačového vidění (OpenCV)
Rozpoznávání hvězd pomocí počítačového vidění (OpenCV)

Tento instruktážní program vám popíše, jak vytvořit program počítačového vidění pro automatickou identifikaci vzorů hvězd na obrázku. Metoda používá knihovnu OpenCV (Open-Source Computer Vision) k vytvoření sady natrénovaných kaskád HAAR, které lze použít k rozpoznávání konkrétních vzorů hvězd. Ačkoli je tato příručka v kontextu rozpoznávání hvězdných vzorů, proces OpenCV, který popisuji, lze použít i na jiné aplikace - takže bude doufejme užitečný!

Shrnutí projektu je v tomto videu:

Proč jsem napsal tento návod?

  1. Věřím, že metoda identifikace hvězdného vzoru, kterou vyvíjím, má potenciál uplatnit se v celé řadě amatérských astronomických projektů - ať už jde o orientaci dalekohledu, automatickou klasifikaci obrazu nebo dokonce nakonec hvězdný senzor na otevřeném zdroji nebo amatérském CubeSat.
  2. Je zde spousta dobrých instrukcí pro OpenCV, ale i přesto mi připadal zpočátku velmi obtížný proces učení, takže doufám, že tato příručka bude dobrou referencí pro ostatní lidi, kteří chtějí vyškolit klasifikátory HAAR pro OpenCV (nemusí to nutně souviset s možná astronomie!).
  3. Sám nejsem vystudovaný programátor, takže tento projekt opravdu posunul mé porozumění. Naštěstí tím, že napíšeme tento Instructable, budou další, zkušenější, tvůrci inspirováni k práci na tomto konceptu a přispějí na GitHub a tento instruktáž prostřednictvím komentářů na této stránce.
  4. Amatérská astronomie a orientační metody jsou mým velkým zájmem, viz můj předchozí návod s Arduino Star-Finderem pro teleskopy.

Titulní fotografie tohoto Instructable má koncept 3U CubeSat, na jehož návrhu jsem se podílel. Použil jsem to k ilustraci tohoto instruktáže, protože původní aplikace systému rozpoznávání hvězd počítačového vidění měla být pro orientační senzor pro amatérsky vyráběné CubeSats pomocí kamery Raspberry Pi V2. Věřím, že existuje mnoho dalších potenciálních aplikací rozpoznávání hvězd počítačového vidění, ale myslím, že toto je nejlepší!

Malý glosář:

Učení o počítačovém vidění zpomaluje hloupé množství použitých odborných termínů, takže některé zde pro nás definuji:

Cascade - Klasifikátor vyškolený k identifikaci konkrétního cílového objektu.

Fiducial Marker - Značka přidávající k obrázku bod vizuální reference.

HAAR - Haar -like features are a type of image feature used for classifier training.

OpenCV - Open Source Computer Vision, knihovna nástrojů počítačového vidění.

Stellarium - otevřený zdrojový astronomický software.

Krok 1: Požadavky

OpenCV je knihovna založená na Linuxu, takže ačkoli je údajně možné ji dobře provozovat v systému Windows, budete ji mít v prostředí Linuxu mnohem snazší (vezměte to ode mě a mnoho dní se snažte, aby to plně fungovalo) Okna!). Jako experiment jsem stáhl a spustil OpenCV na svém Raspberry Pi 3B+, což bylo úspěšné, přestože trénink klasifikátoru je proces velmi náročný na RAM, takže pokud to chcete udělat jakoukoli rychlostí, doporučenou cestou je najmout virtuální server Linux (což může být ve skutečnosti překvapivě levné) na několik dní/týdnů/měsíců a použijte to jako vyhrazené prostředí, ve kterém můžete spustit školení klasifikátoru. Server budete moci ovládat z počítače se systémem Windows pomocí klienta SSH, jako je například Putty. Jakmile jsou kaskády natrénovány pomocí VPS, lze je stáhnout do počítače se systémem Windows a pomocí Pythonu lze spustit program rozpoznávání obrázků v prostředí Windows.

Virtuální server Linux:

K provádění kaskádových tréninkových procesů HAAR je zapotřebí virtuální server Linux (VPS). Zpočátku jsem najal server s 8 GB RAM a Ubuntu 16.04.6 (LTS) x64 a později druhý, abych zdvojnásobil rychlost, s jakou bych mohl trénovat kaskády, i když budete potřebovat minimálně jednu

Software:

  • Stellarium - to je virtuální planetárium/astronomický software, volně dostupný. Bude použit ke shromažďování simulovaných obrazů hvězd pro použití při testování.
  • Putty - Toto je klient SSH, který slouží k ovládání VPS pomocí příkazového řádku.
  • WinSCP - používá se k přenosu souborů z počítače se systémem Windows.

Krok 2: Nastavení VPS

K uvedení VPS do provozu je malý proces nastavení. Poprvé vám to může chvíli trvat, ale není to příliš složité, pokud budete pečlivě postupovat podle pokynů. Tento tutoriál byl pro mě skvělým odkazem, doporučuji vám, abyste si jej přečetli také při práci s tímto návodem. Pokrývá specifika linuxových příkazů řádek po řádku, které je nutné do puntíku dodržovat.

Tento proces zhruba zahrnuje:

  1. Vytvoření serveru Linux se správnou verzí Ubuntu.
  2. Aktualizace a aktualizace serveru.
  3. Vytvoření adresáře pracovního prostoru, do kterého je nainstalován OpenCV.
  4. Instalace některých nezbytností, konkrétně kompilátoru, různých knihoven a vazeb Pythonu.

Po této fázi jste připraveni začít se připravovat na tréninkový proces.

Krok 3: Proces

Celý proces počítačového vidění pomocí kaskád HAAR je zpočátku docela matoucí, takže tento krok popisuje logiku trochu podrobněji:

Základní postup

  1. Existuje datová sada negativních obrázků, která se skládá z několika tisíc obrázků, které neobsahují předmět zájmu. To bude nutné nahrát na VPS.
  2. Vytvoří se jeden pozitivní obrázek, který obsahuje předmět zájmu. To bude také nutné nahrát na VPS.
  3. Jediný pozitivní obraz je zkreslený, pokřivený, otočený atd. Sadou vybraných parametrů a překrývá se výběrem negativních obrazů. Toto je umělý způsob vytváření velké pozitivní datové sady z jednoho obrázku. (Pro jiné aplikace v reálném světě, jako je identifikace kočky, můžete jednoduše použít několik tisíc obrázků koček, ale tato metoda není vždy vhodná, pokud nemáte tak velkou sadu pozitivních obrázků. Zde použitý umělý přístup bude méně efektivní, ale je to jediná možnost pro případ použití, jako je tento).
  4. Probíhá tréninkový proces, který funguje po etapách. Každá fáze bude trénovat kaskádu k identifikaci různých funkcí typu HAAR v sadách obrázků. Dokončení každé etapy trvá exponenciálně déle a účinnost klasifikátoru se pokaždé zvyšuje (je také možné přetrénovat, abyste věděli!).
  5. Jedna trénovaná kaskáda bude schopna hledat jeden cílový objekt. Pokud chcete identifikovat více unikátních objektů, budete pro každý potřebovat trénovanou kaskádu. V tomto případě jsem trénoval asi 50 různých kaskád na jedinečné hvězdné vzory, abych vytvořil soubor, který by mohl pokrýt severní nebeskou polokouli.
  6. Nakonec je použit detekční program, který spouští každou kaskádu sady proti vstupnímu obrazu. Kaskáda bude ve vstupním obrázku hledat svůj daný cílový objekt.
  7. Pokud bude úspěšný, bude cílový objekt identifikován ve vstupním obrázku.

n.b. pokud je například použit v kontextu satelitní orientace, obraz by byl zachycen pomocí integrované kamery. Budou identifikovány nejjasnější hvězdy na tomto obrázku a v těchto pozicích budou překryty značky. Tento obrázek je poté představen sadě natrénovaných kaskád, které otestují, zda vstupní obrázek obsahuje některý z cílových objektů. Pokud je detekováno skutečné pozitivum, pak je úhlová poloha známé konstelace objevena vzhledem k osám satelitního těla.

Krok 4: Negativa a pozitiva

Negativy

Opravdu klíčovým aspektem kaskádového tréninku je mít co největší datovou sadu negativních obrazů. Mluvíme o tisících, ideálně o desítkách tisíc obrázků. Nezáleží na tom, co obsahují, cílem je pouze poskytnout různé vizuální informace. Složka Classifier Training obsahuje řadu různých datových sad negativních obrázků, které jsem sestavil. Zpočátku to byly pouze simulované snímky hvězdného pole nasbírané ze Stellaria, ale později jsem datový soubor rozšířil o tolik náhodných obrázků, kolik jsem našel (ano, včetně mých fotografií z dovolené …). Největší datový soubor tam obsahuje téměř 9 000 obrázků, což byl největší, jaký jsem dosud vytvořil. Jeho použitím si ušetříte sestavování vlastních.

Pozitivní

Pozitivní obraz (to je cílový hvězdný obrazec, který bude kaskáda cvičena rozpoznávat) začíná jako snímek hvězdného obrazce ve Stellariu. Program python poté identifikuje nejjasnější hvězdy na obrázku a překrývá značky (vysvětlené dále v tomto návodu) na tyto polohy hvězd. Tento obrázek se pak zmenší na 50x50 pixelů. To je malé, ale doba tréninku potřebná pro kaskády se bude exponenciálně zvyšovat, jak se tato velikost zvyšuje, a je to tedy dobrý kompromis mezi kvalitou a časem.

Krok 5: Stellarium Control

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

Složka Stellarium Scripts úložiště GitHub obsahuje tři programy, které jsem napsal, abych řídil používání Stellaria. Chcete -li je použít, umístěte je do složky skriptů ve vaší instalační složce Stellarium. Chcete -li je spustit, můžete otevřít okno skriptů z nabídky Stellarium nebo jednoduše dvojitým kliknutím na program ve složce skriptů spustí Stellarium a okamžitě spustí vybraný program.

diplomové práce_4 a diplomové práce_5 zachycují přibližně 2 000 snímků, každý ze severní a jižní, nebeské polokoule. Ty byly použity k vytvoření databází negativních obrazů, k trénování pozitivního obrazu proti. Rozdíl mezi severem a jihem byl jednoduchý způsob, jak zajistit, aby cílový (pozitivní) hvězdný vzor nebyl v negativním datovém souboru přítomen tréninkem vzorů hvězd na severní polokouli proti datové sadě snímků jižní nebeské polokoule a naopak. (Pokud je v datové sadě negativních obrázků přítomen také pozitivní obrázek, ovlivní to kvalitu klasifikátoru).

diplomová práce je také užitečná - to nastavuje Stellarium tak, aby bylo vhodné pro pořizování obrázků - obrázky používané k simulaci pohledu z vesmíru. Provádí akce, jako je skrývání nabídek, mřížky, štítky atd., Aby vás automaticky uložil, kdykoli chcete zachytit obrázek.

Krok 6: Rocket Man

Raketový muž
Raketový muž

První kaskády, které jsem trénoval, nebyly schopny správně identifikovat žádné hvězdné vzorce. Byli velmi nespolehliví a byli velmi náchylní k falešně pozitivním výsledkům. Můj předpoklad byl, že obrázky hvězdného pole ze Stellaria (v podstatě jen bílé tečky na černém pozadí) ve skutečnosti neobsahovaly dostatečné vizuální informace, aby obsahovaly dostatek funkcí typu HAAR pro úspěšný trénink klasifikátorů. Myslím, že už bylo pozdě v noci, ale rozhodl jsem se vyzkoušet myšlenku napsat program, který automaticky umístí malý miniaturní obrázek nad polohu každé jasné hvězdy na obrázku hvězdného pole.

Elton

Byl to hloupý test, ale přidáním malého obrázku tváře Eltona Johna na každé místo s jasnou hvězdou, vycvičením klasifikátoru proti tomuto pozitivnímu obrazu a následným spuštěním kaskád proti původnímu obrazu bylo mnohem efektivnější správně najít správný vzor. Věděl jsem, že na něco jdu!

Krok 7: Základní značky

Výchozí značky
Výchozí značky

Ačkoli 'Eltonové' potvrdili teorii, potřeboval jsem značku, která měla plnou rotační symetrii, aby hvězdný vzor vypadal stejně bez ohledu na to, v jaké orientaci byl představen. Testoval jsem řadu typů značek a zjistil jsem, že typ v pravém dolním rohu je nejúčinnější s kontrastními černobílými kroužky. Program python uvedený v kladné složce repo GitHub ukazuje, jak jsou na daném obrázku identifikovány nejjasnější hvězdy, a tyto značky se v těchto pozicích automaticky překrývají. Nyní jsme vytvořili reprezentaci klíčových vzorů hvězd, proti nimž lze trénovat.

Krok 8: Použití kaskád

Pomocí kaskád
Pomocí kaskád

Když jste vycvičili sadu kaskád, musíte vědět, jak je použít k identifikaci objektu na obrázku!

Podívejte se do složky Star Identification na GitHubu, kde najdete program cascade_test19.py. Tento chytlavě pojmenovaný program převezme sadu kaskád z dané složky a všechny je spustí na vstupním obrázku a podá zprávu o provedených zjištěních. Základem je funkce 'detectMultiScale', která vyžaduje celou řadu argumentů, které definují proces detekce. Jejich změna je rozhodující pro výkon klasifikátoru kaskády a další diskusi o tom lze nalézt v následujícím kroku, kde se podíváme na to, jak odstranit falešně pozitivní výsledky.

To by bylo možné použít v satelitním orientačním systému korelací hodnoty pixelu ve středu ohraničovacího rámečku s nebeskou souřadnicí Ra/Dec identifikované hvězdné patterny a poté korelací s úhlovým posunem od středu obrazu (kamera) osa). Z toho, pomocí porozumění zkreslení čočky (přiblíženo ke gnomonické projekci), lze úhel satelitu zjistit pouze ze dvou pozitivních identifikací.

Krok 9: Jak zůstat pozitivní ohledně falešných pozitiv

Jak zůstat pozitivní ohledně falešných pozitiv
Jak zůstat pozitivní ohledně falešných pozitiv
Jak zůstat pozitivní ohledně falešných pozitiv
Jak zůstat pozitivní ohledně falešných pozitiv

Tyto dva obrázky ukazují výsledky testování kaskádové sady na identickém obrázku, ale s různými parametry. Je zřejmé, že první obrázek obsahuje skutečnou identifikaci, ale také obrovské množství falešných poplachů, zatímco druhý obrázek obsahuje pouze správnou identifikaci.

Program cascade_test19.py ve složce Star Identification v GitHub repo používá k třídění výsledků dvě metody. Za prvé, funkce detectMultiScale nastaví Miminum a maximální velikost výsledku, který lze nalézt, což je rozumné, jako přibližnou velikost vzoru cílové hvězdy v okně (pro daný objektiv a zvětšení - moje simulované obrázky Stellarium využívají vlastností Raspberry Pi V2 Camera) je známý. Za druhé, kód vybere výsledek s největším ohraničujícím rámečkem (v rámci předchozích limitů). Při testování se zjistilo, že je to skutečně pozitivní. Za třetí, program stanoví minimální „levelWeights“(ve skutečnosti „hodnotu spolehlivosti“), která je nutná k tomu, aby bylo toto ID považováno za skutečně pozitivní. Touto metodou byly kaskády účinné při hledání správného výsledku.

Kromě obrázků hvězdného pole jsem to také testoval na obrázcích svého stolu, například při tréninkových kaskádách k identifikaci mého notebooku, hrníčku atd., Abych cvičil odstraňování falešných poplachů. Výše uvedené metody fungovaly dobře za všech okolností, což bylo povzbudivé.

Krok 10: Diskuse

Diskuse
Diskuse
Diskuse
Diskuse
Diskuse
Diskuse

Oblasti pro zlepšení

Byl to pro mě složitý projekt a opravdu posunul mé chápání tématu. To zahrnovalo celkem několik měsíců práce téměř na plný úvazek, aby se projekt dostal do tohoto bodu, když se o něj s vámi mohu podělit, ale je třeba udělat ještě mnoho práce na zlepšení výkonu metody. V současné podobě může v určitých omezeních dobře fungovat. Pracoval jsem na identifikaci oblastí, které potřebují další práci, a doufejme, že budu moci věnovat čas jejich řešení v nadcházejících měsících. Oni jsou:

Úhel - Jedná se o komplexní oblast, myšlenka, že výsledky klasifikátorů musí být rotačně invariantní, tj. Měla by spolehlivě identifikovat vzor cílové hvězdy bez ohledu na úhel, pod kterým je představen obrázek obsahující cílovou hvězdu. Kaskáda vycvičená pomocí vstupního obrazu s jedinou orientací nebude schopná tento obraz identifikovat v náhodných orientacích, takže do tréninkového procesu musí být zavedena odchylka pozitivního úhlu obrazu, aby se trénovaly kaskády, které mohou akceptovat rozsah vstupních úhlů. Parametr „maxzangle“v kaskádových tréninkových příkazech bere argument v radiánech, který řídí hranici úhlu, ve kterém bude vstupní pozitivní obraz překryt na poskytnutých negativních obrazech, takže výsledná sada pozitivních obrázků bude obsahovat řadu orientací pozitivní obraz. Jak se však tento maxzangle zvyšuje, poměr přijetí (obecně řečeno, kvalita) kaskády se výrazně sníží. Věřím, že řešením je trénovat kaskády pomocí podstatně větší databáze negativních obrazů, než jakou jsem používal, aby bylo zajištěno, že lze vytvořit kvalitní kaskádový klasifikátor, a to i začleněním velkého rozpětí orientace.

Dalším potenciálním řešením by bylo vycvičit několik kaskád pro konkrétní cíl, přičemž každá kaskáda by řídila určitou část plné 360stupňové rotace. Tímto způsobem může být kvalita každé kaskády udržována na vysoké úrovni, ale na druhé straně to bude mít za následek mnohem více kaskád, a proto bude proces identifikace pomalejší.

Parametr 'levelWeight', což je hodnota poskytovaná funkcí 'detectMultiScale', je analogický hodnotě spolehlivosti v detekci, která byla provedena. Při studiu toho byl vytvořen výše uvedený graf, který ukazuje, jak důvěra v pozitivní identifikaci prudce klesá, jak se orientace obrazu zvyšuje v obou směrech, což potvrzuje myšlenky, že se jedná o slabé místo.

Umístění pixelů - Mnohem jednodušší, ale také problematický bod je umístění pixelu, ilustrované následujícími dvěma obrázky, které ukazují zvětšený pohled na hvězdný obraz, takže jednotlivé pixely dvou hvězd jsou dobře vidět. Proces eroze použitý v programu na drhnutí všech kromě nejjasnějších hvězd z obrázku udrží první hvězdu a druhou odhodí, přestože mají stejnou jasnost. Důvodem je to, že první hvězda je soustředěna na pixel, zatímco druhá není jako taková. Funkce eroze odstraní soustředné prstence pixelů z okolí centrálního pixelu skupiny, a tak první hvězda bude mít centrální pixel, aby přežil funkci eroze, ale druhá hvězda bude z obrázku zcela odstraněna. Proto budou referenční značky umístěny pouze na první hvězdu, nikoli na druhou. To způsobí nesrovnalosti týkající se toho, které jasné hvězdy v daném hvězdném poli dostanou značky (a budou tedy porovnány s vyškolenými klasifikátory) - proto je možné, že správné pozitivní pozorování nebude možné.

Krok 11: Poslední slovo

Poslední slovo
Poslední slovo

Děkuji, že jste si přečetli můj návod, doufám, že vás tento projekt zaujal. Byl to velmi zajímavý proces, jak na tom pracovat, je to už více než rok, co jsem na konceptu začal pracovat, a výsledky mě k tomuto bodu povzbuzují. Z literatury, kterou jsem četl, je to docela originální koncept a s větším vývojem lze určitě použít v řadě aplikací pro amatérskou astronomii nebo více.

Tento projekt byl pro mě strmou křivkou učení, a proto doufám, že někteří čtenáři s více zkušenostmi s programováním mohou být inspirováni, aby přispěli k pokračování projektu prostřednictvím stránky GitHub, a můžeme pokračovat ve vývoji tohoto open-source nástroje. Těším se, až si přečtu všechny vaše komentáře, ale prosím, nepokládejte příliš mnoho obtížných otázek!

Vesmírná výzva
Vesmírná výzva
Vesmírná výzva
Vesmírná výzva

Runner Up in the Space Challenge

Doporučuje: