#目标检测理论:边界框、锚框、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 是掌握目标检测的关键。
🔗 扩展阅读

