2、目标检测基础:目标检测任务定义、边界框、类别、置信度、IoU、NMS等核心概念
目标检测是计算机视觉中最核心的任务之一,其目标是在图像或视频帧中定位出所有感兴趣的目标实例,并同时给出每个实例的类别标签。与图像分类(仅输出整张图片的类别)不同,目标检测需要回答“图中有什么、在哪里、有多大”三个问题。在实时部署场景中,检测模型不仅要保证精度,还必须在有限的计算资源下满足帧率要求。因此,理解边界框、置信度、IoU、NMS等基础概念,是后续进行模型选型、后处理优化和工程部署的基石。
上图展示了目标检测从输入到输出的完整链路。模型首先通过骨干网络提取图像特征,再由检测头输出大量候选框及其类别和置信度,最后经过IoU计算和NMS后处理得到稀疏且精确的最终结果。下面我们将逐一拆解这些核心概念。
2.1 目标检测任务定义与边界框表示
核心原理
目标检测的任务可以形式化描述为:给定一张图像 \( I \in \mathbb{R}^{H \times W \times 3} \),模型需要输出一组检测结果 \( D = \{d_1, d_2, ..., d_k\} \),其中每个检测结果 \( d_i = (b_i, c_i, s_i) \) 包含边界框 \( b_i \)、类别标签 \( c_i \) 和置信度得分 \( s_i \)。边界框通常有两种表示方式:中心点+宽高(即 \( (c_x, c_y, w, h) \))和左上角+右下角(即 \( (x_1, y_1, x_2, y_2) \))。在部署时,两种表示方式需要根据推理引擎的接口要求进行转换。
| 表示方式 | 格式 | 适用场景 | 优缺点 |
|---|---|---|---|
| 中心点+宽高 | (cx, cy, w, h) | YOLO系列、Anchor-based模型 | 便于回归计算,但需注意坐标偏移 |
| 角点坐标 | (x1, y1, x2, y2) | Faster R-CNN、SSD | 直观,便于IoU计算,但数值范围大 |
| 归一化坐标 | 除以W/H后的值 | 跨分辨率部署 | 适应不同输入尺寸,但需还原 |
判断方法
在实际工程中,选择哪种边界框表示方式取决于后端处理逻辑。例如,在TensorRT部署时,如果模型输出是中心点格式,需要编写一个轻量级的decode层将其转换为角点坐标,以便后续的NMS算子直接使用。转换公式如下:
// 中心点格式转角点格式
x1 = cx - w / 2
y1 = cy - h / 2
x2 = cx + w / 2
y2 = cy + h / 2
2.2 类别与置信度:模型输出的语义信息
核心原理
类别标签 \( c_i \) 表示检测到的目标属于预定义类别集合 \( C = \{1, 2, ..., K\} \) 中的哪一类,通常还会包含一个背景类(索引为0)。置信度 \( s_i \) 是一个综合得分,它由两部分组成:目标存在概率 \( P(obj) \) 和类别条件概率 \( P(class|obj) \)。在单阶段检测器中,最终置信度通常直接由分类分支输出,而在两阶段检测器中,还需要乘以RPN阶段的前景得分。
判断方法
在部署时,我们需要对置信度设置一个阈值(如0.5或0.25),低于该阈值的检测结果将被直接丢弃。这个阈值的选择直接影响模型的精确率和召回率。阈值越高,误检越少但漏检增多;阈值越低,召回率提升但误检增多。在实时场景中,建议根据业务容忍度动态调整该阈值。
2.3 IoU:衡量边界框重叠程度的标尺
核心原理
IoU(Intersection over Union,交并比)是目标检测中最核心的几何度量,它计算两个边界框的交集面积与并集面积的比值,取值范围为[0, 1]。IoU = 1表示完全重合,IoU = 0表示无重叠。其计算公式为:
IoU = Area(Intersection) / Area(Union)
在NMS中,IoU用于判断两个框是否指向同一个目标;在模型评估中,IoU用于判断预测框是否与真实框匹配(通常IoU > 0.5视为正确检测)。
操作流程
- 计算两个框的交集区域:
inter_w = min(x2a, x2b) - max(x1a, x1b),若为负则取0。 - 计算交集面积:
inter_area = inter_w * inter_h。 - 计算并集面积:
union_area = area_a + area_b - inter_area。 - 计算IoU:
iou = inter_area / union_area。
2.4 NMS:去除冗余检测的关键后处理
核心原理
非极大值抑制(Non-Maximum Suppression, NMS)是目标检测后处理中不可或缺的一步。由于滑动窗口或Anchor机制,模型会对同一个目标输出多个高度重叠的候选框。NMS的目标是保留每个目标周围置信度最高的框,并抑制其他冗余框。其核心逻辑是:
- 将所有候选框按置信度降序排序。
- 选择置信度最高的框,加入最终结果列表。
- 计算该框与其余所有框的IoU,将IoU大于阈值(如0.5)的框删除。
- 重复步骤2-3,直到候选框列表为空。
案例拆解:NMS在边缘设备上的优化
背景与约束:某安防项目需要在Jetson Nano上部署YOLOv5s模型,输入分辨率640×640,要求帧率不低于15 FPS。初步测试发现,模型推理耗时约45ms,但NMS后处理耗时高达30ms,成为性能瓶颈。
初始现象:通过Profiling工具发现,NMS耗时主要集中在循环遍历和IoU计算上。原始实现使用Python列表存储候选框,每轮迭代都需计算所有剩余框的IoU,时间复杂度为O(n²)。
分析判断:在640×640输入下,模型输出约25200个候选框(3个尺度×80×80+40×40+20×20),即使经过置信度过滤后仍有约2000个框进入NMS。O(n²)的复杂度导致耗时过高。
实际操作步骤:
- 将候选框数据从Python列表转换为NumPy数组,利用向量化计算批量IoU。
- 使用TensorRT的
EfficientNMS插件,该插件在CUDA上实现了并行NMS,将阈值过滤和NMS合并为一个算子。 - 将置信度阈值从0.25提高到0.4,减少进入NMS的候选框数量(从2000降至约800)。
结果对比:优化后NMS耗时从30ms降至5ms,整体帧率从13 FPS提升至20 FPS,mAP仅下降0.3%(从0.52降至0.517),满足业务需求。
风险与代价:提高置信度阈值可能漏检小目标或遮挡目标,需在测试集上验证。使用TensorRT插件后,模型的可移植性降低,更换推理引擎需重新实现。
复盘经验:在部署阶段,NMS的优化优先级应高于模型结构微调。优先考虑:① 向量化计算;② 使用推理引擎内置的NMS算子;③ 合理设置置信度阈值以减少候选框数量。
2.5 常见误区与总结复盘
误区一:混淆置信度与Softmax概率
很多初学者将分类分支的Softmax输出直接当作置信度。实际上,在YOLO系列中,置信度 = 目标存在概率 × 类别概率。如果直接使用Softmax输出,会忽略目标是否存在这一信息,导致背景区域产生高置信度的误检。
误区二:NMS阈值设置不当
NMS的IoU阈值设置过小(如0.3)会导致相邻的同类目标被误删;设置过大(如0.7)则可能保留大量重叠框。建议根据目标密集程度调整:密集场景(如人群计数)使用0.3~0.4,稀疏场景使用0.5~0.6。
误区三:忽略坐标变换的一致性
在部署时,如果预处理阶段对图像进行了Letterbox填充,那么模型输出的边界框坐标是基于填充后图像的。必须在后处理阶段将坐标映射回原始图像坐标系,否则检测框位置会偏移。
| 概念 | 常见错误 | 正确做法 |
|---|---|---|
| 边界框 | 使用未归一化的坐标 | 统一使用归一化坐标或记录原始尺寸 |
| 置信度 | 直接使用分类概率 | 乘以目标存在概率 |
| IoU | 忽略浮点精度 | 对负交集显式置零 |
| NMS | 使用O(n²)循环 | 向量化或使用CUDA加速 |