Ultralytics YOLO27: 加入候补名单。
Get Started
课程初级

对图像进行预测

在 Python 中运行预训练的 YOLO26 模型,从结果中读取类别、置信度和像素坐标框,并调整能解决大多数漏检问题的参数。

检测器的每种实际用途——统计货架上的库存、裁剪人脸以进行模糊处理,或将边界框发送到 JSON API——都始于正确读取结果对象。哪怕只弄错一个细节,比如用张量索引类别名称,你的应用也会在处理第一张图像时崩溃。

预训练的 YOLO26 检测模型已经认识 COCO 的 80 个类别。在本课中,你将从 Python 运行预测模式,从结果中提取所有有用字段,并了解应调整哪个参数来处理漏检、重复检测和小目标。之后使用你自己训练的模型时,也会得到相同的结果对象。

学习成果

你可以编写 Python 脚本,在图像上运行 YOLO26,并打印每个检测结果的类别名称、置信度和像素坐标框;你也知道应该用哪个参数解决哪类漏检。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. 只加载一次:model = YOLO('yolo26n.pt');然后执行 result = model(source)[0]。

  2. 遍历 result.boxes;使用 int(box.cls)、float(box.conf)、box.xyxy[0].tolist() 进行转换。

  3. 使用 result.names[int(box.cls)] 将类别索引映射到名称。

  4. 按需在每次调用中调整 conf、iou、imgsz 和 classes。

实践操作

预测并打印每个检测结果#

Ultralytics YOLO 在海滨步道上的检测结果:人物、自行车、狗和汽车周围带有置信度分数的标注框

对输入源调用模型会运行预测模式,并返回一个列表,其中每张图像对应一个 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。

调整预测参数#

默认设置适用于大多数图像。如果不适用,每次只调整一个参数:

遇到的问题参数默认调整方式
漏检:能看到物体,却没有检测框conf0.25调低,例如 0.1
误检:在没有物体的地方出现检测框conf0.25调高,例如 0.5
同一个物体上出现两个检测框iou0.7调低:NMS合并重复检测框时使用的重叠(IoU)阈值
漏掉小型或远处的物体imgsz640调高,例如 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 并循环处理:结果会逐个返回。视频课程对此有深入讲解。

试试看

编写 top3.py:只加载一次 yolo26n.pt,在 bus.jpg、zidane.jpg 和你自己的一张照片上运行模型,并打印每张图像的检测数量以及置信度最高的三个类别。然后,对检测数量最少的图像使用 conf=0.1 重新运行,并用一句话写下新出现了什么。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • 你的脚本会为每张图像打印检测数量和置信度最高的三个类别,且不需要 KeyError。

  • 你已比较一张图像在 conf=0.25 和 conf=0.1 下的结果,并记录了变化。

  • 你知道遇到漏检、重复检测框和小目标时应该调整哪个参数。

显示解答
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.59

summary() 已经返回普通名称和浮点数,因此无需转换张量。由于图像列表会填充到统一尺寸,置信度与 predict.py 的结果略有不同。在 conf=0.1 时,bus.jpg 会额外检测出一个停车标志。

接下来做什么

你已经用过最小尺寸的模型。接下来,确定你的项目实际应该训练和部署哪个 YOLO26 尺寸。

登录以保存学习进度