YOLOv8多视频流跟踪时模型目标ID不独立的解决方法咨询
解决YOLOv8多模型跟踪时目标ID不独立的问题
问题核心在于YOLOv8默认的ByteTrack跟踪器会共享全局ID计数器,即便加载两个独立模型,跟踪ID的生成逻辑仍会连在一起。要让两个模型的跟踪ID完全独立,需要为每个模型单独初始化跟踪器,重置ID计数起点。
修改后的代码
from ultralytics import YOLO import cv2 from ultralytics.trackers.byte_tracker import BYTETracker from ultralytics.utils import IterableSimpleNamespace # 生成跟踪器配置,确保参数一致 def get_tracker_config(): cfg = IterableSimpleNamespace() cfg.track_high_thresh = 0.5 cfg.track_low_thresh = 0.1 cfg.new_track_thresh = 0.6 cfg.track_buffer = 30 cfg.match_thresh = 0.8 cfg.aspect_ratio_thresh = 3.0 cfg.min_box_area = 10 cfg.mot20 = False return cfg model1 = YOLO('yolov8s.pt') model2 = YOLO('yolov8s.pt') # 为每个模型创建独立的跟踪器实例 tracker1 = BYTETracker(get_tracker_config()) tracker2 = BYTETracker(get_tracker_config()) cap1 = cv2.VideoCapture("videos/1.mp4") cap2 = cv2.VideoCapture("videos/2.mp4") def draw_results(results, frame): body_boxes = results[0].boxes.xywh.cpu() if results[0].boxes.id is not None: boxes_output = [] track_ids = results[0].boxes.id.int().cpu().tolist() for box, id in zip(body_boxes, track_ids): x, y, w, h = box x, y, w, h = int(x), int(y), int(w), int(h) boxes_output.append([x-w//2, y-h//2, x+w//2, y+h//2]) for box, id in zip(boxes_output, track_ids): frame = cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 255), 2) frame = cv2.putText(frame, str(id), (box[0], box[1]-15), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1, cv2.LINE_AA) return frame while True: ret, frame1 = cap1.read() ret, frame2 = cap2.read() if not ret: break # 绑定独立跟踪器处理对应视频流 results1 = model1.track(frame1, persist=True, iou=0.5, classes=[1,2,3,5,7], verbose=False, tracker=tracker1) frame1 = draw_results(results1, frame1) results2 = model2.track(frame2, persist=True, iou=0.5, classes=[1,2,3,5,7], verbose=False, tracker=tracker2) frame2 = draw_results(results2, frame2) cv2.imshow("Camera 1", frame1) cv2.imshow("Camera 2", frame2) k = cv2.waitKey(1) if k == 32: cv2.destroyAllWindows() break cap1.release() cap2.release()
关键说明
- 手动为每个模型创建独立的
BYTETracker实例,每个跟踪器的ID计数器会从1开始单独递增,彻底避免互相干扰。 - 通过
get_tracker_config()统一生成跟踪器参数,保证两个流的跟踪逻辑一致,同时保持实例独立。 - 在
track()方法中通过tracker参数指定对应跟踪器,替代默认的全局共享跟踪器。
另外也可以用快速重置ID的方式(依赖内部实现,版本更新后可能失效):
model1.tracker._next_id = 1 model2.tracker._next_id = 1
该方式无需额外创建跟踪器实例,适合快速测试,但长期来看推荐使用独立跟踪器实例的方案更稳定。
内容的提问来源于stack exchange,提问作者De Lai
相关产品推荐
相关产品推荐

