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,
    classes_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,
    classes_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,
    classes_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,
    classes_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
classes_names dict None Diccionario de nombres de clase.
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


Creado 2023-12-02, Actualizado 2024-05-18
Autores: glenn-jocher (11), RizwanMunawar (6), AyushExel (1)

Comentarios