YOLO实战:model.predict返回结果Results的10个关键属性解析(附代码示例)

YOLO实战:model.predict返回结果Results的10个关键属性解析(附代码示例) YOLO实战model.predict返回结果Results的10个关键属性解析附代码示例当你第一次调用model.predict()并看到返回的Results对象时可能会被其中复杂的属性结构所困惑。这篇文章将带你深入理解这个核心对象的每个组成部分并通过实际代码演示如何提取和利用这些数据。1. Results对象基础解析Results对象是YOLO模型预测结果的容器它包含了从原始图像到检测框的所有信息。我们先从一个简单的预测示例开始from ultralytics import YOLO # 加载预训练模型 model YOLO(yolov8n.pt) # 使用nano版本 results model.predict(bus.jpg) # 预测单张图片这里需要注意results实际上是一个列表即使你只预测了一张图片。这是因为YOLO的设计支持批量预测当处理多张图片时列表中的每个元素对应一张图片的预测结果。提示访问单张图片的结果时记得使用results[0]而不是直接使用results2. 核心属性详解2.1 检测框信息boxes属性boxes是Results对象中最重要的属性之一包含了所有检测到的边界框信息boxes results[0].boxes print(boxes.xyxy) # 边界框坐标[x1,y1,x2,y2]格式 print(boxes.conf) # 每个框的置信度 print(boxes.cls) # 每个框的类别IDboxes对象提供了多种坐标表示方式适用于不同场景属性名格式说明适用场景xyxy[x1,y1,x2,y2]像素坐标直接绘制到原图xywh[x,y,width,height]中心点坐标计算物体中心位置xyxyn归一化的xyxy坐标不同尺寸图像比较xywhn归一化的xywh坐标模型输入标准化2.2 类别映射names属性names是一个字典将类别ID映射到可读的类别名称for box in results[0].boxes: class_id int(box.cls) class_name results[0].names[class_id] print(f检测到 {class_name}置信度 {box.conf:.2f})2.3 原始图像信息Results对象保留了原始图像的相关信息方便后续处理orig_img results[0].orig_img # 原始图像数组 orig_shape results[0].orig_shape # 原始高宽(H,W) path results[0].path # 图像路径这些属性在需要将检测结果可视化或保存时特别有用。3. 高级属性应用3.1 关键点检测keypoints对于支持姿态估计的YOLO模型keypoints属性包含了检测到的人体关键点if hasattr(results[0], keypoints): keypoints results[0].keypoints.xy # 关键点坐标 print(f检测到 {len(keypoints)} 个人的关键点)3.2 实例分割masks当使用分割模型时masks属性提供了每个检测对象的掩码if hasattr(results[0], masks): masks results[0].masks print(f检测到 {masks.shape[0]} 个分割掩码)3.3 性能分析speed属性speed属性记录了预测过程中各阶段耗时毫秒speed results[0].speed print(f 预处理: {speed[preprocess]}ms 推理: {speed[inference]}ms 后处理: {speed[postprocess]}ms 总耗时: {sum(speed.values())}ms )4. 实战应用技巧4.1 结果可视化利用Results对象内置的方法可以快速可视化结果# 显示带标注的图像 results[0].show() # 保存可视化结果 results[0].save(filenameresult.jpg)4.2 结果过滤基于置信度过滤低质量检测结果import torch conf_threshold 0.5 boxes results[0].boxes high_conf_boxes boxes[boxes.conf conf_threshold] print(f过滤后保留 {len(high_conf_boxes)} 个高置信度检测)4.3 结果转换为常用格式将检测结果转换为Pandas DataFrame方便分析import pandas as pd def results_to_df(results): boxes results[0].boxes data { x1: boxes.xyxy[:, 0].tolist(), y1: boxes.xyxy[:, 1].tolist(), x2: boxes.xyxy[:, 2].tolist(), y2: boxes.xyxy[:, 3].tolist(), confidence: boxes.conf.tolist(), class: [results[0].names[int(c)] for c in boxes.cls] } return pd.DataFrame(data) df results_to_df(results) print(df.head())4.4 多模型结果比较比较不同YOLO版本在同一图像上的表现models { nano: YOLO(yolov8n.pt), small: YOLO(yolov8s.pt), medium: YOLO(yolov8m.pt) } comparison {} for name, model in models.items(): results model.predict(bus.jpg) boxes results[0].boxes comparison[name] { detections: len(boxes), avg_conf: torch.mean(boxes.conf).item() } print(pd.DataFrame(comparison).T)在实际项目中我发现boxes属性的多种坐标表示方式可以大大简化不同任务间的数据转换。特别是xywhn归一化坐标在需要将检测结果作为另一个模型的输入时特别有用。