TensorFlow目标检测API重训练报错:SsdFeatureExtractor无batch_norm_trainable字段
嘿,我之前在适配旧版TensorFlow训练SSD模型时也碰到过一模一样的问题!这个错误本质是你的配置文件(pipeline.config)里用了当前TensorFlow/Object Detection API版本不支持的字段,具体来说就是你错误里提到的batch_no...(应该是截断了,大概率是batch_norm_trainable这类和批量归一化相关的字段),在TF 1.6对应的API proto定义里,这个字段还不属于SsdFeatureExtractor这个消息类型,所以Protobuf解析时直接报错找不到该字段。
给你几个针对性的解决步骤,亲测有效:
对齐API与TensorFlow版本:你用的是TensorFlow 1.6,那必须搭配对应版本的Object Detection API代码——不能直接用最新版的models仓库代码,因为新版API的proto定义已经更新了很多字段。建议去TensorFlow/models仓库找对应TF 1.6的tag(比如
v1.6.0)或者同期的commit,把代码拉到本地使用。修改pipeline.config配置:大概率是你抄了高版本的示例配置文件,里面的
batch_norm_trainable字段在TF 1.6的API里还没被加到SsdFeatureExtractor中。你可以:- 找到TF 1.6官方提供的MobileNet V2 SSD示例配置文件(在对应版本的API代码
object_detection/samples/configs目录下) - 对比你自己的配置,把多余的、不兼容的字段(比如那个
batch_no开头的字段)删掉或者替换成旧版本支持的写法
- 找到TF 1.6官方提供的MobileNet V2 SSD示例配置文件(在对应版本的API代码
重新编译Protobuf文件:虽然你已经编译过,但如果换了API版本,必须重新生成对应的Python proto文件。在API的
research目录下执行:protoc object_detection/protos/*.proto --python_out=.编译完成后,别忘了把
research和slim目录加到PYTHONPATH环境变量里(Windows可以用命令set PYTHONPATH=.;%cd%\slim,Ubuntu用export PYTHONPATH=$PYTHONPATH:/path/to/research:/path/to/research/slim)。用工具验证配置合法性:在
research/object_detection目录下执行以下命令,能帮你更精准地定位配置里的问题字段:python utils/config_util.py --pipeline_config_path=path/to/your/pipeline.config --print_config这个命令会尝试解析你的配置,如果有错误会给出更具体的提示,比单纯的ParseError信息有用得多。
按照这几步操作,应该就能解决这个跨版本的字段不兼容问题了。
内容的提问来源于stack exchange,提问作者Kazuya Hatta

