ObjectDetectionAPI报错:TypeError: __new__()收到意外参数'serialized_options'
解决
TypeError: __new__() got an unexpected keyword argument 'serialized_options' 问题 这个错误几乎百分百是protobuf版本不兼容导致的——你手里的protoc编译工具版本(3.5.1)和Python环境中安装的protobuf包版本不匹配,或是和你的TensorFlow版本存在兼容性冲突。下面是具体的排查和修复步骤:
第一步:检查Python环境的protobuf版本
先确认你Python环境里装的protobuf包是哪个版本,在终端运行:
pip show protobuf
查看输出中的Version字段,如果显示的是3.6.0及以上版本,就会和你的protoc 3.5.1出现不兼容:高版本的protobuf Python包会引入serialized_options这个新参数,但你用旧protoc编译出来的代码根本不支持这个参数。
第二步:匹配protoc与Python protobuf版本
如果查到的版本和3.5.1不一致,先卸载现有版本:
pip uninstall protobuf -y
然后安装和protoc完全匹配的版本:
pip install protobuf==3.5.1
第三步:验证TensorFlow兼容性
如果做完第二步还是报错,那大概率是你的TensorFlow版本和protobuf 3.5.1不兼容(比如TensorFlow 1.14及以上版本要求protobuf 3.6.1或更高)。这时候需要:
- 升级
protoc到3.6.1或更高版本(比如和TensorFlow 1.15匹配的3.8.0) - 安装对应版本的protobuf Python包:
pip install protobuf==3.8.0 - 重新编译所有.proto文件:进入
models/research目录,运行:protoc object_detection/protos/*.proto --python_out=.
第四步:重新运行测试脚本
完成上述步骤后,再次执行测试脚本:
python object_detection/builders/model_builder_test.py
如果仍有问题,建议检查你的TensorFlow版本和Object Detection API的版本是否匹配——比如你如果用的是TensorFlow 2.x,旧版本的installation.md步骤可能不适用,需要切换到TF2对应的Object Detection代码分支。
内容的提问来源于stack exchange,提问作者doruk.sonmez
相关产品推荐
相关产品推荐

