如何调优TensorFlow目标检测输出?解决类别标签错误问题
解决TensorFlow Object Detection API类别标签全错的问题
这种边界框精准但所有物体都被标成同一个错误类别的情况,我之前踩过好几次坑!大概率是分类分支的配置或者数据映射环节出了问题,咱们一步步来排查:
1. 先查label_map.pbtxt——最容易翻车的点
这个文件是模型识别类别时的核心映射,必须丝毫不差:
- 确保每个类的
id从1开始(TensorFlow Object Detection默认0是背景),三类的话就是1、2、3,别搞成0、1、2或者重复的id - 每个类的
name要和你生成record时用的类别文本完全一致,大小写、空格、标点都不能错!比如你数据集里标是"red_apple",这里就不能写"RedApple" - 给你个正确的示例参考:
item { id: 1 name: "apple" } item { id: 2 name: "banana" } item { id: 3 name: "orange" }
2. 核对pipeline.config里的类别配置
训练配置文件里的几个参数必须和你的数据集匹配:
- 找到
num_classes字段,一定要改成3(你的类别数),别留着默认的90或者其他数字 - 检查
train_input_reader和eval_input_reader里的label_map_path,都要指向正确的label_map.pbtxt路径,绝对路径或者相对训练脚本的路径都可以,但别写错!很多人只改了训练的,忘了改评估的,也会出问题 - 如果用的是预训练模型,还要确认模型的分类头是否适配你的类别数,大部分官方配置会自动根据
num_classes调整,但少数特殊模型可能需要手动修改分类层输出维度
3. 再确认数据集record的类别映射
虽然你说record里的类别正确,但还是抽几个样本验证下更放心:
- 用TensorFlow的工具解析几个record样本,打印每个物体的
class_id和对应的类别文本,确认和label_map里的id一一对应 - 检查生成record的脚本,看看类别到id的映射是不是写反了,比如把apple映射成了3、orange映射成了1,这种情况边界框对但类别全错很常见
4. 看看训练时的分类损失是否正常
如果分类分支没学到东西,也会出现这种情况:
- 翻训练日志,找
classification_loss这个指标,如果它一直降不下来,甚至后期回升,说明分类分支根本没学到有效特征 - 可以试试调整训练参数:比如给分类分支单独设置更高的学习率(在
pipeline.config的optimizer部分配置),或者延长训练步数(49K步可能对分类来说还不够) - 另外检查样本是否不平衡:如果某一类的样本量是其他类的好几倍,模型会偏向预测这个类,这种情况要做样本均衡——要么过采样少的类,要么欠采样多的类,或者用加权损失
5. 固化模型和推理环节的检查
- 用
export_inference_graph.py固化模型时,一定要用训练完成后的pipeline.config,而且里面的label_map_path要正确 - 推理时的脚本,加载label_map的代码有没有写错?比如是不是只加载了一个类别,或者id和name对应错了?给你个正确的加载示例:
确保这里的from object_detection.utils import label_map_util # 加载label map label_map = label_map_util.load_labelmap('./label_map.pbtxt') categories = label_map_util.convert_label_map_to_categories( label_map, max_num_classes=3, use_display_name=True ) category_index = label_map_util.create_category_index(categories)max_num_classes是3,路径也没错
如果以上都排查过还是不行,可以试试换个预训练模型重新初始化训练,比如从SSD MobileNet换成Faster R-CNN,看看是不是模型架构的分类分支适配问题。
内容的提问来源于stack exchange,提问作者Unbanned
相关产品推荐
相关产品推荐

