目标检测理论:边界框、锚框、IOU计算与NMS算法详解

引言

目标检测是计算机视觉中的核心任务之一,同时完成分类(识别“是什么”)和定位(标注“在哪里”)两大子任务,广泛应用于自动驾驶、安防监控、工业质检等领域。本文将深入拆解其核心理论与可复用关键代码,帮你打牢基础。

📂 所属阶段:第二阶段 — 深度学习视觉基础(CNN 篇)
🔗 相关章节:迁移学习 (Transfer Learning) · YOLO 家族实战


1. 目标检测基础扫盲

1.1 任务定义与表示

输入:单张图像,形状为 高×宽×通道数 (H×W×C)。
输出:检测到的 N 个目标,每个目标包含三个信息:

  • 类别标签(class):物体属于哪一类
  • 边界框(bbox):物体在图像中的位置
  • 置信度(confidence):模型对该检测结果的把握程度

简单说,目标检测模型读完一张图后,会告诉你图中有什么物体、每个物体在什么位置,并且对每个判断给出一个可信度分数。

1.2 核心应用场景

领域具体应用示例
自动驾驶车辆/行人/交通灯/路标的实时检测
安防监控异常行为/入侵者/危险品识别
工业质检产品缺陷/尺寸偏差/表面瑕疵检测
医疗影像肺部结节/肿瘤/骨折等病变区域定位
智慧零售/农业商品货架盘点/顾客动线追踪/作物病虫害/果实成熟度检测

1.3 算法发展简史(关键节点)

  • 2014:R-CNN(首次将CNN用于目标检测)
  • 2015:Faster R-CNN(引入区域建议网络RPN,实现端到端训练)
  • 2016:YOLOv1/SSD(单阶段检测器,大幅提升速度)
  • 2020:DETR(首次将Transformer直接应用于目标检测,无需锚框)
  • 2021-2023:YOLOv5/v6/v7/v8(易用性与精度速度的极致平衡)

2. 边界框表示与操作

边界框是定位目标的核心载体,主流有两种可相互转换的表示方法。

2.1 主流表示格式

格式类型表示形式含义适用场景
角点坐标(xyxy)(x_min, y_min, x_max, y_max)左上角+右下角像素坐标绘制、裁剪、IOU计算等基础操作
中心坐标(xywh)(c_x, c_y, w, h)中心点坐标+宽高归一化、锚框回归预测

💡 归一化技巧:将像素坐标除以图像宽高,转换到 [0,1] 范围,可适配任意尺寸的输入图像。

2.2 可复用的核心操作代码

def xyxy2xywh(bbox_xyxy):
    """角点坐标 -> 中心坐标"""
    x1, y1, x2, y2 = bbox_xyxy
    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2
    w = x2 - x1
    h = y2 - y1
    return cx, cy, w, h

def xywh2xyxy(bbox_xywh):
    """中心坐标 -> 角点坐标"""
    cx, cy, w, h = bbox_xywh
    x1 = cx - w / 2
    y1 = cy - h / 2
    x2 = cx + w / 2
    y2 = cy + h / 2
    return x1, y1, x2, y2

def clip_bbox(bbox_xyxy, img_h, img_w):
    """将边界框裁剪到图像边界内"""
    x1, y1, x2, y2 = bbox_xyxy
    x1 = max(0, min(x1, img_w))
    y1 = max(0, min(y1, img_h))
    x2 = max(0, min(x2, img_w))
    y2 = max(0, min(y2, img_h))
    return x1, y1, x2, y2

3. IOU(交并比)计算

IOU(Intersection over Union)是目标检测中最核心的评估/匹配指标,用来衡量预测框与真实框的重叠程度。

3.1 基本概念

定义:两个边界框的交集面积与并集面积的比值。
计算公式:IOU = 交集面积 / 并集面积

常用阈值参考

  • IOU > 0.5:初步匹配(COCO AP50 标准)
  • IOU > 0.7:良好匹配
  • IOU > 0.9:几乎完美重合

3.2 可复用的核心计算代码

