Uso del aprendizaje profundo para la detección de objetos en imágenes aéreas: hacia la IA

Estás leyendo la publicación: Uso del aprendizaje profundo para la detección de objetos en imágenes aéreas: hacia la IA

Publicado originalmente en Hacia la IA, la empresa líder mundial en noticias y medios de IA y tecnología. Si está creando un producto o servicio relacionado con la IA, lo invitamos a considerar convertirse en patrocinador de la IA. En Hacia la IA, ayudamos a escalar las empresas emergentes de IA y tecnología. Permítanos ayudarlo a dar rienda suelta a su tecnología a las masas.

Aprendizaje profundo

Compartir mi experiencia trabajando en mi primer proyecto práctico de ML y lo que aprendí

Aprendizaje automático, aprendizaje profundo, ciencia de datos… Hemos estado escuchando estos términos durante varios años y no parecen desaparecer pronto. Tenía 14 años la primera vez que escuché el par de palabras “Machine Learning”, allá por 2018.

Un año después, implementé una red neuronal para una clasificación de imágenes básica usando TensorFlow y Keras como parte de mi clase de aprendizaje automático en la escuela secundaria.

Avance rápido 2 años más de estudio de la teoría del aprendizaje automático y la práctica práctica, me gradué de la escuela secundaria con una especialización en ingeniería de software con un enfoque en el aprendizaje profundo. El tema de mi proyecto final es “Sistema para hacer frente a construcciones ilegales usando detección de objetos en imágenes aéreas”.

Fondo

El trabajo de algunos ingenieros civiles es ayudar a lidiar con la construcción ilegal. Lo hacen tomando una imagen aérea de un área determinada y marcando manualmente cada edificio en la imagen. Este proceso lo repiten con una imagen aérea del mismo lugar que fue filmada varios años después. Luego comparan los dos y averiguan qué ha cambiado (se agregaron nuevos edificios, se agregaron nuevos pisos a un determinado edificio, etc.), y verifican los permisos de los edificios en esta área, para determinar si ha habido un caso de construcción ilegal. . El problema de marcar edificios manualmente es que este proceso es lento, difícil y requiere mucho tiempo. Sin embargo, si este proceso se hiciera de forma automática, sería rápido y fácil y ahorraría mucho tiempo a muchos ingenieros y, lo que es más importante, sería de gran ayuda en la lucha contra la construcción ilegal.

Arquitectura del sistema

Hay varias capas en el sistema:

  • La capa de persistencia: contiene todos los datos que se almacenan en el sistema y se compone de componentes:
    – La base de datos donde se almacenan los datos comerciales.
    – Almacenamiento de archivos que almacena imágenes tanto para el sistema de gestión como para el servidor de detección.
  • La capa de acceso a datos: código que manipula los datos almacenados en la base de datos.
  • La capa empresarial: esta capa consta de las siguientes partes:
    – Lógica empresarial: contiene la funcionalidad requerida por la interfaz de usuario y la integración con el componente de lógica de detección. Esta integración se implementa mediante API REST.
    – Lógica de detección: este componente se implementa como un servicio WEB y atiende solicitudes REST. La funcionalidad de este servicio incluye el procesamiento de las imágenes, la detección de edificios en ellas, el dibujo de cuadros delimitadores alrededor de los edificios y el suministro de imágenes procesadas a través de la API REST.
  • La capa de la interfaz de usuario: esta capa consta de la interfaz de usuario de los ingenieros, que es una aplicación de escritorio, y la interfaz de usuario de los supervisores, que es un sitio web. Una explicación más completa sobre la interfaz de usuario vendrá más adelante en el artículo.

Investigación

Hoy en día, hay una variedad de algoritmos de aprendizaje automático, utilizados para diferentes casos de uso, por lo que, para elegir el adecuado para mi proyecto, tuve que investigar un poco.

Consideré varios algoritmos. Entre ellos estaban SVM y RNN.

SVM es un algoritmo que se usa para problemas de clasificación y regresión, y los resuelve dibujando un límite de decisión/hiperplano, lo que significa que este algoritmo no es el que necesitamos para nuestra tarea, que es la detección de objetos en imágenes.

