Ultralytics YOLO27: 加入候补名单。
Get Started
计算机视觉基础·选择任务·课程 3/10
课程初级

了解目标检测

读取检测器的输出——类别、边界框、置信度——并根据不同错误的代价设定置信度和 IoU 阈值。

大多数生产环境中的视觉系统都是在检测基础上叠加逻辑:计数器、跟踪器、区域告警、隐私模糊处理。系统出问题时,原因通常不是模型,而是没人认真设定过某个阈值。了解检测器究竟会返回什么,以及哪两个参数会影响结果列表,你就能调试几乎所有基于检测构建的功能。

学习成果

在代码中读取 YOLO26 检测结果,并根据漏检与误报的代价选择 conf 和 iou。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. 每个检测结果都包含一个类别、一个边界框和一个置信度分数。

  2. conf 会过滤掉置信度较低的边界框(默认值为 0.25);iou 决定 NMS 何时将两个边界框视为重复项(默认值为 0.7)。

  3. 漏检代价很高?调低 conf。误报很显眼?调高它。

  4. 相邻对象消失了?调高 iou。

  5. 置信度用于排列边界框,不是经过校准的概率。

实践操作

检测器会返回什么#

滨水步道场景中的 Ultralytics YOLO 检测结果:行人、两位骑车者、一只狗和两辆汽车,每个边界框都标注了类别和置信度

图像中的每个标签都对应一行输出:类别名称、置信度,以及对象周围的边界框。检测模型返回的正是这样的列表:

  • 类别 — 一个整数索引,通过 result.names 映射到名称(0 是 person,5 是 bus)。
  • 边界框 — 用于定位对象的四个数值;xyxy 用像素坐标给出左上角和右下角。
  • 置信度 — 一个 0 到 1 之间的分数,用于为检测结果排序和筛选。

计数、告警、跟踪和模糊处理,都是你基于这些输出行编写的代码。

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]

for box in result.boxes:
    name = result.names[int(box.cls)]
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")
bus      conf=0.88 box=(0, 230, 803, 751)
person   conf=0.87 box=(49, 398, 240, 902)
person   conf=0.86 box=(223, 405, 345, 861)
person   conf=0.85 box=(670, 395, 810, 880)
person   conf=0.65 box=(0, 553, 60, 871)

逐行来看:公交车的边界框从 x=0 开始,因为公交车从左侧边缘延伸出画面;三名行人的置信度为 0.85–0.87;第四名行人被左侧边缘截断,置信度只有 0.65——模型只能看到半个身体。被截断对象的置信度偏低很正常,而它也是最先受到阈值影响的情况。

每个边界框都可以采用四种格式;根据下游代码的需求选择:

属性格式典型用途
boxes.xyxy角点像素坐标 (x1, y1, x2, y2)裁剪、绘制、重叠规则
boxes.xywh中心像素坐标加宽度和高度尺寸筛选、运动分析
boxes.xyxyn归一化到 0–1 的角点坐标适用于不同分辨率的规则
boxes.xywhn归一化到 0–1 的中心坐标和尺寸YOLO 标签文件

从候选框到最终列表#

模型内部会为每个对象评估许多候选边界框。经过两种筛选后,才会得到你看到的列表:

置信度筛选。 conf 会过滤掉低于阈值的边界框;预测时的默认阈值为 0.25。对于公交车图像,数量会很快发生变化:

confbus.jpg 上的边界框
0.107
0.255
0.505
0.754

重复项筛选。非极大值抑制 (NMS) 会保留置信度最高的边界框,并删除同类别中与它的重叠程度超过 iou(默认值为 0.7)的其他边界框。重叠程度通过交并比衡量:共享区域面积除以合并后的总面积。

鸟类图像上的交并比:预测边界框与真实边界框及对应掩码相互重叠,IoU 表示重叠面积除以并集面积

ioubus.jpg 上的边界框效果
0.35严格:重叠框会被合并
0.75默认
0.958宽松:近似重复项会保留

根据错误的代价选择阈值#

如果……那么……
漏检代价很高(安全警报、缺陷)降低 conf,并接受一些误报
误报会被用户看到(搜索、标记)提高 conf
你要报告计数在验证图像上遍历 conf,并选择计数误差最小的值
拥挤场景中的真实相邻目标会消失提高 iou,例如从 0.7 提高到 0.8
同一个目标被框出两次降低 iou
不同类别的难度各不相同使用所需的最低 conf 进行预测,然后在代码中按类别筛选

仓库安全监控是典型的低阈值场景;预测模式列出了所有推理参数。

常见问题#

把置信度当成概率

症状:“模型有 88% 的把握认为这是公交车”,并凭直觉选择阈值。解决方法:将置信度视为排序分数。在 YOLO26 中,一个分数同时表示“存在一个物体”和“它属于这个类别”,而且这个分数未经校准——应根据验证数据选择阈值,而不是根据数值的字面含义。

两个相邻目标少了一个?检查 NMS

两个人肩并肩站着时,他们的边界框会高度重叠,NMS 可能会把真实的人当作“重复项”删除。调高 iou,第二个边界框就会恢复。YOLO26 还提供了无需 NMS 的端到端检测头;传入 nms=False 即可使用。

只在一张图像上调参

症状:某个阈值在演示图像上看起来完美,到了真实摄像头画面中却失效。解决方法:在来自部署摄像头的验证集上扫描阈值;一张图像只能让你了解各参数的作用。

四种出错方式#

失败情况哪里出了问题典型修复方法
类别正确,框不准定位统一并收紧框选规则;对小目标使用更大的 imgsz
框正确,类别错误分类增加易混淆类别对的样本,或合并这些类别
完全没有框召回率增加该情况的样本:光照、尺寸、遮挡
在背景上出现框精确率加入容易误导模型的对象的困难负样本图像

两份列表可以快速诊断问题:低置信度的真正例(模型不确定真实目标是否存在)和高置信度的假正例(模型确信地识别错了)。它们对应不同的修复方法。

试试看

使用 conf=0.05 运行解决方案并打开保存的图像。将每个低于 0.5 的框标记为真正例或假正例,并记录每个假正例出现的原因。然后写下你会为这台摄像头上的行人计数器部署的 conf,并用一句话说明理由。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • 你有一份 bus.jpg 中所有低于 0.5 的框的列表,每个框都标记为真正例或假正例,并附有原因。

  • 你已经为行人计数器写下一个 conf 值,以及它能防范的错误。

  • 你可以借助 IoU 表解释为什么提高 iou 会让被抑制的相邻目标重新出现。

显示解答
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]

for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
    name, conf = result.names[int(box.cls)], float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")
0.88 bus        (0, 230, 803, 751)
0.87 person     (49, 398, 240, 902)
0.86 person     (223, 405, 345, 861)
0.85 person     (670, 395, 810, 880)
0.65 person     (0, 553, 60, 871)
0.18 person     (0, 600, 40, 871)
0.12 stop sign  (0, 252, 35, 326)
0.08 handbag    (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag    (225, 634, 291, 705)

所有低于 0.5 的框都是假正例。0.18 的 person 与左边缘被截断、置信度为 0.65 的行人重复。0.12 的 stop sign 是一块真实路牌,但类别错误。手提包和滑板实际框到了手和鞋子。所有真实目标的得分都高于 0.6,因此对于行人计数器,conf=0.5 会保留全部四个人并去除所有干扰项,从而防止重复计数。部署前,请用真实摄像头的验证集确认这一点:置信度为 0.65 的截断行人表明,真实目标的得分可能会非常接近阈值。

接下来做什么

下一节:当矩形框不够用、你需要目标的精确形状时。

登录以保存学习进度