def calculate_iou(box1_xyxy, box2_xyxy):
    """计算两个角点坐标框的IOU"""
    # 1. 计算交集坐标
    x1_inter = max(box1_xyxy[0], box2_xyxy[0])
    y1_inter = max(box1_xyxy[1], box2_xyxy[1])
    x2_inter = min(box1_xyxy[2], box2_xyxy[2])
    y2_inter = min(box1_xyxy[3], box2_xyxy[3])
    
    # 2. 判断是否有交集
    if x2_inter <= x1_inter or y2_inter <= y1_inter:
        return 0.0
    
    # 3. 计算交集、并集面积
    inter_area = (x2_inter - x1_inter) * (y2_inter - y1_inter)
    box1_area = (box1_xyxy[2] - box1_xyxy[0]) * (box1_xyxy[3] - box1_xyxy[1])
    box2_area = (box2_xyxy[2] - box2_xyxy[0]) * (box2_xyxy[3] - box2_xyxy[1])
    union_area = box1_area + box2_area - inter_area
    
    # 4. 计算IOU
    return inter_area / union_area

4. NMS(非极大值抑制)

NMS(Non-Maximum Suppression)是去除重复检测框的核心后处理算法,几乎所有现代检测器都会用到。

4.1 基本流程

  1. 按置信度分数降序排列所有检测框
  2. 选择置信度最高的框作为当前保留框
  3. 计算当前框与剩余框的IOU,删除IOU大于阈值的框
  4. 重复步骤2-3,直到处理完所有框

4.2 可复用的基础NMS代码

def nms_basic(boxes_xyxy, scores, iou_threshold=0.5):
    """
    基础版本NMS
    
    Args:
        boxes_xyxy: 角点坐标框列表 [(x1,y1,x2,y2), ...]
        scores: 对应的置信度分数列表 [s1, s2, ...]
        iou_threshold: IOU抑制阈值
    
    Returns:
        keep_indices: 保留框的索引列表
    """
    if len(boxes_xyxy) == 0:
        return []
    
    # 按分数降序排序索引
    sorted_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)
    keep = []
    
    while sorted_indices:
        # 保留当前最高分框
        current_idx = sorted_indices[0]
        keep.append(current_idx)
        
        # 移除已保留的框
        sorted_indices = sorted_indices[1:]
        
        # 抑制IOU过高的框
        sorted_indices = [
            idx for idx in sorted_indices
            if calculate_iou(boxes_xyxy[current_idx], boxes_xyxy[idx]) < iou_threshold
        ]
    
    return keep

4.3 常用优化变体(简介)

变体类型核心改进适用场景
Soft-NMS降低重叠框的分数而非直接删除密集目标检测(如人群、鸟群)
DIoU-NMS结合中心点距离,抑制与当前框中心点过近的低置信度框遮挡密集的场景
类别感知NMS仅对同一类别的框进行NMS,不同类别的框互不影响所有多类别检测场景(默认)

5. 锚框机制

锚框(Anchor Box)是两阶段/早期单阶段检测器(如 Faster R-CNN、SSD、YOLOv2-v3)解决多尺度目标检测的核心预定义工具。

5.1 基本概念

在特征图的每个网格点上,放置一组预定义尺寸和宽高比的参考框,模型仅需预测:

  1. 相对于锚框的边界框偏移量(而非绝对坐标)
  2. 锚框内是否存在目标的对象性分数
  3. 目标的类别概率

5.2 关键参数

参数作用示例值
尺寸(Scale)锚框的大小[32, 64, 128, 256]
宽高比(AR)锚框的形状,宽/高[0.5, 1.0, 2.0]
步长(Stride)特征图网格点对应原图的步长[8, 16, 32](多尺度特征图)

6. 核心评估指标

目标检测最常用的评估体系是COCO标准,核心指标如下:

指标全称含义
AP50/mAP@0.5Average Precision at IoU=0.5IoU阈值为0.5时,所有类别的平均精度均值
AP75/mAP@0.75Average Precision at IoU=0.75IoU阈值为0.75时的平均精度均值(更严格)
mAP@0.5:0.95COCO mAPIoU阈值从0.5到0.95,步长0.05的10个阈值下的平均精度均值(最权威)

1. **动手实践**:尝试用Python可视化边界框、IOU、NMS的过程,加深理解 2. **阅读源码**:YOLOv5/v8的源码中,这些核心算法的实现非常高效且规范 3. **先易后难**:先掌握基础IOU/NMS,再学习Soft-NMS/DIoU-NMS等变体

7. 总结

本文梳理了目标检测的四大核心基础:

  1. 边界框表示:掌握xyxy与xywh的相互转换、归一化、裁剪
  2. IOU计算:核心匹配/评估指标,理解公式与实现
  3. NMS算法:去除重复检测的后处理核心,掌握基础版与常用变体
  4. 锚框机制:早期/两阶段检测器的预定义参考框

这些概念是所有现代目标检测模型的基石,必须熟练掌握。