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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:15:01