Spisu treści:

Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV): 11 kroków (ze zdjęciami)
Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV): 11 kroków (ze zdjęciami)

Wideo: Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV): 11 kroków (ze zdjęciami)

Wideo: Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV): 11 kroków (ze zdjęciami)
Wideo: Weka: uczenie maszynowe i analiza danych w javie 2024, Lipiec
Anonim
Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV)
Rozpoznawanie gwiazd za pomocą widzenia komputerowego (OpenCV)

Ta instrukcja opisuje, jak stworzyć program do widzenia komputerowego, który automatycznie identyfikuje wzorce gwiazd na obrazie. Metoda wykorzystuje bibliotekę OpenCV (Open-Source Computer Vision) do stworzenia zestawu wytrenowanych kaskad HAAR, które można wykorzystać do rozpoznawania określonych wzorców gwiazd. Chociaż ten przewodnik dotyczy rozpoznawania wzorców gwiazd, opisany przeze mnie proces OpenCV można zastosować również w innych aplikacjach - więc miejmy nadzieję, że będzie przydatny!

Podsumowaniem projektu jest ten film:

Dlaczego napisałem tę instrukcję?

  1. Uważam, że metoda identyfikacji wzorców gwiazd, którą opracowuję, ma potencjał do zastosowania w wielu projektach astronomii amatorskiej – niezależnie od tego, czy chodzi o orientację teleskopu, automatyczną klasyfikację obrazów, czy też ostatecznie o czujnik gwiazdy na otwartym źródle lub amatorskim CubeSat.
  2. Jest tu wiele dobrych instrukcji OpenCV, ale mimo to początkowo nauczenie się tego procesu było dla mnie bardzo trudne, więc mam nadzieję, że ten przewodnik będzie dobrym punktem odniesienia dla innych osób, które chcą trenować klasyfikatory HAAR dla OpenCV (niekoniecznie może astronomia!).
  3. Sam nie jestem wyszkolonym programistą, więc ten projekt naprawdę pchnął moje zrozumienie. Mam nadzieję, że pisząc ten Instructable inni, bardziej doświadczeni, twórcy zostaną zainspirowani do pracy nad tą koncepcją i przyczynią się do GitHub i tego instruktażu poprzez komentarze na tej stronie.
  4. Amatorska astronomia i metody orientacji są moim dużym zainteresowaniem, zobacz mój poprzedni instruktaż zawierający Arduino Star-Finder for Telescopes.

Zdjęcie na okładce tego Instructable przedstawia koncept 3U CubeSat, w którego projektowaniu brałem udział. Użyłem go do zilustrowania tej instrukcji, ponieważ oryginalna aplikacja komputerowego systemu rozpoznawania gwiazd miała być czujnikiem orientacji dla amatorskich CubeSatów, przy użyciu kamery Raspberry Pi V2. Wierzę, że istnieje wiele innych potencjalnych zastosowań komputerowego rozpoznawania gwiazd, ale myślę, że to jest najfajniejsze!

Mały glosariusz:

Uczenie się o wizji komputerowej jest spowalniane przez głupią ilość użytych specjalistycznych terminów, więc zdefiniuję kilka dla nas tutaj:

Kaskada - klasyfikator wyszkolony do identyfikowania określonego obiektu docelowego.

Fiducial Marker - znacznik dodający wizualny punkt odniesienia do obrazu.

HAAR - funkcje podobne do Haar to rodzaj funkcji obrazu używanej do szkolenia klasyfikatorów.

OpenCV - Open Source Computer Vision, biblioteka narzędzi widzenia komputerowego.

Stellarium - oprogramowanie astronomiczne typu Open Source.

Krok 1: Wymagania

