YOLO训练自定义数据集出现Wrong annotation标签越界报错排查
问题根本原因
- 核心触发源是标签坐标完全不符合YOLO框架的格式规范。YOLO全系列训练框架要求标签遵循
class_id x_center_norm y_center_norm width_norm height_norm的存储格式,坐标为图像像素尺寸归一化后的浮点数,取值严格限定在[0,1]区间。当前所有标签文件内的坐标是未做归一化的原始像素绝对值,数值范围从个位数到两千多,完全超出合法取值区间,因此被合法性校验拦截。 - 之前的批量替换操作完全没有触碰到报错根因:仅修改类别ID的字符串替换逻辑,没有完成像素坐标到归一化坐标的换算流程,因此改完类别ID后依然会触发同类越界报错。
- 原替换脚本存在次生风险:脚本直接匹配字符串
'101 '做替换,很可能误把坐标值中恰好出现的"101 "字符串片段替换为'0 ',进一步打乱原有标注的数值结构。
落地解决方案
- 第一,终止使用已经被错误脚本批量修改过的标签文件,重新从Open Images数据集的原始标注文件导出数据,避免之前的字符串替换带来的标注错乱问题。
- 第二,严格按照YOLO格式要求完成标注转换,流程如下:
- 逐张匹配对应图像的实际像素尺寸(图像宽度W、图像高度H)
- 将Open Images原始的绝对像素边界框坐标(通常存储为xmin、ymin、xmax、ymax,即左上角、右下角的像素位置)换算为YOLO要求的中心坐标+宽高格式:
- 归一化中心点x = (xmin + xmax) / 2 / W
- 归一化中心点y = (ymin + ymax) / 2 / H
- 归一化框宽度 = (xmax - xmin) / W
- 归一化框高度 = (ymax - ymin) / H
- 对换算后的坐标值做边界截断处理:所有小于0的坐标值直接修正为0,所有大于1的坐标值直接修正为1,消除越界触发的校验报错。
- 按照自定义类别的索引列表重新映射类别ID,禁止使用简单的全局字符串替换处理类别值。
- 第三,正式启动训练前,运行批量校验脚本扫描所有标签文件:逐行读取每个txt内的5个字段,校验除类别ID外的4个坐标值是否全部落在[0,1]区间,输出所有不满足要求的文件路径,修正完成后再启动训练流程。
注意:YOLO框架的标签校验逻辑只会拦截坐标越界的问题,不会主动替你完成像素值到归一化值的换算,必须在标签生成阶段就保证格式合规。
内容的提问来源于stack exchange,提问作者Vedant Modi
相关产品推荐
相关产品推荐

