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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:43:39