OpenCV jest biblioteką opartą na Linuksie, więc chociaż podobno można ją dobrze obsługiwać w systemie Windows, znacznie łatwiej będzie jej uruchomić w środowisku Linux (weź to ode mnie i wiele dni próbując ją w pełni uruchomić Okna!). W ramach eksperymentu pobrałem i uruchomiłem OpenCV na moim Raspberry Pi 3B+, co się powiodło, chociaż szkolenie klasyfikatorów wymaga bardzo dużej ilości pamięci RAM, więc jeśli chcesz to zrobić z dowolną prędkością, zalecaną drogą jest wynajęcie wirtualnego serwera Linux (co w rzeczywistości może być zaskakująco tanie) przez kilka dni/tygodni/miesięcy i użyj tego jako dedykowanego środowiska do prowadzenia szkolenia klasyfikatorów. Będziesz mógł kontrolować serwer z komputera z systemem Windows za pomocą klienta SSH, takiego jak Putty. Po przeszkoleniu kaskad przy użyciu VPS można je pobrać na komputer z systemem Windows, a Python można wykorzystać do uruchomienia programu do rozpoznawania obrazów w środowisku Windows.

Serwer wirtualny Linux:

Do przeprowadzenia kaskadowych procesów szkoleniowych HAAR potrzebny jest Linux Virtual Server (VPS). Początkowo wynająłem serwer z 8 GB pamięci RAM i Ubuntu 16.04.6 (LTS) x64, a później drugi, aby podwoić szybkość, z jaką mógłbym trenować kaskady, chociaż wystarczy tylko jeden

Oprogramowanie:

  • Stellarium - to oprogramowanie do wirtualnego planetarium/astronomii, dostępne bezpłatnie. Zostanie on wykorzystany do zebrania symulowanych obrazów gwiazd do wykorzystania w testach.
  • Putty - Jest to klient SSH, który służy do sterowania VPS za pomocą wiersza poleceń.
  • WinSCP - służy do wykonywania transferu plików z komputera z systemem Windows.

Krok 2: Konfiguracja VPS

Istnieje mały proces konfiguracji, aby uruchomić VPS. Za pierwszym razem może to trochę potrwać, ale nie jest to zbyt trudne, jeśli będziesz uważnie postępować zgodnie z instrukcjami. Ten samouczek był dla mnie świetnym odniesieniem, polecam również to przeczytać podczas pracy z tą instrukcją. Obejmuje on specyfikę poleceń linuksowych linia po linii, które należy przestrzegać co do joty.

Z grubsza proces obejmuje:

  1. Stworzenie serwera Linux z poprawną wersją Ubuntu.
  2. Aktualizacja i aktualizacja serwera.
  3. Utworzenie katalogu obszaru roboczego, w którym zainstalowany jest OpenCV.
  4. Instalacja podstawowych elementów, a mianowicie kompilatora, różnych bibliotek i powiązań Pythona.

Po tym etapie jesteś gotowy do rozpoczęcia przygotowań do procesu szkoleniowego.

Krok 3: Proces

Cały proces widzenia komputerowego przy użyciu kaskad HAAR jest początkowo dość zagmatwany, więc ten krok opisuje logikę bardziej szczegółowo:

Podstawowy proces

  1. Istnieje zbiór danych obrazu negatywowego, składający się z kilku tysięcy obrazów, które nie zawierają obiektu zainteresowania. Będzie to musiało zostać przesłane do VPS.
  2. Tworzony jest pojedynczy pozytywny obraz zawierający przedmiot zainteresowania. Będzie to również musiało zostać przesłane do VPS.
  3. Pojedynczy obraz pozytywowy jest zniekształcany, wypaczany, obracany itp. przez zestaw wybranych parametrów i nakładany na wybrane obrazy negatywowe. Jest to sztuczny sposób tworzenia dużego pozytywnego zestawu danych z jednego obrazu. (W przypadku innych rzeczywistych zastosowań, takich jak identyfikacja kota, możesz po prostu użyć kilku tysięcy zdjęć kotów, ale ta metoda nie zawsze jest odpowiednia, jeśli nie masz tak dużego zestawu pozytywnych zdjęć. Zastosowane tutaj sztuczne podejście będzie mniej skuteczny, ale jest to jedyna opcja w przypadku użycia takiego jak ten).
  4. Uruchamiany jest proces szkoleniowy, który działa etapami. Każdy etap będzie trenował kaskadę, aby zidentyfikować różne cechy typu HAAR w ramach obrazów. Każdy etap trwa wykładniczo dłużej, a skuteczność klasyfikatora rośnie za każdym razem (możliwe jest również przetrenowanie, tak wiesz!).
  5. Pojedyncza wyszkolona kaskada będzie mogła szukać pojedynczego obiektu docelowego. Jeśli chcesz zidentyfikować wiele unikalnych obiektów, będziesz potrzebować wyszkolonej kaskady dla każdego z nich. W tym przypadku przeszkoliłem około 50 różnych kaskad, aby uzyskać unikalne wzory gwiazd, aby stworzyć zestaw, który mógłby pokryć północną półkulę niebieską.
  6. Na koniec używany jest program wykrywający, który uruchamia każdą kaskadę zestawu względem obrazu wejściowego. Kaskada będzie szukać danego obiektu docelowego w obrazie wejściowym.
  7. Jeśli się powiedzie, obiekt docelowy zostanie zidentyfikowany w obrazie wejściowym.

