RT-DETRv2训练自定义数据集的排坑全记录最近在使用lyuwenyu/RT-DETR的PyTorch版本训练自定义缺陷检测数据集从启动报错到成功训练踩了不少典型的“新手坑”这里把完整的排坑过程和解决方案整理出来帮大家一次性避坑一、环境与项目准备1.1 项目准备我用的是Windows系统Anaconda创建的Python 3.8环境PyTorch 2.0CUDA 11.8项目结构如下RT-DETR-V2/ ├── tools/train.py # 训练入口脚本 ├── configs/rtdetrv2/ # 模型配置文件 ├── src/ # 核心源码 └── datasets/ # 自定义数据集数据集是COCO格式包含train.json、val.json和图片文件标注的类别是N和P两类。1.2 选择yml文件选择训练时传入的yml文件我是用这个不用改长这样1.3 修改coco_detection.yml文件修改coco_detection.yml文件修改输入数据集路径、num_classes和remap_mscoco_category我的是2个类别yolo格式的类别ID是0、1而coco是从1开始为变为1、2这里num_classes则填3下文的坑3就是填为2报错了1.4 修改训练的epoches修改dataloader.yml和optiminzer.yml中的epoches2个文件的epoches需要保持一致1.5 开始运行命令为 python tools/train.py -c configs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml二、排坑全过程按报错顺序坑1FileNotFoundError: No such file or directory配置文件找不到报错截图报错信息FileNotFoundError: [Errno 2] No such file or directory: configs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml问题分析启动命令是在tools目录下运行的python tools/train.py-cconfigs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml此时工作目录是tools/相对路径configs/会被解析为tools/configs/但配置文件实际在项目根目录的configs/下路径不匹配导致文件找不到。解决方案方法1切换工作目录到项目根目录cdD:\work\git\Object-Detection\RT-DETR-V2 python tools/train.py-cconfigs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml方法2使用绝对路径python tools/train.py-cD:\work\git\Object-Detection\RT-DETR-V2\configs\rtdetrv2\rtdetrv2_r50vd_6x_coco.yml坑2UnicodeDecodeError: gbk codec cant decode byte 0xafJSON文件编码错误报错截图报错信息UnicodeDecodeError: gbk codec cant decode byte 0xaf in position 364: illegal multibyte sequence问题分析我的图像文件有中文字符Windows系统默认编码是GBK而你的COCO标注JSON文件是UTF-8编码文件中包含了GBK无法识别的字符比如特殊标点、中文注释导致json.load()读取失败。解决方案修改src/data/dataset/coco_dataset.py中读取JSON文件的代码指定encodingutf-8# 原代码报错self.cocoCOCO(ann_file)# 修改后withopen(ann_file,r,encodingutf-8)asf:self.cocoCOCO(json.load(f))或者直接用VS Code打开train.json点击右下角的编码格式选择UTF-8保存强制转换编码。坑3CUDA error: device-side assert triggered类别ID越界报错截图报错信息C:\actions-runner\_work\pytorch\pytorch\pytorch\aten\src\ATen\native\cuda\IndexKernel.cu:93: Assertion index out of bounds failed. RuntimeError: CUDA error: device-side assert triggered问题分析这是DETR系列模型最经典的“类别ID越界”错误根源是你的标注文件中categories的id是从1开始的N:1、P:2配置文件中num_classes: 2模型预留的类别索引是0和1当模型读取到category_id2的标注时会尝试访问数组的第3个位置索引从0开始直接越界触发CUDA断言错误。解决方案有两种方案推荐方案1不用修改标注文件方案1修改配置文件num_classes把rtdetrv2_r50vd_6x_coco.yml中的num_classes改成3这样模型就支持0,1,2三个索引完美匹配你的标注ID。# 原配置num_classes:2# 修改后num_classes:3方案2修改标注文件把类别ID改成从0开始categories:[{id:0,name:N},{id:1,name:P}]同时把所有annotations中的category_id:1改成0category_id:2改成1保持num_classes:2不变。最终成功训练的日志截图解决完以上三个坑后模型终于正常启动训练loss也在稳定下降Epoch: [0] [0/48] eta: 0:11:06 lr: 0.000000 loss: 40.9994 (40.9994) Epoch: [0] [47/48] eta: 0:00:01 lr: 0.000000 loss: 40.2926 (40.7860)三、避坑总结与经验路径问题优先排查Windows下运行脚本时一定要注意工作目录和相对路径的匹配优先切换到项目根目录运行。编码问题别忽视JSON文件在Windows下很容易出现编码错误读取时务必指定encodingutf-8。类别ID是重中之重DETR模型对类别ID非常敏感必须保证标注的category_id不超过num_classes-1要么修改配置要么重映射ID。调试CUDA报错的技巧在train.py最顶部加上os.environ[CUDA_LAUNCH_BLOCKING] 1可以强制同步CUDA操作让报错直接定位到CPU代码行更容易排查问题。
RT-DETRv2训练自定义数据集的排坑全记录
RT-DETRv2训练自定义数据集的排坑全记录最近在使用lyuwenyu/RT-DETR的PyTorch版本训练自定义缺陷检测数据集从启动报错到成功训练踩了不少典型的“新手坑”这里把完整的排坑过程和解决方案整理出来帮大家一次性避坑一、环境与项目准备1.1 项目准备我用的是Windows系统Anaconda创建的Python 3.8环境PyTorch 2.0CUDA 11.8项目结构如下RT-DETR-V2/ ├── tools/train.py # 训练入口脚本 ├── configs/rtdetrv2/ # 模型配置文件 ├── src/ # 核心源码 └── datasets/ # 自定义数据集数据集是COCO格式包含train.json、val.json和图片文件标注的类别是N和P两类。1.2 选择yml文件选择训练时传入的yml文件我是用这个不用改长这样1.3 修改coco_detection.yml文件修改coco_detection.yml文件修改输入数据集路径、num_classes和remap_mscoco_category我的是2个类别yolo格式的类别ID是0、1而coco是从1开始为变为1、2这里num_classes则填3下文的坑3就是填为2报错了1.4 修改训练的epoches修改dataloader.yml和optiminzer.yml中的epoches2个文件的epoches需要保持一致1.5 开始运行命令为 python tools/train.py -c configs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml二、排坑全过程按报错顺序坑1FileNotFoundError: No such file or directory配置文件找不到报错截图报错信息FileNotFoundError: [Errno 2] No such file or directory: configs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml问题分析启动命令是在tools目录下运行的python tools/train.py-cconfigs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml此时工作目录是tools/相对路径configs/会被解析为tools/configs/但配置文件实际在项目根目录的configs/下路径不匹配导致文件找不到。解决方案方法1切换工作目录到项目根目录cdD:\work\git\Object-Detection\RT-DETR-V2 python tools/train.py-cconfigs/rtdetrv2/rtdetrv2_r50vd_6x_coco.yml方法2使用绝对路径python tools/train.py-cD:\work\git\Object-Detection\RT-DETR-V2\configs\rtdetrv2\rtdetrv2_r50vd_6x_coco.yml坑2UnicodeDecodeError: gbk codec cant decode byte 0xafJSON文件编码错误报错截图报错信息UnicodeDecodeError: gbk codec cant decode byte 0xaf in position 364: illegal multibyte sequence问题分析我的图像文件有中文字符Windows系统默认编码是GBK而你的COCO标注JSON文件是UTF-8编码文件中包含了GBK无法识别的字符比如特殊标点、中文注释导致json.load()读取失败。解决方案修改src/data/dataset/coco_dataset.py中读取JSON文件的代码指定encodingutf-8# 原代码报错self.cocoCOCO(ann_file)# 修改后withopen(ann_file,r,encodingutf-8)asf:self.cocoCOCO(json.load(f))或者直接用VS Code打开train.json点击右下角的编码格式选择UTF-8保存强制转换编码。坑3CUDA error: device-side assert triggered类别ID越界报错截图报错信息C:\actions-runner\_work\pytorch\pytorch\pytorch\aten\src\ATen\native\cuda\IndexKernel.cu:93: Assertion index out of bounds failed. RuntimeError: CUDA error: device-side assert triggered问题分析这是DETR系列模型最经典的“类别ID越界”错误根源是你的标注文件中categories的id是从1开始的N:1、P:2配置文件中num_classes: 2模型预留的类别索引是0和1当模型读取到category_id2的标注时会尝试访问数组的第3个位置索引从0开始直接越界触发CUDA断言错误。解决方案有两种方案推荐方案1不用修改标注文件方案1修改配置文件num_classes把rtdetrv2_r50vd_6x_coco.yml中的num_classes改成3这样模型就支持0,1,2三个索引完美匹配你的标注ID。# 原配置num_classes:2# 修改后num_classes:3方案2修改标注文件把类别ID改成从0开始categories:[{id:0,name:N},{id:1,name:P}]同时把所有annotations中的category_id:1改成0category_id:2改成1保持num_classes:2不变。最终成功训练的日志截图解决完以上三个坑后模型终于正常启动训练loss也在稳定下降Epoch: [0] [0/48] eta: 0:11:06 lr: 0.000000 loss: 40.9994 (40.9994) Epoch: [0] [47/48] eta: 0:00:01 lr: 0.000000 loss: 40.2926 (40.7860)三、避坑总结与经验路径问题优先排查Windows下运行脚本时一定要注意工作目录和相对路径的匹配优先切换到项目根目录运行。编码问题别忽视JSON文件在Windows下很容易出现编码错误读取时务必指定encodingutf-8。类别ID是重中之重DETR模型对类别ID非常敏感必须保证标注的category_id不超过num_classes-1要么修改配置要么重映射ID。调试CUDA报错的技巧在train.py最顶部加上os.environ[CUDA_LAUNCH_BLOCKING] 1可以强制同步CUDA操作让报错直接定位到CPU代码行更容易排查问题。