yolo5print输出置信度
时间: 2023-07-16 08:13:42 浏览: 198
YOLOv5 算法中的 `detect.py` 文件中会有输出每个检测框的置信度(confidence score)。具体来说,`detect.py` 文件中的 `plot_one_box` 函数会输出每个检测框的置信度,代码如下:
```python
def plot_one_box(x, img, color=None, label=None, line_thickness=None):
# ... 省略部分代码
# 输出置信度
if label:
score_txt = f'{label[0]} {label[1]:.2f}'
cv2.putText(img, score_txt, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
# ... 省略部分代码
```
可以看到,`plot_one_box` 函数会在检测框上方输出一个字符串,里面包含了检测物体的类别和置信度。其中,`label` 参数是一个二元组,第一个元素是类别名称,第二个元素是置信度。因此,我们可以通过调用 `plot_one_box` 函数来输出每个检测框的置信度。
相关问题
onnx 输出置信度
### 获取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]。
yolo7检测框输出为中心点代码
以下是使用YOLOv7检测图像中的物体并输出检测框中心点坐标和宽高的Python代码示例:
```
import torch
import cv2
import numpy as np
from yolov7.utils.datasets import letterbox
from yolov7.models.experimental import attempt_load
from yolov7.utils.general import non_max_suppression, scale_coords, xyxy2xywh
# 加载YOLOv7模型
weights = 'yolov7s.pt'
device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
model = attempt_load(weights, map_location=device)
# 加载物体类别标签
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
# 设置输入图像尺寸和缩放因子
input_size = 640
scale_factor = 1/255.0
# 读取图像并进行预处理
image = cv2.imread("image.jpg")
height, width = image.shape[:2]
image = letterbox(image, new_shape=input_size)[0]
image = image[:, :, ::-1].transpose(2, 0, 1).copy()
image = torch.from_numpy(image).float().div(255.0).unsqueeze(0)
# 将预处理后的图像输入到网络中进行推理
model.eval()
with torch.no_grad():
output = model(image.to(device))[0]
output = non_max_suppression(output, conf_thres=0.5, iou_thres=0.5)
# 解析输出层并筛选出置信度较高的物体框
boxes = []
confidences = []
class_ids = []
if output[0] is not None:
for detection in output[0]:
x1y1 = (detection[:2] * input_size).int()
x2y2 = (detection[2:4] * input_size).int()
box = torch.cat([x1y1, x2y2], dim=-1).float()
box = scale_coords(image.shape[2:], box, image.shape[2:]).tolist()
x, y, w, h = xyxy2xywh(torch.tensor(box))[0].tolist()
center_x = x + w/2
center_y = y + h/2
boxes.append([x, y, w, h])
confidences.append(float(detection[4]))
class_ids.append(int(detection[5]))
# 应用非最大抑制(NMS)算法筛选出重叠度较小的物体框
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
# 绘制筛选后的物体框并输出中心点坐标和宽高
for i in indices:
i = i[0]
x, y, w, h = boxes[i]
center_x = x + w/2
center_y = y + h/2
print(classes[class_ids[i]], center_x, center_y, w, h)
cv2.rectangle(image, (int(x), int(y)), (int(x + w), int(y + h)), (0, 255, 0), 2)
cv2.putText(image, classes[class_ids[i]], (int(x), int(y)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示输出图像
cv2.imshow("YOLOv7 Object Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`yolov7s.pt`是YOLOv7模型的权重文件,`coco.names`是物体类别标签文件,`image.jpg`是待检测的图像。可以根据实际需求修改这些文件的路径和名称。在运行代码前需要确保已安装PyTorch库、OpenCV库和Numpy库,并将yolov7目录添加到Python路径中。
阅读全文