求助:如何基于YOLO11实现视频中同一车辆的重复捕获次数统计
求助:如何基于YOLO11实现视频中同一车辆的重复捕获次数统计
嘿,你这个需求其实就是**目标跟踪(Object Tracking)**的典型场景呀!你现在的代码只做了单帧目标检测——每一帧都重新识别车辆,自然没法关联前后帧里的同一辆车。不过不用慌,Ultralytics的YOLO11本身就内置了现成的跟踪功能,直接改你的现有代码就行,不用自己写复杂的匹配逻辑~
我给你梳理下修改思路,再附上完整的可运行代码:
核心思路
- 把YOLO的检测模式切换为跟踪模式:用
track()方法替代直接传帧,它会自动为每个车辆分配唯一的track_id,这就是区分同一辆车的关键。 - 用字典记录每个
track_id的出现次数:每帧检测到对应ID就把计数加1。 - 可视化增强:把车辆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
相关产品推荐
相关产品推荐

