Taula de continguts:

Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV): 11 passos (amb imatges)
Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV): 11 passos (amb imatges)

Vídeo: Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV): 11 passos (amb imatges)

Vídeo: Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV): 11 passos (amb imatges)
Vídeo: La Educación Prohibida - Película Completa HD Oficial 2024, Desembre
Anonim
Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV)
Reconeixement d’estrelles mitjançant visió per ordinador (OpenCV)

Aquesta instrucció us descriurà com crear un programa de visió per ordinador per identificar automàticament els patrons d’estrelles d’una imatge. El mètode utilitza la biblioteca OpenCV (Open-Source Computer Vision) per crear un conjunt de cascades HAAR entrenades que es poden utilitzar per reconèixer patrons d’estrelles específics. Tot i que aquesta guia es troba en el context del reconeixement de patrons estel·lars, el procés OpenCV que descric també es pot aplicar a altres aplicacions, així que espero que sigui útil.

El projecte es resumeix en aquest vídeo:

Per què he escrit això instructiu?

  1. Crec que el mètode d’identificació de patrons estel·lars que estic desenvolupant pot aplicar-se a una àmplia gamma de projectes d’astronomia amateur, ja sigui orientació al telescopi, classificació automàtica d’imatges o, fins i tot, un sensor d’estrelles en un CubeSat de codi obert o amateur.
  2. Hi ha molts bons instructius d’OpenCV aquí, però tot i així em va semblar un procés molt difícil d’aprendre inicialment, així que espero que aquesta guia sigui una bona referència per a altres persones que vulguin formar classificadors HAAR per a OpenCV (no necessàriament astronomia potser!).
  3. Jo no sóc un programador format, de manera que aquest projecte em va impulsar la comprensió. Amb sort, escrivint aquest instructiu, altres creadors més experimentats s’inspiraran per treballar en aquest concepte i contribuiran al GitHub i aquest instructiu mitjançant comentaris en aquesta pàgina.
  4. L’astronomia amateur i els mètodes d’orientació són un dels meus grans interessos; vegeu la meva instrucció anterior amb un cercador d’estrelles Arduino per a telescopis.

La foto de portada d’aquest Instructable és d’un concepte de disseny 3U CubeSat que he participat en el disseny. El vaig fer servir per il·lustrar aquest fet instructiu, ja que l’aplicació original del sistema de reconeixement d’estrelles de visió per ordinador consistia en un sensor d’orientació per a CubeSats de fabricació amateur, mitjançant una càmera Raspberry Pi V2. Crec que hi ha moltes altres aplicacions potencials de reconeixement d’estrelles de visió per ordinador, però crec que és la més divertida.

Un petit glossari:

L’aprenentatge sobre la visió per ordinador es fa més lent gràcies a la quantitat estúpida de termes especialitzats que s’utilitzen, així que en definirem alguns aquí:

Cascada: classificador format per identificar un objecte específic.

Marcador fiducial: marcador que afegeix un punt de referència visual a una imatge.

HAAR: les funcions semblants a Haar són un tipus de característiques d’imatge que s’utilitzen per a l’entrenament del classificador.

OpenCV: Open Source Computer Vision, una biblioteca d’eines de visió per computador.

Stellarium: programari d'astronomia de codi obert.

Pas 1: requisits

OpenCV és una biblioteca basada en Linux, de manera que, tot i que suposadament és possible operar-lo bé al Windows, tindreu molt més fàcil executar-lo en un entorn Linux (treieu-me’l i molts dies intentant que funcioni completament a Windows!). Com a experiment, vaig descarregar i executar OpenCV al meu Raspberry Pi 3B +, que va tenir èxit, tot i que l’entrenament del classificador és un procés molt intensiu en memòria RAM, de manera que si voleu fer-ho a qualsevol velocitat, la ruta recomanada és contractar un servidor virtual de Linux. (que pot ser sorprenentment econòmic) durant uns quants dies / setmanes / mesos i utilitzeu-lo com a entorn dedicat on executar la formació del classificador. Podreu controlar el servidor des d’un PC amb Windows mitjançant un client SSH com Putty. Un cop entrenades les cascades mitjançant el VPS, es poden descarregar al vostre PC amb Windows i es pot utilitzar Python per executar el programa de reconeixement d’imatges en un entorn Windows.

Servidor virtual de Linux:

Es necessita un servidor virtual Linux (VPS) per realitzar els processos d’entrenament en cascada HAAR. Inicialment vaig contractar un servidor amb 8 GB de RAM i Ubuntu 16.04.6 (LTS) x64, i posteriorment un segon per duplicar la velocitat a la qual podia entrenar en cascada, tot i que només en necessiteu un mínim

Programari:

  • Stellarium: es tracta d’un programari virtual d’astronomia / planetari, de lliure accés. S'utilitzarà per recopilar imatges d'estrelles simulades per utilitzar-les en proves.
  • Putty: es tracta d’un client SSH que s’utilitza per controlar el VPS mitjançant la línia d’ordres.
  • WinSCP: s’utilitza per realitzar la transferència de fitxers des del PC amb Windows.

Pas 2: Configuració de VPS

Hi ha un petit procés de configuració per posar en marxa el VPS. La primera vegada pot trigar una mica, però no és massa complicat si seguiu els passos de prop. Aquest tutorial va ser una gran referència per a mi. Us recomanaria que llegiu també mentre esteu treballant amb aquesta instrucció. Cobreix les especificitats de les ordres de Linux línia per línia, que cal seguir al peu de la lletra.

Aproximadament, el procés implica:

  1. Creació de servidor Linux amb la versió d’Ubuntu correcta.
  2. Actualització i actualització del servidor.
  3. Creació d’un directori d’espai de treball en el qual s’instal·la OpenCV.
  4. Instal·lació d’alguns elements essencials, és a dir, un compilador, diverses biblioteques i enllaços Python.

Després d’aquesta etapa, ja podreu començar a preparar-vos per al procés de formació.

Pas 3: el procés

Tot el procés de visió per ordinador mitjançant cascades HAAR al principi és bastant confús, de manera que aquest pas descriu la lògica amb una mica més de detall:

Procés bàsic

  1. Existeix un conjunt de dades d'imatges negatives, format per diversos milers d'imatges que no contenen l'objecte d'interès. Això s’haurà de carregar al VPS.
  2. Es crea una única imatge positiva que conté l'objecte d'interès. Això també s’haurà de carregar al VPS.
  3. La imatge positiva única es distorsiona, es deforma, gira, etc., mitjançant un conjunt de paràmetres escollits i es sobreposa a una selecció de les imatges negatives. Aquesta és una manera artificial de crear un gran conjunt de dades positiu a partir d’una sola imatge. (Per a altres aplicacions del món real, com ara identificar un gat, podeu utilitzar simplement diversos milers d’imatges de gats, però aquest mètode no sempre és adequat si no teniu un conjunt tan gran d’imatges positives. L’enfocament artificial que s’utilitza aquí serà menys efectiu, però és l’única opció per a un cas d’ús com aquest).
  4. S’executa un procés de formació que funciona per etapes. Cada etapa entrenarà una cascada per identificar diferents característiques de tipus HAAR dins dels conjunts d'imatges. Cada etapa triga exponencialment més a completar-se i l'eficàcia del classificador augmenta cada vegada (també és possible entrenar massa perquè ho sàpiga!).
  5. Una sola cascada entrenada podrà buscar un sol objecte objectiu. Si voleu identificar diversos objectes únics, necessitareu una cascada entrenada per a cadascun. En aquest cas, he entrenat unes 50 cascades diferents per obtenir patrons d’estrelles únics, per crear un conjunt que pogués cobrir l’hemisferi celeste nord.
  6. Finalment, s’utilitza un programa de detecció que executa cada cascada d’un conjunt contra una imatge d’entrada. La cascada buscarà l'objecte objectiu donat dins de la imatge d'entrada.
  7. Si té èxit, l'objecte objectiu s'identificarà a la imatge d'entrada.

n.b. si s'utilitza en un context d'orientació per satèl·lit, per exemple, es capturaria una imatge mitjançant una càmera integrada. S'identificaran les estrelles més brillants d'aquesta imatge i es posaran marcadors en aquestes posicions. Aquesta imatge es presenta al conjunt de cascades entrenades, que provaran per veure si la imatge d'entrada conté algun dels objectes objectiu. Si es detecta un veritable positiu, es descobreix la posició angular d'una constel·lació coneguda en relació amb els eixos del cos del satèl·lit.

Pas 4: aspectes negatius i positius

Negatius

Un aspecte realment clau de l’entrenament en cascada és tenir un conjunt de dades d’imatges negatives tan gran com sigui possible. Parlem de milers, idealment de desenes de milers d’imatges. Realment no importa el que contenen, l’objectiu és proporcionar informació visual variada. La carpeta Classifier Training conté diversos conjunts de dades d'imatges negatives que he compilat. Inicialment, estaven compostes únicament per imatges de camp estel·lar simulades extretes de Stellarium, però més tard vaig augmentar el conjunt de dades amb tantes imatges aleatòries com vaig poder trobar (sí, incloses les meves fotos de vacances …). El conjunt de dades més gran que hi ha inclou gairebé 9.000 imatges, que era el més gran que he creat fins ara. En utilitzar-lo, us estalviarà compilant els vostres.

Positius

La imatge positiva (que és el patró d’estrelles objectiu que la cascada s’entrenarà per reconèixer) comença com una captura de pantalla d’un patró d’estrelles a Stellarium. Un programa Python identifica les estrelles més brillants de la imatge i recobreix marcadors (explicats més endavant en aquest instructiu) en aquestes posicions estel·lars. Aquesta imatge es redueix a 50x50 píxels. Això és petit, però el temps d'entrenament necessari per a les cascades augmentarà exponencialment a mesura que augmenta aquesta mida, de manera que es tracta d'un bon compromís entre qualitat i temps.

Pas 5: control de Stellarium

Control Stellarium
Control Stellarium
Control Stellarium
Control Stellarium

La carpeta Stellarium Scripts del dipòsit GitHub conté tres programes que vaig escriure per controlar l’ús de Stellarium. Per utilitzar-los, col·loqueu-los a la carpeta d'escriptures de la vostra carpeta d'instal·lació de Stellarium. Per executar-los, podeu obrir la finestra dels scripts des del menú Stellarium o simplement fent doble clic al programa de la carpeta de scripts, que iniciarà Stellarium i executarà immediatament el programa seleccionat.

tesi_4 i tesi_5 capturen aproximadament 2000 imatges cadascun dels hemisferis celestes del nord i del sud, respectivament. Aquests es van utilitzar per formar bases de dades d’imatges negatives, per entrenar la imatge positiva en contra. La distinció entre nord i sud era una manera senzilla d’assegurar-se que el patró d’estrelles objectiu (positiu) no estaria present en el conjunt de dades negatiu mitjançant la formació de patrons d’estrelles de l’hemisferi nord contra el conjunt de dades d’imatges de l’hemisferi celest sud i viceversa. (Si també hi ha una imatge positiva dins del conjunt de dades d'imatges negatives, afectarà la qualitat del classificador).

thesis_setup també és útil (això configura Stellarium perquè sigui adequat per capturar imatges) les imatges que s’utilitzen per simular una vista des de l’espai. Fa accions com ocultar menús, línies de quadrícula, etiquetes, etc. automàticament per estalviar-vos necessitat cada vegada que vulgueu agafar una imatge.

Pas 6: Rocket Man

Home del coet
Home del coet

Les primeres cascades que vaig entrenar no van poder identificar correctament cap patró estel·lar. No eren molt fiables i eren molt propensos als falsos positius. La meva suposició era que, efectivament, les imatges de camp estel·lar de Stellarium (bàsicament només punts blancs sobre fons negre) no contenien prou informació visual per contenir prou característiques de tipus HAAR per a un entrenament amb èxit del classificador. Crec que era tard a la nit, però vaig decidir provar la idea d’escriure un programa per col·locar automàticament una petita imatge en miniatura sobre la ubicació de cada estrella brillant en una imatge de camp d’estrelles.

Elton

Aquesta va ser una prova ximple, però afegint una petita imatge de la cara d’Elton John a cada ubicació d’estrelles brillants, entrenant el classificador contra aquesta imatge positiva i després executant les cascades contra la imatge original, va ser molt més eficaç trobar correctament la patró correcte. Sabia que estava en alguna cosa!

Pas 7: Marcadors fiducials

Marcadors fiducials
Marcadors fiducials

Tot i que els 'Eltons' van demostrar la teoria, necessitava un marcador que tingués una simetria rotacional completa, de manera que el patró estel·lar aparegués igual, independentment de la seva orientació. Vaig provar diversos tipus de marcadors i vaig trobar que el tipus a la part inferior dreta era el més eficaç, amb els anells en blanc i negre contrastats. El programa Python presentat a la carpeta positiva del repositori de GitHub mostra com s’identifiquen les estrelles més brillants d’una imatge determinada i aquests marcadors es superposen automàticament en aquestes posicions. Ara hem creat una representació dels patrons estrella clau contra els quals es pot entrenar.

Pas 8: utilitzar les cascades

Ús de les cascades
Ús de les cascades

Quan hàgiu entrenat un conjunt de cascades, heu de saber utilitzar-les per identificar un objecte en una imatge.

Mireu la carpeta Star Identification del GitHub, on trobareu el programa cascade_test19.py. Aquest programa de nom atractiu pren un conjunt de cascades d'una carpeta determinada i les executa contra una imatge d'entrada i informa de les deteccions realitzades. La funció 'detectMultiScale' és el nucli d'aquesta qüestió i requereix diversos arguments que defineixen el procés de detecció. Alterar-los és fonamental per al rendiment del classificador en cascada, i es pot trobar més discussió al pas següent, on analitzem com eliminar falsos positius.

Això es podria aplicar en un sistema d’orientació per satèl·lit correlacionant el valor del píxel al centre de la caixa delimitadora amb la coordenada celeste Ra / Dec del patró d’estrelles identificat i, després, correlacionant-ho amb el desplaçament angular des del centre de la imatge (càmera eix). A partir d’això, mitjançant una comprensió de la distorsió de la lent (aproximada a una projecció gnomònica), l’angle del satèl·lit es pot trobar a partir de només dues identificacions positives.

Pas 9: Com mantenir-se positiu sobre els falsos positius

Com mantenir-se positiu sobre els falsos positius
Com mantenir-se positiu sobre els falsos positius
Com mantenir-se positiu sobre els falsos positius
Com mantenir-se positiu sobre els falsos positius

Aquestes dues imatges mostren els resultats de provar el conjunt en cascada amb una imatge idèntica, però amb paràmetres diferents. És evident que la primera imatge conté la veritable identificació, però també un gran nombre de falsos positius, mentre que la segona imatge només conté la identificació correcta.

El programa cascade_test19.py de la carpeta Star Identification del repositori GitHub utilitza dos mètodes per ordenar els resultats. En primer lloc, el funció detectMultiScale estableix una mida mínima i màxima del resultat que es pot trobar, la qual cosa és raonable, ja que la mida aproximada del patró d’estrella objectiu a la finestra (per a la lent i l’augment donats, les meves imatges Stellarium simulades utilitzen les propietats de la càmera Raspberry Pi V2) és coneguda. En segon lloc, el codi seleccionarà el resultat amb el quadre de delimitació més gran (dins dels límits anteriors). En les proves, es va trobar que aquest era el veritable positiu. En tercer lloc, el programa estableix un "levelWeights" mínim (efectivament "valor de confiança") que es requereix per tractar aquest identificador com un veritable positiu. Mitjançant aquest mètode, les cascades van ser efectives per trobar el resultat correcte.

A més de les imatges del camp estel·lar, també vaig provar-ho amb imatges del meu escriptori, per exemple, entrenant en cascada per identificar la meva llibreta, tassa, etc., per practicar l'eliminació de falsos positius. Els mètodes anteriors van funcionar bé en totes les circumstàncies, cosa que va ser encoratjador.

Pas 10: debat

Debat
Debat
Debat
Debat
Debat
Debat

Àrees de millora

Aquest ha estat un projecte complex per a mi i em va impulsar molt la comprensió del tema. Ha suposat un total de diversos mesos gairebé a temps complet per aconseguir que el projecte arribi a aquest punt quan pugui compartir-lo amb vosaltres, però hi ha molta feina per fer per millorar el rendiment del mètode. Tal com està, pot funcionar bé dins de determinades restriccions. He treballat per identificar quines àrees necessiten feina addicional i, amb sort, podré dedicar temps a abordar-les en els propers mesos. Ells són:

Angle: es tracta d’una àrea complexa, la idea que els resultats dels classificadors han de ser invariants rotacionalment, és a dir, hauria d’identificar la fiabilitat del patró d’estrelles objectiu independentment de l’angle en què es presenti la imatge que conté el patró d’estrelles objectiu. Una cascada entrenada amb una imatge d’entrada en una única orientació no serà capaç d’identificar aquesta imatge en orientacions aleatòries, de manera que s’ha d’introduir la variància de l’angle positiu de la imatge en el procés d’entrenament per entrenar cascades que puguin acceptar un rang d’angles d’entrada. El paràmetre 'maxzangle' a les ordres d'entrenament en cascada adopta un argument en radians, que controla un límit de l'angle que la imatge positiva d'entrada es superposarà a les imatges negatives proporcionades, de manera que el conjunt d'imatges positives resultants contindrà un ventall d'orientacions de la imatge positiva. No obstant això, a mesura que augmenta aquest maxzangle, la proporció d'acceptació (a grans trets, qualitat) de la cascada es reduirà bruscament. Crec que la solució és entrenar cascades mitjançant una base de dades d'imatges negatives significativament més gran que la que feia servir per assegurar-me que es pugui crear un classificador de cascades de bona qualitat fins i tot incorporant una gran orientació.

Una altra solució potencial seria entrenar una sèrie de cascades per a un objectiu específic, governant cada cascada una determinada porció d'una rotació completa de 360 graus. D'aquesta manera, la qualitat de cada cascada es pot mantenir a un nivell alt, però, d'altra banda, donarà lloc a moltes cascades i, per tant, el procés d'identificació serà més lent.

El paràmetre "levelWeight", que és un valor proporcionat per la funció "detectMultiScale", és anàleg al valor de confiança en la detecció que s'ha realitzat. Estudiant això, es va crear el gràfic anterior, que mostra com la confiança de la identificació positiva disminueix bruscament a mesura que l'orientació de la imatge augmenta en qualsevol direcció, confirmant els pensaments que es tracta d'un punt feble.

Col·locació de píxels: un punt molt més senzill, però també problemàtic, és el de la col·locació de píxels, il·lustrat per les dues imatges següents, que mostren una vista ampliada d’una imatge d’estrella, de manera que es poden veure clarament els píxels individuals de dues estrelles. El procés d'erosió que s'utilitza al programa per eliminar totes les estrelles més brillants de la imatge, llevat de les estrelles més brillants, mantindrà la primera estrella i descartarà la segona, tot i ser de la mateixa brillantor. La raó és que la primera estrella està centrada en un píxel, mentre que la segona no és com a tal. La funció d'erosió tira anells concèntrics de píxels al voltant del píxel central d'un grup, de manera que la primera estrella farà que el píxel central sobrevisqui a la funció d'erosió, però la segona estrella s'eliminarà completament de la imatge. Per tant, els marcadors fiducials només es col·locaran a la primera estrella i no a la segona. Això provocarà inconsistències relacionades amb les estrelles brillants d’un determinat camp estel·lar que rebran marcadors (i, per tant, es compararan amb els classificadors entrenats), per tant, és possible que no sigui possible una correcta observació positiva.

Pas 11: última paraula

Darrera paraula
Darrera paraula

Gràcies per llegir el meu instructiu, espero que us hagi semblat intrigant aquest projecte. Ha estat un procés molt interessant treballant-hi, ha passat més d’un any des que vaig començar a treballar el concepte i els resultats fins ara m’animen. Per la literatura que he llegit, aquest és un concepte força original i, amb més desenvolupament, es pot aplicar sens dubte en una sèrie d’aplicacions per a astronomia aficionada o més.

Aquest projecte va ser per a mi una forta corba d’aprenentatge i, per tant, espero que alguns lectors amb més experiència en programació s’inspirin per contribuir a la continuació del projecte a través de la pàgina de GitHub i puguem continuar desenvolupant aquesta eina de codi obert. Tinc ganes de llegir qualsevol comentari que tingueu, però si us plau no feu massa preguntes difícils.

Desafiament espacial
Desafiament espacial
Desafiament espacial
Desafiament espacial

Subcampió al Space Challenge

Recomanat: