这个坑值得记一笔。标注平台导出的 CSV 里 bbox 是 [12, 30, 88, 140] 这样的字符串,训练脚本直接按列表索引取值,抛 TypeError 说 list indices must be integers,重新导出还是同样格式,只能在中间加一层解析。

刚开始盯着「部分行的 bbox 为空,长度判断没有做」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。CSV 里列表被序列化成字符串,pandas 不会还原;字段里带空格和单引号,直接反序列化也会失败;坐标浮点与整数混用,转数组时类型不一致。

先看字段真实类型与前几行内容

python -c "import pandas as pd;d=pd.read_csv('labels.csv');print(type(d.bbox[0]), d.bbox.head(3).tolist())"

然后用字面量解析把字符串转回列表

python -c "import ast,pandas as pd;d=pd.read_csv('labels.csv');d['bbox']=d.bbox.apply(lambda v: ast.literal_eval(v) if isinstance(v,str) else v);print(d.bbox[0])"

接着统计空值与长度不为四的行

python -c "import pandas as pd;d=pd.read_csv('labels.csv');print(d.bbox.isna().sum(), d.bbox.astype(str).str.count(',').value_counts())"

转成数组后跑两个 batch 验证

python train.py --dataset labels.csv --dry-run --batch 2

怎么算真的好了,看的是同一批现象。bbox 全部解析成四元列表,空值行单独落盘,训练脚本连跑两个 batch 没有再抛类型错误。

这里还有个坑。CSV 只能存文本,列表和字典一定会变成字符串,读入时显式解析比在训练脚本里打补丁干净。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189