INHOUDSOPGAWE:

Sterrekenning met behulp van Computer Vision (OpenCV): 11 stappe (met prente)
Sterrekenning met behulp van Computer Vision (OpenCV): 11 stappe (met prente)

Video: Sterrekenning met behulp van Computer Vision (OpenCV): 11 stappe (met prente)

Video: Sterrekenning met behulp van Computer Vision (OpenCV): 11 stappe (met prente)
Video: Leap Motion SDK 2024, November
Anonim
Sterrekenning met behulp van Computer Vision (OpenCV)
Sterrekenning met behulp van Computer Vision (OpenCV)

Hierdie instruksies sal u beskryf hoe u 'n rekenaarvisieprogram kan skep om outomaties sterpatrone in 'n beeld te identifiseer. Die metode gebruik die OpenCV (Open-Source Computer Vision) biblioteek om 'n stel opgeleide HAAR-watervalle te skep wat gebruik kan word om spesifieke sterpatrone te herken. Alhoewel hierdie gids in die konteks van sterpatroonherkenning is, kan die OpenCV -proses wat ek beskryf, ook op ander toepassings toegepas word - so dit sal hopelik nuttig wees!

Die projek word in hierdie video saamgevat:

Waarom het ek dit opdrag gegee?

  1. Die sterpatroon -identifiseringsmetode wat ek ontwikkel, meen ek, het die potensiaal om toegepas te word op 'n wye reeks amateur -sterrekunde -projekte - of dit nou teleskooporiëntasie, outomatiese beeldklassifikasie of selfs uiteindelik 'n stersensor is op 'n open source of amateur CubeSat.
  2. Daar is baie goeie OpenCV -instruksies hier, maar ek het dit aanvanklik baie moeilik gevind om te leer, so ek hoop dat hierdie gids 'n goeie verwysing sal wees vir ander mense wat HAAR -klassifiseerders vir OpenCV wil oplei (nie noodwendig met sterrekunde miskien!).
  3. Ek is self nie 'n opgeleide programmeerder nie, so hierdie projek het my begrip baie gedruk. Hopelik, deur hierdie Instructable ander, meer ervare makers te skryf, sal hulle geïnspireer word om aan hierdie konsep te werk en 'n bydrae te lewer tot die GitHub en hierdie instruksies via kommentaar op hierdie bladsy.
  4. Amateur-sterrekunde en oriëntasiemetodes is 'n groot belangstelling van my, sien my vorige instruksies met 'n Arduino Star-Finder vir teleskope.

Die voorbladfoto van hierdie Instructable is van 'n konsep 3U CubeSat -ontwerp waaraan ek deelgeneem het. Ek het dit gebruik om hierdie instruksies te illustreer, aangesien die oorspronklike toepassing van die rekenaarvisie-sterherkenningstelsel bedoel was vir 'n oriënteringsensor vir amateurgemaakte CubeSats, met 'n Raspberry Pi V2-kamera. Ek glo daar is baie ander moontlike toepassings van rekenaarherkenning, maar ek dink dit is die coolste!

'N Klein woordelys:

Om te leer oor rekenaarvisie word stadiger deur die dom hoeveelheid spesialisterme wat gebruik word, so ek sal 'n paar hier vir ons definieer:

Cascade - 'n Klassifiseerder wat opgelei is om 'n spesifieke doelvoorwerp te identifiseer.

Vertroulike merker - 'n merker wat 'n visuele punt na 'n beeld voeg.

HAAR - Haar -agtige kenmerke is 'n tipe beeldfunksie wat gebruik word vir klassifikasie -opleiding.

OpenCV - Open Source Computer Vision, 'n biblioteek met rekenaarvisie -instrumente.

Stellarium - Open Source astronomie sagteware.

Stap 1: Vereistes

