SSD模型转TFLite后interpreter输出含义及类别概率转换问题
问题1:output_details的返回内容是什么?
interpreter.get_output_details()返回的是由字典组成的列表,每个字典对应模型一个输出张量的完整元信息,常用字段如下:
index:输出张量的索引,调用get_tensor()时需要传入该值读取对应输出name:输出张量的原始名称dtype:输出张量的数据类型shape:输出张量的维度形状quantization:量化模型的缩放系数、零点参数,非量化模型该值为(0,0)
你目前代码里只读取了output_details[0]对应的第一个输出张量,你的SSD模型实际上有4个输出张量,剩下的分别对应检测置信度、类别索引、有效检测框数量。
问题2:形状tf.Tensor([ 1 10 4], shape=(3,), dtype=int32)的含义
这是第一个输出张量(检测框坐标)的三维形状,每个维度的数值含义如下:
- 第一个值
1:批次大小,代表你单次输入了1张图片 - 第二个值
10:模型配置的最大检测框数量,你训练时设置的单图最多输出10个检测结果 - 第三个值
4:每个检测框的坐标参数,顺序为归一化的[y_min, x_min, y_max, x_max],数值范围一般在0~1之间,超出部分是边界框溢出的合理情况,和你打印的10组4个坐标值完全对应。
问题3:如何获取每个类别的对应概率
你目前只读取了检测框坐标的输出,还需要读取另外两个输出张量才能拿到类别和概率信息,补全代码如下:
# 读取全部所需输出,去掉批次维度(第一个维度的1) # 检测框坐标,形状(10,4) boxes = interpreter.get_tensor(output_details[0]['index'])[0] # 检测置信度(即你需要的类别概率),形状(10,) scores = interpreter.get_tensor(output_details[1]['index'])[0] # 检测类别索引,形状(10,),数值为0~9对应你训练的10个类别 classes = interpreter.get_tensor(output_details[2]['index'])[0] # 可以按阈值过滤有效结果,比如置信度大于0.5的结果 for i in range(len(scores)): if scores[i] > 0.5: print(f"类别索引:{int(classes[i])},置信度:{scores[i]},框坐标:{boxes[i]}")
如果你的模型是int8量化模型,需要先用量化参数将输出的整数值转换为浮点型的真实概率:
# 从output_details[1]读取量化参数 scale, zero_point = output_details[1]['quantization'] scores = (scores.astype(np.float32) - zero_point) * scale
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

