Skip to content

使用Ultralytics YOLO11进行对象计数

什么是对象计数?

使用Ultralytics YOLO11进行对象计数涉及在视频和摄像头流中准确识别和计数特定对象。YOLO11在实时应用中表现出色,凭借其先进的算法和深度学习能力,为各种场景如人群分析和监控提供了高效且精确的对象计数。


观看: 使用Ultralytics YOLO11进行对象计数

观看: 使用Ultralytics YOLO11进行类别对象计数

对象计数的优势?

  • 资源优化: 对象计数通过提供准确的计数,促进资源的高效管理,优化库存管理等应用中的资源分配。
  • 增强安全性: 对象计数通过准确跟踪和计数实体,增强安全性和监控,有助于主动威胁检测。
  • 明智决策: 对象计数为决策提供有价值的见解,优化零售、交通管理和其他多个领域的流程。

现实世界应用

物流 水产养殖
使用Ultralytics YOLO11进行传送带包裹计数 使用Ultralytics YOLO11在海中进行鱼类计数
使用Ultralytics YOLO11进行传送带包裹计数 使用Ultralytics YOLO11在海中进行鱼类计数

使用YOLO11进行对象计数的示例

import cv2

from ultralytics import solutions

cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "错误读取视频文件"
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("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# 初始化对象计数器
counter = solutions.ObjectCounter(
    show=True,
    region=region_points,
    model="yolo11n.pt",
)

# 处理视频
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("视频帧为空或视频处理已成功完成。")
        break
    im0 = counter.count(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import solutions
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)]

# 视频写入器
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# 初始化对象计数器
counter = solutions.ObjectCounter(
    show=True,
    region=line_points,
    model="yolo11n-obb.pt",
)

# 处理视频
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("视频帧为空或视频处理已成功完成。")
        break
    im0 = counter.count(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import solutions

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

# 定义区域点
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]

# 视频写入器
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# 初始化对象计数器
counter = solutions.ObjectCounter(
    show=True,
    region=region_points,
    model="yolo11n.pt",
)

# 处理视频
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("视频帧为空或视频处理已成功完成。")
        break
    im0 = counter.count(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import solutions

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

# 视频写入器
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# 初始化对象计数器
counter = solutions.ObjectCounter(
    show=True,
    region=line_points,
    model="yolo11n.pt",
)

# 处理视频
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("视频帧为空或视频处理已成功完成。")
        break
    im0 = counter.count(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import solutions

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

# 视频写入器
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# 初始化对象计数器
counter = solutions.ObjectCounter(
    show=True,
    model="yolo11n.pt",
    classes=[0, 1],
)

# 处理视频
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("视频帧为空或视频处理已成功完成。")
        break
    im0 = counter.count(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()

ObjectCounter 参数

以下是 ObjectCounter 参数的表格:

名称 类型 默认值 描述
model str None Ultralytics YOLO 模型文件的路径
region list [(20, 400), (1260, 400)] 定义计数区域的点列表。
line_width int 2 边界框的线条厚度。
show bool False 控制是否显示视频流的标志。
show_in bool True 控制是否在视频流上显示进入计数的标志。
show_out bool True 控制是否在视频流上显示离开计数的标志。

参数 model.track

参数 类型 默认值 描述
source str None 指定图像或视频的源目录。支持文件路径和URL。
persist bool False 启用帧间对象的持续跟踪,在视频序列中保持ID一致。
tracker str botsort.yaml 指定要使用的跟踪算法,例如 bytetrack.yamlbotsort.yaml
conf float 0.3 设置检测的置信度阈值;较低的值允许更多对象被跟踪,但可能包含误报。
iou float 0.5 设置用于过滤重叠检测的交并比 (IoU) 阈值。
classes list None 按类别索引过滤结果。例如,classes=[0, 2, 3] 仅跟踪指定的类别。
verbose bool True 控制跟踪结果的显示,提供被跟踪对象的视觉输出。

常见问题

如何使用Ultralytics YOLO11在视频中计数对象?

要使用Ultralytics YOLO11在视频中计数对象,您可以按照以下步骤操作:

  1. 导入必要的库(cv2ultralytics)。
  2. 定义计数区域(例如,多边形、线条等)。
  3. 设置视频捕获并初始化对象计数器。
  4. 处理每一帧以跟踪对象并在定义的区域内计数。

以下是一个简单的计数区域内的对象的示例:

import cv2

from ultralytics import solutions


def count_objects_in_region(video_path, output_video_path, model_path):
    """在视频的特定区域内计数对象。"""
    cap = cv2.VideoCapture(video_path)
    assert cap.isOpened(), "读取视频文件时出错"
    w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

    region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
    counter = solutions.ObjectCounter(show=True, region=region_points, model=model_path)

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("视频帧为空或视频处理已成功完成。")
            break
        im0 = counter.count(im0)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolo11n.pt")

对象计数部分探索更多配置和选项。

使用Ultralytics YOLO11进行对象计数有哪些优势?

使用Ultralytics YOLO11进行对象计数具有以下几个优势:

  1. 资源优化: 它通过提供准确的计数来促进资源的高效管理,帮助优化库存管理等行业的资源分配。
  2. 增强安全性: 它通过准确跟踪和计数实体来增强安全性和监控,有助于主动威胁检测。
  3. 决策支持: 它为决策提供有价值的见解,优化零售、交通管理等领域的流程。

访问对象计数的优势部分获取实际应用和代码示例。

如何使用Ultralytics YOLO11计数特定类别的对象?

要使用Ultralytics YOLO11计数特定类别的对象,您需要在跟踪阶段指定您感兴趣的类别。以下是一个Python示例:

import cv2

from ultralytics import solutions


def count_specific_classes(video_path, output_video_path, model_path, classes_to_count):
    """在视频中计数特定类别的对象。"""
    cap = cv2.VideoCapture(video_path)
    assert cap.isOpened(), "读取视频文件时出错"
    w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

    line_points = [(20, 400), (1080, 400)]
    counter = solutions.ObjectCounter(show=True, region=line_points, model=model_path, classes=classes_to_count)

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("视频帧为空或视频处理已成功完成。")
            break
        im0 = counter.count(im0)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_specific_classes("path/to/video.mp4", "output_specific_classes.avi", "yolo11n.pt", [0, 2])

在这个示例中,classes_to_count=[0, 2],这意味着它计数类别为02的对象(例如,人和车)。

为什么在实时应用中我应该使用YOLO11而不是其他对象检测模型?

Ultralytics YOLO11相比其他对象检测模型如Faster R-CNN、SSD和之前的YOLO版本,提供了几个优势: 1. 速度与效率: YOLO11 提供实时处理能力,非常适合需要高速推理的应用,如监控和自动驾驶。 2. 准确性: 它在物体检测和跟踪任务中提供最先进的准确性,减少误报数量并提高系统整体可靠性。 3. 易于集成: YOLO11 能够无缝集成到各种平台和设备中,包括移动和边缘设备,这对现代AI应用至关重要。 4. 灵活性: 支持物体检测、分割和跟踪等多种任务,并提供可配置的模型以满足特定用例需求。

欲深入了解其功能和性能比较,请查看 Ultralytics YOLO11 文档

我可以将 YOLO11 用于人群分析和交通管理等高级应用吗?

是的,Ultralytics YOLO11 非常适合人群分析和交通管理等高级应用,因其具备实时检测能力、可扩展性和集成灵活性。其高级功能允许在动态环境中进行高精度的物体跟踪、计数和分类。示例用例包括:

  • 人群分析: 监控和管理大型集会,确保安全并优化人群流动。
  • 交通管理: 跟踪和计数车辆,分析交通模式,并实时管理拥堵。

更多信息和实施细节,请参阅 现实世界应用 指南中关于使用 YOLO11 进行物体计数的部分。


📅 Created 10 months ago ✏️ Updated 9 days ago

Comments