在yolo中什么是先验框
在 YOLO(You Only Look Once)目标检测算法中(尤其是从 YOLOv2 开始),先验框是一个核心概念。它们也被称为 锚框。
简单来说:
先验框是预先定义在特征图网格单元上的一组具有特定宽度和高度的边界框模板。
为什么需要先验框?
提供参考形状和大小: 现实世界中的物体具有各种形状和大小(如行人通常瘦高,汽车通常扁宽)。先验框为模型提供了这些常见形状和大小的“参考模板”。
简化学习任务: 模型不再需要从零开始预测一个绝对完美的边界框坐标。相反,它学习的是相对于这些先验框的偏移量和缩放因子,以及该框包含某个类别的物体的概率和该框的置信度。这大大降低了学习难度。
提高定位精度: 通过微调预定义的框,模型可以更精确地拟合目标物体的实际边界。
适应多尺度检测: 通过在网络不同层(不同尺度的特征图)上设置不同大小的先验框,YOLO 能够有效地检测不同尺寸的物体(小物体在深层、大感受野的特征图上检测效果差,所以通常在较浅层、更高分辨率的特征图上使用较小的先验框;大物体则在较深层使用较大的先验框)。
先验框是如何工作的?
定义: 在训练模型之前,我们会分析训练数据集(如 COCO, Pascal VOC)中所有标注边界框的宽度和高度。通常使用聚类算法(如 K-means)对这些真实框的尺寸进行聚类,选择 K 个最具代表性的宽高组合作为先验框的尺寸。例如,YOLOv3 常用 9 个先验框(3 个尺度 * 每个尺度 3 个框)。
放置: 在模型前向传播时,输入图像会被划分为 S x S 的网格(在特征图上)。在每个网格单元的中心点,都会放置 K 个(预先定义好尺寸的)先验框。所以,一张图片上总共有 S x S x K 个先验框。
预测: 对于每个网格单元中的每个先验框,模型会预测以下值:
边界框偏移量: 4 个值 (t_x, t_y, t_w, t_h)。这些值不是绝对的坐标,而是用于调整先验框的位置和大小:
t_x
,t_y
:预测目标框中心点相对于该网格单元左上角的偏移量(通常经过 sigmoid 函数处理,限制在 0-1 之间)。t_w
,t_h
:预测目标框的宽度和高度相对于该先验框宽度和高度的缩放因子(取指数)。
目标置信度: 1 个值 (t_o)。表示该预测框包含一个目标物体的概率(无论类别是什么)以及预测框位置的准确程度(IoU)。通常也经过 sigmoid 函数处理。
类别概率: C 个值 (C 是类别数)。表示如果框内有物体,该物体属于每个类别的概率。通常经过 softmax 或 sigmoid(对于多标签)处理。
匹配与训练: 在训练时,需要将真实的目标框分配给特定的先验框。通常的规则是:
一个真实框的中心点落在哪个网格单元内,就由该网格单元负责预测。
在该网格单元的 K 个先验框中,选择与真实框 IoU(交并比)最大的那个先验框作为“负责”预测该真实框的锚框。
模型学习的目标就是让这个“负责”的先验框预测出的偏移量、置信度和类别概率尽可能接近真实值。其他不负责的框则被鼓励预测低置信度。
总结
先验框是 YOLO 等单阶段目标检测算法中预先设定的、代表常见物体形状和大小的边界框模板。它们被放置在特征图的每个网格单元上,模型的任务是预测相对于这些模板的精细调整(偏移量和缩放),以及框内物体的存在概率和类别概率。这种机制极大地简化了目标检测的学习过程,提高了定位精度和速度,是多尺度检测的关键组成部分。