You Only Look Once: Unified, Real-Time Object Detection学习笔记
YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
抓取bbox步骤:
1.输入图像分成S×S的网格。现在是划分成了7*7的,如果物品的中点落在某一个网格单元,这个网格单元将负责识别出这个物体。
注意只是看该目标的中心点,而不是整体。比如A(2,3)是狗的中心点,那么A就负责来负责预测狗
2.每个网格自身也要预测n个边界框bounding box和边界框的置信度confidence。文章中b=2
边界框包含四个数据xywh:(x,y)框中心是相对于网格单元的坐标,w 和 h 是框相当于整幅图的宽和高。置信度有两部分构成:含有物体的概率和边界框覆盖的准确性。
解释:iou交并比,pr就是概率p。如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值
每个边界框又要预测五个数值:x, y, w, h, confidence。(x,y)框中心是相对于网格单元的坐标,w 和 h 是框相当于整幅图的宽和高,confidence 代表该框与 ground truth 之间的 IOU(框里没有物体分数直接为 0 )
每个网格都要预测 b= 2 个框,49 个网格就会输出 98 个边界框,每个框还有它的分数。每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
最后每个单元格再预测他的n个边界框中的物体分类概率,有c个类别就要计算c个概率,和全连接层类似。本文中有20个类别
总结:每个方格要找到n个边界框,然后还要计算每个边界框的置信度,最后再计算每个边界框的分类的可能性。7*7(2*5+20)
bbox怎么产生的?
"But the bounding box is limited to the cell, so how does YOLO work when the object is bigger than one cell ?". Bounding box predicted by the YOLO is not limited to the grid cell, only its (x,y) coordinates are limited to the grid cell. They write in the paper: "The (x, y) coordinates represent the center of the box relative to the bounds of the grid cell. The width and height are predicted relative to the whole image.". So as you can see they predict width and height of a bbox with respect to the whole image, not grid cell.
翻译过来就是生成的bounding box的(x, y)被限制在cell里, 但长宽是没有限制的(即生成的bounding box可超出cell的边界)
网络结构
YOLO网络借鉴了GoogLeNet分类网络结构。有24个卷积层后接2个全连接层
输入是448*448*3
输出是7*7*30
YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测。YOLO的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。
损失函数
yolov1的损失函数就是把三类损失加权求和,用的也都是简单的平方差
损失函数计算是有条件的,是否存在对象对损失函数的计算有影响,下面具体讲。
先要计算位置误差:预测中点和实际中点之间的距离,再计算bbox宽度和高度之间的差距,权重为5调高位置误差的权重
置信度误差:要考虑两个情况:这个框里实际上有目标;这个框里没有目标,而且要成一个权重降低他的影响,调低不存在对象的bounding box的置信度误差的权重,论文中是0.5
对象分类的误差:当该框中有目标时才计算,概率的二范数
yolov1的缺陷
不能解决小目标问题,YOLO对边界框预测施加了严格的空间约束,因为每个网格单元只能预测两个边界框,并且只能有一个类。这个空间约束限制了我们模型能够预测的临近对象的数量。我们的模型在处理以群体形式出现的小对象时会有困啦,比如成群的鸟。
yolov1的性能
YOLO以速度见长,处理速度可以达到45fps,其fastyolo甚至可以达到155fps。我看现在的yolov5都可以在移动端,确实是一个很快的目标检测算法。
我感觉可以通过把网格分的更细如9*9,让后每个网格预测3个bbox,当然就降低了效率。
参考资料:
You Only Look Once: Unified, Real-Time Object Detection
https://www.jianshu.com/p/cad68ca85e27
https://blog.csdn.net/tangwei2014/article/details/50915317
https://zhuanlan.zhihu.com/p/25236464
https://blog.csdn.net/Maybemust/article/details/83450321
YOLO9000: Better, Faster, Stronger
YOLOv2相对v1版本,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。
yolov1的优势就是快,因为他不用滑窗,但是精确度就低,作者就该缺陷提出了进一步的改进。
改进
批量归一化(Batch Normalization)
所有的卷积层添加BN,带来了2%的mAP提升。
因为深层神经网络在做非线性变换前的激活输入值x随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布
原理
1.计算样本均值。
2.计算样本方差。
3.样本数据标准化处理。
4.进行平移和缩放处理。引入了γ和β两个参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
高分辨率分类器(High-Resolution Classifier)
YOLOv2先以224×224图片进行分类训练,再使用448×448的分辨率在ImageNet上微调分类网络,然后再微调检测网络。这使得检测器的训练更容易,并取得4%的mAP提升。
带有先验框的卷积(Convolutional With Anchor Boxes)
借鉴Faster RCNN的做法,YOLO2也尝试采用先验框。在每个网格预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。比如车,都是矮胖的长方形,再比如行人,都是瘦高的长方形。
缩减输入图片的分辨率,从 448x448 变成 416x416,这样让后面产生的特征图大小都为奇数。使用卷积层进行降采样,最后得到13x13的特征图,每个网格采用9个先验框,总共有13139=1521个先验框,大大超过之前的7*7*2=98个。二者这1500多个先验框时属于整个先验框的,不是v1中的,每两个框属于一个网格。
提高了准确率,但这样就慢下来了,因为要测一组。
聚类
用的是 K-means,1500个框虽然大大提高的圈起来目标的概率,但是也大大提高了计算机的计算量。YOLO2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。
不能用简单的欧式距离,因为大边框会产生更大的误差,但我们关心的是边框的IOU。就有了新的衡量距离函数:
1-两个框的交并比,IOU越大(交并比),距离越小,越接近。
作者实验表明,边框 K 越多,Avg IOU越大。K = 5的时候,就可与人工设置 9 个 Anchor boxes尺寸得到的效果。这样就又准又快了。13*13*5=845
上图右边显示了5种聚类得到的先验框,上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。
直接的位置预测(Direct location prediction)
每个网格有5个bbox(Anchor Boxes)后,这些bbox是有偏移量的,很有可能往左或者往右有偏移,把目标漏掉一部分。所以要限制一下bbox:
使用 logistic 激活函数来限制网络的预测约束在(0,1)范围内。边界框先验信息中的宽和高为p。预测为tx、ty、tw、th、to,这个to是之前的置信度,也得做个 logistic。网格与图像左上角的偏移c。
预测边框的蓝色中心点被约束在蓝色背景的网格内。
多尺度训练
进一步为了使得模型能够对各种尺度的图片进行有效检测,作者在训练Yolo v2时不再固定图像大小,而是每训练10个epochs随机地从一个组合{320; 352; :::; 608}中选取(注意它们都是32的倍数,因为darknet网络的步长为32)一个数作为输入的图像大小。此种训练方法被证明可有效地使得网络学会去自动识别各种尺度大小的图片。
V2的损失函数
v2损失函数和v1的思路一样,也是三个的加权和,用的还是二范数。。YOLO2使用交并比阈值Thresh=0.6、只有前128000次迭代计入误差。
网络结构:
之前v1用的是谷歌,现在用VGG16,YOLO2网络中第0-22层是Darknet-19网络来提取特征,后面第23层开始是添加的检测网络。3*3卷积,采用2*2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍.之前提到的bn批归一化加入之后,训练的速度有人提升了,而且也稳定了。
实验结果
可以看出来,yolo一如既往的快,同时也克服了v1中map值低的缺点,再544*544情况下可以达到78.6
参考文献:
YOLOv2:YOLO9000:Better,Faster,Stronger
https://blog.csdn.net/shanlepu6038/article/details/84778770
https://zhuanlan.zhihu.com/p/47575929
https://www.jianshu.com/p/b02f64e0d44b
YOLOv3: An Incremental Improvement
v3融合了别人的一些新的想法,改进了一下。YOLOv3 的提出不是为了解决什么问题,整篇论文其实是技术报告
改进
边界框预测
v1的每个网络2个bbox,v2的5个anchor box,v3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。感觉没啥变化。
分类预测
预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(如一个东西可以是女性和人)
Darknet-53
一看53层的卷积来提取,就知道他使用了残差网络residual network的做法,添加了shortcut connection这样就避免了梯度消逝。
实验结果
再要求map为50左右了,速度依旧非常快,yolo优势就是快。
参考文献:
YOLOv3: An Incremental Improvement
https://www.jianshu.com/p/d13ae1055302
https://www.cnblogs.com/wj-1314/p/9744146.html
YOLOv4: Optimal Speed and Accuracy of Object Detection解读
这篇论文的创新点就是把这些年别人提出的一些模块、损失函数加进去一个一个试,最后试出来一个新的模型。由于论文中涉及了很多新概念,阅读起来有困难。
一.检测模型分成:输入、骨干结构、颈部、头部。提出一个更细分更形象的网络结构概念
骨干:预先训练的网络用来特征提取
颈部:近年来发展起来的目标检测器常常在主干和头部之间插入一些层,这些层通常用来收集不同阶段的特征图
头部:用来预测物体的类和边界盒的头部。通常分为两类即单阶段目标检测器和两阶段目标检测器。
二.Bag of freebies
传统的目标检测器是离线训练的,使目标检测器在不增加推理成本的情况下获得更好的精度,这种只改变训练策略或只增加训练成本的方法称为Bag of freebies,他使用了三种方法来达到这个目的。
在线学习:一个数据点训练完了直接更新权重(而不是一个batch),
离线学习:一个batch训练完才更新权重,这样的话要求所有的数据必须在每一个训练操作中(batch中)都是可用的
(1)数据增强:
数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性。
①像素级别的数据增强:在处理光度失真时,调整图像的亮度、对比度、色调、饱和度和噪声。对于几何畸变,添加了随机缩放、剪切、翻转和旋转。
②模拟遮挡问题进行数据增强:随机擦除和随机剪裁(一个把随机位置的像素变成0,一个把一整个矩形区域的像素变成0)
③将多幅图像结合在一起进行数据增强:MixUp使用两张图像以不同的系数比率进行相乘和叠加,然后用这些叠加比率调整标签。
CutMix是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。
④style transfer GAN :用gan网络来做风格迁移,可以有效减少CNN学习到的纹理偏差
(2)语义分布偏差:
①两阶段对象检测器:使用困难反例挖掘hard negative example mining 或在线困难样本挖掘 online hard example mining 来解决。
困难样本挖掘:用分类器对样本进行分类,把其中错误分类的样本(hard negative)放入负样本集合再继续训练分类器。
在线困难样例挖掘:一个batch的输入经过网络的前向传播后,有一些困难样本loss较大,我们可以对loss进行降序排序,取前K个认为是hard example,
②单阶段目标检测器:focal损失函数来处理各个类之间存在的数据不平衡问题。这个损失函数是在标准交叉熵损失基础上改进得到:
还有标签平滑(The label smoothing)、知识蒸馏(knowledge distillation等方法
(3)边界框回归的损失函数
IoU损失:计算BBox和ground truth框的交并比,然后将生成的结果连接到整段代码中。
GIoU损失:找到可以同时覆盖预测的BBox和ground truth框的最小面积的BBox,并将其代替IoU损失中的分母用于计算。
DIoU损失:考虑了与对象中心的距离。
CIoU损失:同时考虑了重叠区域面积,中心点之间的距离和纵横比等因素。CIoU 可以在 BBox 回归问题上实现更好的收敛速度和准确性。
b和bgt分别代表了预测框和真实框的中心点,ρ计算两个中心点间的欧式距离,c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
三.Bag of specials
仅增加少量推理成本,却能显著提高目标检测精度的插件模块和后处理方法。
(1)增强感受野
SPP(Spatial Pyramid Pooling,空间金字塔池化):可以输入任意大小的图片,不需要经过裁剪缩放等操作。
ASPP(atrous spatial pyramid pooling 空洞空间卷积池化金字塔):
空洞卷积:可让其获得较大感受野,又可让分辨率不损失太多。是隔开进行卷积提前特征值的。
RBF(Receptive Field Block):模拟人类的视觉系统,考虑了不同尺度的感受野来提升特征的多样性,在RFB网络中使用分支池,不同的内核对应不同大小的RFs,应用扩张的卷积层来控制其偏心度,并对其进行reshape以生成最终的表示。
(2)引入注意力机制:
通道注意:Squeeze-and-Excitation(SE)模型,就是给每个通道加一个权值
最左边是原始输入图片特征X,然后经过变换,比如卷积变换,产生了新的特征信号U。U有C个通道,我们希望通过注意力模块来学习出每个通道的权重,从而产生通道域的注意力。中间的模块就是空间注意力机制模块。这个注意力机制分成三个部分:挤压(squeeze),激励(excitation),以及注意(attention)。
空间注意力:Spatial Attention module(SAM)模型空间域将原始图片中的空间信息变换到另一个空间中并保留了关键信息。
spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。
说人话就是空间变换模块可以把图像中关键的信息提取出来
(3)特征集成
SFAM:主要思想是使用SE模块在多尺度级联特征图上执行通道级级别的加权。
ASFF:使用softmax作为逐点级别权重,然后添加不同比例的特征图。
BiFPN:使用多输入加权残差连接以执行按比例的级别重新加权,然后添加不同比例的特征图。
(4)激活函数
一个好的激活函数可以使梯度更有效地传播,同时也不会造成过多的计算开销。作者试用了LReLU,PReLU,ReLU6,SELU,Swish,hard-Swish和Mish等激活函数
①LReLU和PReLU:主要目的是解决输出小于0时ReLU的梯度为零的问题。
②ReLU6和hard-Swish:专门为量化网络设计的。
③SELU:针对神经网络的自归一化问题。
④Swish和Mish:都是连续可微的激活函数。
(5)后处理
①NMS(非最大值抑制):对那些预测相同目标的BBox进行过滤,而仅保留具有较高响应度的候选BBox。
②soft NMS:目标比较密集的时候nms容易误检。Soft-NMS和NMS的区别就在于改动了一个地方,在判断当前最高confidence的box和其余box的IOU的时候加了一个系数,这个系数可以让我们更好地选择要去掉的多余的box。
③DIoU NMS:在soft NMS的基础上,将中心点距离信息添加到BBox筛选过程中。
4.又加了些改进
自我对抗训练(SAT):自我对抗训练主要执行2个前向和反向传播。在第一阶段中网络不会修改自身权重,而是去改变原始的图像。第二阶段,训练神经网络以正常方式检测此修改图像上的目标。感觉和GAN网络的实现机制有点相似,只不过GAN网络是使用两个网络进行对抗训练。
马赛克数据增强:将四张不同的图片通过一定的比例拼接成一张图,这样就可以训练网络检测到超出其正常背景的对象。同时在样本数据集较少的时候,这也是一种扩充数据集的方法。
四.最终结构
1.主体
作者在实验完众多新的模块之后后,调出最好的做了模型。
CSPDarknet53做主干网络,并添加了SPP,颈部使用PANet,头:YOLOv3
2.细节
主干免费包(BoF): CutMix和Mosaic数据增强,DropBlock正则化,类标签平滑
主干专用包(BoS): Mish激活、跨级部分连接(CSP)、多输入加权剩余连接(MiWRC)
检测器免费包(BoF): CIoU loss, CmBN, DropBlock正则化,Mosaic数据增强,自对抗训练,消除网格敏感性,为一个真值使用多个锚,余弦退火调度,最优超参数,随机训练形状
检测器专用包(BoS): Mish激活、SPP-block、SAM-block、PAN路径聚合块、DIoU-NMS
五.实验结果
1.不同特征对分类器训练的影响
我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个从高到低排名的概率,表示网络预测该图片属于各类的概率
Top-1 Accuracy是指排名第一的类别与实际结果相符的准确率
Top-5 Accuracy是指排名前五的类别包含实际结果的准确率
由于最后的主干网络是CSPDarknet-53,所以看第二张图,用了新的损失和图像增强后,精度有提升。
2.不同BoF对检测器训练的影响
M:马赛克数据增强
IT:IoU阈值
GA:遗传算法
LS:类标签平滑
CBN:CmBN(上文中经过改进的CBN)
CA:余弦退货调度进程
DM:动态mini-batch大小
OA:最优化锚点
3.BoS中方法对检测器的影响
当使用SPP、PAN和SAM时,检测器的性能最佳。
4.不同主干网络和预训练权重对检测器训练的影响
CSPDarknet53模型由于各种改进而显示出更大的提高检测器准确度的能力。
5.不同的小批尺寸对检测器培训的影响
小批量大小对检测器的性能几乎没有影响,这一结果表明,在引入BoF和BoS之后,不再需要使用昂贵的gpu进行训练。
参考文献:
https://blog.csdn.net/qq_36926037/article/details/106353387
https://www.it610.com/article/1296844378148511744.htm
YOLOV5
yolov5没有发布论文而且和v4也不是一个作者,v5是在v4几个月后就出来了,所以有很多撞车点。只在github开源了。就根据他的报告进行简单的学习。
1.数据增强
和v4一样都是用了数据增强,进行了三种数据增强:缩放,色彩空间调整和马赛克增强。
2.Auto Learning Bounding Box Anchors自适应锚定框
v3中提出来的,当要检测车的时候,bbox就不可能是瘦长类型的,v5中锚定框是基于训练数据自动学习的,这个模块在v4中没有。
3.Focus 结构
Focus是Yolov5新增的操作,原始图像输入Focus结构,采用切片操作,先变成304*12的特征图,再经过一次32个卷积核的卷积操作,最终变成304*32的特征图。
4.Backbone
主干网络没怎么变化和v4一样,依旧使用CSPDarknet,类似于DenseNet和resnet合并改进,网络更窄,参数更少,有残差块可以减少梯度弥散。
5.neck
Yolov5的Neck和Yolov4中一样,都采用FPN Feature Pyramid Networks特征金字塔+PAN的结构。
6.Yolov5四种网络的宽度
yolov5按大小分为四个模型yolov5s、yolov5m、yolov5l、yolov5x,yolov5在精度上没v4高,但是5s版本的速度是比较快的,也是他能迁移到移动端的原因。
参考文献:Windows 10 YOLO v3-PyTorch 复现_LogP的博客-CSDN博客
Windows 10 YOLO v3-PyTorch 复现_LogP的博客-CSDN博客
yolov4论文解读a_1234567890的博客-CSDN博客_yolov4论文解读
YOLOV4目标检测训练trick(bag of freebies)_我也不是故意要这么菜的啊的博客-CSDN博客
YOLO v4 论文中英对照翻译 | YOLO v4全文翻译-马春杰杰
【目标检测】YOLOv4论文理解_不断进步的咸鱼的博客-CSDN博客
论文阅读——YOLOv4:Optimal Speed and Accuracy of Object Detection - it610.com
(35 封私信 / 29 条消息) Kissrabbit - 知乎