YOLOv8 目标检测后返回的 result
对象包含丰富的预测信息。下面是一个整理自搜索结果的核心属性表格,方便你快速了解:
属性/方法路径 | 数据类型 | 描述 | 备注/示例 |
---|---|---|---|
result.boxes |
Boxes object |
包含检测到的所有边界框信息3 | 核心容器,下面有多个属性 |
result.boxes.xyxy |
torch.Tensor | 边界框坐标,格式为 [x_min, y_min, x_max, y_max] (绝对像素值)13 |
tensor([[ 10, 20, 100, 200], ...]) |
result.boxes.xywh |
torch.Tensor | 边界框坐标,格式为 [x_center, y_center, width, height] (绝对像素值)1 |
|
result.boxes.xyxyn |
torch.Tensor | 归一化的 [x_min, y_min, x_max, y_max] ,值范围 [0, 1] 1 |
相对于图像尺寸的比例 |
result.boxes.xywhn |
torch.Tensor | 归一化的 [x_center, y_center, width, height] ,值范围 [0, 1] 1 |
|
result.boxes.conf |
torch.Tensor | 每个检测框的置信度(confidence score),值范围 [0, 1] 13 |
值越高,模型越确信框内是目标且分类正确。tensor([0.95, 0.88, ...]) |
result.boxes.cls |
torch.Tensor | 每个检测框对应的类别索引(class index)3 | 整数形式。tensor([0., 2., ...]) 表示类别0、类别2等 |
result.names |
dict | 类别索引到类别名称(label)的映射字典1 | 例如 {0: 'person', 1: 'car', 2: 'dog'} 。通常通过 model.names 访问3 |
result.masks |
Masks object |
(实例分割模型) 包含分割掩码信息3 | 每个掩码对应一个检测到的对象实例。 |
result.keypoints |
Keypoints object |
(姿态估计模型) 包含检测到的关键点信息3 | 例如人的关节坐标。 |
result.orig_img |
numpy.ndarray | 原始的输入图像(BGR格式)3 | HWC 形状,即 (高度, 宽度, 通道数) 。常用于自定义可视化或后处理。 |
result.plot() |
method | 可视化检测结果,返回带标注框的图像(numpy数组)3 | 默认在图像上绘制框、标签和置信度。plot(conf=True, labels=True) 可控制参数。 |
result.save(filename) |
method | 将可视化结果保存为图像文件6 | |
result.verbose() |
method | 在控制台打印结果的摘要信息10 |
🧠 如何使用这些属性
获取 result
对象后,你可以这样提取和使用信息:
python
from ultralytics import YOLO
import cv2
# 加载模型
model = YOLO('yolov8n.pt') # 或用你自己的模型 'best.pt':cite[1]
# 进行预测
results = model.predict('path/to/your/image.jpg') # 也可直接传入cv2图像:cite[6]
# 处理检测结果
for result in results:
# 获取边界框的绝对坐标 (xyxy格式) 和置信度
boxes_xyxy = result.boxes.xyxy.cpu().numpy() # 转换为numpy数组方便处理
conf_scores = result.boxes.conf.cpu().numpy()
class_indices = result.boxes.cls.cpu().numpy().astype(int) # 类别索引转为整数
# 获取类别名称
class_names = [model.names[idx] for idx in class_indices] # 使用model.names映射:cite[3]
# 遍历每个检测到的对象
for i, (box, conf, cls_idx, cls_name) in enumerate(zip(boxes_xyxy, conf_scores, class_indices, class_names)):
x1, y1, x2, y2 = box
print(f"对象 {i+1}: 类别 {cls_name}({cls_idx}), 置信度 {conf:.4f}, 坐标 [{x1:.1f}, {y1:.1f}, {x2:.1f}, {y2:.1f}]")
# 可视化并显示结果 (需要有图形界面的环境)
annotated_img = result.plot() # 返回带标注的BGR图像 :cite[3]
cv2.imshow('YOLOv8 Detection', annotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 或者直接保存可视化结果
result.save('annotated_image.jpg') :cite[6]
💡 重要提示
-
GPU vs CPU : 如果模型在GPU上运行,
result.boxes
等属性对应的张量默认也在GPU上。使用.cpu()
方法将其转移到CPU后再转换为numpy数组或进行其他操作10。 -
模型类型 :
result.masks
和result.keypoints
仅在使用了相应的实例分割模型 或姿态估计模型 时才有效3。使用纯目标检测模型时,这些属性为None
。 -
批量处理 :
model.predict
可以处理单张图像,也可以处理一个图像列表(批量)。返回的results
是一个列表,其中每个元素对应一张图像的结果3。 -
归一化坐标 : 归一化坐标 (
xyxyn
,xywhn
) 的值在[0, 1]
之间,是相对于图像宽度(x坐标、宽)和高度(y坐标、高)的比例。将其乘以图像的宽高即可得到绝对坐标1。 -
置信度过滤 : 通常会根据
result.boxes.conf
设置一个阈值(如0.5),只保留置信度高于该阈值的预测框8。 -
非极大值抑制 (NMS) :
model.predict
默认会应用NMS来移除冗余的重叠框8。你通常不需要手动处理,但可以通过参数调整NMS的阈值。
希望这份详细的说明文档能帮助你更好地理解和使用 YOLOv8 的检测结果