对图像进行预测
在 Python 中运行预训练的 YOLO26 模型,从结果中读取类别、置信度和像素坐标框,并调整能解决大多数漏检问题的参数。
检测器的每种实际用途——统计货架上的库存、裁剪人脸以进行模糊处理,或将边界框发送到 JSON API——都始于正确读取结果对象。哪怕只弄错一个细节,比如用张量索引类别名称,你的应用也会在处理第一张图像时崩溃。
预训练的 YOLO26 检测模型已经认识 COCO 的 80 个类别。在本课中,你将从 Python 运行预测模式,从结果中提取所有有用字段,并了解应调整哪个参数来处理漏检、重复检测和小目标。之后使用你自己训练的模型时,也会得到相同的结果对象。
实践操作
预测并打印每个检测结果#

对输入源调用模型会运行预测模式,并返回一个列表,其中每张图像对应一个 Results 对象。只有一张图像时,读取 results[0]。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
for box in result.boxes:
name = result.names[int(box.cls)]
conf = float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:>8} {conf:.2f} ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")
result.save("bus_annotated.jpg")predict.py 的实际输出,位于常见的日志行之后:
bus 0.88 (0, 230) -> (803, 751)
person 0.87 (49, 398) -> (240, 902)
person 0.86 (223, 405) -> (345, 861)
person 0.85 (670, 395) -> (810, 880)
person 0.65 (0, 553) -> (60, 871)读取结果:
bus 0.88:类别名称和置信度。边界框按置信度从高到低排序。(0, 230) -> (803, 751):原始 810×1080 图像中左上角和右下角的像素坐标,原点位于左上角。你可以直接用这些坐标进行裁剪或绘制。person 0.65在(0, 553)处:第五个人被左侧边缘截断,因此得分较低。部分可见的物体通常会出现这种情况。
result.save() 会写入标注后的图像;result.show() 会在窗口中打开图像。
了解结果中包含什么#
每种任务都返回相同的 Results 类型;只有已填充的字段会有所不同。完整字段说明请参阅 Python 使用指南。
| 属性 | 包含内容 |
|---|---|
boxes | 检测结果:像素坐标 xyxy、归一化中心格式 xywhn、conf、cls,以及跟踪时使用的 id |
masks, keypoints, obb, probs | 分割、姿态、OBB 和分类模型的输出(检测模型中为 None) |
names | 类别索引 → 类别名称的字典 |
orig_img, orig_shape | 作为 NumPy 数组的输入图像及其高度 × 宽度 |
speed | 预处理、推理和后处理耗时,单位为毫秒 |
path, save_dir | 输入来源以及输出写入位置 |
对于目标检测,你主要需要 boxes,也就是边界框。result.summary() 会将相同的检测结果作为普通字典列表返回,可直接用于 JSON API。
调整预测参数#
默认设置适用于大多数图像。如果不适用,每次只调整一个参数:
| 遇到的问题 | 参数 | 默认 | 调整方式 |
|---|---|---|---|
| 漏检:能看到物体,却没有检测框 | conf | 0.25 | 调低,例如 0.1 |
| 误检:在没有物体的地方出现检测框 | conf | 0.25 | 调高,例如 0.5 |
| 同一个物体上出现两个检测框 | iou | 0.7 | 调低:NMS合并重复检测框时使用的重叠(IoU)阈值 |
| 漏掉小型或远处的物体 | imgsz | 640 | 调高,例如 1280(取整到 32 的倍数) |
| 只关注部分类别 | classes | 全部 | 例如,使用 classes=[0] 只检测人物 |
| 硬件不正确 | device | 自动 | cpu、mps,或类似 0 的 GPU 索引 |
置信度会改变预测结果,而不仅仅是检测数量。同一张公交车图像的结果:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0]) # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1) # 5 个人、1 辆公交车、1 个停车标志在 conf=0.1 时,模型还会报告一个它不太确定的停车标志。调低 conf 是查看模型“差一点就检测到”的目标最快的方法。其他参数请参阅配置参考。
如果预测结果为空,按以下路径逐步排查:
批量运行多张图像#
传入列表、文件夹或类似 "photos/*.jpg" 的 glob 模式。预测默认使用 batch=1;设置 batch 可让模型一次处理多张图像,在 GPU 上会快得多:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
print(result.path, len(result.boxes), result.verbose())image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,避免这些错误#
症状:KeyError: tensor([5.])。原因:box.cls 和 box.conf 是 PyTorch 张量,而 result.names 是以 int 为键的字典。解决方法:先进行转换:result.names[int(box.cls)]、float(box.conf)、box.xyxy[0].tolist()。
症状:在函数内部调用 YOLO("yolo26n.pt") 的辅助函数运行缓慢。在笔记本电脑的 CPU 上,每张图像都重新加载模型需要 71 毫秒,而只加载一次则需要 25 毫秒。解决方法:在启动时创建一次模型,并对每张图像重复使用。
model(list_or_folder) 会先在内存中收集每个 Results 对象,然后再返回。对于大型文件夹和所有视频,传入 stream=True 并循环处理:结果会逐个返回。视频课程对此有深入讲解。
显示解答
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, verbose=False):
top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
print(f"{result.path}: {len(result.boxes)} detections")
for d in top3:
print(f" {d['name']:>8} {d['confidence']:.2f}")image0.jpg: 5 detections
bus 0.90
person 0.85
person 0.85
image1.jpg: 3 detections
person 0.89
person 0.79
tie 0.59summary() 已经返回普通名称和浮点数,因此无需转换张量。由于图像列表会填充到统一尺寸,置信度与 predict.py 的结果略有不同。在 conf=0.1 时,bus.jpg 会额外检测出一个停车标志。