OpenCV is 'n Linux -gebaseerde biblioteek, maar alhoewel dit vermoedelik moontlik is om dit goed op Windows te bedryf, sal u dit baie makliker hê om dit in 'n Linux -omgewing uit te voer (neem dit van my af en probeer baie dae om dit volledig te laat werk) Windows!). As 'n eksperiment het ek OpenCV afgelaai en uitgevoer op my Raspberry Pi 3B+, wat suksesvol was, hoewel klassifikasie -opleiding 'n baie RAM -intensiewe proses is, dus as u dit teen enige spoed wil doen, is die aanbevole roete om 'n Linux Virtual Server te huur (wat eintlik verbasend goedkoop kan wees) vir 'n paar dae/weke/maande, en gebruik dit as 'n toegewyde omgewing waarin u die klassifikasie -opleiding kan uitvoer. U kan die bediener vanaf 'n Windows -rekenaar beheer met behulp van 'n SSH -kliënt, soos Putty. Sodra die kaskades opgelei is met behulp van die VPS, kan dit na u Windows -rekenaar afgelaai word, en Python kan gebruik word om die beeldherkenningsprogram in 'n Windows -omgewing uit te voer.

Linux virtuele bediener:

'N Linux virtuele bediener (VPS) is nodig om die HAAR cascade -opleidingsprosesse uit te voer. Aanvanklik het ek 'n bediener gehuur met 8 GB RAM en Ubuntu 16.04.6 (LTS) x64, en later 'n tweede om die tempo waarmee ek kaskades kon oplei te verdubbel, alhoewel u slegs 'n minimum van een benodig

Sagteware:

  • Stellarium - dit is virtuele planetarium/sterrekunde sagteware, gratis beskikbaar. Dit sal gebruik word om gesimuleerde sterbeelde te versamel vir gebruik in toetsing.
  • Putty - Dit is 'n SSH -kliënt wat gebruik word om die VPS via opdragreël te beheer.
  • WinSCP - dit word gebruik om lêeroordrag vanaf die Windows -rekenaar uit te voer.

Stap 2: VPS -opstelling

Daar is 'n klein opstelproses om die VPS aan die gang te kry. Die eerste keer kan dit 'n rukkie neem, maar dit is nie te moeilik as u die stappe noukeurig volg nie. Hierdie handleiding was vir my 'n goeie verwysing. Ek sou aanbeveel dat u dit ook lees terwyl u hierdie instruksies deurwerk. Dit dek die besonderhede van die Linux -opdragte reël vir reël, wat u tot op die letter moet volg.

Die proses behels ongeveer:

  1. Die skep van 'n Linux -bediener met die korrekte Ubuntu -weergawe.
  2. Opgradering en opdatering van die bediener.
  3. Die skep van 'n werkruimtegids waarin OpenCV geïnstalleer is.
  4. Die installering van 'n paar noodsaaklikhede, naamlik 'n samesteller, verskillende biblioteke en Python -bindings.

Na hierdie fase is u gereed om voor te berei op die opleidingsproses.

Stap 3: Die proses

Die hele proses van rekenaarvisie met behulp van HAAR -watervalle is aanvanklik nogal verwarrend, daarom beskryf hierdie stap die logika in 'n bietjie meer detail:

Basiese proses

  1. 'N Negatiewe beelddatastel bestaan, wat bestaan uit 'n paar duisend beelde wat nie die voorwerp van belang bevat nie. Dit moet na die VPS gelaai word.
  2. 'N Enkele positiewe beeld word geskep wat die voorwerp van belang bevat. Dit moet ook na die VPS gelaai word.
  3. Die enkele positiewe beeld word verdraai, verdraai, geroteer, ensovoorts, deur 'n stel gekose parameters en word bedek op 'n seleksie van die negatiewe beelde. Dit is 'n kunsmatige manier om 'n groot positiewe dataset uit 'n enkele beeld te skep. (Vir ander werklike toepassings, soos die identifisering van 'n kat, kan u eenvoudig 'n paar duisend kattebeelde gebruik, maar hierdie metode is nie altyd geskik as u nie so 'n groot aantal positiewe beelde het nie. Die kunsmatige benadering wat hier gebruik word sal minder effektief wees, maar dit is die enigste opsie vir 'n gebruiksgeval soos hierdie).
  4. 'N Opleidingsproses word uitgevoer wat in fases werk. Elke fase sal 'n waterval oplei om verskillende funksies van die HAAR-tipe binne die beelde te identifiseer. Elke fase neem eksponensieel langer om te voltooi, en die effektiwiteit van die klassifiseerder neem elke keer toe (dit is ook moontlik om te veel te oefen, net sodat u weet!).
  5. 'N Enkele opgeleide kaskade sal na 'n enkele doelvoorwerp kan soek. As u verskeie unieke voorwerpe wil identifiseer, benodig u 'n opgeleide kaskade vir elk. In hierdie geval het ek ongeveer 50 verskillende kaskades opgelei vir unieke sterpatrone om 'n stel te skep wat die noordelike hemisfeer kan dek.
  6. Laastens word 'n opsporingsprogram gebruik wat elke kaskade van 'n stel teen 'n invoerbeeld laat loop. Die kaskade sal na die gegewe doelvoorwerp in die invoerbeeld soek.
  7. As dit suksesvol is, word die doelobjek binne die invoerbeeld geïdentifiseer.

n.b. as dit byvoorbeeld in 'n satelliet -oriëntasie konteks gebruik word, sou 'n beeld met 'n ingeboude kamera geneem word. Die helderste sterre in die prentjie sal geïdentifiseer word, en merkers wat op daardie posisies geplaas is. Hierdie beeld word dan voorgestel aan die stel opgeleide kaskades, wat sal toets of die invoerbeeld een van die doelvoorwerpe bevat. As 'n ware positief opgespoor word, word die hoekposisie van 'n bekende sterrebeeld ontdek relatief tot die asse van die satellietliggaam.

Stap 4: Negatiewe en positiewe aspekte

Negatiewe

'N Belangrike aspek van kaskade -opleiding is om so 'n groot hoeveelheid negatiewe beelde as moontlik te hê. Ons praat oor duisende, verkieslik tienduisende beelde. Dit maak nie saak wat dit bevat nie, die doel is net om verskillende visuele inligting te verskaf. Die gids Classifier Training bevat 'n verskeidenheid verskillende datastelle met negatiewe beeld wat ek saamgestel het. Aanvanklik bestaan dit slegs uit gesimuleerde sterrebeeldbeelde wat uit Stellarium verkry is, maar ek het die datastel later aangevul met soveel gerandomiseerde beelde as wat ek kon vind (ja, insluitend my vakansiefoto's …). Die grootste datastel daar bevat byna 9000 beelde, wat die grootste was wat ek tot dusver geskep het. Deur dit te gebruik, bespaar u u eie opstel.

Positiewe

Die positiewe beeld (dit is die teikensterpatroon wat die kaskade opgelei word om te herken) begin as 'n skermkiekie van 'n sterpatroon in Stellarium. 'N Python -program identifiseer dan die helderste sterre in die beeld en plaas merkers (wat later in hierdie instruksie verduidelik word) op hierdie sterposisies. Hierdie beeld word dan verklein tot 50x50 pixels. Dit is klein, maar die opleidingstyd wat vir die watervalle benodig word, sal eksponensieel toeneem namate hierdie grootte toeneem, en dit is dus 'n goeie kompromie tussen kwaliteit en tyd.

Stap 5: Stellariumbeheer

Stellariumbeheer
Stellariumbeheer
Stellariumbeheer
Stellariumbeheer

Die gids Stellarium Scripts van die GitHub -bewaarplek bevat drie programme wat ek geskryf het om die gebruik van Stellarium te beheer. Om dit te gebruik, plaas dit in die script -gids van u Stellarium -installeringsmap. Om dit uit te voer, kan u die script -venster vanuit die Stellarium -menu oopmaak, of net deur op die program in die scripts -map te dubbelklik, wat Stellarium begin en onmiddellik die geselekteerde program laat loop.

