目标检测理论:边界框、锚框、IOU 计算

📂 所属阶段:第三阶段 — 核心视觉任务(进阶篇)
🔗 相关章节:迁移学习 (Transfer Learning) · YOLO 家族实战


1. 目标检测基础

目标检测 = 分类 + 定位

输出:
  - 类别:物体是什么(人、车、狗等)
  - 边界框:物体在哪里(x, y, w, h)

应用:
  - 自动驾驶:检测车、行人、交通灯
  - 监控:检测异常行为
  - 工业检测:检测缺陷

2. 边界框表示

"""
边界框有多种表示方法:

1. (x1, y1, x2, y2):左上角和右下角坐标
2. (x, y, w, h):中心坐标和宽高
3. (cx, cy, w, h):中心坐标和宽高

转换:
  x1, y1, x2, y2 → x, y, w, h
  x = (x1 + x2) / 2
  y = (y1 + y2) / 2
  w = x2 - x1
  h = y2 - y1
"""

def convert_bbox(x1, y1, x2, y2):
    x = (x1 + x2) / 2
    y = (y1 + y2) / 2
    w = x2 - x1
    h = y2 - y1
    return x, y, w, h

3. IOU(交并比)

"""
IOU = Intersection Over Union

用于评估预测框和真实框的重叠程度

IOU = 交集面积 / 并集面积
"""

def calculate_iou(box1, box2):
    """
    box1, box2: (x1, y1, x2, y2)
    """
    x1_inter = max(box1[0], box2[0])
    y1_inter = max(box1[1], box2[1])
    x2_inter = min(box1[2], box2[2])
    y2_inter = min(box1[3], box2[3])
    
    if x2_inter < x1_inter or y2_inter < y1_inter:
        return 0.0
    
    inter_area = (x2_inter - x1_inter) * (y2_inter - y1_inter)
    box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])
    box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])
    union_area = box1_area + box2_area - inter_area
    
    return inter_area / union_area

4. NMS(非极大值抑制)

"""
NMS:去除重复的检测框

步骤:
1. 按置信度排序
2. 选择置信度最高的框
3. 删除与其 IOU > 阈值的框
4. 重复直到没有框
"""

def nms(boxes, scores, iou_threshold=0.5):
    """
    boxes: [(x1, y1, x2, y2), ...]
    scores: [score1, score2, ...]
    """
    indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)
    keep = []
    
    while indices:
        current = indices[0]
        keep.append(current)
        indices = indices[1:]
        
        # 删除与当前框 IOU > 阈值的框
        indices = [i for i in indices if calculate_iou(boxes[current], boxes[i]) < iou_threshold]
    
    return keep

5. 小结

目标检测核心概念:

1. 边界框:(x, y, w, h) 或 (x1, y1, x2, y2)
2. IOU:评估框的重叠程度
3. NMS:去除重复检测

这些是所有目标检测算法的基础!

💡 记住:理解 IOU 和 NMS 是掌握目标检测的关键。


🔗 扩展阅读