自定义训练的YOLOv5模型经torch.hub加载后检测异常如何解决
问题解答
你不需要克隆整个YOLOv5仓库,也不必须通过detect.py调用模型。当前推理结果异常,是因为你的调用代码没有对齐detect.py运行时的默认处理逻辑,补上缺失的配置即可得到和detect.py完全一致的检测效果。
常见遗漏配置项
- 图像通道顺序错误
cv2.imread()读取的图像默认是BGR通道顺序,而YOLOv5的输入要求是RGB格式。detect.py内部自动完成了BGR到RGB的通道转换,你直接传入BGR格式的图像会导致输入数据分布错乱,检测结果完全不符合预期。 - 推理输入尺寸不匹配
你运行detect.py时指定了--img 224,即推理阶段会将输入图像缩放至224分辨率再送入模型。但torch.hub加载的YOLOv5模型默认推理输入尺寸为640,和你训练、验证时使用的分辨率不一致,会直接导致精度骤降甚至完全检测不到目标。 - 推理阈值未对齐
你在detect.py中设置了--conf 0.5,即仅保留置信度高于0.5的检测结果。torch.hub加载的模型默认置信度阈值为0.25、NMS IoU阈值为0.45,参数不匹配会导致输出结果和detect.py存在差异。 - 检测结果解析错误
模型返回的pred.xyxy是长度等于输入batch数的列表,单张图像推理时需要取pred.xyxy[0]才能拿到对应图像的检测框数据,直接读取pred.xyxy拿到的是列表对象,不是实际的坐标结果。
修正后的可用代码
import torch import cv2 # 加载自定义训练权重 model = torch.hub.load('ultralytics/yolov5', 'custom', path='custom_weights.pt', force_reload=True) # 对齐detect.py的推理参数 model.conf = 0.5 # 置信度阈值 model.imgsz = 224 # 推理输入分辨率,和--img参数保持一致 model.eval() # 读取图像并转换通道顺序 img = cv2.imread('test.jpg') img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 执行推理 pred = model(img_rgb) # 解析检测结果:每行格式为 [x1, y1, x2, y2, 置信度, 类别ID] bboxes = pred.xyxy[0].cpu().numpy()
按照上述配置调整后如果仍有异常,可以检查权重文件是否完整、训练时是否修改过类别数量/名称配置,不需要额外引入整个YOLOv5仓库的代码。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