proefskrif_4 en proefskrif_5 neem ongeveer 2000 beelde elk van die noordelike en suidelike, onderskeidelik, hemelse sfere. Dit is gebruik om databasisse van negatiewe beelde te vorm om die positiewe beeld op te lei. Die onderskeid tussen noord en suid was 'n eenvoudige manier om te verseker dat die teiken (positiewe) sterpatroon nie in die negatiewe datastel voorkom nie, deur die sterpatrone van die noordelike halfrond op te lei teen die beelddatastel van die suidelike hemisfeer en omgekeerd. (As 'n positiewe beeld ook in die negatiewe beelddatastel voorkom, sal dit die kwaliteit van die klassifiseerder beïnvloed).

thesis_setup is ook nuttig - dit stel Stellarium in om geskik te wees vir die neem van beelde - die beelde wat gebruik word om 'n uitsig uit die ruimte te simuleer. Dit doen outomaties aksies, soos om spyskaarte, roosterlyne, etikette, ens weg te steek, sodat u nie elke keer as u 'n prentjie wil neem nie, spaar.

Stap 6: Rocket Man

Vuurpyl man
Vuurpyl man

Die eerste watervalle wat ek opgelei het, kon geen sterpatrone korrek identifiseer nie. Hulle was baie onbetroubaar en was baie geneig tot vals positiewe. My aanname was dat die sterrebeeldbeelde van Stellarium (basies net wit kolletjies op 'n swart agtergrond) effektief nie genoeg visuele inligting bevat om genoeg HAAR-tipe funksies te bevat vir suksesvolle klassifikasie-opleiding nie. Ek dink dit was laat in die nag, maar ek het besluit om 'n program te skryf om outomaties 'n klein miniatuurbeeld oor die ligging van elke helder ster in 'n sterveldbeeld te plaas.

Elton

Dit was 'n dom toets, maar deur 'n klein prentjie van Elton John se gesig by elke helder sterlokasie te voeg, die klassifiseerder op te lei teen hierdie positiewe beeld en dan die kaskades teen die oorspronklike beeld te laat loop, was dit baie meer effektief om die regte patroon. Ek het geweet ek is besig met iets!

Stap 7: Vertroulike merkers

Vertroulike merkers
Vertroulike merkers

Alhoewel die 'Eltons' die teorie bewys het, het ek 'n merker nodig wat volle rotasiesimmetrie gehad het, sodat die sterpatroon dieselfde sou lyk, ongeag in watter rigting dit aangebied word. Ek het 'n verskeidenheid soorte merker getoets en gevind dat die tipe regs onder die doeltreffendste was, met die kontrasterende swart en wit ringe. Die luislangprogram wat in die positiewe gids van die GitHub -repo aangebied word, toon hoe die helderste sterre in 'n gegewe beeld geïdentifiseer word, en hierdie merkers word outomaties in daardie posisies oorgetrek. Ons het nou 'n voorstelling gemaak van die sleutelsterpatrone waarteen u kan oefen.

Stap 8: Gebruik die Cascades

Die gebruik van die Cascades
Die gebruik van die Cascades

As u 'n stel kaskades opgelei het, moet u weet hoe u dit kan gebruik om 'n voorwerp in 'n beeld te identifiseer!

Kyk na die Star Identification -lêergids van die GitHub, waar u die cascade_test19.py -program vind. Hierdie program met 'n noemenswaardige naam haal 'n stel watervalle uit 'n gegewe vouer en voer dit almal teen 'n invoerbeeld uit en rapporteer oor die opsporings wat gemaak is. Die 'detectMultiScale' -funksie is die kern hiervan, en dit verg 'n verskeidenheid argumente wat die opsporingsproses definieer. Om dit te verander is van kritieke belang vir die prestasie van die kaskade -klassifiseerder, en meer bespreking hieroor kan gevind word in die volgende stap, waar ons kyk na hoe om vals positiewe uit te skakel.

Dit kan toegepas word in 'n satelliet -oriëntasiestelsel deur die pixelwaarde in die middel van die omskakelingskassie te korreleer met die Ra/Dec hemelse koördinaat van die geïdentifiseerde sterpatroon, en dit dan te korreleer met die hoekverskuiwing vanaf die middel van die beeld (kamera as). Hieruit kan die hoek van die satelliet uit slegs twee positiewe identifikasies gevind word deur die lensvervorming (by benadering tot 'n gnoniese projeksie) te verstaan.

Stap 9: Hoe om positief te bly oor vals positiewe

Hoe om positief te bly oor vals positiewe
Hoe om positief te bly oor vals positiewe
Hoe om positief te bly oor vals positiewe
Hoe om positief te bly oor vals positiewe

Hierdie twee beelde toon die resultate van die toets van die kaskade teen 'n identiese beeld, maar met verskillende parameters. Dit is duidelik dat die eerste beeld die ware identifikasie bevat, maar ook 'n enorme aantal vals positiewe, terwyl die tweede beeld slegs die korrekte identifikasie bevat.

Die cascade_test19.py -program in die Star Identification -lêergids van die GitHub -repo gebruik twee metodes om die resultate te sorteer. Eerstens stel die detectMultiScale -funksie 'n Miminum- en Maksimum grootte van die resultaat op, wat verstandig is, aangesien die benaderde grootte van die teikensterpatroon binne die venster (vir die gegewe lens en vergroting - my gesimuleerde Stellarium -beelde gebruik die eienskappe van die Raspberry Pi V2 -kamera) bekend is. Tweedens kies die kode die resultaat met die grootste omskakeling (binne die vorige perke). In die toets is dit gevind dat dit die ware positiewe is. Derdens stel die program 'n minimum 'levelWeights' (effektief 'vertrouenswaarde') wat nodig is om hierdie ID as 'n ware positiewe te beskou. Deur hierdie metode was die watervalle effektief om die korrekte resultaat te vind.

Behalwe die sterrebeeld -beelde, het ek dit ook getoets aan die hand van foto's van my lessenaar, byvoorbeeld die opleiding van kaskades om my notaboek, beker, ens te identifiseer, om te oefen om vals positiewe uit te skakel. Bogenoemde metodes het in alle omstandighede goed gewerk, wat bemoedigend was.

Stap 10: Bespreking

Bespreking
Bespreking
Bespreking
Bespreking
Bespreking
Bespreking

Gebiede vir verbetering

Dit was 'n ingewikkelde projek vir my, en het my begrip van die onderwerp regtig aangemoedig. Dit het 'n totaal van 'n paar maande byna voltydse werk behels om die projek tot so 'n punt te bring dat ek dit met u kan deel, maar daar is nog baie meer werk om die prestasie van die metode te verbeter. Soos dit tans is, kan dit goed funksioneer binne sekere beperkings. Ek het gewerk om vas te stel watter gebiede ekstra werk benodig, en ek sal hopelik tyd kan bestee om dit in die komende maande aan te spreek. Hulle is:

Hoek - Dit is 'n ingewikkelde gebied, die idee dat die resultate van die klassifiseerders rotasioneel onveranderlik moet wees, dit wil sê, dit moet die doelsterpatroon betroubaar identifiseer, ongeag die hoek waarteen dit die beeld bevat wat die teikensterpatroon bevat. 'N Kaskade wat opgelei is met behulp van 'n invoerbeeld in 'n enkele oriëntasie, sal die beeld nie in ewekansige oriëntasies kan identifiseer nie, dus moet die afwyking van die positiewe beeldhoek in die opleidingsproses ingebring word om kaskades op te lei wat 'n reeks op invoerhoeke kan aanvaar. Die parameter 'maxzangle' in die cascade -opleidingsopdragte neem 'n argument in radiale, wat 'n beperking van die hoek bepaal waarop die positiewe invoerbeeld oor die negatiewe beelde sal wees, sodat die gevolglike positiewe beeldstel 'n reeks oriëntasies sal bevat die positiewe beeld. Namate hierdie maxzangle toeneem, sal die aanvaardingsverhouding (in die breë gesproke, kwaliteit) van die kaskade egter skerp verminder. Ek glo die oplossing is om kaskades op te lei deur 'n aansienlik groter databasis van negatiewe beelde te gebruik as wat ek gebruik het om te verseker dat 'n kaskade -klassifiseerder van goeie gehalte geskep kan word, selfs met 'n groot oriëntasieverspreiding.