n.b. jeśli na przykład zostanie użyty w kontekście orientacji satelitarnej, obraz zostanie przechwycony za pomocą wbudowanej kamery. Zidentyfikowane zostaną najjaśniejsze gwiazdy na tym zdjęciu, a na tych pozycjach zostaną nałożone znaczniki. Ten obraz jest następnie prezentowany zestawowi wytrenowanych kaskad, które sprawdzają, czy obraz wejściowy zawiera którykolwiek z obiektów docelowych. Jeśli zostanie wykryty prawdziwy wynik dodatni, wówczas zostanie odkryte położenie kątowe znanej konstelacji względem osi korpusu satelity.

Krok 4: Negatywy i pozytywy

Negatywy

Naprawdę kluczowym aspektem treningu kaskadowego jest posiadanie jak największego zestawu danych negatywnych obrazów. Mówimy o tysiącach, najlepiej dziesiątkach tysięcy obrazów. Tak naprawdę nie ma znaczenia, co zawierają, celem jest po prostu dostarczenie różnorodnych informacji wizualnych. Folder Trening klasyfikatorów zawiera wiele różnych zestawów danych obrazów negatywowych, które skompilowałem. Początkowo składały się one wyłącznie z symulowanych obrazów pola gwiazd zebranych ze Stellarium, ale później poszerzyłem zestaw danych o tyle losowych obrazów, ile mogłem znaleźć (tak, w tym moje zdjęcia z wakacji…). Największy zbiór danych zawiera prawie 9000 obrazów, co jest największym, jaki do tej pory stworzyłem. Korzystając z tego, zaoszczędzisz kompilowania własnych.

Pozytywy

Pozytywny obraz (czyli wzór gwiazdy docelowej, który kaskada będzie rozpoznawać) zaczyna się jako zrzut ekranu wzoru gwiazdy w Stellarium. Następnie program Pythona identyfikuje najjaśniejsze gwiazdy na obrazie i nakłada znaczniki (wyjaśnione później w tej instrukcji) na te pozycje gwiazd. Ten obraz jest następnie zmniejszany do 50x50 pikseli. To niewiele, ale czas potrzebny na trenowanie kaskad będzie wzrastał wykładniczo wraz ze wzrostem tego rozmiaru, a więc jest to dobry kompromis między jakością a czasem.

Krok 5: Kontrola gwiezdna

Kontrola gwiezdna
Kontrola gwiezdna
Kontrola gwiezdna
Kontrola gwiezdna

Folder Stellarium Scripts repozytorium GitHub zawiera trzy programy, które napisałem, aby kontrolować użycie Stellarium. Aby z nich skorzystać, umieść je w folderze scripts w folderze instalacyjnym Stellarium. Aby je uruchomić, możesz otworzyć okno skryptów z menu Stellarium lub po prostu klikając dwukrotnie program w folderze skryptów, co spowoduje uruchomienie Stellarium i natychmiastowe uruchomienie wybranego programu.

