使用SSD-MobileNet-V1-Coco模型训练自定义数据集遇属性报错
解决TensorFlow Detection API训练时'SsdFeatureExtractor'无'override_base_feature_extractor_hyperparams'属性的问题
我之前帮不少开发者排查过这个问题,它本质上是TensorFlow Detection API版本和你使用的旧预训练模型不兼容导致的,下面给你分步解决的方案:
一、核心原因
你用的ssd_mobilenet_v1_coco_11_06_2017是2017年发布的旧模型,对应的Detection API还是早期版本;而你当前环境的API版本大概率是较新的——在后续的API迭代中,开发团队重构了SsdFeatureExtractor类,移除了override_base_feature_extractor_hyperparams这个方法,但旧模型的配置文件还在调用它,所以触发了属性不存在的报错。
二、具体解决步骤
1. 切换到与模型匹配的API分支
首先把TensorFlow/models仓库切换到和模型发布时间对应的稳定分支,比如r1.2分支(这个分支和2017年6月的模型完全兼容):
cd 你的tensorflow/models目录路径 git checkout r1.2
同时确保你的TensorFlow版本是1.2.x,高版本的TF(比如1.4+)和这个旧分支的API会有冲突。
2. 重新编译Protobuf文件
切换分支后,必须重新编译Detection API依赖的Protobuf文件,保证生成的Python代码和当前API版本一致:
cd path/to/tensorflow/models/research protoc object_detection/protos/*.proto --python_out=.
然后重新设置PYTHONPATH环境变量:
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
3. 检查并修正训练配置文件
打开你的pipeline.config文件,查找是否有类似override_base_feature_extractor_hyperparams: true的配置项:
- 如果是切换到旧API分支,这个配置可以保留,因为旧分支的
SsdFeatureExtractor确实有这个方法; - 如果坚持使用新API版本,需要移除这个配置项,改用新版本API支持的方式调整特征提取器超参数(比如直接在
base_feature_extractor节点下配置对应参数)。
三、验证解决方案
重新执行你的./train.sh脚本,如果配置正确,应该不会再触发这个属性不存在的报错了。
内容的提问来源于stack exchange,提问作者feng
相关产品推荐
相关产品推荐

