Ultralytics YOLOv8目标检测中probs属性返回None的问题咨询
问题
使用Ultralytics YOLOv8进行图像目标检测时,尝试从results对象中获取分类输出的probs属性,返回值为None。代码如下:
from ultralytics import YOLO # Load a model model = YOLO('yolov8n.pt') # pretrained YOLOv8n model # Run batched inference on a list of images results = model('00000.png') # return a list of Results objects # Process results list for result in results: boxes = result.boxes # Boxes object for bbox outputs masks = result.masks # Masks object for segmentation masks outputs keypoints = result.keypoints # Keypoints object for pose outputs probs = result.probs # Probs object for classification outputs print(probs)
运行后print(probs)输出None,其余输出内容:
image 1/1 00000.png: 640x640 1 person, 1 zebra, 7.8ms Speed: 2.6ms preprocess, 7.8ms inference, 1.3ms postprocess per image at shape (1, 3, 640, 640)
请问:
- 为何
probs属性会返回None? - 如何获取每个检测对象的分类概率?
- Ultralytics YOLOv8的此设计是否存在特定原因?
解答
1. 为什么probs返回None?
probs是YOLOv8分类任务模型的专属输出属性,而你加载的yolov8n.pt是目标检测任务模型。两类模型的输出逻辑完全不同:
- 分类模型输出整幅图像属于各个类别的概率分布,对应
probs属性; - 检测模型的核心输出是检测框及其对应类别的置信度,这些信息存储在
result.boxes中,不会生成probs属性,因此访问时返回None。
2. 获取每个检测对象的分类概率(置信度)
在目标检测任务中,每个检测对象的类别置信度和类别信息都包含在result.boxes对象中,可以通过以下方式获取:
boxes.conf:每个检测框的置信度值(模型对该检测结果的信任程度,范围0-1);boxes.cls:每个检测框对应的类别索引;model.names:模型的类别名称映射表,可通过索引获取类别名称。
示例代码:
from ultralytics import YOLO model = YOLO('yolov8n.pt') results = model('00000.png') for result in results: # 遍历所有检测框 for box in result.boxes: # 获取置信度,保留两位小数 conf = round(float(box.conf), 2) # 获取类别索引,转为整数 cls_idx = int(box.cls) # 获取类别名称 cls_name = model.names[cls_idx] print(f"检测对象:{cls_name},置信度:{conf}")
3. 该设计的原因
YOLOv8采用模块化设计,针对不同任务(检测、分类、分割、姿态估计)的输出结构做了差异化处理:
- 不同任务的核心输出需求不同:检测任务关注"哪里有什么",输出检测框+对应类别置信度;分类任务关注"整体是什么",输出全类别概率分布。
- 分开存储不同任务的输出属性,能避免结果结构混乱,让开发者可以快速定位到对应任务的输出数据,提升代码可读性和开发效率。
内容的提问来源于stack exchange,提问作者hanugm
相关产品推荐
相关产品推荐

