Saltar al contenido

Recuento de objetos mediante Ultralytics YOLOv8

驴Qu茅 es el recuento de objetos?

El recuento de objetos con Ultralytics YOLOv8 implica la identificaci贸n y el recuento precisos de objetos espec铆ficos en v铆deos y secuencias de c谩maras. YOLOv8 destaca en aplicaciones en tiempo real, proporcionando un recuento de objetos eficiente y preciso para diversos escenarios como el an谩lisis de multitudes y la vigilancia, gracias a sus algoritmos de 煤ltima generaci贸n y a sus capacidades de aprendizaje profundo.


Observa: Recuento de objetos mediante Ultralytics YOLOv8

Observa: Recuento de objetos por clases mediante Ultralytics YOLOv8

驴Ventajas del recuento de objetos?

  • Optimizaci贸n de recursos: El recuento de objetos facilita una gesti贸n eficaz de los recursos, proporcionando recuentos precisos y optimizando la asignaci贸n de recursos en aplicaciones como la gesti贸n de inventarios.
  • Seguridad mejorada: El recuento de objetos mejora la seguridad y la vigilancia mediante el seguimiento y recuento precisos de entidades, ayudando a la detecci贸n proactiva de amenazas.
  • Toma de decisiones informada: El recuento de objetos ofrece informaci贸n valiosa para la toma de decisiones, optimizando los procesos en el comercio minorista, la gesti贸n del tr谩fico y otros 谩mbitos diversos.

Aplicaciones en el mundo real

Log铆stica Acuicultura
Recuento de paquetes con cinta transportadora Ultralytics YOLOv8 Recuento de peces en el mar utilizando Ultralytics YOLOv8
Recuento de paquetes con cinta transportadora Ultralytics YOLOv8 Recuento de peces en el mar utilizando Ultralytics YOLOv8

Recuento de objetos mediante YOLOv8 Ejemplo

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

# Define region points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

# Define region points as a polygon with 5 points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

# Define line points
line_points = [(20, 400), (1080, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

line_points = [(20, 400), (1080, 400)]  # line or region points
classes_to_count = [0, 2]  # person and car classes for count

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
La regi贸n es m贸vil

Puedes mover la regi贸n a cualquier lugar del marco haciendo clic en sus bordes

Argumento ObjectCounter

Aqu铆 tienes una tabla con los ObjectCounter argumentos:

Nombre Tipo Por defecto Descripci贸n
names dict None Diccionario de nombres de clases.
reg_pts list [(20, 400), (1260, 400)] Lista de puntos que definen la regi贸n de recuento.
count_reg_color tuple (255, 0, 255) Color RGB de la regi贸n de recuento.
count_txt_color tuple (0, 0, 0) Color RGB del texto de recuento.
count_bg_color tuple (255, 255, 255) Color RGB del fondo del texto de recuento.
line_thickness int 2 Grosor de l铆nea de los cuadros delimitadores.
track_thickness int 2 Grosor de las l铆neas de la v铆a.
view_img bool False Bandera para controlar si se muestra el flujo de v铆deo.
view_in_counts bool True Indicador para controlar si se muestran los recuentos en el flujo de v铆deo.
view_out_counts bool True Bandera para controlar si se muestran los recuentos de salida en el flujo de v铆deo.
draw_tracks bool False Indicador para controlar si se dibujan las pistas del objeto.
track_color tuple None Color RGB de las pistas.
region_thickness int 5 Grosor de la regi贸n de recuento de objetos.
line_dist_thresh int 15 Umbral de distancia euclidiana para el contador de l铆neas.
cls_txtdisplay_gap int 50 Muestra el espacio entre cada recuento de clases.

Argumentos model.track

Nombre Tipo Por defecto Descripci贸n
source im0 None directorio fuente de im谩genes o v铆deos
persist bool False persistencia de pistas entre fotogramas
tracker str botsort.yaml M茅todo de seguimiento 'bytetrack' o 'botsort'
conf float 0.3 Umbral de confianza
iou float 0.5 Umbral del pagar茅
classes list None filtrar los resultados por clase, es decir, classes=0, o classes=[0,2,3]
verbose bool True Mostrar los resultados del seguimiento de objetos

PREGUNTAS FRECUENTES

驴C贸mo cuento objetos en un v铆deo utilizando Ultralytics YOLOv8 ?

Para contar objetos en un v铆deo utilizando Ultralytics YOLOv8 , puedes seguir estos pasos:

  1. Importa las bibliotecas necesarias (cv2, ultralytics).
  2. Carga un modelo YOLOv8 preentrenado.
  3. Define la regi贸n de recuento (por ejemplo, un pol铆gono, una l铆nea, etc.).
  4. Configura la captura de v铆deo e inicializa el contador de objetos.
  5. Procesa cada fotograma para rastrear los objetos y contarlos dentro de la regi贸n definida.

He aqu铆 un ejemplo sencillo para contar en una regi贸n:

import cv2

from ultralytics import YOLO, solutions


def count_objects_in_region(video_path, output_video_path, model_path):
    """Count objects in a specific region within a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    assert cap.isOpened(), "Error reading video file"
    w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
    region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=region_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolov8n.pt")

Explora m谩s configuraciones y opciones en la secci贸n Recuento de objetos.

驴Qu茅 ventajas tiene utilizar Ultralytics YOLOv8 para el recuento de objetos?

Utilizar Ultralytics YOLOv8 para el recuento de objetos ofrece varias ventajas:

  1. Optimizaci贸n de recursos: Facilita la gesti贸n eficaz de los recursos proporcionando recuentos precisos, ayudando a optimizar la asignaci贸n de recursos en sectores como la gesti贸n de inventarios.
  2. Seguridad mejorada: Mejora la seguridad y la vigilancia mediante el seguimiento y recuento precisos de entidades, ayudando a la detecci贸n proactiva de amenazas.
  3. Toma de decisiones informada: Ofrece informaci贸n valiosa para la toma de decisiones, optimizando procesos en 谩mbitos como el comercio minorista, la gesti贸n del tr谩fico, etc.

Para aplicaciones reales y ejemplos de c贸digo, visita la secci贸n Ventajas del Recuento de Objetos.

驴C贸mo puedo contar clases espec铆ficas de objetos utilizando Ultralytics YOLOv8 ?

Para contar clases espec铆ficas de objetos utilizando Ultralytics YOLOv8 , tienes que especificar las clases que te interesan durante la fase de seguimiento. A continuaci贸n se muestra un ejemplo de Python :

import cv2

from ultralytics import YOLO, solutions


def count_specific_classes(video_path, output_video_path, model_path, classes_to_count):
    """Count specific classes of objects in a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    assert cap.isOpened(), "Error reading video file"
    w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
    line_points = [(20, 400), (1080, 400)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=line_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_specific_classes("path/to/video.mp4", "output_specific_classes.avi", "yolov8n.pt", [0, 2])

En este ejemplo, classes_to_count=[0, 2]lo que significa que cuenta los objetos de la clase 0 y 2 (por ejemplo, persona y coche).

驴Por qu茅 deber铆a utilizar YOLOv8 en lugar de otros modelos de detecci贸n de objetos para aplicaciones en tiempo real?

Ultralytics YOLOv8 proporciona varias ventajas sobre otros modelos de detecci贸n de objetos, como Faster R-CNN, SSD y las versiones anteriores de YOLO :

  1. Velocidad y eficacia: YOLOv8 ofrece capacidades de procesamiento en tiempo real, por lo que es ideal para aplicaciones que requieren inferencia a alta velocidad, como la vigilancia y la conducci贸n aut贸noma.
  2. Precisi贸n: Proporciona una precisi贸n de vanguardia para las tareas de detecci贸n y seguimiento de objetos, reduciendo el n煤mero de falsos positivos y mejorando la fiabilidad general del sistema.
  3. Facilidad de integraci贸n: YOLOv8 ofrece una integraci贸n perfecta con varias plataformas y dispositivos, incluidos los dispositivos m贸viles y de borde, lo que es crucial para las aplicaciones modernas de IA.
  4. Flexibilidad: Admite diversas tareas, como la detecci贸n, segmentaci贸n y seguimiento de objetos, con modelos configurables para satisfacer los requisitos espec铆ficos de cada caso de uso.

Consulta ladocumentaci贸n de Ultralytics YOLOv8 para profundizar en sus funciones y comparar su rendimiento.

驴Puedo utilizar YOLOv8 para aplicaciones avanzadas como el an谩lisis de multitudes y la gesti贸n del tr谩fico?

S铆, Ultralytics YOLOv8 es perfectamente adecuado para aplicaciones avanzadas como el an谩lisis de multitudes y la gesti贸n del tr谩fico, gracias a su capacidad de detecci贸n en tiempo real, su escalabilidad y su flexibilidad de integraci贸n. Sus funciones avanzadas permiten seguir, contar y clasificar objetos con gran precisi贸n en entornos din谩micos. Ejemplos de casos de uso

  • An谩lisis de multitudes: Supervisa y gestiona las grandes concentraciones, garantizando la seguridad y optimizando el flujo de multitudes.
  • Gesti贸n del Tr谩fico: Sigue y cuenta los veh铆culos, analiza los patrones de tr谩fico y gestiona la congesti贸n en tiempo real.

Para m谩s informaci贸n y detalles de implementaci贸n, consulta la gu铆a sobre Aplicaciones en el mundo real del recuento de objetos con YOLOv8.



Creado 2023-12-02, Actualizado 2024-07-14
Autores: RizwanMunawar (6), glenn-jocher (15), IvorZhu331 (1), AyushExel (1)

Comentarios