Innholdsfortegnelse:
- Trinn 1: Krav
- Trinn 2: VPS -oppsett
- Trinn 3: Prosessen
- Trinn 4: Negativer og positive
- Trinn 5: Stellarium Control
- Trinn 6: Rocket Man
- Trinn 7: Fiducial markører
- Trinn 8: Bruke Cascades
- Trinn 9: Hvordan holde seg positiv til falske positiver
- Trinn 10: Diskusjon
- Trinn 11: Siste ord
Video: Star Recognition Using Computer Vision (OpenCV): 11 trinn (med bilder)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:21
Denne instruksen vil beskrive deg hvordan du lager et dataviseprogram for automatisk å identifisere stjernemønstre i et bilde. Metoden bruker OpenCV (Open-Source Computer Vision) -biblioteket til å lage et sett med trente HAAR-kaskader som kan brukes til å gjenkjenne bestemte stjernemønstre. Selv om denne guiden er i sammenheng med gjenkjenning av stjernemønstre, kan OpenCV -prosessen jeg beskriver også brukes på andre applikasjoner - så den vil forhåpentligvis være nyttig!
Prosjektet er oppsummert i denne videoen:
Hvorfor skrev jeg dette instruerbart?
- Stjernemønsteridentifikasjonsmetoden jeg utvikler tror jeg har potensial til å bli brukt på et bredt spekter av amatørastronomiprosjekter - enten det er teleskoporientering, automatisk bildeklassifisering eller til og med en stjernesensor på en åpen kildekode eller amatør CubeSat.
- Det er mange gode OpenCV -instruktører her, men likevel syntes jeg det var en veldig vanskelig prosess å lære i utgangspunktet, så jeg håper at denne guiden vil være en god referanse for andre mennesker som ønsker å trene HAAR -klassifisere for OpenCV (ikke nødvendigvis å gjøre med astronomi kanskje!).
- Jeg er ikke utdannet programmerer selv, så dette prosjektet presset virkelig min forståelse. Forhåpentligvis vil andre, mer erfarne, skapere bli inspirert til å jobbe med dette konseptet og bidra til GitHub og dette instruerbart via kommentarer på denne siden.
- Amatørastronomi og orienteringsmetoder er en stor interesse av meg, se min forrige instruksjonsfilm med en Arduino Star-Finder for teleskoper.
Forsidebildet til denne Instructable er av et konsept 3U CubeSat -design som jeg deltok i designet av. Jeg brukte det for å illustrere dette instruerbart da den opprinnelige applikasjonen av datasynet stjernegjenkjenningssystem skulle være for en orienteringssensor for amatørproduserte CubeSats, ved bruk av et Raspberry Pi V2-kamera. Jeg tror det er mange andre potensielle applikasjoner for datavisstjernegjenkjenning, men jeg synes dette er det kuleste!
En liten ordliste:
Læring om datasyn blir tregere av den dumme mengden spesialtermer som brukes, så jeg skal definere noen for oss her:
Cascade - En klassifikator som er opplært i å identifisere et bestemt målobjekt.
Fiducial Marker - En markør som legger til et visuelt referansepunkt til et bilde.
HAAR - Haar -lignende funksjoner er en type bildefunksjon som brukes til klassifiseringstrening.
OpenCV - Open Source Computer Vision, et bibliotek med verktøy for datasyn.
Stellarium - Astronomi -programvare med åpen kildekode.
Trinn 1: Krav
OpenCV er et Linux -basert bibliotek, så selv om det visstnok er mulig å bruke det godt på Windows, vil du ha det mye lettere å kjøre det i et Linux -miljø (ta dette fra meg og mange dager prøver å få det til å fungere fullt ut Windows!). Som et eksperiment lastet jeg ned og kjørte OpenCV på min Raspberry Pi 3B+, noe som var vellykket, selv om klassifiseringstrening er en veldig RAM -intens prosess, så hvis du ønsker å gjøre det i hvilken som helst hastighet, er den anbefalte ruten å ansette en Linux Virtual Server (som faktisk kan være overraskende billig) i noen dager/uker/måneder, og bruk det som et dedikert miljø for å kjøre klassifiseringstreningen. Du vil kunne kontrollere serveren fra en Windows -PC ved hjelp av en SSH -klient som Putty. Når kaskadene er trent ved hjelp av VPS, kan de lastes ned til Windows -PC -en, og Python kan brukes til å kjøre bildegjenkjenningsprogrammet i et Windows -miljø.
Linux Virtual Server:
En Linux Virtual Server (VPS) er nødvendig for å utføre HAAR -kaskadeopplæringsprosessene. Opprinnelig leide jeg en server med 8 GB RAM og Ubuntu 16.04.6 (LTS) x64, og senere en annen for å doble hastigheten jeg kunne trene kaskader med, selv om du bare trenger minst en
Programvare:
- Stellarium - dette er virtuell planetarium/astronomi -programvare, fritt tilgjengelig. Den vil bli brukt til å samle simulerte stjernebilder for bruk i testing.
- Putty - Dette er en SSH -klient som brukes til å kontrollere VPS via kommandolinje.
- WinSCP - dette brukes til å utføre filoverføring fra Windows -PCen.
Trinn 2: VPS -oppsett
Det er en liten oppsettprosess for å få VPS i gang. Den første gangen kan det ta litt tid for deg, men det er ikke så vanskelig hvis du følger trinnene nøye. Denne opplæringen var en flott referanse for meg, jeg vil anbefale deg å lese dette også mens du arbeider gjennom dette instruerbare. Den dekker detaljene for linux -kommandoene linje for linje, som er nødvendig for å følge til punkt og prikke.
I grove trekk involverer prosessen:
- Opprettelse av Linux -server med riktig Ubuntu -versjon.
- Oppgradering og oppdatering av serveren.
- Opprettelse av en arbeidsområdekatalog som OpenCV er installert i.
- Installasjon av noen vesentlige ting, nemlig en kompilator, forskjellige biblioteker og Python -bindinger.
Etter dette stadiet er du klar til å begynne å forberede deg på treningsprosessen.
Trinn 3: Prosessen
Hele prosessen med datasyn ved hjelp av HAAR -kaskader er ganske forvirrende i begynnelsen, så dette trinnet beskriver logikken litt mer detaljert:
Grunnleggende prosess
- Det finnes et negativt bildedatasett som består av flere tusen bilder som ikke inneholder objektet av interesse. Dette må lastes opp til VPS.
- Det opprettes et enkelt positivt bilde som inneholder objektet av interesse. Dette må også lastes opp til VPS.
- Det eneste positive bildet blir forvrengt, vridd, rotert, etc., av et sett med valgte parametere og lagt på et utvalg av de negative bildene. Dette er en kunstig måte å lage et stort positivt datasett ut av et enkelt bilde. (For andre virkelige applikasjoner, for eksempel å identifisere en katt, kan du ganske enkelt bruke flere tusen bilder av katter, men denne metoden er ikke alltid passende hvis du ikke har et så stort sett med positive bilder. Den kunstige tilnærmingen som brukes her vil være mindre effektiv, men det er det eneste alternativet for et brukstilfelle som dette).
- En treningsprosess kjøres som fungerer i etapper. Hvert trinn vil trene en kaskade for å identifisere forskjellige funksjoner av HAAR-typen i bildesettene. Hvert trinn tar eksponensielt lengre tid å fullføre, og effektiviteten til klassifisereren øker for hver gang (det er også mulig å over-trene bare så du vet!).
- En enkelt trent kaskade vil kunne lete etter et enkelt målobjekt. Hvis du ønsker å identifisere flere unike objekter, trenger du en opplært kaskade for hver. I dette tilfellet trente jeg rundt 50 forskjellige kaskader for unike stjernemønstre, for å lage et sett som kunne dekke den nordlige himmelen.
- Til slutt brukes et deteksjonsprogram som kjører hver kaskade av et sett mot et inngangsbilde. Kaskaden vil lete etter det gitte målobjektet i inngangsbildet.
- Hvis det lykkes, blir målobjektet identifisert i inndatabildet.
n.b. hvis det for eksempel brukes i en satellittorienteringskontekst, vil et bilde bli tatt med et innebygd kamera. De lyseste stjernene i bildet vil bli identifisert, og markører overlappet i disse posisjonene. Dette bildet blir deretter presentert for settet med trente kaskader, som vil teste for å se om inngangsbildet inneholder noen av målobjektene. Hvis en sann positiv blir oppdaget, blir vinkelposisjonen til en kjent stjernebilde oppdaget i forhold til aksene til satellittlegemet.
Trinn 4: Negativer og positive
Negativer
Et virkelig viktig aspekt ved kaskadeopplæring er å ha et så stort datasett med negative bilder som mulig. Vi snakker tusenvis, helst titusenvis av bilder. Det spiller ingen rolle hva de inneholder, målet er bare å gi variasjon av visuell informasjon. Classifier Training -mappen inneholder en rekke forskjellige negative bildedatasett som jeg har samlet. Opprinnelig besto disse utelukkende av simulerte stjernefeltbilder hentet fra Stellarium, men jeg forsterket senere datasettet med så mange randomiserte bilder jeg kunne finne (ja, inkludert mine feriebilder …). Det største datasettet der inneholder nesten 9000 bilder, som var det største jeg har laget så langt. Ved å bruke dette sparer du deg for å lage din egen.
Positivt
Det positive bildet (det er målstjernemønsteret som kaskaden skal trenes til å gjenkjenne) begynner som et skjermbilde av et stjernemønster i Stellarium. Et pythonprogram identifiserer deretter de lyseste stjernene i bildet, og legger over markører (forklart senere i denne instruksjonsboken) på disse stjerneposisjonene. Dette bildet blir deretter krympet til 50x50 piksler. Dette er lite, men treningstiden som kreves for kaskadene vil øke eksponentielt etter hvert som denne størrelsen øker, og dette er derfor et godt kompromiss mellom kvalitet og tid.
Trinn 5: Stellarium Control
Stellarium Scripts -mappen i GitHub -depotet inneholder tre programmer jeg skrev for å kontrollere bruken av Stellarium. For å bruke dem, plasser dem i skriptmappen i installasjonsmappen din for Stellarium. For å kjøre dem kan du åpne skriptvinduet fra Stellarium -menyen, eller bare ved å dobbeltklikke på programmet i skriptmappen, som starter Stellarium og kjører det valgte programmet umiddelbart.
thesis_4 og thesis_5 fanger omtrent 2000 bilder hver av de henholdsvis nordlige og sørlige himmelhvelene. Disse ble brukt til å danne databaser med negative bilder, for å trene det positive bildet mot. Skillet mellom nord og sør var en enkel måte å sikre at målet (positivt) stjernemønster ikke ville være tilstede i det negative datasettet ved å trene stjernemønstre på den nordlige halvkule mot bildet på den sørlige himmelen og omvendt. (Hvis et positivt bilde også er tilstede i det negative bildedatasettet, vil det påvirke kvaliteten på klassifisereren).
thesis_setup er også nyttig - dette setter opp Stellarium for å være passende for å ta bilder - bildene som brukes til å simulere en visning fra verdensrommet. Det gjør handlinger som å skjule menyer, rutenett, etiketter osv. Automatisk for å spare deg for hver gang du vil ta et bilde.
Trinn 6: Rocket Man
De første kaskadene jeg trente, klarte ikke å identifisere stjernemønstre riktig. De var veldig upålitelige og var veldig utsatt for falske positive. Min antagelse var at stjernefeltbildene fra Stellarium (i utgangspunktet bare hvite prikker på svart bakgrunn) ganske enkelt ikke inneholdt tilstrekkelig visuell informasjon til å inneholde nok HAAR-funksjoner for vellykket klassifiseringstrening. Jeg tror det var sent på kvelden, men jeg bestemte meg for å prøve ideen om å skrive et program for automatisk å plassere et lite miniatyrbilde over plasseringen av hver lysende stjerne i et stjernefeltbilde.
Elton
Dette var en dum test, men ved å legge til et lite bilde av Elton Johns ansikt til hver lysstjernested, trene klassifisereren mot dette positive bildet, og deretter kjøre kaskadene mot det opprinnelige bildet, var det mye mye mer effektivt til riktig å finne riktig mønster. Jeg visste at jeg var på noe!
Trinn 7: Fiducial markører
Selv om 'Eltons' beviste teorien, trengte jeg en markør som hadde full rotasjonssymmetri, slik at stjernemønsteret ville se det samme ut uansett hvilken orientering det ble presentert. Jeg testet en rekke markørtyper, og fant ut at typen nederst til høyre var mest effektiv, med de kontrasterende sorte og hvite ringene. Python -programmet som presenteres i den positive mappen i GitHub -repoen viser hvordan de lyseste stjernene i et gitt bilde blir identifisert, og disse markørene overlappes automatisk i disse posisjonene. Vi har nå laget en representasjon av nøkkelstjernemønstrene som kan trenes mot.
Trinn 8: Bruke Cascades
Når du har trent et sett med kaskader, må du vite hvordan du bruker dem til å identifisere et objekt i et bilde!
Se på Star Identification -mappen i GitHub, der du finner cascade_test19.py -programmet. Dette fengende programmet tar et sett med kaskader fra en gitt mappe, og kjører dem alle mot et inndatabilde, og rapporterer om deteksjonene som er gjort. Funksjonen 'detectMultiScale' er kjernen i dette, og det krever en rekke argumenter som definerer deteksjonsprosessen. Å endre disse er avgjørende for ytelsen til kaskadeklassifiseringen, og mer diskusjon om dette kan bli funnet i det følgende trinnet, hvor vi ser på hvordan du kan eliminere falske positiver.
Dette kan brukes i et satellittorienteringssystem ved å korrelere pikselverdien i midten av avgrensningsboksen til Ra/Dec -himmelkoordinaten til det identifiserte stjernemønsteret, og deretter korrelere dette til vinkelforskyvningen fra midten av bildet (kamera akser). Fra dette, ved hjelp av en forståelse av linseforvrengningen (tilnærmet til en gnomonisk projeksjon), kan vinkelen til satellitten finnes fra bare to positive identifikasjoner.
Trinn 9: Hvordan holde seg positiv til falske positiver
Disse to bildene viser resultatene av å teste kaskadesettet mot et identisk bilde, men med forskjellige parametere. Det er klart at det første bildet inneholder den sanne identifikasjonen, men også et enormt antall falske positiver, mens det andre bildet bare inneholder den riktige identifikasjonen.
Cascade_test19.py -programmet i Star Identification -mappen i GitHub -repoen bruker to metoder for å sortere resultatene. For det første angir detectMultiScale -funksjonen en Miminum og maksimal størrelse på resultatet som kan bli funnet, som er fornuftig, som den omtrentlige størrelsen på målstjernemønsteret i vinduet (for det gitte objektivet og forstørrelsen - mine simulerte Stellarium -bilder bruker egenskapene til Raspberry Pi V2 Camera) er kjent. For det andre vil koden velge resultatet med den største avgrensningsboksen (innenfor de tidligere grensene). Ved testing ble dette funnet å være det sanne positive. For det tredje setter programmet et minimum 'levelWeights' (effektivt 'konfidensverdi') som er nødvendig for å behandle denne IDen som en sann positiv. Ved denne metoden var kaskadene effektive for å finne det riktige resultatet.
I tillegg til stjernefeltbildene, testet jeg dette også mot bilder av skrivebordet mitt, for eksempel treningskaskader for å identifisere notatblokken min, krus etc., for å øve på å eliminere falske positiver. Metodene ovenfor fungerte bra under alle omstendigheter, noe som var oppmuntrende.
Trinn 10: Diskusjon
Forbedringsområder
Dette har vært et komplekst prosjekt for meg, og virkelig presset min forståelse av temaet. Det har involvert totalt flere måneder nesten heltidsarbeid for å få prosjektet til dette punktet når jeg kan dele det med deg, men det er mye mer arbeid som må gjøres for å forbedre metodens ytelse. Slik den er, kan den fungere godt innenfor visse begrensninger. Jeg har jobbet med å identifisere hvilke områder som trenger tilleggsarbeid, og vil forhåpentligvis kunne bruke tid på å løse disse i månedene som kommer. De er:
Vinkel - Dette er et komplekst område, ideen om at resultatene av klassifisererne må være rotasjonsmessig invariante, det vil si at den skal pålitelig identifisere målstjernemønsteret uavhengig av vinkelen det viser bildet i som inneholder målstjernemønsteret. En kaskade som er opplært ved å bruke et inngangsbilde i en enkelt orientering, vil ikke kunne identifisere det bildet i randomiserte retninger, så variasjon av den positive bildevinkelen må innføres i treningsprosessen for å trene kaskader som kan godta et område på inndatavinkler. Parameteren 'maxzangle' i kaskadeopplæringskommandoene tar et argument i radianer, som styrer en grense for vinkelen som det inngående positive bildet vil bli overlagt på de negative bildene som tilbys, så det resulterende positive bildesettet vil inneholde en rekke retninger av det positive bildet. Etter hvert som dette makszangelet øker, vil akseptforholdet (i grove trekk, kvalitet) på kaskaden redusere kraftig. Jeg tror løsningen er å trene kaskader ved å bruke en betydelig større database med negative bilder enn det jeg brukte for å sikre at en kaskadeklassifiser av god kvalitet kan opprettes, selv om den inneholder en stor orienteringsspredning.
En annen potensiell løsning ville være å trene et antall kaskader for et bestemt mål, hver kaskade som styrer en viss del av en full 360 graders rotasjon. På den måten kan kvaliteten på hver kaskade opprettholdes på et høyt nivå, men på den annen side vil dette resultere i langt flere kaskader, og dermed blir identifikasjonsprosessen tregere.
Parameteren 'levelWeight', som er en verdi fra funksjonen 'detectMultiScale', er analog med en konfidensverdi i detekteringen som er gjort. Ved å studere dette ble grafen ovenfor opprettet, som viser hvordan tilliten til positiv identifikasjon synker kraftig når orienteringen til bildet øker i begge retninger, og bekrefter tankene om at dette er et svakt punkt.
Pixel Placement - Et mye enklere, men også problematisk poeng er pixelplassering, illustrert med de følgende to bildene, som viser en forstørret visning av et stjernebilde, slik at de enkelte pikslene til to stjerner kan sees tydelig. Erosjonsprosessen som ble brukt i programmet for å skrubbe alle bortsett fra de lyseste stjernene fra bildet vil beholde den første stjernen og kaste den andre, til tross for at de har samme lysstyrke. Grunnen til dette er at den første stjernen er sentrert på en piksel, mens den andre ikke er som sådan. Erosjonsfunksjonen fjerner konsentriske ringer av piksler fra rundt den sentrale pikslen i en gruppe, og derfor vil den første stjernen få den sentrale pikslen til å overleve erosjonsfunksjonen, men den andre stjernen vil bli fullstendig fjernet fra bildet. Derfor vil fiducial markører bare plasseres på den første stjernen, og ikke den andre. Dette vil forårsake inkonsekvenser knyttet til hvilke lyse stjerner i et gitt stjernefelt vil motta markører (og dermed bli sammenlignet med de trente klassifisererne) - derfor er det mulig at en korrekt positiv observasjon ikke er mulig.
Trinn 11: Siste ord
Takk for at du leser min instruktive, jeg håper at du syntes dette prosjektet var spennende. Det har vært en veldig interessant prosess å jobbe med det, det er over et år siden jeg begynte å jobbe med konseptet, og jeg er oppmuntret av resultatene til dette punktet. Fra litteraturen jeg leste, er dette et ganske originalt konsept, og med mer utvikling kan det sikkert brukes i en rekke applikasjoner for amatørastronomi eller mer.
Dette prosjektet var en bratt læringskurve for meg, og derfor håper jeg at noen lesere med mer programmeringserfaring kan bli inspirert til å bidra til videreføring av prosjektet gjennom GitHub-siden, og vi kan fortsette å utvikle dette open source-verktøyet. Jeg gleder meg til å lese eventuelle kommentarer du måtte ha, men vær så snill å ikke stille for mange vanskelige spørsmål!
Runner Up i Space Challenge
Anbefalt:
Vær oppmerksom på ATLAS - STAR WARS - Death Star II: 7 trinn (med bilder)
Vær oppmerksom på ATLAS - STAR WARS - Death Star II: Bygg fra Bandai Death Star II plastmodell. Viktige funksjoner inkluderer: ✅Lys og lydeffekt✅MP3-spiller✅InfraRED fjernkontroll✅Temperatursensor✅3 minutter timerBlogg: https://kwluk717.blogspot.com 2020/12/be-aware-of-atlas-star-wars- dødsstjerne
Micro: bit MU Vision Sensor for Beginners - I2C and Shape Card Recognition: 8 Steps
Micro: bit MU Vision Sensor for Beginners - I2C og Shape Card Recognition: Jeg har fått tak i en MU vision sensor for Micro: bit. Det ser ut til å være et kult verktøy som gjør at jeg kan lage mange forskjellige visjonsbaserte prosjekter. Dessverre er det ikke så mange guider til det, og selv om dokumentasjonen virkelig er
Real Working Harry Potter Wand ved hjelp av Computer Vision: 8 trinn (med bilder)
Real Working Harry Potter Wand ved hjelp av Computer Vision: "Enhver tilstrekkelig avansert teknologi kan ikke skilles fra Magic" - Arthur C. Clarke For noen måneder siden besøkte broren min Japan og hadde virkelig trollmannsopplevelse i Harry Potter's Wizarding World i Universal Studios
Cat-a-way-Computer Vision Cat Sprinkler: 6 trinn (med bilder)
Cat -a -way - Computer Vision Cat Sprinkler: Problem - Katter som bruker hagen din som et toalett Løsning - Bruk for mye tid på å konstruere en kattesprinkler med automatisk youtube -opplastingsfunksjon Dette er ikke et trinn for trinn, men en oversikt over konstruksjon og noen kode#BeforeYouCallPETA - Kattene er
Computer Vision Controlled Rullestol Med Mannequin: 6 trinn (med bilder)
Computer Vision Controlled Wheelchair With Mannequin: Prosjekt av AJ Sapala, Fanyun Peng, Kuldeep Gohel, Ray LC. Instruerbar av AJ Sapala, Fanyun Peng, Ray LC. Vi opprettet en rullestol med hjul kontrollert av et Arduino -bord, som igjen styres av en bringebær pi som kjører openCV via prosessering