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: Contagem de objectos por classe 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

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()
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
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

FAQ

Como é que conto objectos num vídeo utilizando Ultralytics YOLOv8 ?

Para contar objectos num vídeo utilizando Ultralytics YOLOv8 , podes seguir estes passos:

  1. Importa as bibliotecas necessárias (cv2, ultralytics).
  2. Carrega um modelo YOLOv8 pré-treinado.
  3. Define a região de contagem (por exemplo, um polígono, uma linha, etc.).
  4. Configura a captura de vídeo e inicializa o contador de objectos.
  5. Processa cada fotograma para localizar objectos e contá-los dentro da região definida.

Aqui tens um exemplo simples para contar numa região:

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 mais configurações e opções na secção Contagem de objectos.

Quais são as vantagens de utilizar Ultralytics YOLOv8 para a contagem de objectos?

A utilização de Ultralytics YOLOv8 para a contagem de objectos oferece várias vantagens:

  1. Otimização de recursos: Facilita a gestão eficiente de recursos ao fornecer contagens precisas, ajudando a otimizar a atribuição de recursos em indústrias como a gestão de inventário.
  2. Segurança melhorada: Melhora a segurança e a vigilância ao seguir e contar com precisão as entidades, ajudando na deteção proactiva de ameaças.
  3. Tomada de decisões informada: Oferece informações valiosas para a tomada de decisões, optimizando processos em domínios como o retalho, a gestão de tráfego e muito mais.

Para aplicações reais e exemplos de código, visita a secção Vantagens da contagem de objectos.

Como é que posso contar classes específicas de objectos utilizando Ultralytics YOLOv8 ?

Para contar classes específicas de objectos utilizando Ultralytics YOLOv8 , é necessário especificar as classes em que está interessado durante a fase de rastreio. Abaixo está um exemplo 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])

Neste exemplo, classes_to_count=[0, 2], o que significa que conta os objectos da classe 0 e 2 (por exemplo, pessoa e carro).

Por que razão devo utilizar YOLOv8 em vez de outros modelos de deteção de objectos para aplicações em tempo real?

Ultralytics YOLOv8 oferece várias vantagens em relação a outros modelos de deteção de objectos, como o Faster R-CNN, o SSD e as versões anteriores do YOLO :

  1. Velocidade e eficiência: YOLOv8 oferece capacidades de processamento em tempo real, tornando-o ideal para aplicações que requerem inferência a alta velocidade, como a vigilância e a condução autónoma.
  2. Precisão: Proporciona uma precisão de ponta para tarefas de deteção e seguimento de objectos, reduzindo o número de falsos positivos e melhorando a fiabilidade geral do sistema.
  3. Facilidade de integração: YOLOv8 oferece uma integração perfeita com várias plataformas e dispositivos, incluindo dispositivos móveis e de ponta, o que é crucial para as aplicações modernas de IA.
  4. Flexibilidade: Suporta várias tarefas, como deteção, segmentação e rastreamento de objetos com modelos configuráveis para atender a requisitos específicos de casos de uso.

Consulta Ultralytics YOLOv8 Documentation para conheceres melhor as suas funcionalidades e comparações de desempenho.

Posso utilizar o YOLOv8 para aplicações avançadas como a análise de multidões e a gestão de tráfego?

Sim, o Ultralytics YOLOv8 é perfeitamente adequado para aplicações avançadas, como a análise de multidões e a gestão de tráfego, devido às suas capacidades de deteção em tempo real, escalabilidade e flexibilidade de integração. As suas funcionalidades avançadas permitem o seguimento, contagem e classificação de objectos com elevada precisão em ambientes dinâmicos. Exemplos de casos de utilização incluem:

  • Análise de multidões: Monitoriza e gere grandes aglomerações, garantindo a segurança e optimizando o fluxo de pessoas.
  • Gestão de tráfego: Acompanha e conta os veículos, analisa os padrões de tráfego e gere o congestionamento em tempo real.

Para mais informações e detalhes de implementação, consulta o guia sobre Aplicações do mundo real da contagem de objectos com YOLOv8.



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

Comentários