在yolo中什么是先验框

YOLO中先验框的作用与原理

在 YOLO(You Only Look Once)目标检测算法中(尤其是从 YOLOv2 开始),​​先验框​​是一个核心概念。它们也被称为 ​​锚框​​。

简单来说:

​先验框是预先定义在特征图网格单元上的一组具有特定宽度和高度的边界框模板。​

为什么需要先验框?

  1. ​提供参考形状和大小:​​ 现实世界中的物体具有各种形状和大小(如行人通常瘦高,汽车通常扁宽)。先验框为模型提供了这些常见形状和大小的“参考模板”。

  2. ​简化学习任务:​​ 模型不再需要从零开始预测一个绝对完美的边界框坐标。相反,它学习的是​​相对于这些先验框的偏移量​​和​​缩放因子​​,以及​​该框包含某个类别的物体的概率​​和​​该框的置信度​​。这大大降低了学习难度。

  3. ​提高定位精度:​​ 通过微调预定义的框,模型可以更精确地拟合目标物体的实际边界。

  4. ​适应多尺度检测:​​ 通过在网络不同层(不同尺度的特征图)上设置不同大小的先验框,YOLO 能够有效地检测不同尺寸的物体(小物体在深层、大感受野的特征图上检测效果差,所以通常在较浅层、更高分辨率的特征图上使用较小的先验框;大物体则在较深层使用较大的先验框)。

先验框是如何工作的?

  1. ​定义:​​ 在训练模型之前,我们会分析训练数据集(如 COCO, Pascal VOC)中所有标注边界框的宽度和高度。通常使用聚类算法(如 K-means)对这些真实框的尺寸进行聚类,选择 K 个最具代表性的宽高组合作为先验框的尺寸。例如,YOLOv3 常用 9 个先验框(3 个尺度 * 每个尺度 3 个框)。

  2. ​放置:​​ 在模型前向传播时,输入图像会被划分为 S x S 的网格(在特征图上)。​​在每个网格单元的中心点​​,都会放置 K 个(预先定义好尺寸的)先验框。所以,一张图片上总共有 S x S x K 个先验框。

  3. ​预测:​​ 对于每个网格单元中的每个先验框,模型会预测以下值:

    • ​边界框偏移量:​​ 4 个值 (t_x, t_y, t_w, t_h)。这些值不是绝对的坐标,而是用于调整先验框的位置和大小:

      • t_xt_y:预测目标框中心点相对于​​该网格单元左上角​​的偏移量(通常经过 sigmoid 函数处理,限制在 0-1 之间)。

      • t_wt_h:预测目标框的宽度和高度相对于​​该先验框宽度和高度​​的缩放因子(取指数)。

    • ​目标置信度:​​ 1 个值 (t_o)。表示该预测框包含一个目标物体的概率(无论类别是什么)以及预测框位置的准确程度(IoU)。通常也经过 sigmoid 函数处理。

    • ​类别概率:​​ C 个值 (C 是类别数)。表示如果框内有物体,该物体属于每个类别的概率。通常经过 softmax 或 sigmoid(对于多标签)处理。

  4. ​匹配与训练:​​ 在训练时,需要将真实的目标框分配给特定的先验框。通常的规则是:

    • 一个真实框的中心点落在哪个网格单元内,就由该网格单元负责预测。

    • 在该网格单元的 K 个先验框中,选择与真实框 IoU(交并比)最大的那个先验框作为“负责”预测该真实框的锚框。

    • 模型学习的目标就是让这个“负责”的先验框预测出的偏移量、置信度和类别概率尽可能接近真实值。其他不负责的框则被鼓励预测低置信度。

总结

先验框是 YOLO 等单阶段目标检测算法中预先设定的、代表常见物体形状和大小的边界框模板。它们被放置在特征图的每个网格单元上,模型的任务是预测相对于这些模板的精细调整(偏移量和缩放),以及框内物体的存在概率和类别概率。这种机制极大地简化了目标检测的学习过程,提高了定位精度和速度,是多尺度检测的关键组成部分。

告知:需要学习YOLOv4进行TT100K数据集上中国交通标志识别的学员请前往(1) Ubuntu系统《YOLOv4目标检测实战:中国交通标志识别》课程链接:https://edu.youkuaiyun.com/course/detail/29362(2)《Windows版YOLOv4目标检测实战:中国交通标志识别》课程链接:https://edu.youkuaiyun.com/course/detail/29363在无人驾驶中,交通标志识别是一项重要的任务。本课程中的项目以美国交通标志数据集LISA为训练对象,采用YOLOv3目标检测方法实现实时交通标志识别。具体项目过程包括包括:安装Darknet、下载LISA交通标志数据集、数据集格式转换、修改配置文件、训练LISA数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验聚类。YOLOv3基于深度学习,可以实时地进行端到端的目标检测,以速度快见长。本课程将手把手地教大家使用YOLOv3实现交通标志的多目标检测。本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。 Darknet是使用C语言实现的轻型开源深度学习架,依赖少,可移植性好,值得深入学习和探究。除本课程《YOLOv3目标检测实战:交通标志识别》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括:《YOLOv3目标检测实战:训练自己的数据集》《YOLOv3目标检测:原理与源码解析》《YOLOv3目标检测:网络模型改进方法》另一门课程《YOLOv3目标检测实战:训练自己的数据集》主要是介绍如何训练自己标注的数据集。而本课程的区别主要在于学习对已标注数据集的格式转换,即把LISA数据集从csv格式转换成YOLOv3所需要的PASCAL VOC格式和YOLO格式。本课程提供数据集格式转换的Python代码。请大家关注以上课程,并选择学习。下图是使用YOLOv3进行交通标志识别的测试结果
YOLO v3中使用K-means聚类获取先验的具体步骤如下: 1. **准备数据**:使用只有标注的检测数据集,YOLOv2、v3都会生成一个包含标注位置和类别的TXT文件,其中每行都包含ground truth boxes相对于原图的坐标,即的中心点以及的宽和高,N是所有标注的个数 [^3]。 2. **初始化聚类中心**:给定k个聚类中心点,这里的k是先验(anchor boxes)的宽和高尺寸,由于anchor boxes位置不固定,所以没有(x,y)的坐标,只有宽和高 [^3]。 3. **计算距离**:计算每个标注和每个聚类中心点的距离 d=1 - IOU(标注, 聚类中心),计算时每个标注的中心点都与聚类中心重合,这样才能计算IOU值 [^3]。 4. **分配标注**:将标注分配给“距离”最近的聚类中心 [^3]。 5. **更新聚类中心**:所有标注分配完毕以后,对每个簇重新计算聚类中心点,计算方式为求该簇中所有标注的宽和高的平均值,其中是第i个簇的标注个数 [^3]。 6. **迭代更新**:重复步骤3和步骤4,直到聚类中心改变量很小 [^3]。 ### 代码示例 以下是一个简化的Python代码示例,用于说明K-means聚类先验的实现: ```python import numpy as np def iou(boxes, clusters): """ 计算每个标注和聚类中心的IOU :param boxes: 标注的宽高,形状为 (N, 2) :param clusters: 聚类中心的宽高,形状为 (k, 2) :return: IOU矩阵,形状为 (N, k) """ N = boxes.shape[0] k = clusters.shape[0] box_area = boxes[:, 0] * boxes[:, 1] box_area = box_area.repeat(k) box_area = np.reshape(box_area, (N, k)) cluster_area = clusters[:, 0] * clusters[:, 1] cluster_area = np.tile(cluster_area, [1, N]) cluster_area = np.reshape(cluster_area, (N, k)) box_w_matrix = np.reshape(boxes[:, 0].repeat(k), (N, k)) cluster_w_matrix = np.reshape(np.tile(clusters[:, 0], (1, N)), (N, k)) min_w_matrix = np.minimum(cluster_w_matrix, box_w_matrix) box_h_matrix = np.reshape(boxes[:, 1].repeat(k), (N, k)) cluster_h_matrix = np.reshape(np.tile(clusters[:, 1], (1, N)), (N, k)) min_h_matrix = np.minimum(cluster_h_matrix, box_h_matrix) inter_area = np.multiply(min_w_matrix, min_h_matrix) return inter_area / (box_area + cluster_area - inter_area) def kmeans(boxes, k, dist=np.median): """ K-means聚类算法 :param boxes: 标注的宽高,形状为 (N, 2) :param k: 聚类的数量 :param dist: 距离度量函数,默认为中位数 :return: 聚类中心,形状为 (k, 2) """ box_number = boxes.shape[0] distances = np.empty((box_number, k)) last_nearest = np.zeros((box_number,)) np.random.seed() clusters = boxes[np.random.choice(box_number, k, replace=False)] # 随机初始化聚类中心 while True: distances = 1 - iou(boxes, clusters) current_nearest = np.argmin(distances, axis=1) if (last_nearest == current_nearest).all(): break # 聚类中心不再改变,退出循环 for cluster in range(k): clusters[cluster] = dist(boxes[current_nearest == cluster], axis=0) last_nearest = current_nearest return clusters # 示例数据 boxes = np.random.rand(100, 2) * 100 # 假设100个标注 k = 9 # 聚类数量,对应YOLO v3的9个先验 clusters = kmeans(boxes, k) print("聚类得到的先验:", clusters) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值