安装TensorFlow Model Garden测试时protobuf不兼容问题排查
问题产生原因
报错的核心原因是混淆了两个不同的protobuf组件版本要求:
- 报错提示中要求的
protoc >=3.19.0指的是proto文件编译器的版本,作用是把.proto源文件编译成Python可调用的*_pb2.py文件,不是pip安装的Python版protobuf运行时库的版本。 - 你当前通过pip安装的4.21.1是Python端的protobuf运行时,从4.0版本开始,protobuf运行时不再兼容3.19.0版本之前protoc编译生成的*_pb2.py文件。而TensorFlow Model Garden仓库里自带的目标检测模块相关pb2文件,是官方用旧版protoc预编译好的,没有用3.19.0+版本的protoc重新生成,所以哪怕你Python端的protobuf版本满足>=3.19.0,依然会触发报错。
可行解决方法
按优先级从高到低排列,优先选第一种方案,稳定性最高、无性能损失:
方案1:降级protobuf运行时到兼容版本(推荐)
这是和官方预编译pb文件适配最好的方案,操作简单无额外开销:
- 卸载当前高版本protobuf:
pip uninstall -y protobuf - 安装经过兼容性验证的3.20.x版本:
pip install protobuf==3.20.3 - 重新执行测试命令验证:
python object_detection/builders/model_builder_tf2_test.py
方案2:临时设置环境变量启用纯Python解析(应急用)
该方案不需要修改已安装的包版本,但会大幅降低protobuf解析速度,仅适合临时测试场景:
- 当前PowerShell会话临时生效:在执行测试命令前,先在当前窗口执行
$env:PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION="python" - 永久生效:在系统环境变量中新增名为
PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION的变量,值设为python,重启PowerShell后生效。
方案3:用符合版本要求的protoc重新编译proto文件(根源解决)
如果必须使用4.x版本的protobuf运行时,可以自行重新编译所有proto文件:
- 提前安装3.19.0及以上版本的protoc二进制编译器(该工具为独立程序,不是pip安装的Python包)
- 进入TensorFlow Model Garden的research目录,执行编译命令重新生成所有pb2文件:
protoc object_detection/protos/*.proto --python_out=. - 编译完成后重新执行测试命令即可。
注意:目前TensorFlow 2.x稳定版对protobuf 4.x版本的适配仍存在多处依赖冲突,非必要不建议强行使用4.x版本,日常开发使用3.20.x版本的兼容性最好。
内容的提问来源于stack exchange,提问作者Christian01
相关产品推荐
相关产品推荐