'N Ander moontlike oplossing sou wees om 'n aantal kaskades op te lei vir 'n spesifieke teiken, elke kaskade wat 'n sekere gedeelte van 'n volledige 360 grade -rotasie beheer. Op hierdie manier kan die kwaliteit van elke kaskade op 'n hoë vlak gehandhaaf word, maar aan die ander kant sal dit baie meer kaskades tot gevolg hê, en dus sal die identifikasieproses stadiger wees.

Die parameter 'levelWeight', 'n waarde wat deur die 'detectMultiScale' -funksie verskaf word, is analoog aan 'n vertrouenswaarde in die opsporing wat gemaak is. Bogenoemde grafiek is gemaak, wat toon hoe die vertroue van positiewe identifikasie skerp afneem namate die oriëntasie van die beeld in beide rigtings toeneem, wat die gedagtes bevestig dat dit 'n swak punt is.

Pixelplasing - 'n Baie eenvoudiger, maar ook problematiese punt, is die pixelplasing, geïllustreer deur die volgende twee beelde, wat 'n vergrote beeld van 'n sterbeeld toon, sodat die individuele pixels van twee sterre duidelik gesien kan word. Die erosieproses wat in die program gebruik word om alles behalwe die helderste sterre uit die beeld te skrop, sal die eerste ster behou en die tweede weggooi, alhoewel hulle ewe helder is. Die rede hiervoor is dat die eerste ster op 'n pixel gesentreer is, terwyl die tweede ster nie so is nie. Die erosiefunksie strook konsentriese ringe van pixels rondom die sentrale pixel van 'n groep, en dus sal die eerste ster die sentrale pixel die erosiefunksie laat oorleef, maar die tweede ster sal heeltemal uit die beeld verwyder word. Daarom sal vertroulike merkers slegs op die eerste ster geplaas word, en nie op die tweede ster nie. Dit sal teenstrydighede veroorsaak oor watter helder sterre in 'n gegewe sterveld merkers sal ontvang (en dus vergelyk kan word met die opgeleide klassifiseerders) - daarom is dit moontlik dat 'n korrekte positiewe waarneming nie moontlik is nie.

Stap 11: Laaste woord

Laaste Woord
Laaste Woord

Dankie dat u my instruksies gelees het; ek hoop dat u hierdie projek interessant gevind het. Dit was 'n baie interessante proses om daaraan te werk, dit is meer as 'n jaar sedert ek aan die konsep begin werk het, en ek is tot dusver aangemoedig deur die resultate. Uit die literatuur wat ek gelees het, is dit 'n redelik oorspronklike konsep, en met meer ontwikkeling kan dit beslis toegepas word in 'n verskeidenheid toepassings vir amateur -sterrekunde of meer.

Hierdie projek was vir my 'n skerp leerkurwe, en ek hoop dat sommige lesers met meer programmeringservaring geïnspireer kan word om by te dra tot die voortsetting van die projek via die GitHub-bladsy, en ons kan voortgaan om hierdie open source-instrument te ontwikkel. Ek sien uit daarna om u kommentaar te lees, maar moenie te veel moeilike vrae vra nie!

Ruimte -uitdaging
Ruimte -uitdaging
Ruimte -uitdaging
Ruimte -uitdaging

Naaswenner in die ruimte -uitdaging

Aanbeveel: