在Google Colab中复现卫星图像目标检测工作流时遭遇ImportError:无法从object_detection.protos导入preprocessor_pb2
解决Colab中TensorFlow Object Detection API的
preprocessor_pb2导入错误 看起来你遇到的是典型的Protobuf编译路径/环境变量冲突问题,在Colab这种交互式环境里很容易踩坑——哪怕你跑了protoc编译命令,Python可能还是在加载安装到site-packages里的旧版object_detection包,而非你本地编译了proto的那个版本。下面是几个针对性的解决思路,按优先级尝试:
1. 调整安装顺序:先编译Protobuf,再以开发模式安装API
你之前的步骤是先安装API再编译proto,这会导致site-packages里的包没有编译后的pb2文件,而Python默认会优先加载site-packages的版本。反过来操作就能解决这个优先级问题:
# 切换到research目录 %cd /content/models/research # 先清理可能存在的旧pb2文件 !rm -rf object_detection/protos/*.py # 编译所有proto文件为Python模块 !protoc object_detection/protos/*.proto --python_out=. # 以开发模式安装(-e参数会创建本地目录链接,后续修改会实时生效) !pip install -e .
2. 强制指定PYTHONPATH并在同一命令中运行训练
Colab的%env设置有时候不会在后续的!命令中持续生效,或者路径优先级有问题。直接在运行train.py的命令里指定PYTHONPATH,确保加载本地的research目录:
%cd /content/models/research/object_detection !PYTHONPATH="/content/models/research:/content/models/research/slim" python train.py --logtostderr \ --train_dir training/ \ --pipeline_config_path=training/ssd_inception_v2_coco.config
3. 替换Colab默认的Protobuf版本
Colab自带的protoc版本可能和TensorFlow Object Detection API不兼容(比如版本过低),替换为官方推荐的适配版本:
# 卸载默认protoc !apt-get remove -y protobuf-compiler # 下载并安装兼容版本(这里用3.19.0,适配大多数TF2.x版本的OD API) !wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.0/protoc-3.19.0-linux-x86_64.zip !unzip protoc-3.19.0-linux-x86_64.zip -d protoc3 !sudo mv protoc3/bin/* /usr/local/bin/ !sudo mv protoc3/include/* /usr/local/include/ # 验证版本是否替换成功 !protoc --version
替换完成后,回到步骤1重新编译proto并安装API。
4. 在Python代码中手动添加路径
如果上述shell层面的设置还是不生效,在运行train.py之前,先通过Python代码强制添加路径,确保加载本地编译的版本:
import sys # 把research和slim目录放到Python路径的最前面,优先加载 sys.path.insert(0, '/content/models/research') sys.path.insert(0, '/content/models/research/slim') # 再运行训练命令 !python train.py --logtostderr \ --train_dir training/ \ --pipeline_config_path=training/ssd_inception_v2_coco.config
排查小技巧
- 先检查编译后的文件是否存在:
如果不存在,说明protoc编译失败,先解决编译问题;如果存在但还是报错,就是路径优先级的问题。!ls /content/models/research/object_detection/protos/preprocessor_pb2.py - 检查Python实际加载的object_detection路径:
如果输出的是import object_detection print(object_detection.__file__)/usr/local/lib/python3.7/dist-packages/object_detection/__init__.py,说明加载的是site-packages里的旧版本,需要调整PYTHONPATH或者用开发模式安装。
内容的提问来源于stack exchange,提问作者wfgeo
相关产品推荐
相关产品推荐

