Google Colab训练YOLOv5触发CUDA device assert triggered错误求助
YOLOv5 训练进入验证阶段触发CUDA device assert错误解决方案
问题根因
该错误由验证集标注文件存在非法值触发,训练阶段的逻辑对异常值容错性更高所以不会报错,进入验证阶段后执行坐标转换、指标计算逻辑时触发了张量索引越界。
具体排查步骤
- 优先排查验证集标注的类别ID:
确认所有txt标注文件中的第一个值(类别ID)符合两个要求:1. 为非负整数;2. 最大值不超过数据集yaml配置中nc(类别总数)减1,比如你配置了5个类别,ID的合法范围是0~4,出现5、-1等都会触发越界。 - 其次排查验证集标注的坐标值:
YOLO要求的归一化坐标(x_center、y_center、width、height)必须全部落在0~1区间内,标注超出图片边界、标注转换计算错误、标注文件被损坏都会产生小于0或大于1的非法值。 - 快速定位异常文件的方法:
在Colab训练代码的最开头添加如下代码开启CUDA同步报错,再次运行即可直接输出触发错误的具体图片/标注文件路径:import os os.environ['CUDA_LAUNCH_BLOCKING'] = "1" - 批量清理异常标注的参考代码:
import os # 替换为你的验证集标注文件夹路径 label_dir = "./datasets/val/labels" # 替换为你的数据集类别总数 num_classes = 5 for label_file in os.listdir(label_dir): if not label_file.endswith(".txt"): continue file_path = os.path.join(label_dir, label_file) with open(file_path, "r") as f: lines = f.readlines() for line_num, line in enumerate(lines): line = line.strip() if not line: continue vals = list(map(float, line.split())) if len(vals) != 5: print(f"异常文件(字段数错误):{file_path} 第{line_num+1}行") continue cls_id, x, y, w, h = vals if cls_id <0 or cls_id >= num_classes or int(cls_id)!=cls_id: print(f"异常文件(类别ID非法):{file_path} 第{line_num+1}行,ID值:{cls_id}") if x<0 or x>1 or y<0 or y>1 or w<0 or w>1 or h<0 or h>1: print(f"异常文件(坐标超出范围):{file_path} 第{line_num+1}行,坐标值:{x} {y} {w} {h}")
临时规避方案
如果暂时不需要验证结果,可以在训练命令中添加--val 0参数关闭验证阶段,可正常完成训练流程。
内容的提问来源于stack exchange,提问作者MICHAEL AARON SY
相关产品推荐
相关产品推荐

