本地使用TensorFlow Object Detection API时遭遇Protobuf报错
我之前也踩过一模一样的坑!从你的报错日志里能一眼揪出问题根源——你的label map(标签映射)文件格式有问题,或者配置文件里指向的路径不对,导致Protobuf解析器读不懂它。咱们一步步来解决:
先看错误根源
最开始的报错已经给了明确提示:
google.protobuf.text_format.ParseError: 3:10 : Expected ":"
这说明你的label map文件(通常是.pbtxt格式)在第3行第10个字符的位置,缺了冒号,或者格式完全不符合Protobuf文本的语法要求。后面的TypeError: unsupported operand type(s) for &: 'str' and 'int'只是连锁反应——程序发现文本解析失败,就尝试把它当成二进制Protobuf来读,结果自然报错了。
具体解决方案
1. 检查并修复label map文件格式
你的label map文件必须严格遵循以下格式,每一项的键值对后面必须加冒号,字符串用单/双引号括起来,括号要配对:
item { id: 1 name: 'cat' } item { id: 2 name: 'dog' }
重点检查报错提到的第3行:是不是漏了:?比如把id: 1写成了id 1?或者把name:拼错了?另外注意id必须从1开始,不能从0起步,否则训练时会出其他问题。
2. 确认pipeline.config里的路径配置正确
打开你用的ssdlite_mobilenet_v2_coco_2018_05_09/pipeline.config,找到train_input_reader和eval_input_reader里的label_map_path项,确保它指向的是你正确的label map文件路径(可以是相对路径,相对于你运行train.py的object_detection/目录,或者绝对路径)。
比如正确的配置应该是这样:
train_input_reader { label_map_path: "training/your_label_map.pbtxt" tf_record_input_reader { input_path: "training/train.record" } } eval_input_reader { label_map_path: "training/your_label_map.pbtxt" tf_record_input_reader { input_path: "training/test.record" } }
3. 验证label map文件的有效性
在object_detection目录下打开Python交互环境,用官方工具测试你的label map能不能正常加载:
python3
然后输入:
from object_detection.utils import label_map_util # 替换成你的label map文件路径 label_map = label_map_util.load_labelmap("training/your_label_map.pbtxt") # max_num_classes改成你自己的类别数 categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=2, use_display_name=True) print(categories)
如果这一步不报错,能正常输出类别列表,说明你的label map没问题了。
4. 重新运行训练命令
当以上步骤都完成后,再重新执行你的训练命令:
python3 train.py --logtostderr --train_dir=training/ --pipeline_config_path=ssdlite_mobilenet_v2_coco_2018_05_09/pipeline.config
额外提醒
- 确保label map里的类别名称,和你制作TFRecord数据集时用的类别名称完全一致(大小写、拼写都不能错),否则训练时会出现类别不匹配的问题。
- 如果还是报错,可以检查一下你的Protobuf版本是否和TensorFlow兼容,不过从你之前的测试脚本运行正常来看,版本应该没问题,重点还是label map的问题。
内容的提问来源于stack exchange,提问作者Anna

