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

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

from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(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

Argumentos opcionais set_args

Nome Tipo Predefinição Descrição
view_img bool False Apresenta quadros com contagens
view_in_counts bool True Apresenta as contagens iniciais apenas no fotograma de vídeo
view_out_counts bool True Apresenta as contagens totais apenas no fotograma de vídeo
line_thickness int 2 Aumenta as caixas delimitadoras e conta a espessura do texto
reg_pts list [(20, 400), (1260, 400)] Pontos que definem a área da região
classes_names dict model.model.names Dicionário de nomes de classes
count_reg_color RGB Color (255, 0, 255) Cor da região ou linha de contagem de objectos
track_thickness int 2 Espessura das linhas de rastreio
draw_tracks bool False Ativar o desenho de linhas de traço
track_color RGB Color (0, 255, 0) Cor para cada linha de pista
line_dist_thresh int 15 Limiar da distância euclidiana para o contador de linhas
count_txt_color RGB Color (255, 255, 255) Cor de primeiro plano para o texto de contagem de objectos
region_thickness int 5 Espessura da região ou linha do contador de objectos
count_bg_color RGB Color (255, 255, 255) Conta a cor do marcador

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


Criado em 2023-12-02, Atualizado em 2024-04-18
Autores: glenn-jocher (9), RizwanMunawar (1), AyushExel (1)

Comentários