thesis_4 i thesis_5 rejestrują około 2000 zdjęć odpowiednio północnej i południowej półkuli niebieskich. Były one używane do tworzenia baz danych obrazów negatywnych, do trenowania obrazu pozytywnego. Rozróżnienie między północą a południem było prostym sposobem zapewnienia, że docelowy (dodatni) wzór gwiazdy nie będzie obecny w negatywnym zbiorze danych poprzez przeszkolenie wzorów gwiazd z półkuli północnej z zestawem danych obrazu z półkuli nieba południowej i odwrotnie. (Jeżeli pozytywny obraz jest również obecny w zbiorze danych obrazu negatywnego, wpłynie to na jakość klasyfikatora).

Użyteczne jest również thesis_setup - ustawia to Stellarium tak, aby było odpowiednie do przechwytywania obrazów - obrazów używanych do symulowania widoku z kosmosu. Wykonuje czynności, takie jak ukrywanie menu, linii siatki, etykiet itp. Automatycznie, aby zaoszczędzić Ci potrzeb za każdym razem, gdy chcesz pobrać obraz.

Krok 6: Rakietowy Człowiek

Człowiek rakieta
Człowiek rakieta

Pierwsze kaskady, które trenowałem, nie były w stanie poprawnie zidentyfikować żadnych wzorów gwiazd. Były bardzo zawodne i bardzo podatne na fałszywe alarmy. Moje założenie było takie, że w rzeczywistości obrazy pól gwiazdowych ze Stellarium (w zasadzie tylko białe kropki na czarnym tle) po prostu nie zawierały wystarczającej ilości informacji wizualnych, aby zawierać wystarczającą liczbę cech typu HAAR do pomyślnego szkolenia klasyfikatorów. Wydaje mi się, że było późno w nocy, ale postanowiłem spróbować napisać program, który automatycznie umieszczałby małą miniaturkę obrazu nad lokalizacją każdej jasnej gwiazdy na obrazie pola gwiazdowego.

Elton

To był głupi test, ale dodając małe zdjęcie twarzy Eltona Johna do każdej jasnej lokalizacji gwiazdy, ucząc klasyfikatora na podstawie tego pozytywnego obrazu, a następnie porównując kaskady z oryginalnym obrazem, był znacznie skuteczniejszy w prawidłowym znalezieniu właściwy wzór. Wiedziałem, że jestem na coś!

Krok 7: Markery referencyjne

Markery referencyjne
Markery referencyjne

Chociaż "Eltonowie" udowodnili tę teorię, potrzebowałem markera, który miałby pełną symetrię obrotową, aby wzór gwiazdy wyglądał tak samo bez względu na to, w jakiej orientacji został przedstawiony. Przetestowałem szereg typów znaczników i stwierdziłem, że najskuteczniejszy był typ w prawym dolnym rogu, z kontrastującymi czarno-białymi pierścieniami. Program python prezentowany w pozytywnym folderze repozytorium GitHub pokazuje, w jaki sposób identyfikowane są najjaśniejsze gwiazdy na danym obrazie, a znaczniki te automatycznie nakładają się na te pozycje. Stworzyliśmy teraz reprezentację kluczowych wzorców gwiezdnych, przeciwko którym można trenować.

Krok 8: Korzystanie z kaskad

Korzystanie z kaskad
Korzystanie z kaskad

Po wytrenowaniu zestawu kaskad musisz wiedzieć, jak ich używać do identyfikacji obiektu na obrazie!

Spójrz na folder Star Identification na GitHub, gdzie znajdziesz program cascade_test19.py. Ten program o chwytliwej nazwie pobiera zestaw kaskad z danego folderu i uruchamia je wszystkie na obrazie wejściowym oraz raportuje o dokonanych wykryciach. Sednem tego jest funkcja „detectMultiScale”, która wymaga różnych argumentów definiujących proces wykrywania. Ich zmiana ma kluczowe znaczenie dla wydajności klasyfikatora kaskadowego, a więcej dyskusji na ten temat można znaleźć w następnym kroku, w którym przyjrzymy się, jak wyeliminować fałszywe alarmy.

