TensorFlow Object API转SSD模型为TFLite及Python调用异常问题
问题原因及解决方法
一、官方ODAPI导出模型推理置信度低的修复方案
- 预处理逻辑错误
你当前的预处理仅将图像转为float32类型,未按模型要求归一化到[-1, 1]区间,输入分布与训练时完全不符,导致推理结果失效。修改预处理代码:new_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2RGB) # 新增归一化步骤 new_img = (new_img.astype(np.float32) - 127.5) / 127.5 - 输出索引匹配错误
ODAPI导出的带NMS后处理的TFLite模型,默认输出顺序为:output_details[0]:检测框坐标output_details[1]:类别IDoutput_details[2]:置信度得分output_details[3]:有效检测数量
你之前调换了置信度和检测框的索引,拿到的得分本身就是错误值,调整对应索引即可。
- 可选优化
推理时可增加置信度过滤逻辑,只绘制得分大于0.5的框,避免无效结果干扰。
二、直接转换SavedModel的输出解析方案
你直接转换原生SavedModel时没有加入内置NMS后处理,输出的是模型原始预测结果,需要自行增加后处理步骤:
- 核心输出对应关系:
- 形状为
[1, 51150, 4]的张量:所有锚框的原始坐标 - 形状为
[1, 51150, 91]的张量:所有锚框对应91个COCO类别的原始置信度
其余输出为模型中间变量,无需使用。
- 形状为
- 后处理步骤:
先按置信度阈值(一般取0.5)过滤低得分结果,再调用tf.image.non_max_suppression接口执行非极大值抑制,去除重叠框,最终得到可用的检测结果。 - 更简单的替代方案:
不要直接转换训练生成的SavedModel,先用ODAPI提供的export_tflite_graph_tf2.py脚本导出带NMS后处理的中间SavedModel,再转换为TFLite,即可直接得到和官方教程一致的、输出后处理完成结果的模型。
内容的提问来源于stack exchange,提问作者Burschken
相关产品推荐
相关产品推荐

