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 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:
- Importa as bibliotecas necessárias (
cv2
,ultralytics
). - Carrega um modelo YOLOv8 pré-treinado.
- Define a região de contagem (por exemplo, um polígono, uma linha, etc.).
- Configura a captura de vídeo e inicializa o contador de objectos.
- 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:
- 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.
- 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.
- 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 :
- 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.
- 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.
- 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.
- 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.