Después de examinar rápidamente la SVM, decidí ver si existe algún tipo de red neuronal que pueda ser de alguna utilidad. Hay muchos tipos de redes neuronales, como la RNN (Red Neural Recurrente), que pueden usar su memoria interna para procesar secuencias de entradas en varias longitudes para resolver problemas relacionados con datos de series de tiempo, datos de texto y datos de video, como sentimiento clasificación, traducción de idiomas, reconocimiento de escritura a mano conectado, etc. Nuevamente, esto no es lo que necesito para este proyecto, por lo que los RNN no son muy útiles.

🔥 Recomendado:  Marketing de contenido B2B: la guía definitiva para crear contenido de marketing B2B impactante

Después de revisar una variedad de NN, finalmente descubrí el tipo de NN que podría ser el adecuado para mi proyecto: las CNN.

CNN (Red Neuronal Convolucional)

Una CNN es un tipo de red neuronal que utiliza filtros para extraer características de las imágenes. Se aplica principalmente para analizar imágenes visuales.

“Pero, ¿qué es la convolución?” podrías preguntar. Una convolución es una operación matemática aplicada sobre una matriz, generalmente, la imagen representada en forma de píxeles o números. Durante esta operación, se realiza un producto escalar entre los valores del filtro (también llamado “núcleo”) y los valores de la imagen sobre los que se desplaza el núcleo, hasta que el núcleo termina de desplazarse sobre cada valor de la matriz que representa la imagen. El objetivo de este proceso es extraer características de la imagen de entrada.

Otra capa importante es la capa de agrupación, que es responsable de reducir el tamaño espacial de una característica convolucionada y, por lo tanto, disminuye la potencia computacional requerida para procesar los datos. Hay dos tipos de Pooling: Max Pooling y Average Pooling. Max Pooling devuelve el valor máximo de la parte de la imagen cubierta por el Kernel. La agrupación promedio devuelve el promedio de todos los valores de la parte de la imagen cubierta por el Kernel.

La Retinanet

Durante mi investigación, revisé muchas arquitecturas de CNN, como RCNN, Yolo, etc. Se puede encontrar más información sobre esas y otras aquí. Tenía una cantidad limitada de tiempo para trabajar en este proyecto y otros componentes en los que tenía que trabajar además de la parte de ML, así que tuve que encontrar una biblioteca donde ya se haya implementado un algoritmo de detección de objetos, lo que me permitiría me entrena, predice y dibuja cuadros delimitadores alrededor de los objetos detectados. Después de una extensa investigación en línea, encontré RetinaNet.

RetinaNet es una red compuesta compuesta por:

  • red troncal llamada Feature Pyramid (FPN) Net construida sobre ResNet de forma totalmente convolucional, que se utiliza para calcular mapas de características de una imagen de entrada.
  • Subred de clasificación de objetos.
  • Subred de regresión de cuadro delimitador.

La subred de clasificación de objetos y la subred de regresión de cuadro delimitador se crean en cada nivel de FPN y utilizan la salida de la red troncal.

La construcción de la FPN está compuesta por dos vías conectadas con conexiones laterales.

El primero es un camino de abajo hacia arriba. En este camino, se producen los mapas de características de la imagen de entrada. El último mapa de características producido por cada grupo de capas consecutivas que genera mapas de características de la misma escala se utiliza posteriormente como base de la pirámide de características.

El segundo es un camino de arriba hacia abajo. En esta vía, el último mapa de características de la vía de abajo hacia arriba se expande a la misma escala que el penúltimo mapa de características. Luego, los dos se fusionan y el nuevo mapa de funciones se envía a las dos subredes. Este proceso se repite hasta que cada mapa de características de la ruta de abajo hacia arriba tiene un nuevo mapa de características correspondiente conectado con conexiones laterales.

En mi proyecto, utilicé Keras-retinanet (implementación de Keras de RetinaNet) para entrenar, predecir y dibujar cuadros delimitadores alrededor de edificios detectados en imágenes aéreas.

Crear el conjunto de datos

Después de encontrar los módulos correctos para realizar la tarea deseada (en este proyecto, es la detección de objetos en imágenes aéreas), necesitaba datos para el entrenamiento y la predicción del modelo. En mi búsqueda de un conjunto de datos, intenté encontrar uno con imágenes que contenían edificios y archivos XML de metadatos que almacenaban la ubicación de los edificios en cada imagen (un archivo XML para cada imagen). Desafortunadamente, no encontré uno, pero sí encontré un conjunto de datos que podría ser útil. Este conjunto de datos es el Detección de piscinas y coches conjunto de datos, que contiene imágenes con automóviles y grupos, y archivos XML que almacenan la ubicación de grupos y automóviles en estas imágenes. Quizás se pregunte por qué elegí este conjunto de datos. La razón es simple. En las mismas imágenes donde hay autos y piscinas, también hay edificios, por lo que puedo usar las imágenes del conjunto de datos para entrenar y predecir.

🔥 Recomendado:  5 errores y soluciones del marketing en redes sociales

Para crear archivos XML que almacenen la ubicación de los objetos en las imágenes. Usé CVAT, una herramienta de anotación de visión por computadora, que me permitió dibujar cuadros delimitadores alrededor de objetos en imágenes y luego generar los archivos XML que necesitaba para el entrenamiento. De alrededor de mil imágenes que tenía, creé archivos XML para 600 imágenes, 224X224 píxeles cada una.

Ahora que tengo todas las imágenes y sus archivos XML correspondientes, puedo comenzar a entrenar el modelo.

Entrenamiento y predicción

Ahora, todo lo que me queda es entrenar el modelo y usar uno de los archivos del modelo entrenado generado más adelante en el proyecto. Debido a que el código para entrenar el modelo se ejecutó en Google Colab, primero tuve que montar mi Google Drive. Luego, importé todos los módulos que necesitaba. Luego, extraje las anotaciones de los archivos XML y las almacené en los archivos CSV necesarios para la capacitación. El paso final es el entrenamiento en sí, y este es un paso que tuve que repetir varias veces. La razón de esto es que tenía que encontrar una cierta cantidad de épocas (una ronda de entrenamiento de todos los datos de entrenamiento), pasos (parte de la época en la que una cierta cantidad de datos se envía a la red), que me daría los resultados óptimos.

Decidí probar varias veces, con diferentes números de épocas, pasos y tamaños de lote, para ver cuál me da mejores resultados. La siguiente tabla resume algunos de mis intentos de encontrar una mejor combinación de estos parámetros.

En esta tabla se puede ver que cuantas más épocas y más pasos (= tamaño de lote más pequeño) obtuvimos mejores resultados, ya que el intento de entrenamiento con más épocas y pasos dio la pérdida inicial más baja (2,96) y la pérdida final más baja ( 1.46).

Cada vez que finaliza una época, se genera un nuevo archivo de modelo entrenado para nosotros, que se puede usar para la predicción.

Para la predicción, utilicé uno de los archivos de modelo entrenado generados anteriormente, así como los módulos de predicción y los módulos de cuadros delimitadores de keras_retinanet. Una cosa en la que tuve que concentrarme fue en el umbral de confianza del modelo requerido para dibujar un cuadro delimitador. Empecé a probar cómo se hizo el modelo usando diferentes imágenes y, de acuerdo con el rendimiento del modelo, cambié el umbral de confianza para que no fuera demasiado bajo (lo que podría llevar a dibujar cuadros delimitadores alrededor de objetos que no son edificios), y no demasiado alto (lo que podría llevar a no dibujar cuadros delimitadores alrededor de los objetos, incluso si son edificios).

¡Funciona! Nuestro modelo hace un muy buen trabajo dibujando cuadros delimitadores alrededor de los edificios, y con una confianza muy alta (lamentablemente, por alguna razón, la confianza del edificio detectado en la esquina superior derecha no se puede ver en la imagen).

Ahora todo lo que necesito es construir la interfaz de usuario, para que los usuarios puedan usar mi proyecto y encontrar una manera de hacer que mi código python funcione en un proyecto que está escrito principalmente en C#.

Dando vida a mi proyecto

Ser capaz de realizar la detección de objetos en imágenes aéreas es genial y todo, pero ¿qué valor tiene si no puede usarlo en una interfaz de usuario fácil de usar?

Hay dos usuarios en este proyecto, lo que significa que hay dos entornos de interfaz de usuario. El primer tipo de usuario es un ingeniero. El entorno de la interfaz de usuario del ingeniero se utilizará principalmente para detectar edificios en imágenes aéreas en direcciones nuevas y existentes, ver imágenes detectadas anteriormente y enviar informes a los supervisores. El segundo tipo de usuario es un supervisor. El supervisor es responsable de ver los informes enviados por los ingenieros, ver y agregar los permisos de construcción y determinar que ha habido un caso de construcción ilegal.

Afortunadamente, tengo formularios de Windows a mi lado, lo que me permite crear aplicaciones de escritorio, y aquí es donde se usarán las detecciones de objetos.

🔥 Recomendado:  (Parte final) Fomento de los impactos sociales con la ciencia de datos: hacia la IA

El ingeniero puede detectar edificios en una imagen que se tomó en una dirección recién agregada

O detectar edificios en una imagen que se tomó en una dirección que ya existe en el sistema y compararla con la anterior.

El ingeniero también puede ver todas las imágenes con cuadros delimitadores de diferentes direcciones y horas.

E incluso enviar informes a su supervisor.

Hablando de supervisores, también obtienen su propia interfaz de usuario, un sitio web, creado con aspx.

En su entorno de interfaz de usuario, los supervisores pueden ver todos los permisos de construcción.

Agregar un nuevo permiso de construcción.

Y ver los informes que se les envían.

Diseñé ambos ambientes con tonos similares, simplemente para dar la sensación de que ambos son partes del mismo sistema.

Ahora que puede ver que usé python en un proyecto mayormente de C#, veamos cómo lo hice posible.

Usar python en un proyecto mayormente C#

El código de Python no se puede ejecutar en C# así, se deben realizar algunos pasos adicionales para que eso sea posible. Es posible convertir el archivo python en un archivo .EXE y ejecutarlo usando el código C#, pero hice algo diferente. He configurado un servidor web con Matrazque gestiona las solicitudes del sistema de gestión.

El sistema de gestión envía una solicitud POST al servidor y recibe la URL del recurso que representa una imagen que contiene cuadros delimitadores después de que se realiza la detección.

El servidor recibe la imagen, la detecta y devuelve la URL del recurso que representa una imagen que contiene cuadros delimitadores al sistema de gestión.

A continuación, el sistema de gestión muestra la imagen con cuadros delimitadores en lugar de la imagen sin cuadros delimitadores, como ha visto anteriormente.

Que aprendí

A lo largo de este proceso, aprendí cosas técnicas como:

1. Configuración de un servidor web con Flask.

2. Trabajar con bases de datos.

3. Arquitecturas CNN.

4. Realización de detección de objetos mediante keras_retinanet.

5. API REST.

Pero además de eso, también aprendo otra lección, como por ejemplo:

1. Las lagunas de conocimiento deben abordarse antes que nada.

2. Las cosas pueden ponerse difíciles, pero esta no es una razón para renunciar.

3. Debe pedir ayuda si la necesita.

Fuentes

[1] T. Bandara, Construyamos un sistema informático distribuido simple, para la nube moderna (2021), Hacia la ciencia de datos

[2] R. Gandhi, R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Algoritmos de detección de objetos (2018), Hacia la ciencia de datos

[3] N.Kumar, Explicación de las redes neuronales recurrentes (RNN): al estilo ELI5 (2019), Hacia la ciencia de datos

[4] T. Lin, P. Dollár, R. Girshick, K. He, B. Hariharan y S. Belongie, Característica Pyramid Networks para la detección de objetos (2016), arXiv

[5] T. Lin, P. Goyal, R. Girshick, K. He y P. Dollár, Pérdida focal para detección de objetos densos (2017), arXiv

[6] A.Pai, CNN vs. RNN vs. ANN: análisis de 3 tipos de redes neuronales en aprendizaje profundo (2020), Analytics Vidhya

[7] R. Pupa, Máquinas de vectores de soporte (SVM): descripción general (2018), Hacia la ciencia de datos

[8] S. Saha, Una guía completa de redes neuronales convolucionales: al estilo ELI5 (2018), Hacia la ciencia de datos

[9] A. Tch, El cuadro mayormente completo de Redes Neuronales, explicado (2017), Hacia la ciencia de datos

[10] N.Zeng, RetinaNet explicado y desmitificado (2018), blog.zenggyu.com


El uso del aprendizaje profundo para la detección de objetos en imágenes aéreas se publicó originalmente en Hacia la IA en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.

Publicado a través de Hacia la IA