Indholdsfortegnelse:

Stjernegenkendelse ved hjælp af Computer Vision (OpenCV): 11 trin (med billeder)
Stjernegenkendelse ved hjælp af Computer Vision (OpenCV): 11 trin (med billeder)

Video: Stjernegenkendelse ved hjælp af Computer Vision (OpenCV): 11 trin (med billeder)

Video: Stjernegenkendelse ved hjælp af Computer Vision (OpenCV): 11 trin (med billeder)
Video: How Computer Vision Works 2024, November
Anonim
Stjernegenkendelse ved hjælp af Computer Vision (OpenCV)
Stjernegenkendelse ved hjælp af Computer Vision (OpenCV)

Denne instruktive vil beskrive for dig, hvordan du opretter et computer vision -program til automatisk at identificere stjernemønstre i et billede. Metoden anvender OpenCV-biblioteket (Open-Source Computer Vision) til at oprette et sæt uddannede HAAR-kaskader, der kan bruges til at genkende bestemte stjernemønstre. Selvom denne vejledning er i forbindelse med genkendelse af stjernemønstre, kan OpenCV -processen, jeg beskriver, også anvendes på andre applikationer - så det vil forhåbentlig være nyttigt!

Projektet er opsummeret i denne video:

Hvorfor skrev jeg dette instruerbart?

  1. Stjernemønsteridentifikationsmetoden, jeg udvikler, tror jeg har potentiale til at blive anvendt på en lang række amatørastronomiprojekter - uanset om det er teleskoporientering, automatisk billedklassificering eller endda i sidste ende en stjernesensor på en open source eller amatør CubeSat.
  2. Der er masser af gode OpenCV -instruktører her, men alligevel syntes jeg det var en meget vanskelig proces at lære i starten, så jeg håber, at denne vejledning vil være en god reference for andre mennesker, der ønsker at træne HAAR -klassifikatorer til OpenCV (ikke nødvendigvis at gøre med astronomi måske!).
  3. Jeg er ikke selv uddannet programmør, så dette projekt pressede virkelig min forståelse. Forhåbentlig ved at skrive denne Instructable andre, mere erfarne, beslutningstagere vil blive inspireret til at arbejde på dette koncept og bidrage til GitHub og dette instruerbart via kommentarer på denne side.
  4. Amatørastronomi og orienteringsmetoder er en stor interesse for mig, se min tidligere instruktør med en Arduino Star-Finder til teleskoper.

Forsidefotoet af denne Instructable er af et koncept 3U CubeSat -design, som jeg deltog i designet af. Jeg brugte det til at illustrere dette instruerbare, da den oprindelige anvendelse af computervisionstjernegenkendelsessystemet skulle være til en orienteringssensor til amatørfremstillede CubeSats ved hjælp af et Raspberry Pi V2-kamera. Der er mange andre potentielle anvendelser af computer vision stjerne genkendelse, jeg tror, men jeg synes, det er det sejeste!

En lille ordliste:

Læring om computersyn gøres langsommere af den dumme mængde specialtermer, der bruges, så jeg vil definere nogle for os her:

Cascade - En klassifikator, der er uddannet til at identificere et specifikt målobjekt.

Fiducial Marker - En markør, der tilføjer et visuelt punkt til et billede.

HAAR - Haarlignende funktioner er en type billedfunktion, der bruges til klassificeringstræning.

OpenCV - Open Source Computer Vision, et bibliotek med computervisionværktøjer.

Stellarium - Open Source astronomisoftware.

Trin 1: Krav

OpenCV er et Linux -baseret bibliotek, så selvom det angiveligt er muligt at betjene det godt på Windows, har du meget lettere ved at køre det i et Linux -miljø (tag dette fra mig og mange dage med at prøve at få det til at fungere fuldt ud Windows!). Som et eksperiment downloadede og kørte jeg OpenCV på min Raspberry Pi 3B+, hvilket var en succes, selvom klassificeringstræning er en meget RAM -intensiv proces, så hvis du ønsker at gøre det med en hvilken som helst hastighed, er den anbefalede rute at ansætte en Linux Virtual Server (som faktisk kan være overraskende billig) i et par dage/uger/måneder, og brug det som et dedikeret miljø til at køre klassificeringstræningen. Du vil kunne styre serveren fra en Windows -pc ved hjælp af en SSH -klient som f.eks. Putty. Når kaskaderne er uddannet ved hjælp af VPS, kan de downloades til din Windows -pc, og Python kan bruges til at køre billedgenkendelsesprogrammet i et Windows -miljø.

