基于TensorFlow Object Detection API训练Citypersons模型遇InvalidArgumentError
问题场景
基于TensorFlow 2.x Object Detection API训练Citypersons数据集,执行训练命令:
python model_main_tf2.py --pipeline_config_path=models/MaskCNN/v1/pipeline.config --model_dir=models/MaskCNN/v1/ --checkpoint_every_n=4 --num_workers=2 --alsologtostderr
出现如下报错:
File "/Users/Desktop/TensorFlow/tf2_api_env/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 7215, in raise_from_not_ok_status
raise core._status_to_exception(e) from None # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node _wrapped__IteratorGetNext_output_types_18_device/job:localhost/replica:0/task:0/device:CPU:0}} indices[0] = 0 is not in [0, 0)
[[{{node GatherV2_7}}]]
[[MultiDeviceIteratorGetNextFromShard]]
[[RemoteCall]] [Op:IteratorGetNext]
可能的原因及解决步骤
1. 数据集标注或TFRecord文件异常
这个报错核心是数据读取时索引越界,大概率和数据集处理有关:
- 检查Citypersons的标注文件(XML/JSON格式),确认所有训练图片都包含有效目标标注,没有完全无目标的样本;如果存在无目标样本,需在生成TFRecord时明确处理这类数据。
- 核对
pipeline.config中的num_classes参数,Citypersons核心检测类别为person,需设置为1,避免类别数与数据集不匹配。 - 重新生成TFRecord文件,确保标注转换过程中没有丢失或错误映射类别索引。
2. Pipeline配置文件错误
- 检查
pipeline.config的train_input_reader模块,确认label_map_path指向的.pbtxt标签文件正确,标签ID需从1开始(TensorFlow Object Detection API默认标签ID起始值为1,而非0),且与数据集标注的类别完全对应。 - 确认
train_config中的fine_tune_checkpoint路径正确,使用的预训练模型需与当前MaskCNN结构、TF2版本兼容。
3. 多Worker读取数据冲突
你设置了--num_workers=2,可能存在多线程数据读取异常:
- 先去掉
--num_workers=2参数,以单Worker模式运行训练。如果单Worker正常,再排查多Worker配置问题(比如数据集路径对所有Worker是否可见、文件权限是否足够)。
4. TensorFlow版本兼容问题
当前使用Python3.7搭配旧版TensorFlow,可能存在API兼容问题:
- 确认TensorFlow Object Detection API版本与TensorFlow主版本匹配(比如TF2.4+对应API v2.4+版本)。
- 尝试将TensorFlow升级到适配Python3.7的稳定版本(如TF2.5或TF2.6)。
内容的提问来源于stack exchange,提问作者Tandez Sarkaria

