Yolov8结合DeepSort追踪车辆时维度不匹配ValueError求助
解决YOLOv8+DeepSort实时追踪时的维度不匹配错误
问题核心原因
deep_sort_realtime的update_tracks方法对输入图像维度、检测结果格式有严格要求,你遇到的错误是因为传入的图像张量维度不符合预期,或是检测框坐标格式未转换正确。
具体解决步骤
1. 修正图像维度格式
输入图像是(720,1280,3)的HWC格式(高度、宽度、通道),但deep_sort_realtime需要CHW格式(通道、高度、宽度)。调用update_tracks前先转换维度:
# 假设原始图像变量为frame_original frame_chw = frame_original.transpose(2, 0, 1) # 从(H,W,C)转为(C,H,W)
转换后需确认维度为(3,720,1280),避免误交换高度和宽度导致出现(3,1280,720)这类错误维度。
2. 转换YOLOv8检测结果格式
YOLOv8输出的边界框是(x1,y1,x2,y2)格式,而deep_sort_realtime要求[x1,y1,width,height]格式,同时需要提取置信度和类别。处理代码示例:
from deep_sort_realtime.deepsort_tracker import DeepSort # 按你的配置初始化追踪器 object_tracker = DeepSort(max_age=30, n_init=3) # 处理YOLOv8检测结果 results = model(frame_original) # frame_original为原始HWC格式图像 detections = [] for box in results[0].boxes: x1, y1, x2, y2 = box.xyxy[0].tolist() conf = box.conf[0].item() cls = box.cls[0].item() # 仅保留车辆类(YOLOv8中car=2、bus=5、truck=7,按需调整) if cls in [2,5,7]: width = x2 - x1 height = y2 - y1 detections.append(([x1, y1, width, height], conf, int(cls))) # 传入转换后的图像和检测结果 tracks = object_tracker.update_tracks(detections, frame=frame_chw)
3. 排查其他维度错误诱因
- 检查是否在其他步骤误裁剪/resize图像,导致高度和宽度颠倒(比如得到
(1280,720,3)的图像),转换后维度不符合要求。 - 确认
update_tracks的参数顺序:第一个参数是检测结果列表,第二个是图像,不要传反。
调试技巧
- 调用
update_tracks前打印图像维度:print(frame_chw.shape),确保是(3,720,1280)。 - 打印检测结果的第一个元素,确认格式为
([x1,y1,w,h], 置信度, 类别ID)。
内容的提问来源于stack exchange,提问作者vishnu_vardhan
相关产品推荐
相关产品推荐

