Detección de objetos con ImageAI en Python

La detección de objetos es una tecnología que cae bajo el dominio más amplio de Computer Vision. Se trata de identificar y rastrear objetos presentes en imágenes y v...

Introducción

La detección de objetos es una tecnología que cae bajo el dominio más amplio de Visión por computador. Se trata de identificar y rastrear objetos presentes en imágenes y videos. La detección de objetos tiene múltiples aplicaciones como detección de rostros, detección de vehículos, conteo de peatones, autos sin conductor, sistemas de seguridad, etc.

Los dos objetivos principales de la detección de objetos incluyen:

  • Para identificar todos los objetos presentes en una imagen
  • Filtrar el objeto de atención.

En este artículo, verá cómo realizar la detección de objetos en Python con la ayuda de la biblioteca ImagenAI.

Deep learning para la detección de objetos

Las técnicas de aprendizaje profundo han demostrado ser de vanguardia para varios problemas de detección de objetos. Los siguientes son algunos de los enfoques de aprendizaje profundo comúnmente utilizados para la detección de objetos:

En el resto de este artículo, veremos qué es exactamente ImageAI y cómo usarlo para realizar la detección de objetos.

IA de imagen

ImageAI es una biblioteca de Python creada para permitir a los desarrolladores crear aplicaciones y sistemas con capacidades autónomas de aprendizaje profundo y visión por computadora utilizando unas pocas líneas de código directo. ImageAI contiene una implementación de Python de casi todos los algoritmos de aprendizaje profundo de última generación como RetinaNet, [YOLOv3](https://pjreddie.com/ darknet/yolo/) y TinyYOLOv3.

ImageAI utiliza varias API que funcionan sin conexión: tiene API de detección de objetos, detección de video y seguimiento de objetos a las que se puede llamar sin acceso a Internet. ImageAI utiliza un modelo previamente entrenado y se puede personalizar fácilmente.

La clase ObjectDetection de la biblioteca ImageAI contiene funciones para realizar la detección de objetos en cualquier imagen o conjunto de imágenes, utilizando modelos previamente entrenados. Con ImageAI, puede detectar y reconocer 80 tipos diferentes de objetos comunes y cotidianos.

Configuración de su entorno

En esta parte del tutorial, trabajaremos en la instalación de ImageAI.

Para usar ImageAI, debe instalar algunas dependencias. El primer paso es tener Python instalado en su computadora. Descarga e instala Python 3 desde el sitio web oficial de Phyton.

Una vez que tenga Python instalado en su computadora, instale las siguientes dependencias usando pip:

TensorFlow

1
$ pip install tensorflow

OpenCV

1
$ pip install opencv-python

Difícil

1
$ pip install keras

Imagen IA

1
$ pip install imageAI

Ahora descargue el archivo de modelo TinyYOLOv3 que contiene el modelo de clasificación que se usará para la detección de objetos.

Realización de la detección de objetos con ImageAI

Ahora veamos cómo usar realmente la biblioteca ImageAI. Explicaré paso a paso cómo puede construir su primer modelo de detección de objetos con ImageAI.

Paso 1

Nuestra primera tarea aquí es crear las carpetas necesarias. Para este tutorial necesitamos las siguientes carpetas:

  • Detección de objetos: carpeta raíz
  • modelos: almacena el modelo preentrenado
  • entrada: almacena el archivo de imagen en el que queremos realizar la detección de objetos
  • salida: almacena el archivo de imagen con los objetos detectados

Después de haber creado sus carpetas, su carpeta Detección de objetos debería tener las siguientes subcarpetas:

1
2
3
4
5
├── input
├── models
└── output

3 directories, 0 files
Paso 2

Abra su editor de texto preferido para escribir código Python y cree un nuevo archivo detector.py.

Paso 3

Importe la clase ObjectDetection de la biblioteca ImageAI.

1
from imageai.Detection import ObjectDetection
Paso 4

Ahora que ha importado la biblioteca imageAI y la clase ObjectDetection, lo siguiente es crear una instancia de la clase ObjectDetection, como se muestra aquí:

1
detector = ObjectDetection()
Paso 5

Especifiquemos la ruta desde nuestra imagen de entrada, imagen de salida y modelo.

1
2
3
model_path = "./models/yolo-tiny.h5"
input_path = "./input/test45.jpg"
output_path = "./output/newimage.jpg"
Paso 6

Después de instanciar la clase ObjectDetection ahora podemos llamar a varias funciones de la clase. La clase contiene las siguientes funciones para llamar a modelos previamente entrenados: setModelTypeAsRetinaNet(), setModelTypeAsYOLOv3() y setModelTypeAsTinyYOLOv3().

Para el propósito de este tutorial, usaré el modelo TinyYOLOv3 previamente entrenado y, por lo tanto, usaremos la función setModelTypeAsTinyYOLOv3() para cargar nuestro modelo.

1
detector.setModelTypeAsTinyYOLOv3()
Paso 7

A continuación, llamaremos a la función setModelPath(). Esta función acepta una cadena que contiene la ruta al modelo previamente entrenado:

1
detector.setModelPath(model_path)
Paso 8

Este paso llama a la función loadModel() desde la instancia detector. Carga el modelo desde la ruta especificada anteriormente utilizando el método de clase setModelPath().

1
detector.loadModel()
Paso 9

Para detectar objetos en la imagen, necesitamos llamar a la función detectObjectsFromImage usando el objeto detector que creamos en la sección anterior.

Esta función requiere dos argumentos: imagen_de_entrada y ruta_de_imagen_de_salida. input_image es la ruta donde se encuentra la imagen que estamos detectando, mientras que el parámetro output_image_path es la ruta para almacenar la imagen con los objetos detectados. Esta función devuelve un diccionario que contiene los nombres y porcentajes de probabilidad de todos los objetos detectados en la imagen.

1
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)
Paso 10

Se puede acceder a los elementos del diccionario recorriendo cada elemento del diccionario.

1
2
for eachItem in detection:
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])
Código completo para la detección de objetos

Aquí está el código completo para la detección de imágenes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from imageai.Detection import ObjectDetection

detector = ObjectDetection()

model_path = "./models/yolo-tiny.h5"
input_path = "./input/test45.jpg"
output_path = "./output/newimage.jpg"

detector.setModelTypeAsTinyYOLOv3()
detector.setModelPath(model_path)
detector.loadModel()
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)

for eachItem in detection:
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])

En el resultado, puede ver el nombre de cada objeto detectado junto con su porcentaje de probabilidad, como se muestra a continuación:
Producción

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
car  :  54.72719073295593
car  :  58.94589424133301
car  :  62.59384751319885
car  :  74.07448291778564
car  :  91.10507369041443
car  :  97.26507663726807
car  :  97.55765795707703
person  :  53.6459743976593
person  :  56.59831762313843
person  :  72.28181958198547

Imagen original:

La imagen original, es decir, "test45", se veía así:

Imagen con detección de objetos:

Después de la detección del objeto, la imagen resultante se ve así:

Puede ver que ImageAI identificó con éxito automóviles y personas en la imagen.

Conclusión

La detección de objetos es una de las tareas de visión por computadora más comunes. Este artículo explica cómo realizar la detección de objetos en Python utilizando la biblioteca ImageAI con la ayuda de un ejemplo.

Referencias