YOLO算法总结

本文详细解析了YOLOv1、YOLOv2和YOLOv3三个版本的算法发展,从分而治之的YOLOv1到引入BN、anchor机制的YOLOv2,再到采用多尺度检测和FPN结构的YOLOv3,逐步揭示了目标检测算法的进化历程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、YOLOv1:
YOLOv1奠定了yolo系列算法“分而治之”的基调,在YOLOv1上,输入图片被划分为7x7的网络,如下图所示:
在这里插入图片描述
网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。

YOLOv1的结构图:
在这里插入图片描述
预测框的位置、大小和物体分类都通过CNN暴力predict出来。
v1的输出是一个7x7x30的张量,7x7表示把输入图片划分位7x7的网格,每一个小单元的另一个维度等于30。30=(2*5+20)。代表能预测2个框的5个参数(x,y,w,h,score)和20个种类
可以看出输出张量的深度影响yolo_v1能检测目标的种类。v1的输出深度只有30,意味着每个单元格只能预测两个框(而且只认识20类物体),这对于密集型目标检测和小物体检测都不能很好适用。
yolo是端到端训练,对于预测框的位置、size、种类、置信度(score)等信息的预测都通过一个损失函数来训练。
在这里插入图片描述
二、yolov2:
v2在v1上的提升:

1.batch normalization: BN能够给模型收敛带来显著地提升,同时也消除了其他形式正则化的必要。作者在每层卷积层的后面加入BN后,在mAP上提升了2%。BN也有助于正则化模型。有了BN便可以去掉用dropout来避免模型过拟合的操作。BN层的添加直接将mAP硬拔了2个百分点,这一操作在yolo_v3上依然有所保留,BN层从v2开始便成了yolo算法的标配。

2.Convolutional With Anchor Boxes: 在yolo_v2的优化尝试中加入了anchor机制。作者去除了YOLO的全连接层,使用anchor框来预测bounding box。首先,作者去除了一层池化层以保证卷积输出具有较高的分辨率。作者把448X448的图像收缩到416大小。因为作者想让输出特征图的维度是奇数(416/32=13,13为奇数),这样的话会有一个中间单元格(center cell)。物体(尤其是大物体)经常占据图像的中心,所以有一个单独位置恰好在中心位置能够很好地预测物体。YOLO的卷积层下采样这些图像以32(即2525)为采样系数(416/32 = 13),所以输出feature map为13x13。

3.Dimension Clusters: 当作者对yolo使用anchor机制时,遇到了两个问题。1,模板框(prior)的大小是手动挑选的(指anchor prior的大小一开始使人为手动设定的,Faster R-CNN中k=9,大小尺寸一共有3x3种)。box的规格虽然后期可以通过线性回归来调整,但如果一开始就选用更合适的prior(模板框)的话,可以使网络学习更轻松一些。作者并没有手动设定prior,而是在训练集的b-box上用了k-means聚类来自动找到prior。

4.Direct location prediction: 当在YOLO中使用anchor boxes机制的时候,遇到了第二个问题:模型不稳定。尤其时早期迭代的时候。不稳定的因素主要来自于为box预测(x,y)位置的时候。
在这里插入图片描述
这个公式没有加以限制条件,所以任何anchor box都可以偏移到图像任意的位置上。随机初始化模型会需要很长一段时间才能稳定产生可靠的offsets(偏移量)。
改进:
我们并没有“预测偏移量”,而是遵循了YOLO的方法:直接预测对于网格单元的相对位置。
在这里插入图片描述
直接预测(x, y),就像yolo_v1的做法,不过v2是预测一个相对位置,相对单元格的左上角的坐标(如上图所示)。当(x, y)被直接预测出来,那整个bounding box还差w和h需要确定。yolo_v2的做法是既有保守又有激进,x和y直接暴力预测,而w和h通过bounding box prior的调整来确定。
在这里插入图片描述
看上面的公式也可以看出,b-box的宽和高也是同时确定出来,并不会像RPN那样通过regression来确定。pw和ph都是kmeans聚类之后的prior(模板框)的宽和高,yolo直接预测出偏移量tw和th,相当于直接预测了bounding box的宽和高。使用聚类搭配直接位置预测法的操作,使得模型上升了5个百分点。

**5.multi-scale training:**用多种分辨率的输入图片进行训练。

**6.Fine-Grained Features:**调整后的yolo将在13x13的特征图上做检测任务。虽然这对大物体检测来说用不着这么细粒度的特征图,但这对小物体检测十分有帮助。Fast R-CNN和SSD都是在各种特征图上做推荐网络以得到一个范围内的分辨率。我们采用不同的方法,只添加了一个passthrough层,从26x26的分辨率得到特征。

darknet-19:
在这里插入图片描述

评估:
在这里插入图片描述
召回率(Recall)= 系统检索到的相关文件 / 系统所有相关的文件总数
准确率(Precision)= 系统检索到的相关文件 / 系统所有检索到的文件总数
MAP:全称mean average precision(平均准确率)
假设有两个主题,主题1有4个相关网页,主题2有5个相关网页。某系统对于主题1检索出4个相关网页,其rank分别为1, 2, 4, 7;对于主题2检索出3个相关网页,其rank分别为1,3,5。对于主题1,平均准确率为(1/1+2/2+3/4+4/7)/4=0.83。对于主题 2,平均准确率为(1/1+2/3+3/5+0+0)/5=0.45。则MAP=(0.83+0.45)/2=0.64

三、YOLOv3:

darknet-53:
在这里插入图片描述
结构图:
在这里插入图片描述

各个模块:
DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。
resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。
concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

输出:
这个借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
在这里插入图片描述
y1,y2和y3的深度都是255,边长的规律是13:26:52
yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。

补充
Bounding Box Prediction

b-box预测手段是v3论文中提到的又一个亮点。先回忆一下v2的b-box预测:想借鉴faster R-CNN RPN中的anchor机制,但不屑于手动设定anchor prior(模板框),于是用维度聚类的方法来确定anchor box prior(模板框),最后发现聚类之后确定的prior在k=5也能够又不错的表现,于是就选用k=5。后来呢,v2又嫌弃anchor机制线性回归的不稳定性(因为回归的offset可以使box偏移到图片的任何地方),所以v2最后选用了自己的方法:直接预测相对位置。预测出b-box中心点相对于网格单元左上角的相对坐标。

v2相当直接predict出了b-box的位置大小和confidence。box宽和高的预测是受prior影响的,对于v2而言,b-box prior数为5,在论文中并没有说明抛弃anchor机制之后是否抛弃了聚类得到的prior,如果prior数继续为5,那么v2需要对不同prior预测出 。

对于v3而言,在prior这里的处理有明确解释:选用的b-box priors 的k=9,对于tiny-yolo的话,k=6。priors都是在数据集上聚类得来的,有确定的数值,如下:
在这里插入图片描述

### YOLO算法简介 YOLO(You Only Look Once)是一种实时目标检测算法,它通过单次神经网络运行完成目标的定位与分类任务。相比传统的两阶段目标检测方法(如R-CNN系列),YOLO属于一种一阶段的目标检测算法,具有更高的效率和更快的速度[^2]。 --- ### YOLO算法的核心原理 #### 统一框架 YOLO将目标检测视为一个回归问题,输入图像被划分为S×S个网格单元格(grid cells)。每个网格负责预测B个边界框及其置信度分数以及C类别的条件概率。具体来说: - **边界框预测**:每个边界框由(x, y, w, h)表示,其中(x, y)是边界框中心相对于网格单元左上角的位置,w和h分别是宽度和高度。 - **置信度分数**:定义为Pr(Object) * IoU^(pred truth),即存在对象的概率乘以其预测边界框与真实边界框之间的交并比(Intersection over Union, IoU)。 - **类别概率**:每个网格还预测一组类别条件概率P(Class_i|Object)[^1]。 最终损失函数综合考虑了坐标误差、置信度误差和类别概率误差三部分[^2]。 #### 特点总结 - 高效性:由于只需执行一次前向传播即可获得所有预测结果,因此适合实现实时应用。 - 统一模型:集成了目标定位与分类功能于一体,简化了传统pipeline的设计复杂度。 - 泛化能力较强:能够较好地处理未见过的数据分布情况下的新场景[^3]。 然而需要注意的是,在早期版本中可能存在如下局限之处: - 对小物体检测效果较差; - 定位精度相对较低; 这些问题在后续迭代版本(YOLOv2,v3等)得到了显著改善[^4]。 --- ### Python实现概览 以下是基于PyTorch的一个简单YOLO v1架构构建实例: ```python import torch.nn as nn class YOLOv1(nn.Module): def __init__(self, S=7, B=2, C=20): # 默认参数设置来自原始论文 super(YOLOv1, self).__init__() self.S = S self.B = B self.C = C # 主干特征提取网络 (可替换为其他预训练骨干网) self.feature_extractor = nn.Sequential( nn.Conv2d(3, 64, kernel_size=7, stride=2), nn.LeakyReLU(0.1), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(64, 192, kernel_size=3), nn.LeakyReLU(0.1), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(192, 128, kernel_size=1), nn.LeakyReLU(0.1), nn.Conv2d(128, 256, kernel_size=3), nn.LeakyReLU(0.1), ... # 更深层次省略 ) # 输出层调整大小适应(S*S*(B*5+C)) self.fc = nn.Linear(... , S*S*(B*5 + C)) def forward(self, x): x = self.feature_extractor(x) x = x.view(x.size(0), -1) # 展平成一维张量 x = self.fc(x) return x.reshape(-1, self.S, self.S, self.B*5+self.C) # 初始化模型 model = YOLOv1() print(model) ``` 此代码片段展示了如何搭建基础版YOLO v1结构,并提供了灵活扩展的空间以便适配不同的需求或优化方向[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值