onnx 输出置信度
时间: 2025-01-02 20:33:55 浏览: 8
### 获取ONNX模型输出置信度
为了从ONNX模型中获得预测结果的置信度分数,可以利用 `onnxruntime` 库加载训练好的YOLOv11 ONNX模型并执行推理操作。具体来说,在完成图像预处理之后将其作为输入传递给模型,模型会返回一系列输出数据其中包括边界框坐标、类别索引以及相应的置信度分数。
通常情况下,这些信息会被打包成一个多维张量形式给出。对于YOLO系列的目标检测算法而言,其最后一层往往会产生一个形状类似于 `(batch_size, num_anchors * (num_classes + 5), grid_h, grid_w)` 的特征图,其中每个锚点对应着五个属性:中心位置x/y偏移量、宽度/高度缩放因子、对象存在概率;再加上各个类别的条件概率分布向量[^1]。
当使用像 `onnxruntime` 这样的工具来进行推理时,可以直接访问这个多维度数组来提取所需的信息:
```python
import onnxruntime as ort
import numpy as np
# 初始化SessionOptions以支持自动选择设备(CPU/GPU)
sess_options = ort.SessionOptions()
session = ort.InferenceSession('yolov11.onnx', sess_options)
input_name = session.get_inputs()[0].name
output_names = [o.name for o in session.get_outputs()]
def get_confidence_scores(image_data):
"""
输入经过预处理后的图片数据,
返回预测的结果中的置信度分数列表。
参数:
image_data: 预处理过的numpy array格式的数据
返回:
confidences: list of float 类型的置信度分数组
"""
# 执行前向传播得到所有输出节点的数据
outputs = session.run(output_names, {input_name: image_data})
# 假设最后一个输出包含了所有的预测信息
pred_output = outputs[-1]
# 解析pred_output获取置信度分数
batch_predictions = []
for i in range(pred_output.shape[0]): # 对每一张测试样本进行解析
predictions_per_image = []
anchor_count = int((pred_output.shape[1]-5)/len(CLASSES))
for j in range(anchor_count):
start_idx = j*(5+len(CLASSES))
end_obj_score_idx = start_idx + 4
obj_score = sigmoid(pred_output[i][end_obj_score_idx])
class_probs_start = end_obj_score_idx + 1
class_probs_end = class_probs_start + len(CLASSES)
class_probabilities = softmax(
pred_output[i][class_probs_start:class_probs_end])
max_class_prob_index = np.argmax(class_probabilities)
confidence_score = obj_score * \
class_probabilities[max_class_prob_index]
predictions_per_image.append(confidence_score.item())
batch_predictions.extend(predictions_per_image)
return batch_predictions
def sigmoid(x):
"""计算sigmoid函数"""
return 1 / (1 + np.exp(-x))
def softmax(logits):
"""计算softmax函数"""
exps = np.exp(logits - np.max(logits))
return exps / np.sum(exps)
CLASSES = ["person", "bicycle", ... ] # 定义具体的分类标签集合
image_preprocessed = preprocess_your_image() # 替换成实际使用的预处理逻辑
confidences = get_confidence_scores(np.array([image_preprocessed]))
print(f'Confidence scores are :{confidences}')
```
上述代码片段展示了如何定义辅助方法用于转换原始网络输出为易于理解的形式——即单个数值表示某特定实例属于某一类的概率大小。注意这里假设了最后一位代表物体存在的可能性而紧接着后面几位则依次列举各类别发生的几率[^2]。
阅读全文