You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何基于YOLO11实现视频中同一车辆的重复捕获次数统计

求助:如何基于YOLO11实现视频中同一车辆的重复捕获次数统计

嘿,你这个需求其实就是**目标跟踪(Object Tracking)**的典型场景呀!你现在的代码只做了单帧目标检测——每一帧都重新识别车辆,自然没法关联前后帧里的同一辆车。不过不用慌,Ultralytics的YOLO11本身就内置了现成的跟踪功能,直接改你的现有代码就行,不用自己写复杂的匹配逻辑~

我给你梳理下修改思路,再附上完整的可运行代码:

核心思路

  1. 把YOLO的检测模式切换为跟踪模式:用track()方法替代直接传帧,它会自动为每个车辆分配唯一的track_id,这就是区分同一辆车的关键。
  2. 用字典记录每个track_id的出现次数:每帧检测到对应ID就把计数加1。
  3. 可视化增强:把车辆ID和计数直接画在框上,方便你实时看到效果。

修改后的完整代码

from ultralytics import YOLO
import cv2
from enum import Enum

class DetectionType(Enum):
    CAR         = 2
    MOTORCYCLE  = 3
    BUS         = 5
    TRUCK       = 6


coco_model = YOLO('yolo11n.pt')
cap = cv2.VideoCapture('testVideo.mp4')

# 定义要跟踪的车辆类别ID
vehicles = [
            DetectionType.CAR.value, 
            DetectionType.MOTORCYCLE.value, 
            DetectionType.BUS.value,
            DetectionType.TRUCK.value
            ]

# 字典:key为车辆跟踪ID,value为该车辆的出现次数
vehicle_count = {}

ret = True

while ret:
    ret, frame = cap.read()

    if ret:
        # 切换为YOLO跟踪模式:persist=True提升遮挡场景下的跟踪稳定性,classes直接过滤车辆类别
        results = coco_model.track(frame, persist=True, classes=vehicles)[0]

        # 只有当存在有效跟踪结果时才处理
        if results.boxes.id is not None:
            # 把检测框数据和跟踪ID一一对应
            boxes = results.boxes.data.tolist()
            track_ids = results.boxes.id.tolist()

            for box, track_id in zip(boxes, track_ids):
                x1, y1, x2, y2, score, class_id = box
                x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
                track_id = int(track_id)

                # 更新当前车辆的出现次数
                if track_id not in vehicle_count:
                    vehicle_count[track_id] = 1
                else:
                    vehicle_count[track_id] += 1

                # 画检测框+标注ID和次数
                cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
                label = f"ID: {track_id} | Count: {vehicle_count[track_id]}"
                cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
        
    # 显示跟踪画面
    cv2.imshow('Vehicle Tracking with Count', frame)

    # 按ESC键退出
    if cv2.waitKey(33) == 27:
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

# 程序结束后打印最终统计结果
print("=== 车辆出现次数统计结果 ===")
for track_id, count in vehicle_count.items():
    print(f"车辆ID {track_id}: 累计出现 {count} 次")

关键修改点说明

  • 启用跟踪模式:coco_model.track()会自动维护目标的ID,persist=True参数能让车辆被短暂遮挡后,重新出现时仍保持原有ID,提升跟踪稳定性。
  • 直接过滤类别:通过classes=vehicles参数提前过滤车辆,省去了手动判断class_id的步骤,更高效。
  • 计数逻辑:用vehicle_count字典存储每个ID的出现次数,每帧检测到对应ID就更新计数。

进阶优化建议

如果你的视频场景比较复杂(比如大量车辆遮挡、快速移动),可以切换到更精准的跟踪器,比如DeepSORT,只需要修改track()方法的参数:

results = coco_model.track(frame, persist=True, classes=vehicles, tracker="deepsort.yaml")[0]

Ultralytics会自动下载对应的配置文件,DeepSORT在复杂场景下的跟踪稳定性比默认的ByteTrack更好,只是计算量会稍大一点。

备注:内容来源于stack exchange,提问作者anandyn02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:19:30