使用Roboflow Yolov4 PyTorch模型训练自定义数据集出现ValueError错误
错误原因
- 数据集存在无效样本:使用的Roboflow导出数据集中包含无任何标注框的空标注样本,加载样本时返回的标注框对象
out_bboxes为空列表,既不存在.shape属性触发第一个AttributeError,长度为0的空结构也无法匹配YOLOv4要求的5维标注格式[x,y,w,h,类别id],最终触发广播形状不匹配的ValueError。 - 数据集加载逻辑无异常兼容:当前使用的PyTorch版YOLOv4的
dataset.py没有做异常标注兼容逻辑,未提前处理标注类型转换和空标注分支,遇到异常样本直接崩溃。
解决方法
- 方案1:清理数据集(推荐)
登陆Roboflow平台对应数据集版本页,筛选出标注数量为0的样本,要么直接删除这类无效样本,要么补全标注后重新导出数据集,替换本地原有训练集即可。 - 方案2:修改数据集加载代码(无需改动数据集)
打开/content/pytorch-YOLOv4/dataset.py,定位到报错的382行附近代码,做两处修改:- 先将标注框转换为numpy数组,解决无
.shape属性的问题 - 新增空标注判断分支,遇到无标注样本时直接生成符合格式的空标注数组,避免广播报错
修改后参考代码:
# 新增代码 start import numpy as np out_bboxes = np.array(out_bboxes, dtype=np.float32) if out_bboxes.shape[0] == 0: out_bboxes1 = np.zeros((self.cfg.boxes, 5), dtype=np.float32) else: # 新增代码 end # 保留原有赋值逻辑 out_bboxes1[:min(out_bboxes.shape[0], self.cfg.boxes)] = out_bboxes[:min(out_bboxes.shape[0], self.cfg.boxes)] - 先将标注框转换为numpy数组,解决无
- 修复验证:修改完成后先跑少量batch的测试训练,确认无同类报错后再启动全量训练。
内容的提问来源于stack exchange,提问作者Jaisil Rose Dennison
相关产品推荐
相关产品推荐

