Conteo de Clientes en Locales con Yolo y OpenCV
Clase 9 de 16 • Curso de Visión Artificial con Python
Resumen
La detección de personas en tiempo real mediante inteligencia artificial ha revolucionado la forma en que los negocios analizan el comportamiento de sus clientes. Esta tecnología no solo permite identificar personas, sino también realizar un seguimiento preciso de sus movimientos, lo que resulta invaluable para optimizar la distribución de espacios comerciales y mejorar la experiencia del cliente. El conteo automático de personas mediante sistemas de visión por computadora representa una solución eficiente para analizar el tráfico en establecimientos comerciales.
¿Cómo implementar un sistema de conteo de clientes con YOLO?
Para implementar un sistema de conteo de clientes en un local comercial utilizando YOLO (You Only Look Once), necesitamos seguir varios pasos fundamentales. Este proceso comienza con la instalación de las dependencias necesarias, principalmente la librería Ultralytics, que nos proporciona una implementación eficiente de YOLO.
# Instalación de dependencias
!pip install ultralytics
Una vez instaladas las dependencias, debemos cargar el video que queremos analizar. En este caso, trabajamos con un archivo llamado "people_detection.mp4" que muestra el movimiento de personas en un establecimiento comercial con diferentes secciones.
# Definición de rutas
video_path = "people_detection.mp4"
output_path = "output_video.avi"
El siguiente paso consiste en configurar el sistema para guardar los resultados del análisis, incluyendo el conteo de personas y el seguimiento de cada individuo a lo largo de los pasillos del establecimiento.
¿Qué función matemática nos permite detectar el cruce de líneas?
El concepto clave para el conteo de personas es la detección de cruces de línea. Para esto, implementamos una función que calcula si un punto (el centroide de una persona detectada) cruza una línea predefinida. Esta función matemática nos permite determinar si una persona ha pasado de un lado a otro de una línea virtual.
# Función para detectar si un punto está a la derecha o izquierda de una línea
def is_point_right_of_line(point, line):
x, y = point
(x1, y1), (x2, y2) = line
return (y2 - y1) * (x - x1) - (x2 - x1) * (y - y1) > 0
Para implementar esta solución, necesitamos definir líneas de conteo en ubicaciones estratégicas. En nuestro ejemplo, establecemos dos líneas: una para la sección de ropa y otra para la sección de deportes.
# Definición de líneas de conteo
line1 = [(130, 180), (25, 300)] # Línea para sección de ropa
line2 = [(350, 180), (450, 300)] # Línea para sección de deportes
¿Cómo realizar el seguimiento de personas entre frames?
El seguimiento de personas entre frames consecutivos es fundamental para evitar contar a la misma persona múltiples veces. Para lograr esto, implementamos un sistema que asocia los centroides detectados en el frame actual con los del frame anterior.
# Parámetros para el seguimiento
association_threshold = 50 # Umbral para asociar detecciones entre frames
centroids_prev_frame = [] # Lista para almacenar centroides del frame anterior
El proceso completo de detección y conteo se realiza frame por frame siguiendo estos pasos:
- Detectar personas en el frame actual usando YOLO
- Calcular el centroide de cada persona detectada
- Asociar los centroides actuales con los del frame anterior
- Verificar si algún centroide ha cruzado alguna de las líneas de conteo
- Actualizar los contadores correspondientes
- Dibujar las visualizaciones (rectángulos, centroides, líneas y contadores)
- Guardar el frame procesado
- Actualizar la lista de centroides para el siguiente frame
# Inicialización del modelo YOLO
model = YOLO('yolov8n.pt')
# Contadores para cada línea
counter_line1 = 0
counter_line2 = 0
# Procesamiento del video frame por frame
while True:
ret, frame = cap.read()
if not ret:
break
# Detección de personas con YOLO
results = model(frame)
# Procesamiento de detecciones
# ...
# Verificación de cruces de línea
# ...
# Actualización de contadores
# ...
# Visualización de resultados
# ...
# Guardar frame procesado
out.write(frame)
# Actualizar centroides para el siguiente frame
centroids_prev_frame = current_centroids.copy()
¿Cómo optimizar el sistema para mejorar la precisión del conteo?
Durante la implementación, podemos encontrar algunos desafíos que afectan la precisión del conteo. Los problemas más comunes incluyen la detección de falsos positivos cuando varias personas están muy cerca entre sí y la falta de detección cuando las personas se mueven rápidamente.
Para mejorar la precisión del sistema, podemos ajustar varios parámetros:
- Ajustar el umbral de confianza (confidence threshold): Aumentar este valor (por ejemplo, a 0.7) ayuda a eliminar detecciones poco confiables que podrían ser falsos positivos.
# Filtrar detecciones con baja confianza
confidence_threshold = 0.7
boxes = boxes[confidences >= confidence_threshold]
- Modificar la posición y longitud de las líneas de conteo: Ajustar la ubicación de las líneas puede mejorar la detección de cruces en áreas específicas.
# Ajuste de la posición de la línea 1
line1 = [(130, 120), (25, 300)] # Modificado desde (130, 180)
- Ajustar el umbral de asociación: Reducir este valor permite un seguimiento más preciso de las personas entre frames consecutivos.
# Reducir el umbral de asociación
association_threshold = 30 # Reducido desde 50
Estos ajustes nos permiten mejorar significativamente la precisión del sistema. Por ejemplo, en el caso donde dos personas caminando juntas eran contadas erróneamente como tres, después de los ajustes, el sistema correctamente cuenta solo dos personas.
El último desafío consiste en detectar a una persona que sale corriendo rápidamente del establecimiento. Para capturar este caso, se necesita ajustar aún más los parámetros, especialmente reduciendo el umbral de confianza para detectar movimientos rápidos y ajustando la posición de las líneas para asegurar que cruzan las rutas de salida.
La implementación de sistemas de conteo de personas con inteligencia artificial ofrece a los negocios información valiosa sobre el comportamiento de sus clientes, permitiéndoles optimizar la distribución de sus espacios, mejorar la experiencia del cliente y tomar decisiones basadas en datos. ¿Has implementado alguna solución similar o tienes ideas para mejorar este sistema? Comparte tu experiencia en los comentarios.