Salta para o conteúdo

Contagem de objectos utilizando Ultralytics YOLOv8 🚀

O que é a contagem de objectos?

A contagem de objectos com Ultralytics YOLOv8 envolve a identificação e contagem precisas de objectos específicos em vídeos e fluxos de câmaras. O YOLOv8 destaca-se em aplicações em tempo real, fornecendo uma contagem de objectos eficiente e precisa para vários cenários, como a análise de multidões e a vigilância, graças aos seus algoritmos de ponta e capacidades de aprendizagem profunda.


Observa: Contagem de objectos utilizando Ultralytics YOLOv8

Observa: Class-wise Object Counting using Ultralytics YOLOv8

Vantagens da contagem de objectos?

  • Otimização de recursos: A contagem de objectos facilita a gestão eficiente de recursos, fornecendo contagens precisas e optimizando a atribuição de recursos em aplicações como a gestão de inventário.
  • Segurança melhorada: A contagem de objectos melhora a segurança e a vigilância ao seguir e contar entidades com precisão, ajudando na deteção proactiva de ameaças.
  • Tomada de decisões informada: A contagem de objectos oferece informações valiosas para a tomada de decisões, optimizando os processos no retalho, na gestão do tráfego e em vários outros domínios.

Aplicações no mundo real

Logística Aquacultura
Contagem de pacotes de correia transportadora usando Ultralytics YOLOv8 Contagem de peixes no mar usando Ultralytics YOLOv8
Contagem de pacotes de correia transportadora usando Ultralytics YOLOv8 Contagem de peixes no mar usando Ultralytics YOLOv8

Contagem de objectos utilizando YOLOv8 Exemplo

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()
A região é móvel

Podes mover a região para qualquer parte da moldura clicando nas suas extremidades

Argumenta ObjectCounter

Aqui tens uma tabela com os ObjectCounter argumentos:

Nome Tipo Predefinição Descrição
classes_names dict None Dicionário de nomes de classes.
reg_pts list [(20, 400), (1260, 400)] Lista de pontos que definem a região de contagem.
count_reg_color tuple (255, 0, 255) Cor RGB da região de contagem.
count_txt_color tuple (0, 0, 0) Cor RGB do texto da contagem.
count_bg_color tuple (255, 255, 255) Cor RGB do fundo do texto da contagem.
line_thickness int 2 Espessura da linha para caixas delimitadoras.
track_thickness int 2 Espessura das linhas de traçado.
view_img bool False Sinalizador para controlar se o fluxo de vídeo deve ser apresentado.
view_in_counts bool True Sinalizador para controlar a apresentação das contagens de entrada no fluxo de vídeo.
view_out_counts bool True Sinalizador para controlar a apresentação das contagens de saída no fluxo de vídeo.
draw_tracks bool False Sinalizador para controlar se desenha as pistas do objeto.
track_color tuple None Cor RGB das faixas.
region_thickness int 5 Espessura da região de contagem de objectos.
line_dist_thresh int 15 Limiar da distância euclidiana para o contador de linhas.
cls_txtdisplay_gap int 50 Mostra o intervalo entre cada contagem de classes.

Argumentos model.track

Nome Tipo Predefinição Descrição
source im0 None diretório de origem para imagens ou vídeos
persist bool False persistência de faixas entre fotogramas
tracker str botsort.yaml Método de rastreio 'bytetrack' ou 'botsort'
conf float 0.3 Limiar de confiança
iou float 0.5 Limiar IOU
classes list None filtra os resultados por classe, ou seja, classes=0, ou classes=[0,2,3]
verbose bool True Apresenta os resultados do rastreio de objectos


Created 2023-12-02, Updated 2024-06-10
Authors: glenn-jocher (14), IvorZhu331 (1), RizwanMunawar (6), AyushExel (1)

Comentários