Linux virtuel server:

En Linux Virtual Server (VPS) er nødvendig for at udføre HAAR -kaskade -træningsprocesser. Oprindeligt lejede jeg en server med 8 GB RAM og Ubuntu 16.04.6 (LTS) x64, og senere en anden for at fordoble den hastighed, hvormed jeg kunne træne kaskader, selvom du kun skal bruge mindst en

Software:

  • Stellarium - dette er virtuel planetarium/astronomisoftware, frit tilgængelig. Det vil blive brugt til at samle simulerede stjernebilleder til brug i test.
  • Putty - Dette er en SSH -klient, der bruges til at styre VPS via kommandolinje.
  • WinSCP - dette bruges til at udføre filoverførsel fra Windows -pc'en.

Trin 2: VPS -opsætning

Der er en lille installationsproces for at få VPS'en til at køre. Første gang kan det tage lidt tid for dig, men det er ikke for svært, hvis du følger trinene nøje. Denne vejledning var en god reference for mig, jeg vil anbefale dig at læse dette også, mens du arbejder igennem dette instruerbare. Det dækker specifikationerne for linux -kommandoerne linje for linje, hvilket er nødvendigt at følge til punkt og prikke.

I grove træk involverer processen:

  1. Oprettelse af Linux -server med korrekt Ubuntu -version.
  2. Opgradering og opdatering af serveren.
  3. Oprettelse af et arbejdsområdekatalog, hvor OpenCV er installeret.
  4. Installation af nogle essentials, nemlig en compiler, forskellige biblioteker og Python -bindinger.

Efter denne fase er du klar til at begynde at forberede træningsprocessen.

Trin 3: Processen

Hele computervisionen ved hjælp af HAAR -kaskader er ganske forvirrende i starten, så dette trin beskriver logikken lidt mere detaljeret:

Grundlæggende proces

  1. Der findes et negativt billedsæt, der består af flere tusinde billeder, der ikke indeholder objektet af interesse. Dette skal uploades til VPS.
  2. Der oprettes et enkelt positivt billede, der indeholder objektet af interesse. Dette skal også uploades til VPS.
  3. Det enkelte positive billede forvrænges, forvrænges, roteres osv. Af et sæt valgte parametre og overlejres efter et udvalg af de negative billeder. Dette er en kunstig måde at oprette et stort positivt datasæt ud af et enkelt billede. (For andre virkelige applikationer, f.eks. Identifikation af en kat, kan du simpelthen bruge flere tusinde billeder af katte, men denne metode er ikke altid passende, hvis du ikke har så mange positive billeder. Den kunstige tilgang, der bruges her vil være mindre effektiv, men det er den eneste mulighed for en use-case som denne).
  4. Der udføres en træningsproces, der fungerer i etaper. Hvert trin træner en kaskade til at identificere forskellige funktioner af HAAR-typen i billedsættene. Hvert trin tager eksponentielt længere tid at gennemføre, og klassificeringsvirksomhedens effektivitet øges for hver gang (det er også muligt at træne for meget, bare så du ved det!).
  5. En enkelt trænet kaskade vil være i stand til at lede efter et enkelt målobjekt. Hvis du ønsker at identificere flere unikke objekter, skal du bruge en uddannet kaskade til hver. I dette tilfælde trænede jeg omkring 50 forskellige kaskader til unikke stjernemønstre i at skabe et sæt, der kunne dække den nordlige himmelsfære.
  6. Endelig bruges et detekteringsprogram, der kører hver kaskade af et sæt mod et inputbillede. Kaskaden vil lede efter sit givne målobjekt i inputbilledet.
  7. Hvis det lykkes, identificeres målobjektet i inputbilledet.

n.b. hvis det f.eks. bruges i en satellitorienteret kontekst, ville et billede blive taget med et indbygget kamera. De lyseste stjerner i dette billede vil blive identificeret, og markører overlejret i disse positioner. Dette billede præsenteres derefter for sættet med uddannede kaskader, der tester, om inputbilledet indeholder nogen af målobjekterne. Hvis der opdages en sand positiv, opdages vinkelpositionen for en kendt konstellation i forhold til satellitlegemets akser.

Trin 4: Negativer og positive

Negativer

Et virkelig vigtigt aspekt ved kaskadeuddannelse er at have et så stort datasæt med negative billeder som muligt. Vi taler tusinder, helst titusinder af billeder. Det er ikke ligegyldigt, hvad de indeholder, målet er bare at levere forskellige visuelle oplysninger. Classifier Training -mappen indeholder en række forskellige negative billeddatasæt, som jeg har samlet. Oprindeligt bestod disse udelukkende af simulerede stjernefeltbilleder hentet fra Stellarium, men jeg udvidede senere datasættet med så mange randomiserede billeder, som jeg kunne finde (ja, inklusive mine feriefotos …). Det største datasæt der indeholder næsten 9000 billeder, hvilket var det største, jeg har oprettet hidtil. Ved at bruge dette sparer du dig for at sammensætte dine egne.

Positiver

Det positive billede (det er målstjernemønsteret, som kaskaden skal trænes i at genkende) begynder som et skærmbillede af et stjernemønster i Stellarium. Et pythonprogram identificerer derefter de klareste stjerner i billedet og overlejrer markører (forklaret senere i denne instruerbare) på disse stjernepositioner. Dette billede formindskes derefter til 50x50 pixels. Dette er lille, men den træningstid, der kræves til kaskaderne, vil stige eksponentielt, når denne størrelse stiger, og det er derfor et godt kompromis mellem kvalitet og tid.

Trin 5: Stellariumkontrol

Stellarium kontrol
Stellarium kontrol
Stellarium kontrol
Stellarium kontrol

Stellarium Scripts -mappen i GitHub -depotet indeholder tre programmer, jeg skrev til at styre brugen af Stellarium. For at bruge dem skal du placere dem i mappen scripts i din Stellarium -installationsmappe. For at køre dem kan du åbne vinduet scripts i menuen Stellarium eller bare ved at dobbeltklikke på programmet i scripts -mappen, som starter Stellarium og straks kører det valgte program.

afhandling_4 og tese_5 fanger omkring 2000 billeder hver af henholdsvis de nordlige og sydlige himmelhveler. Disse blev brugt til at danne databaser med negative billeder, til at træne det positive billede imod. Skelnen mellem nord og syd var en enkel måde at sikre, at målmønsteret (positivt) stjernemønster ikke ville være til stede i det negative datasæt ved at træne stjernemønstre på den nordlige halvkugle mod det sydlige himmelsfærebilleddatasæt og omvendt. (Hvis der også er et positivt billede i det negative billedsæt, vil det påvirke klassifikatorens kvalitet).

thesis_setup er også nyttig - dette indstiller Stellarium til at være passende til at tage billeder - de billeder, der bruges til at simulere en udsigt fra rummet. Det gør handlinger som at skjule menuer, gitterlinjer, etiketter osv. Automatisk for at spare dig for hver gang du vil tage et billede.

Trin 6: Rocket Man

Raket mand
Raket mand

De første kaskader, jeg trænede, kunne ikke korrekt identificere stjernemønstre. De var meget upålidelige og var meget tilbøjelige til falske positive. Min antagelse var, at stjernefeltbillederne fra Stellarium (stort set bare hvide prikker på en sort baggrund) simpelthen ikke indeholdt tilstrækkelig visuel information til at indeholde nok funktioner af HAAR-typen til vellykket klassificeringstræning. Jeg tror, det var sent om aftenen, men jeg besluttede at prøve ideen om at skrive et program til automatisk at placere et lille miniaturebillede over placeringen af hver lysende stjerne i et stjernefeltbillede.

Elton

Dette var en fjollet test, men ved at tilføje et lille billede af Elton Johns ansigt til hver lysende stjerneplacering, træne klassifikatoren mod dette positive billede og derefter køre kaskaderne mod det originale billede, var det meget meget mere effektivt til korrekt at finde rigtige mønster. Jeg vidste, at jeg var til noget!

Trin 7: Fiducial markører

Tillidsmarkører
Tillidsmarkører

Selvom 'Eltons' beviste teorien, havde jeg brug for en markør, der havde fuld rotationssymmetri, så stjernemønsteret ville se det samme ud uanset hvilken orientering det blev præsenteret. Jeg testede en række markørtyper og fandt ud af, at typen nederst til højre var mest effektiv med de kontrasterende sorte og hvide ringe. Python -programmet præsenteret i den positive mappe i GitHub -repoen viser, hvordan de lyseste stjerner i et givet billede identificeres, og disse markører overlejres automatisk i disse positioner. Vi har nu skabt en repræsentation af nøglestjernemønstre, der kan trænes imod.

Trin 8: Brug af Cascades

Brug af Cascades
Brug af Cascades

Når du har trænet et sæt kaskader, skal du vide, hvordan du bruger dem til at identificere et objekt i et billede!

Se på mappen Star Identification i GitHub, hvor du finder cascade_test19.py -programmet. Dette fængslende program tager et sæt kaskader fra en given mappe og kører dem alle mod et inputbillede og rapporterer om de foretagne registreringer. Funktionen 'detectMultiScale' er kernen i dette, og det kræver en række argumenter, der definerer detekteringsprocessen. Ændring af disse er afgørende for kaskadeklassificatorens ydeevne, og mere diskussion af dette kan findes i det følgende trin, hvor vi ser på, hvordan man fjerner falske positiver.

Dette kan anvendes i et satellitorienteringssystem ved at korrelere pixelværdien i midten af afgrænsningsboksen til Ra/Dec -himmelkoordinaten for det identificerede stjernemønster og derefter korrelere dette med vinkelforskydningen fra midten af billedet (kamera akse). Ud fra dette, ved hjælp af en forståelse af linseforvrængningen (tilnærmet til en gnomonisk projektion), kan satellitens vinkel findes fra kun to positive identifikationer.

Trin 9: Sådan forbliver du positiv om falske positive

Sådan forbliver du positiv om falske positive
Sådan forbliver du positiv om falske positive
Sådan forbliver du positiv om falske positive
Sådan forbliver du positiv om falske positive

Disse to billeder viser resultaterne af at teste kaskadesættet mod et identisk billede, men med forskellige parametre. Det er klart, at det første billede indeholder den sande identifikation, men også et enormt antal falske positiver, hvorimod det andet billede kun indeholder den korrekte identifikation.

Cascade_test19.py -programmet i mappen Star Identification i GitHub -repoen bruger to metoder til at sortere resultaterne. For det første angiver detectMultiScale -funktionen et resultat af Miminum og maksimal størrelse, der kan findes, hvilket er fornuftigt, da den omtrentlige størrelse af målstjernemønsteret i vinduet (for den givne linse og forstørrelse - mine simulerede Stellarium -billeder bruger egenskaberne Raspberry Pi V2 -kameraet) er kendt. For det andet vil koden vælge resultatet med den største afgrænsningsboks (inden for de tidligere grænser). I test viste det sig, at dette var det rigtige positive. For det tredje fastsætter programmet et minimum 'levelWeights' (effektivt 'konfidensværdi'), der kræves for at behandle dette ID som et sandt positivt. Ved denne metode var kaskaderne effektive til at finde det korrekte resultat.

Udover stjernefeltbillederne testede jeg også dette mod billeder af mit skrivebord, f.eks. Træning af kaskader i at identificere min notesbog, krus osv. For at øve på at eliminere falske positiver. Ovenstående metoder fungerede godt under alle omstændigheder, hvilket var opmuntrende.

Trin 10: Diskussion

Diskussion
Diskussion
Diskussion
Diskussion
Diskussion
Diskussion

Områder til forbedring

Dette har været et komplekst projekt for mig og virkelig presset min forståelse af emnet. Det har involveret i alt flere måneder næsten fuldtidsarbejde for at få projektet til dette punkt, når jeg kan dele det med dig, men der er masser af mere arbejde, der skal gøres for at forbedre metodens ydeevne. Som det ser ud, kan det fungere godt inden for visse begrænsninger. Jeg har arbejdet med at identificere, hvilke områder der har brug for yderligere arbejde, og vil forhåbentlig kunne bruge tid på at løse disse i de kommende måneder. De er:

Vinkel - Dette er et komplekst område, ideen om, at resultaterne af klassifikatorerne skal være rotationsmæssigt invariante, dvs. det skal pålidelighed identificere målstjernemønsteret, uanset hvilken vinkel det viser billedet, der indeholder målstjernemønsteret. En kaskade, der er uddannet ved hjælp af et inputbillede i en enkelt orientering, vil ikke være i stand til at identificere dette billede i randomiserede retninger, så variation af den positive billedvinkel skal indføres i træningsprocessen for at træne kaskader, der kan acceptere et område på inputvinkler. Parameteren 'maxzangle' i kaskade -træningskommandoer tager et argument i radianer, der styrer en grænse for den vinkel, som det input -positive billede vil blive overlejret på de medfølgende negative billeder, så det resulterende positive billedsæt vil indeholde en række orienteringer af det positive image. Når dette maxzangle stiger, vil acceptforholdet (generelt set kvalitet) af kaskaden imidlertid reducere kraftigt. Jeg tror, at løsningen er at træne kaskader ved hjælp af en betydeligt større database med negative billeder, end hvad jeg brugte for at sikre, at der kan oprettes en kaskadeklassificering af god kvalitet, selv med en stor orienteringsspredning.

En anden potentiel løsning ville være at træne et antal kaskader til et specifikt mål, hver kaskade styrer en bestemt del af en fuld 360 graders rotation. På den måde kan kvaliteten af hver kaskade opretholdes på et højt niveau, men på den anden side vil dette resultere i langt flere kaskader, og derfor vil identifikationsprocessen være langsommere.

Parameteren 'levelWeight', som er en værdi fra funktionen 'detectMultiScale', er analog med en konfidensværdi i den detektering, der er foretaget. Ved at studere dette blev ovenstående graf skabt, som viser, hvordan tilliden til positiv identifikation falder kraftigt, når billedets orientering stiger i begge retninger, hvilket bekræfter tankerne om, at dette er et svagt punkt.

Pixelplacering - Et meget enklere, men også problematisk punkt er pixelplacering, illustreret med de følgende to billeder, der viser et forstørret billede af et stjernebillede, så de enkelte pixels på to stjerner kan ses tydeligt. Erosionsprocessen, der bruges i programmet til at skrubbe alle undtagen de lyseste stjerner fra billedet, vil beholde den første stjerne og kassere den anden, på trods af at de har samme lysstyrke. Grunden til dette er, at den første stjerne er centreret om en pixel, hvorimod den anden ikke er som sådan. Erosionsfunktionen fjerner koncentriske ringe af pixels fra omkring den centrale pixel i en gruppe, og derfor får den første stjerne den centrale pixel til at overleve erosionsfunktionen, men den anden stjerne fjernes fuldstændigt fra billedet. Derfor vil tillidsmarkører kun blive placeret på den første stjerne, og ikke den anden. Dette vil forårsage uoverensstemmelser i forbindelse med hvilke lyse stjerner i et givet stjernefelt vil modtage markører (og dermed blive sammenlignet med de uddannede klassifikatorer) - derfor er det muligt, at en korrekt positiv observation ikke er mulig.

Trin 11: Sidste ord

Sidste ord
Sidste ord

Tak fordi du læste min instruktive, jeg håber, at du fandt dette projekt spændende. Det har været en meget interessant proces at arbejde med det, det er over et år siden jeg begyndte at arbejde med konceptet, og jeg er opmuntret af resultaterne til dette punkt. Fra den litteratur, jeg læste, er dette et temmelig originalt koncept, og med mere udvikling kan bestemt anvendes i en række applikationer til amatørastronomi eller mere.

Dette projekt var en stejl indlæringskurve for mig, og derfor håber jeg, at nogle læsere med mere programmeringserfaring kan blive inspireret til at bidrage til projektets fortsættelse via GitHub-siden, og vi kan fortsætte med at udvikle dette open source-værktøj. Jeg glæder mig til at læse de kommentarer, du måtte have, men stil ikke for mange vanskelige spørgsmål!

Space Challenge
Space Challenge
Space Challenge
Space Challenge

Runner Up i Space Challenge

Anbefalede: