4、目标检测基础:目标检测任务定义、边界框、类别标签、置信度、IoU(交并比)等核心概念
在机器人视觉系统中,目标检测(Object Detection)是连接“看见”与“理解”的关键桥梁。与图像分类(判断整张图是什么)不同,目标检测需要回答两个更复杂的问题:“图中有什么物体?”以及“这些物体分别在哪里?”。对于舵机跟随、机械臂抓取、移动避障等机器人任务而言,仅知道“画面中有一个人”远远不够,必须知道这个人的像素坐标位置,才能驱动舵机转向或规划机械臂轨迹。本章将系统梳理目标检测任务的形式化定义、边界框表示方法、类别标签与置信度的含义,以及评估检测质量的核心指标——IoU(交并比),为后续学习轻量级检测模型(如YOLO、SSD、NanoDet)打下坚实基础。
4.1 目标检测任务的形式化定义
目标检测任务可以形式化描述为:给定一张输入图像 \( I \in \mathbb{R}^{H \times W \times 3} \),其中 H 和 W 分别为图像的高度和宽度(以像素为单位),3 表示 RGB 三个颜色通道。检测模型需要输出一个目标集合 \( D = \{d_1, d_2, ..., d_n\} \),其中每个检测结果 \( d_i \) 包含三个核心要素:边界框(Bounding Box)、类别标签(Class Label)和置信度(Confidence Score)。
在机器人视觉的实际工程中,输入图像通常来自摄像头实时视频流。以常见的 USB 摄像头为例,分辨率为 640×480 或 1280×720,帧率为 30 FPS。这意味着检测模型必须在约 33 毫秒内完成一帧图像的前向推理,才能保证实时性。因此,目标检测任务在机器人场景下不仅是“能否检测到”的问题,更是“能否在限定时间内检测到”的约束优化问题。
4.2 边界框(Bounding Box)的表示方法
边界框是目标在图像中的矩形包围区域,通常有两种主流表示方式:
| 表示方式 | 参数含义 | 适用场景 | 示例 |
|---|---|---|---|
| 中心点 + 宽高 (cx, cy, w, h) | 矩形中心坐标、宽度、高度 | YOLO 系列模型输出格式 | (320, 240, 100, 80) |
| 左上角 + 右下角 (x1, y1, x2, y2) | 两个对角顶点坐标 | Faster R-CNN、SSD 及标注工具 | (270, 200, 370, 280) |
| 归一化坐标 (x_center, y_center, w_norm, h_norm) | 相对图像宽高的比例值 | 模型训练时避免尺度影响 | (0.5, 0.5, 0.156, 0.167) |
在轻量级检测模型(如 NanoDet、YOLOv5-nano)中,边界框通常以归一化坐标输出,因为这样可以使模型对不同分辨率的输入图像具有更好的泛化能力。实际部署时,需要将归一化坐标乘以图像宽高,还原为像素坐标,才能用于舵机控制或机械臂定位。
# 归一化坐标转像素坐标示例
img_w, img_h = 640, 480
x_norm, y_norm, w_norm, h_norm = 0.5, 0.5, 0.156, 0.167
x_pixel = int(x_norm * img_w) # 320
y_pixel = int(y_norm * img_h) # 240
w_pixel = int(w_norm * img_w) # 100
h_pixel = int(h_norm * img_h) # 80
4.3 类别标签与置信度
类别标签定义了检测目标所属的语义类别。在机器人视觉项目中,类别集合通常由任务需求决定。例如,一个桌面清理机器人需要检测“杯子”、“书本”、“笔”等物体;而一个行人跟随机器人则只需检测“person”一个类别。类别标签通常以整数索引表示(如 0=person, 1=cup, 2=book),模型输出的类别概率向量经过 softmax 或 sigmoid 激活后,取最大值对应的索引作为预测类别。
置信度(Confidence Score)是一个 0 到 1 之间的浮点数,表示模型对该检测结果的把握程度。它综合了“框内是否真的有目标”和“目标属于该类别的概率”两个因素。在 YOLO 系列中,置信度计算公式为:
confidence = objectness × class_probability
其中 objectness 表示边界框内包含目标的概率,class_probability 表示该目标属于某一类别的概率。实际工程中,通常设置一个置信度阈值(如 0.5),低于该阈值的检测结果会被直接丢弃,以减少误检。
4.4 IoU(交并比)——衡量检测质量的标尺
IoU(Intersection over Union)是目标检测中最核心的评估指标,用于衡量预测边界框与真实边界框(Ground Truth)之间的重叠程度。其计算公式为:
IoU = (预测框 ∩ 真实框) 的面积 / (预测框 ∪ 真实框) 的面积
IoU 的取值范围为 [0, 1]:0 表示两个框完全没有重叠,1 表示完全重合。在模型评估中,通常设定一个 IoU 阈值(常见为 0.5),当预测框与真实框的 IoU 大于该阈值时,认为该检测结果是正确的(True Positive)。
IoU 在机器人视觉中有三个关键应用场景:
- 模型评估:计算 mAP(mean Average Precision)时,需要根据 IoU 阈值判断检测是否正确。
- 非极大值抑制(NMS):同一目标可能产生多个重叠的预测框,通过 IoU 计算重叠程度,保留置信度最高的框,删除其他冗余框。
- 跟踪关联:在连续帧中,通过计算前后帧检测框的 IoU,判断是否为同一目标,实现简单的目标跟踪。
4.5 案例拆解:舵机跟随中的目标检测流程
假设我们要实现一个基于舵机云台的红色小球跟随系统。摄像头分辨率为 640×480,舵机云台可以在水平和垂直方向旋转。整个检测与跟随流程如下:
场景约束:红色小球直径约 5cm,摄像头距离小球 1~2 米,背景为白色墙壁。舵机响应延迟约 50ms,要求系统在 100ms 内完成一次检测与角度更新。
初始现象:使用 YOLOv5-nano 模型(输入尺寸 320×320)进行检测,发现两个问题:一是小球在图像中仅占约 20×20 像素,检测置信度只有 0.35;二是当小球快速移动时,检测框出现明显抖动。
分析过程:
- 小球像素面积过小,导致特征提取不充分,置信度偏低。解决方案:将输入分辨率提升至 416×416,或使用图像裁剪放大预处理。
- 检测框抖动是因为相邻帧的检测结果不稳定,且没有做平滑处理。解决方案:引入指数移动平均(EMA)对边界框中心坐标进行滤波。
- 舵机控制需要的是小球中心的像素坐标,而非完整边界框。因此,从检测结果中提取 (cx, cy) 作为控制输入。
实际操作步骤:
# 伪代码:检测 + 跟随控制
while True:
frame = camera.read() # 读取一帧
detections = model.detect(frame, conf=0.4) # 检测,阈值0.4
if len(detections) > 0:
# 取置信度最高的检测框
best = max(detections, key=lambda d: d.conf)
cx, cy = best.center_x, best.center_y
# EMA平滑
smooth_cx = 0.7 * smooth_cx + 0.3 * cx
smooth_cy = 0.7 * smooth_cy + 0.3 * cy
# 计算偏差并控制舵机
dx = smooth_cx - 320 # 图像中心x
dy = smooth_cy - 240 # 图像中心y
servo.horizontal += dx * Kp_x # 比例控制
servo.vertical += dy * Kp_y
else:
# 未检测到目标,执行搜索模式
servo.sweep()
结果对比:经过优化后,检测置信度从 0.35 提升至 0.62,检测框抖动幅度从 ±15 像素降低至 ±3 像素,舵机跟随的稳定性显著提升。代价是推理时间从 18ms 增加到 25ms,但仍满足 100ms 的实时性要求。
4.6 常见误区与总结复盘
在目标检测基础概念的学习和工程应用中,初学者常犯以下错误:
| 误区 | 错误理解 | 正确认知 |
|---|---|---|
| 混淆分类与检测 | 认为分类模型也能给出目标位置 | 分类输出全局标签,检测输出局部位置+标签 |
| 忽略置信度阈值 | 所有检测结果都可信 | 低置信度结果多为误检,需设置阈值过滤 |
| IoU 只用于评估 | IoU 只在训练后计算精度时使用 | IoU 在 NMS、跟踪、数据增强中都有关键作用 |
| 边界框坐标混淆 | 混用 (x,y,w,h) 和 (x1,y1,x2,y2) | 不同模型输出格式不同,转换时需明确坐标系 |
总结复盘:目标检测是机器人视觉系统的基石,边界框、类别标签、置信度和 IoU 四个核心概念构成了检测任务的定义、输出和评估闭环。在实际项目中,需要根据机器人任务的具体需求(实时性、精度、算力)来选择合适的检测模型和参数配置。下一阶段的学习将围绕轻量级检测模型的结构原理展开,理解这些基础概念将帮助你更好地调试和优化模型性能。