Tabla de contenido:

Reconocimiento de estrellas mediante visión por computadora (OpenCV): 11 pasos (con imágenes)
Reconocimiento de estrellas mediante visión por computadora (OpenCV): 11 pasos (con imágenes)

Video: Reconocimiento de estrellas mediante visión por computadora (OpenCV): 11 pasos (con imágenes)

Video: Reconocimiento de estrellas mediante visión por computadora (OpenCV): 11 pasos (con imágenes)
Video: CURSO de VISION ARTIFICIAL CLASE 1 | INTRODUCCION A LAS IMAGENES | Python OpenCV 2024, Mes de julio
Anonim
Reconocimiento de estrellas mediante visión por computadora (OpenCV)
Reconocimiento de estrellas mediante visión por computadora (OpenCV)

Este instructivo le describirá cómo crear un programa de visión por computadora para identificar automáticamente patrones de estrellas en una imagen. El método utiliza la biblioteca OpenCV (Open-Source Computer Vision) para crear un conjunto de cascadas HAAR entrenadas que se pueden usar para reconocer patrones de estrellas específicos. Aunque esta guía está en el contexto del reconocimiento de patrones de estrellas, el proceso OpenCV que describo también se puede aplicar a otras aplicaciones, ¡así que espero que sea útil!

El proyecto se resume en este video:

¿Por qué escribí este instructivo?

  1. Creo que el método de identificación de patrones de estrellas que estoy desarrollando tiene potencial para aplicarse a una amplia gama de proyectos de astronomía de aficionados, ya sea la orientación de un telescopio, la clasificación automática de imágenes o incluso, en última instancia, un sensor de estrellas en un CubeSat de código abierto o amateur.
  2. Hay muchos buenos instructables de OpenCV aquí, pero aun así me pareció un proceso muy difícil de aprender al principio, así que espero que esta guía sea una buena referencia para otras personas que buscan entrenar clasificadores HAAR para OpenCV (no necesariamente relacionado con ¡quizás astronomía!).
  3. Yo mismo no soy un programador capacitado, por lo que este proyecto realmente impulsó mi comprensión. Con suerte, al escribir este Instructable, otros creadores más experimentados se inspirarán para trabajar en este concepto y contribuir a GitHub y este instructable a través de los comentarios en esta página.
  4. Los métodos de orientación y astronomía amateur son un gran interés para mí, vea mi instructable anterior con un buscador de estrellas Arduino para telescopios.

La foto de portada de este Instructable es de un concepto de diseño de 3U CubeSat en el que participé en el diseño. Lo usé para ilustrar este instructivo, ya que la aplicación original del sistema de reconocimiento de estrellas de visión por computadora iba a ser para un sensor de orientación para CubeSats hechos por aficionados, usando una cámara Raspberry Pi V2. Hay muchas otras aplicaciones potenciales del reconocimiento de estrellas de visión por computadora, creo, ¡pero creo que esta es la mejor!

Un pequeño glosario:

El aprendizaje de la visión por computadora se hace más lento debido a la estúpida cantidad de términos especializados utilizados, por lo que definiré algunos para nosotros aquí:

Cascade: un clasificador entrenado para identificar un objeto objetivo específico.

Marcador fiducial: un marcador que agrega un punto de referencia visual a una imagen.

HAAR: las características similares a las de Haar son un tipo de característica de imagen que se utiliza para el entrenamiento del clasificador.

OpenCV: Open Source Computer Vision, una biblioteca de herramientas de visión por computadora.

Stellarium: software de astronomía de código abierto.

Paso 1: requisitos

OpenCV es una biblioteca basada en Linux, por lo que, aunque supuestamente es posible operarlo bien en Windows, le resultará mucho más fácil ejecutarlo en un entorno Linux (tome esto de mí y muchos días tratando de que funcione completamente Windows!). Como experimento, descargué y ejecuté OpenCV en mi Raspberry Pi 3B +, el cual fue exitoso, aunque el entrenamiento del clasificador es un proceso muy intensivo en RAM, por lo que si deseas hacerlo a cualquier velocidad, la ruta recomendada es contratar un Servidor Virtual Linux. (que en realidad puede ser sorprendentemente económico) durante unos días / semanas / meses y utilícelo como un entorno dedicado en el que ejecutar el entrenamiento del clasificador. Podrá controlar el servidor desde una PC con Windows utilizando un cliente SSH como Putty. Una vez que se entrenan las cascadas con el VPS, se pueden descargar a su PC con Windows y se puede usar Python para ejecutar el programa de reconocimiento de imágenes en un entorno de Windows.

Servidor virtual Linux:

Se necesita un servidor virtual Linux (VPS) para realizar los procesos de entrenamiento en cascada de HAAR. Inicialmente contraté un servidor con 8GB de RAM y Ubuntu 16.04.6 (LTS) x64, y luego un segundo para duplicar la velocidad a la que podía entrenar cascadas, aunque solo necesitarás un mínimo de uno

Software:

  • Stellarium: este es un software de planetario / astronomía virtual, disponible gratuitamente. Se utilizará para recopilar imágenes de estrellas simuladas para su uso en pruebas.
  • Putty: este es un cliente SSH que se utiliza para controlar el VPS a través de la línea de comandos.
  • WinSCP: se utiliza para realizar la transferencia de archivos desde la PC con Windows.

Paso 2: Configuración de VPS

Hay un pequeño proceso de configuración para poner en funcionamiento el VPS. La primera vez puede llevarle un poco de tiempo, pero no es demasiado complicado si sigue los pasos de cerca. Este tutorial fue una gran referencia para mí, te recomiendo que lo leas también mientras trabajas en este instructivo. Cubre los detalles de los comandos de Linux línea por línea, que es necesario seguir al pie de la letra.

A grandes rasgos, el proceso implica:

  1. Creación de servidor Linux con la versión correcta de Ubuntu.
  2. Actualización y actualización del servidor.
  3. Creación de un directorio de espacio de trabajo, en el que se instala OpenCV.
  4. Instalación de algunos elementos esenciales, a saber, un compilador, varias bibliotecas y enlaces de Python.

Después de esta etapa, estará listo para comenzar a prepararse para el proceso de capacitación.

Paso 3: el proceso

Todo el proceso de visión por computadora usando cascadas HAAR es bastante confuso al principio, por lo que este paso describe la lógica con un poco más de detalle:

Proceso básico

  1. Existe un conjunto de datos de imágenes negativas, que consta de varios miles de imágenes que no contienen el objeto de interés. Esto deberá cargarse en el VPS.
  2. Se crea una única imagen positiva que contiene el objeto de interés. Esto también deberá cargarse en el VPS.
  3. La imagen positiva única se distorsiona, deforma, gira, etc., mediante un conjunto de parámetros elegidos y se superpone a una selección de imágenes negativas. Esta es una forma artificial de crear un gran conjunto de datos positivos a partir de una sola imagen. (Para otras aplicaciones del mundo real, como identificar un gato, simplemente puede usar varios miles de imágenes de gatos, pero este método no siempre es apropiado si no tiene un conjunto tan grande de imágenes positivas. El enfoque artificial utilizado aquí será menos eficaz, pero es la única opción para un caso de uso como este).
  4. Se ejecuta un proceso de formación, que funciona por etapas. Cada etapa entrenará una cascada para identificar diferentes características de tipo HAAR dentro de los conjuntos de imágenes. Cada etapa tarda exponencialmente más en completarse, y la efectividad del clasificador aumenta cada vez (¡también es posible sobreentrenar solo para que lo sepas!).
  5. Una sola cascada entrenada podrá buscar un solo objeto objetivo. Si desea identificar varios objetos únicos, necesitará una cascada entrenada para cada uno. En este caso, entrené alrededor de 50 cascadas diferentes para patrones de estrellas únicos, para crear un conjunto que pudiera cubrir el hemisferio celeste norte.
  6. Por último, se utiliza un programa de detección que ejecuta cada cascada de un conjunto contra una imagen de entrada. La cascada buscará su objeto de destino dado dentro de la imagen de entrada.
  7. Si tiene éxito, el objeto de destino se identificará dentro de la imagen de entrada.

nótese bien. si se usa en un contexto de orientación satelital, por ejemplo, se capturaría una imagen usando una cámara integrada. Se identificarán las estrellas más brillantes de esa imagen y los marcadores se superpondrán en esas posiciones. Luego, esta imagen se presenta al conjunto de cascadas entrenadas, que probarán para ver si la imagen de entrada contiene alguno de los objetos de destino. Si se detecta un verdadero positivo, entonces se descubre la posición angular de una constelación conocida con respecto a los ejes del cuerpo del satélite.

Paso 4: aspectos negativos y positivos

Negativos

Un aspecto realmente clave del entrenamiento en cascada es tener un conjunto de datos de imágenes negativas tan grande como sea posible. Estamos hablando de miles, idealmente decenas de miles de imágenes. Realmente no importa lo que contengan, el objetivo es solo proporcionar variedad de información visual. La carpeta Classifier Training contiene una variedad de diferentes conjuntos de datos de imágenes negativas que compilé. Inicialmente, estos estaban compuestos únicamente por imágenes de campos de estrellas simuladas obtenidas de Stellarium, pero luego aumenté el conjunto de datos con tantas imágenes aleatorias como pude encontrar (sí, incluidas mis fotos de vacaciones …). El conjunto de datos más grande incluye casi 9000 imágenes, que fue el más grande que he creado hasta ahora. Al usar esto, le ahorrará compilar el suyo.

Positivos

La imagen positiva (que es el patrón de estrellas objetivo que la cascada será entrenada para reconocer) comienza como una captura de pantalla de un patrón de estrellas en Stellarium. Luego, un programa de Python identifica las estrellas más brillantes en la imagen y superpone marcadores (explicados más adelante en este instructivo) en estas posiciones de estrellas. Luego, esta imagen se reduce a 50x50 píxeles. Esto es pequeño, pero el tiempo de entrenamiento requerido para las cascadas aumentará exponencialmente a medida que aumente este tamaño, por lo que este es un buen compromiso entre calidad y tiempo.

Paso 5: Control de Stellarium

Control de Stellarium
Control de Stellarium
Control de Stellarium
Control de Stellarium

La carpeta Stellarium Scripts del repositorio de GitHub contiene tres programas que escribí para controlar el uso de Stellarium. Para usarlos, colóquelos en la carpeta de scripts de su carpeta de instalación de Stellarium. Para ejecutarlos, puede abrir la ventana de secuencias de comandos desde el menú de Stellarium, o simplemente haciendo doble clic en el programa en la carpeta de secuencias de comandos, que iniciará Stellarium e inmediatamente ejecutará el programa seleccionado.

thesis_4 y thesis_5 capturan alrededor de 2000 imágenes de cada uno de los hemisferios celestes norte y sur, respectivamente. Estos se utilizaron para formar bases de datos de imágenes negativas, para entrenar la imagen positiva contra. La distinción entre norte y sur era una forma sencilla de garantizar que el patrón de estrellas objetivo (positivo) no estaría presente en el conjunto de datos negativos mediante el entrenamiento de los patrones de estrellas del hemisferio norte contra el conjunto de datos de imágenes del hemisferio celeste sur y viceversa. (Si una imagen positiva también está presente dentro del conjunto de datos de imágenes negativas, afectará la calidad del clasificador).

thesis_setup también es útil, esto configura Stellarium para que sea apropiado para capturar imágenes, las imágenes utilizadas para simular una vista desde el espacio. Realiza acciones como ocultar menús, líneas de cuadrícula, etiquetas, etc. de forma automática para ahorrarle la necesidad cada vez que desee tomar una imagen.

Paso 6: Rocket Man

Hombre cohete
Hombre cohete

Las primeras cascadas que entrené no pudieron identificar correctamente ningún patrón de estrellas. Eran muy poco fiables y muy propensos a los falsos positivos. Mi suposición era que efectivamente las imágenes de campo estelar de Stellarium (básicamente solo puntos blancos sobre un fondo negro) simplemente no contenían suficiente información visual para contener suficientes características de tipo HAAR para un entrenamiento exitoso del clasificador. Creo que era tarde en la noche, pero decidí probar la idea de escribir un programa para colocar automáticamente una pequeña imagen en miniatura sobre la ubicación de cada estrella brillante en una imagen de campo estelar.

Elton

Esta fue una prueba tonta, pero al agregar una pequeña imagen de la cara de Elton John a cada ubicación de estrella brillante, entrenar al clasificador contra esta imagen positiva y luego ejecutar las cascadas contra la imagen original, fue mucho más efectivo para encontrar correctamente la imagen. patrón correcto. ¡Sabía que estaba en algo!

Paso 7: marcadores fiduciales

Marcadores fiduciales
Marcadores fiduciales

Aunque los 'Elton' demostraron la teoría, necesitaba un marcador que tuviera una simetría rotacional completa, de modo que el patrón de estrellas pareciera el mismo sin importar en qué orientación se presentara. Probé una variedad de tipos de marcadores y descubrí que el tipo de la parte inferior derecha era más efectivo, con los anillos en blanco y negro contrastantes. El programa de Python presentado en la carpeta positiva del repositorio de GitHub muestra cómo se identifican las estrellas más brillantes en una imagen determinada, y estos marcadores se superponen automáticamente en esas posiciones. Ahora hemos creado una representación de los patrones estelares clave contra los que se puede entrenar.

Paso 8: uso de las cascadas

Usando las cascadas
Usando las cascadas

Cuando haya entrenado un conjunto de cascadas, ¡debe saber cómo usarlas para identificar un objeto en una imagen!

Mire la carpeta Star Identification de GitHub, donde encontrará el programa cascade_test19.py. Este programa de nombre llamativo toma un conjunto de cascadas de una carpeta determinada y las ejecuta todas contra una imagen de entrada e informa sobre las detecciones realizadas. La función 'detectMultiScale' es el núcleo de esto, y requiere una variedad de argumentos que definen el proceso de detección. La alteración de estos es fundamental para el rendimiento del clasificador en cascada, y se puede encontrar más discusión sobre esto en el siguiente paso, donde veremos cómo eliminar los falsos positivos.

Esto podría aplicarse en un sistema de orientación por satélite correlacionando el valor de píxel en el centro del cuadro delimitador con la coordenada celeste Ra / Dec del patrón de estrella identificado, y luego correlacionando esto con el desplazamiento angular desde el centro de la imagen (cámara eje). A partir de esto, utilizando una comprensión de la distorsión de la lente (aproximada a una proyección gnomónica), el ángulo del satélite se puede encontrar a partir de solo dos identificaciones positivas.

Paso 9: Cómo mantener una actitud positiva ante los falsos positivos

Cómo mantenerse positivo acerca de los falsos positivos
Cómo mantenerse positivo acerca de los falsos positivos
Cómo mantenerse positivo acerca de los falsos positivos
Cómo mantenerse positivo acerca de los falsos positivos

Estas dos imágenes muestran los resultados de probar el conjunto de cascada contra una imagen idéntica, pero con diferentes parámetros. Claramente, la primera imagen contiene la identificación verdadera, pero también una enorme cantidad de falsos positivos, mientras que la segunda imagen contiene solo la identificación correcta.

El programa cascade_test19.py dentro de la carpeta Star Identification del repositorio de GitHub usa dos métodos para ordenar los resultados. En primer lugar, la función detectMultiScale establece un tamaño mínimo y máximo de resultado que se puede encontrar, que es sensible, como el tamaño aproximado del patrón de estrella objetivo dentro de la ventana (para la lente y el aumento dados, mis imágenes Stellarium simuladas utilizan las propiedades de la cámara Raspberry Pi V2). En segundo lugar, el código seleccionará el resultado con el cuadro delimitador más grande (dentro de los límites anteriores). En las pruebas, se encontró que este era el verdadero positivo. En tercer lugar, el programa establece un 'levelWeights' mínimo (efectivamente 'valor de confianza') que se requiere para tratar esta identificación como un verdadero positivo. Con este método, las cascadas fueron efectivas para encontrar el resultado correcto.

Además de las imágenes del campo de estrellas, también probé esto con imágenes de mi escritorio, por ejemplo, entrenando cascadas para identificar mi cuaderno, taza, etc., para practicar la eliminación de falsos positivos. Los métodos anteriores funcionaron bien en todas las circunstancias, lo que fue alentador.

Paso 10: Discusión

Discusión
Discusión
Discusión
Discusión
Discusión
Discusión

Áreas para mejorar

Este ha sido un proyecto complejo para mí y realmente impulsó mi comprensión del tema. Ha involucrado un total de varios meses de trabajo casi a tiempo completo para llevar el proyecto a este punto en el que puedo compartirlo con ustedes, pero hay mucho más trabajo por hacer para mejorar el rendimiento del método. En su forma actual, puede funcionar bien dentro de ciertas limitaciones. He trabajado para identificar qué áreas necesitan trabajo adicional y espero poder dedicar tiempo a abordarlas en los próximos meses. Son:

Ángulo: esta es un área compleja, la idea de que los resultados de los clasificadores deben ser invariantes en rotación, es decir, debe identificar de manera confiable el patrón de estrella objetivo independientemente del ángulo en el que se presenta la imagen que contiene el patrón de estrella objetivo. Una cascada entrenada usando una imagen de entrada en una sola orientación no podrá identificar esa imagen en orientaciones aleatorias, por lo que la variación del ángulo de imagen positivo debe introducirse en el proceso de entrenamiento para entrenar cascadas que puedan aceptar un rango en los ángulos de entrada. El parámetro 'maxzangle' en los comandos de entrenamiento en cascada toma un argumento en radianes, que controla un límite del ángulo en el que la imagen positiva de entrada se superpondrá a las imágenes negativas proporcionadas, por lo que el conjunto de imágenes positivas resultante contendrá un rango de orientaciones de la imagen positiva. Sin embargo, a medida que aumenta este ángulo máximo, la tasa de aceptación (en términos generales, la calidad) de la cascada se reducirá drásticamente. Creo que la solución es entrenar cascadas usando una base de datos de imágenes negativas significativamente mayor que la que estaba usando para asegurar que se pueda crear un clasificador en cascada de buena calidad incluso incorporando una gran extensión de orientación.

Otra solución potencial sería entrenar una serie de cascadas para un objetivo específico, cada cascada gobernando una cierta porción de una rotación completa de 360 grados. De esa manera, la calidad de cada cascada se puede mantener en un nivel alto, pero por otro lado, esto dará como resultado muchas más cascadas y, por lo tanto, el proceso de identificación será más lento.

El parámetro 'levelWeight', que es un valor proporcionado por la función 'detectMultiScale', es análogo a un valor de confianza en la detección que se ha realizado. Al estudiar esto, se creó el gráfico anterior, que muestra cómo la confianza de la identificación positiva disminuye drásticamente a medida que aumenta la orientación de la imagen en cualquier dirección, lo que confirma los pensamientos de que este es un punto débil.

Colocación de píxeles: un punto mucho más simple, pero también problemático, es el de la colocación de píxeles, ilustrado por las siguientes dos imágenes, que muestran una vista ampliada de la imagen de una estrella, de modo que los píxeles individuales de dos estrellas se puedan ver claramente. El proceso de erosión utilizado en el programa para eliminar todas las estrellas excepto las más brillantes de la imagen mantendrá la primera estrella y descartará la segunda, a pesar de que tienen el mismo brillo. La razón de esto es que la primera estrella está centrada en un píxel, mientras que la segunda no es como tal. La función de erosión elimina los anillos concéntricos de píxeles de alrededor del píxel central de un grupo, por lo que la primera estrella tendrá el píxel central sobrevive a la función de erosión, pero la segunda estrella se eliminará por completo de la imagen. Por lo tanto, los marcadores fiduciales solo se colocarán en la primera estrella y no en la segunda. Esto provocará inconsistencias en cuanto a qué estrellas brillantes en un campo de estrellas dado recibirán marcadores (y por lo tanto se compararán con los clasificadores entrenados); por lo tanto, es posible que una observación positiva correcta no sea posible.

Paso 11: Última palabra

Ultima palabra
Ultima palabra

Gracias por leer mi instructable, espero que este proyecto le haya resultado intrigante. Ha sido un proceso muy interesante trabajar en él, ha pasado más de un año desde que comencé a trabajar en el concepto, y los resultados me alientan hasta este momento. De la literatura que leí, este es un concepto bastante original, y con más desarrollo ciertamente se puede aplicar en una variedad de aplicaciones para la astronomía amateur o más.

Este proyecto fue una curva de aprendizaje empinada para mí, por lo que espero que algunos lectores con más experiencia en programación puedan sentirse inspirados para contribuir a la continuación del proyecto a través de la página de GitHub, y podamos continuar desarrollando esta herramienta de código abierto. Espero leer cualquier comentario que pueda tener, ¡pero no haga demasiadas preguntas difíciles!

Desafío espacial
Desafío espacial
Desafío espacial
Desafío espacial

Finalista en el desafío espacial

Recomendado: