Guía paso a paso para contar hormigas paseantes en un árbol mediante técnicas de detección y seguimiento.
Contar objetos en videos es una tarea desafiante en Visión Artificial. A diferencia de contar objetos en imágenes estáticas, los videos implican complejidades adicionales, ya que los objetos pueden moverse, quedar ocluidos o aparecer y desaparecer en diferentes momentos, lo que complica el proceso de conteo.
En este tutorial, demostraremos cómo contar hormigas que se mueven a lo largo de un árbol, utilizando técnicas de seguimiento y detección de objetos. Aprovecharemos la plataforma Ultralytics para integrar el modelo YOLOv8 para la detección, BoT-SORT para el seguimiento y un contador de líneas para contar las hormigas.
En una canalización típica de conteo de objetos de video, cada cuadro pasa por una secuencia de procesos: detección, seguimiento y conteo. Aquí hay una breve descripción general de cada paso:
- Detección: Un detector de objetos identifica y ubica objetos en cada cuadro, produciendo cuadros delimitadores a su alrededor.
- Seguimiento: Un rastreador sigue estos objetos a lo largo de los fotogramas y asigna ID únicos a cada objeto para garantizar que se cuenten solo una vez.
- Contando: El módulo de conteo agrega esta información y agrega cada objeto nuevo para proporcionar resultados precisos.
Conectar un detector de objetos, un rastreador y un contador puede requerir una codificación extensa. Afortunadamente, la biblioteca Ultralytics [1] Simplifica este proceso al proporcionar una canalización conveniente que integra perfectamente estos componentes.
El primer paso es detectar que las hormigas en cada cuadro producen cuadros delimitadores a su alrededor. En este tutorial, usaremos un detector YOLOv8 que entrené de antemano para detectar hormigas. solía Puesta a tierra de DINO [2] para etiquetar los datos, y luego utilicé los datos anotados para entrenar el modelo YOLOv8. Si desea obtener más información sobre cómo entrenar un modelo YOLO, consulte mi publicación anterior sobre entrenamiento YOLOv5, ya que los conceptos son similares. Para su aplicación, puede utilizar un modelo previamente entrenado o entrenar un modelo personalizado propio.
Para comenzar, necesitamos inicializar el detector con los pesos entrenados previamente:
from ultralytics import YOLO# Initialize YOLOv8 model with pre-trained weights
model = YOLO("/path/to/your/yolo_model.pt")
Posteriormente, usaremos el detector para detectar hormigas en cada cuadro dentro del bucle de video, integrando la detección con el proceso de seguimiento.
Dado que las hormigas aparecen varias veces en los cuadros del video, es esencial rastrear cada hormiga y asignarle una identificación única, para garantizar que cada hormiga se cuente solo una vez. Ultralytics admite tanto BoT-SORT [3] y ByteTrack [4] para seguimiento.
- Pista de bytes: Proporciona un equilibrio entre precisión y velocidad, con menor complejidad computacional. Es posible que no maneje oclusiones y movimientos de la cámara tan bien como BoT-SORT.
- BOT-CLASIFICACIÓN: Ofrece precisión de seguimiento mejorada y solidez sobre ByteTrack, especialmente en escenarios desafiantes con oclusiones y movimiento de cámara. Sin embargo, esto tiene el costo de una mayor complejidad computacional y velocidades de cuadro más bajas.
La elección entre estos algoritmos depende de los requisitos específicos de su aplicación.
Cómo funciona BoT-SORT: BoT-SORT es un rastreador de múltiples objetos, lo que significa que puede rastrear múltiples objetos al mismo tiempo. Combina información de movimiento y apariencia junto con compensación de movimiento de la cámara. Las posiciones de los objetos se predicen mediante un filtro de Kalman y las coincidencias con las pistas existentes se basan tanto en su ubicación como en sus características visuales. Este enfoque permite a BoT-SORT mantener seguimientos precisos incluso en presencia de oclusiones o cuando la cámara está en movimiento.
Un rastreador bien configurado puede compensar las fallas leves del detector. Por ejemplo, si el detector de objetos no detecta temporalmente una hormiga, el rastreador puede mantener el seguimiento de la hormiga utilizando señales de movimiento y apariencia.
El detector y el rastreador se utilizan de forma iterativa en cada cuadro dentro del bucle de vídeo para producir las pistas. Así es como lo integras en tu bucle de procesamiento de vídeo:
tracks = model.track(frame, persist=True, tracker=’botsort.yaml’, iou=0.2)
La configuración del rastreador se define en el archivo ‘botsort.yaml’. Puede ajustar estos parámetros para que se ajusten mejor a sus necesidades. Para cambiar el rastreador a ByteTrack, simplemente pase ‘bytetrack.yaml’ al parámetro del rastreador.
Asegúrese de que el valor de Intersección sobre unión (IoU) se ajuste a los requisitos de su aplicación; El umbral de IoU (utilizado para la supresión no máxima) determina qué tan cercanas deben ser las detecciones para que se consideren el mismo objeto. El persist=True
El argumento le dice al rastreador que el fotograma actual es parte de una secuencia y que debe esperar que las pistas del fotograma anterior persistan en el fotograma actual.
Ahora que hemos detectado y rastreado a las hormigas, el paso final es contar las hormigas únicas que cruzan una línea designada en el video. El ObjectCounter
La clase de la biblioteca Ultralytics nos permite definir una región de conteo, que puede ser una línea o un polígono. Para este tutorial, usaremos una línea simple como nuestra región de conteo. Este enfoque reduce los errores al garantizar que una hormiga se cuente solo una vez cuando cruza la línea, incluso si su ID única cambia debido a errores de seguimiento.
Primero, inicializamos el ObjectCounter
antes del bucle del vídeo:
counter = solutions.ObjectCounter(
view_img=True, # Display the image during processing
reg_pts=[(512, 320), (512, 1850)], # Region of interest points
classes_names=model.names, # Class names from the YOLO model
draw_tracks=True, # Draw tracking lines for objects
line_thickness=2, # Thickness of the lines drawn
)
Dentro del bucle de vídeo, el ObjectCounter
contará las pistas producidas por el rastreador. Los puntos de la línea se pasan al contador en el parámetro reg_pts, en el [(x1, y1), (x2, y2)] formato. Cuando el punto central del cuadro delimitador de una hormiga cruza la línea por primera vez, se suma al conteo de acuerdo con la dirección de su trayectoria. Los objetos que se mueven en una dirección determinada cuentan como «dentro», y los objetos que se mueven en la otra dirección cuentan como «fuera».
# Use the Object Counter to count new objects
frame = counter.start_counting(frame, tracks)
Ahora que hemos visto los componentes de conteo, integremos el código con el bucle de video y guardemos el video resultante.
# Install and import Required Libraries
%pip install ultralytics
import cv2
from ultralytics import YOLO, solutions# Define paths:
path_input_video = '/path/to/your/input_video.mp4'
path_output_video = "/path/to/your/output_video.avi"
path_model = "/path/to/your/yolo_model.pt"
# Initialize YOLOv8 Detection Model
model = YOLO(path_model)
# Initialize Object Counter
counter = solutions.ObjectCounter(
view_img=True, # Display the image during processing
reg_pts=[(512, 320), (512, 1850)], # Region of interest points
classes_names=model.names, # Class names from the YOLO model
draw_tracks=True, # Draw tracking lines for objects
line_thickness=2, # Thickness of the lines drawn
)
# Open the Video File
cap = cv2.VideoCapture(path_input_video)
assert cap.isOpened(), "Error reading video file"
# Initialize the Video Writer to save resulted video
video_writer = cv2.VideoWriter(path_output_video, cv2.VideoWriter_fourcc(*"mp4v"), 30, (1080, 1920))
# itterate over video frames:
frame_count = 0
while cap.isOpened():
success, frame = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
# Perform object tracking on the current frame
tracks = model.track(frame, persist=True, tracker='botsort.yaml', iou=0.2)
# Use the Object Counter to count objects in the frame and get the annotated image
frame = counter.start_counting(frame, tracks)
# Write the annotated frame to the output video
video_writer.write(frame)
frame_count += 1
# Release all Resources:
cap.release()
video_writer.release()
cv2.destroyAllWindows()
# Print counting results:
print(f'In: {counter.in_counts}\nOut: {counter.out_counts}\nTotal: {counter.in_counts + counter.out_counts}')
print(f'Saves output video to {path_output_video}')
El código anterior integra la detección y el seguimiento de objetos en un bucle de procesamiento de video para guardar el video anotado. Usando OpenCV, abrimos el video de entrada y configuramos un escritor de video para la salida. En cada cuadro, realizamos un seguimiento de objetos con BoTSORT, contamos los objetos y anotamos el cuadro. Los fotogramas anotados, incluidos los cuadros delimitadores, los ID únicos, las trayectorias y los recuentos de «entrada» y «salida», se guardan en el vídeo de salida. Los recuentos de ‘entradas’ y ‘salidas’ se pueden recuperar de counter.in_counts
y counter.out_counts
respectivamente, y también están impresos en el vídeo de salida.
En el vídeo comentado, contamos correctamente un total de 85 hormigas, 34 entrando y 51 saliendo. Para recuentos precisos, es fundamental que el detector funcione bien y que el rastreador esté bien configurado. Un rastreador bien configurado puede compensar los fallos del detector, asegurando la continuidad del seguimiento.
En el vídeo anotado podemos ver que el rastreador manejó muy bien las detecciones faltantes, como lo demuestra la desaparición del cuadro delimitador alrededor de una hormiga y su regreso en fotogramas posteriores con la identificación correcta. Además, los errores de seguimiento que asignaron diferentes ID al mismo objeto (por ejemplo, la hormiga número 42 se convirtió en la número 48) no afectaron los conteos ya que solo se cuentan las hormigas que cruzan la línea.
En este tutorial, exploramos cómo contar objetos en videos utilizando técnicas avanzadas de detección y seguimiento de objetos. Utilizamos YOLOv8 para detectar hormigas y BoT-SORT para un seguimiento sólido, todo integrado perfectamente con la biblioteca Ultralytics.
¿Querer aprender más?
Referencias
[3] BoT-SORT: Seguimiento multipeatonal de asociaciones robustas
[4] ByteTrack: seguimiento de múltiples objetos asociando cada cuadro de detección