YOLO自定义模型图片检测正常,视频实时检测无结果求助
问题排查与解决方案
核心原因分析
图片检测正常但视频流直接检测失效,且拆帧转JPG后能正常检测,说明问题大概率出在视频帧的格式/色彩空间与模型输入要求不匹配,或是代码细节处理遗漏。
具体排查与修复步骤
1. 手动统一色彩空间
OpenCV读取视频帧默认是BGR格式,而YOLOv5训练时默认用RGB格式。虽然模型理论上会自动处理,但偶尔会出现兼容问题,手动转换格式试试:
cap = cv2.VideoCapture('../video/1st/output.mp4') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 新增:处理帧读取失败的情况 # 手动将BGR转RGB适配模型输入 frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = model(frame_rgb) # 渲染结果后转回BGR给OpenCV显示 final_img = np.squeeze(results.render()) final_img_bgr = cv2.cvtColor(final_img, cv2.COLOR_RGB2BGR) cv2.imshow("YOLO", final_img_bgr) if cv2.waitKey(10) & 0XFF == ord("q"): break cap.release() cv2.destroyAllWindows()
2. 对齐视频帧与训练集分辨率
如果视频帧分辨率和训练时的图片分辨率差异过大,可能导致模型检测失效。强制将视频帧resize到训练时的尺寸(比如640x640,替换成你实际训练用的img-size参数):
# 在色彩空间转换后添加resize frame_resized = cv2.resize(frame_rgb, (640, 640)) results = model(frame_resized)
3. 固定模型推理设备
确认模型运行的设备(CPU/GPU),视频流推理时设备切换可能引发隐性问题,手动指定设备:
# 加载模型时指定设备,0代表GPU,cpu代表CPU model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5/runs/train/exp36/weights/best.pt", force_reload=True, device='0')
4. 验证模型推理结果
添加打印语句查看检测原始数据,确认是没检测到还是显示环节出问题:
results = model(frame_rgb) print(results.pandas().xyxy[0]) # 打印检测到的目标坐标、置信度等信息
如果有输出检测框,说明是显示环节问题;如果无输出,回到前两步排查输入兼容性。
5. 完善帧读取逻辑
原代码未处理ret=False的情况(比如视频读到末尾),错误帧传入模型会影响后续检测,必须加上帧读取有效性判断,如步骤1中的if not ret: break。
拆帧转JPG能正常检测的原因
保存JPG时,图片色彩空间会自动转为RGB,且格式完全匹配训练集的输入标准,因此模型能正常识别。
内容的提问来源于stack exchange,提问作者Aggerio6969
相关产品推荐
相关产品推荐

