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.
line_thickness int 2 Espessura da linha para caixas delimitadoras.
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.

Argumentos model.track

Argumenta Tipo Predefinição Descrição
source str None Specifies the source directory for images or videos. Supports file paths and URLs.
persist bool False Enables persistent tracking of objects between frames, maintaining IDs across video sequences.
tracker str botsort.yaml Specifies the tracking algorithm to use, e.g., bytetrack.yaml ou botsort.yaml.
conf float 0.3 Sets the confidence threshold for detections; lower values allow more objects to be tracked but may include false positives.
iou float 0.5 Sets the Intersection over Union (IoU) threshold for filtering overlapping detections.
classes list None Filters results by class index. For example, classes=[0, 2, 3] only tracks the specified classes.
verbose bool True Controls the display of tracking results, providing a visual output of tracked objects.

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.


📅C riado há 9 meses ✏️ Atualizado há 3 dias

Comentários