Można to zastosować w systemie orientacji satelitarnej poprzez skorelowanie wartości piksela w środku ramki granicznej ze współrzędną niebieską Ra/Dec zidentyfikowanego wzorca gwiazdy, a następnie skorelowanie tego z przesunięciem kątowym od środka obrazu (kamery oś). Na tej podstawie, korzystając ze zrozumienia zniekształcenia soczewki (przybliżonego do projekcji gnomonicznej), kąt satelity można znaleźć na podstawie zaledwie dwóch pozytywnych identyfikacji.

Krok 9: Jak być pozytywnie nastawionym do fałszywych pozytywów?

Jak być pozytywnie nastawionym do fałszywych pozytywów?
Jak być pozytywnie nastawionym do fałszywych pozytywów?
Jak być pozytywnie nastawionym do fałszywych pozytywów?
Jak być pozytywnie nastawionym do fałszywych pozytywów?

Te dwa obrazy przedstawiają wyniki testowania zestawu kaskadowego na identycznym obrazie, ale o różnych parametrach. Oczywiście pierwszy obraz zawiera prawdziwą identyfikację, ale także ogromną liczbę fałszywych trafień, podczas gdy drugi obraz zawiera tylko prawidłową identyfikację.

Program cascade_test19.py w folderze Star Identification repozytorium GitHub używa dwóch metod do sortowania wyników. Po pierwsze, funkcja detectMultiScale ustawia minimalną i maksymalną wielkość możliwego do znalezienia wyniku, co jest sensowne, jako przybliżony rozmiar wzoru gwiazdy docelowej w oknie (dla danego obiektywu i powiększenia - moje symulowane obrazy Stellarium wykorzystują właściwości kamera Raspberry Pi V2) jest znana. Po drugie, kod wybierze wynik z największą ramką ograniczającą (w ramach poprzednich limitów). W testach okazało się, że jest to prawdziwy pozytyw. Po trzecie, program ustala minimalny „levelWeights” (efektywnie „wartość ufności”), który jest wymagany do traktowania tego identyfikatora jako prawdziwie pozytywnego. Dzięki tej metodzie kaskady były skuteczne w znalezieniu prawidłowego wyniku.

Oprócz zdjęć gwiezdnych pól testowałem to również na zdjęciach mojego biurka, na przykład trenując kaskady w celu identyfikacji mojego notebooka, kubka itp., aby przećwiczyć eliminację fałszywych alarmów. Powyższe metody sprawdzały się we wszystkich okolicznościach, co było zachęcające.

Krok 10: Dyskusja

Dyskusja
Dyskusja
Dyskusja
Dyskusja
Dyskusja
Dyskusja

Obszary do poprawy

To był dla mnie złożony projekt i naprawdę pogłębił moje zrozumienie tematu. Doprowadzenie projektu do tego momentu, w którym mogę się nim z wami podzielić, wymagało w sumie kilku miesięcy pracy prawie w pełnym wymiarze godzin, ale jest jeszcze wiele do zrobienia, aby poprawić wydajność metody. W obecnej formie może dobrze funkcjonować w pewnych ograniczeniach. Pracowałem nad określeniem, które obszary wymagają dodatkowej pracy i mam nadzieję, że w nadchodzących miesiącach będę mógł poświęcić czas na ich rozwiązanie. Oni są:

Kąt - Jest to złożony obszar, idea, że wyniki klasyfikatorów muszą być niezmienne rotacyjnie, tj. powinny wiarygodnie identyfikować wzór gwiazdy docelowej niezależnie od kąta, pod jakim jest prezentowany obraz zawierający wzór gwiazdy docelowej. Kaskada wytrenowana przy użyciu obrazu wejściowego w pojedynczej orientacji nie będzie w stanie zidentyfikować tego obrazu w losowych orientacjach, więc wariancję dodatniego kąta obrazu należy wprowadzić do procesu uczenia, aby wytrenować kaskady, które mogą zaakceptować zakres kątów wejściowych. Parametr 'maxzangle' w poleceniach treningu kaskadowego przyjmuje argument w radianach, który kontroluje granicę kąta, pod jakim wejściowy obraz dodatni zostanie nałożony na dostarczone obrazy ujemne, tak aby wynikowy zestaw obrazów dodatnich zawierał zakres orientacji pozytywny wizerunek. Jednak wraz ze wzrostem tego maxzangle współczynnik akceptacji (ogólnie mówiąc, jakość) kaskady gwałtownie się zmniejszy. Uważam, że rozwiązaniem jest trenowanie kaskad przy użyciu znacznie większej bazy danych obrazów negatywowych niż ta, której używałem, aby zapewnić, że można stworzyć dobrej jakości klasyfikator kaskadowy nawet z dużym rozrzutem orientacji.

Innym potencjalnym rozwiązaniem byłoby wytrenowanie kilku kaskad dla określonego celu, z których każda zarządza pewną częścią pełnego obrotu o 360 stopni. W ten sposób jakość każdej kaskady może być utrzymana na wysokim poziomie, ale z drugiej strony spowoduje to znacznie więcej kaskad, a co za tym idzie proces identyfikacji będzie wolniejszy.

Parametr 'levelWeight', który jest wartością dostarczaną przez funkcję 'detectMultiScale', jest analogiczny do wartości ufności dokonanej detekcji. Studiując to, powstał powyższy wykres, który pokazuje, jak pewność pozytywnej identyfikacji gwałtownie spada wraz ze wzrostem orientacji obrazu w obu kierunkach, potwierdzając myśli, że jest to słaby punkt.

Rozmieszczenie pikseli - Znacznie prostszym, ale również problematycznym punktem jest rozmieszczenie pikseli, zilustrowane następującymi dwoma obrazami, pokazującymi powiększony widok obrazu gwiazdy, tak aby poszczególne piksele dwóch gwiazd były wyraźnie widoczne. Proces erozji użyty w programie do szorowania wszystkich z wyjątkiem najjaśniejszych gwiazd na zdjęciu zatrzyma pierwszą gwiazdę i odrzuci drugą, mimo że mają one taką samą jasność. Powodem tego jest to, że pierwsza gwiazda jest wyśrodkowana na pikselu, podczas gdy druga nie jest jako taka. Funkcja erozji usuwa koncentryczne pierścienie pikseli wokół centralnego piksela grupy, dzięki czemu pierwsza gwiazda będzie miała centralny piksel przetrwający funkcję erozji, ale druga gwiazda zostanie całkowicie usunięta z obrazu. Dlatego znaczniki referencyjne będą umieszczane tylko na pierwszej gwieździe, a nie na drugiej. Spowoduje to niespójności co do tego, które jasne gwiazdy w danym polu gwiazdowym otrzymają znaczniki (a co za tym idzie będą porównywane z wyszkolonymi klasyfikatorami) - stąd możliwe jest, że poprawna pozytywna obserwacja nie będzie możliwa.

Krok 11: Ostatnie słowo

Ostatnie słowo
Ostatnie słowo

Dziękuję za przeczytanie mojej instrukcji, mam nadzieję, że zaintrygował Cię ten projekt. To był bardzo ciekawy proces pracy nad tym, minął ponad rok odkąd zacząłem pracować nad koncepcją i jestem ożywiony wynikami do tego momentu. Z literatury, którą przeczytałem, jest to dość oryginalna koncepcja i przy większym rozwoju z pewnością może być zastosowana w wielu zastosowaniach w astronomii amatorskiej lub nie tylko.

Ten projekt był dla mnie stromą krzywą uczenia się, więc mam nadzieję, że niektórzy czytelnicy z większym doświadczeniem w programowaniu mogą zostać zainspirowani do przyczynienia się do kontynuacji projektu za pośrednictwem strony GitHub i możemy nadal rozwijać to narzędzie typu open source. Z niecierpliwością czekam na wszelkie komentarze, które możesz mieć, ale nie zadawaj zbyt wielu trudnych pytań!

Kosmiczne wyzwanie
Kosmiczne wyzwanie
Kosmiczne wyzwanie
Kosmiczne wyzwanie

Drugie miejsce w wyzwaniu kosmicznym

Zalecana: