写在前面:这个blog集百家之文章,仅仅记录了本人学习过程中一些不清楚的地方。如果系统学习YOLO的话,B站有很多up主都讲的非常清晰,比如霹雳吧啦Wz、 Bubbliiiing,推荐大家去看。
Yolo系列的train阶段打标签原则都是:这几个bounding box中只有和ground truth的IOU最大的bounding box才是用来预测该object的。
YOLO算法的基本思想是:首先通过特征提取网络对输入图像提取特征,得到一定size的feature map,比如13*13,然后将输入图像分成13*13个grid cell,接着如果ground truth中某个object的中心坐标落在哪个grid cell中,那么就由该grid cell来预测该object,因为每个grid cell都会预测固定数量的bounding box(YOLO v1中是2个,YOLO v2中是5个,YOLO v3中是3个,这几个bounding box的初始size是不一样的),那么这几个bounding box中最终是由哪一个来预测该object?答案是:这几个bounding box中只有和ground truth的IOU最大的bounding box才是用来预测该object的。可以看出预测得到的输出feature map有两个维度是提取到的特征的维度,比如13*13,还有一个维度(深度)是B*(5+C),注:YOLO v1中是(B*5+C),其中B表示每个grid cell预测的bounding box的数量,比如YOLO v1中是2个,YOLO v2中是5个,YOLO v3中是3个,C表示bounding box的类别数(没有背景类,所以对于VOC数据集是20),5表示4个坐标信息和一个置信度(objectness score)。
一句话总结YOLO:将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
一.YOLOv1
参考:https://www.bilibili.com/video/BV1yi4y1g7ro
先把图片预训练成448*448,然后通过一系列conv和maxpooling,接着展平处理、全连接*2,再把一维的向量reshape成7*7*30的tensor,其中7*7为grid cell的大小,30中有20个class scores,2个bounding box,每个bounding box包括x,y,w,h和一个confidence(置信度). confidence score计算(IOU表示交并比):
LOSS函数计算:
对于 λcoord 与 λnoobj ,Yolo面临的物体检测问题,是一个典型的类别数目不均衡的问题。其中49个格点,含有物体的格点往往只有3、4个,其余全是不含有物体的格点。此时如果不采取点措施,那么物体检测的mAP不会太高,因为模型更倾向于不含有物体的格点。 λcoord 与 λnoobj 的作用,就是让含有物体的格点,在损失函数中的权重更大,让模型更加“重视”含有物体的格点所造成的损失。在论文中, λcoord 与 λnoobj 的取值分别为5与0.5。
二.YOLOv2
用到了先验框,及提前约定好了常见目标的宽高,在预测的时候直接在此基础上进行变动
YOLOv2中先验框的获得:在寻常的kmean算法中,使用的是欧氏距离来完成聚类,但是先验框显然不可以这样,因为大框的欧氏距离更大,yolo2使用的是处理后的IOU作为欧氏距离。
distance(i,center)=1−IOU(i,center)
处理后的IOU其实指的是每个聚类中心与其它的框的重合程度,如果单用IOU(i,center)的话,就是IOU(i,center)越大重合度越高,我们是希望重合度越高距离越短,这样才可以kmeans聚类,所以不可以直接使用IOU(i,center),所以应当为其取负号后加上1。聚类有5个中心点。
YOLOv2使用了一个新的分类网络作为特征提取部分,网络使用了较多的3 x 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,把1 x 1的卷积核置于3 x 3的卷积核之间,用来压缩特征。使用batch normalization稳定模型训练,加速收敛,正则化模型。
与此同时,其保留了一个shortcut用于存储之前的特征。
除去网络结构的优化外,yolo2相比于yolo1加入了先验框部分,我们可以看到最后输出的conv_dec的shape为(13,13,425),其中13x13是把整个图分为13x13的网格用于预测,425可以分解为(85x5),在85中,由于yolo2常用的是coco数据集,其中具有80个类,剩余的5指的是x、y、w、h和其置信度。x5的5中,意味着预测结果包含5个框,分别对应5个先验框。
三.YOLOv3
参考资料:https://blog.csdn.net/weixin_44791964/article/details/105310627
1.backbone: Darknet-53. 特点:使用了残差网络,增加深度的同时缓解了深度大所带来的梯度消失的问题。
2.特征利用:在最后三个残差网络处理完后,对它们进行5次卷积,处理完后一部分用于输出该特征层对应的预测结果,一部分用于进行反卷积UpSampling2d后与其它特征层进行结合。(提取多特征层进行目标检测)
3.对得到的三个预测结果解码:需要把得到的结果reshape一下(把先验框的长、宽乘以416)
4.每个网格点有3个先验框,每个先验框都含有x_offset、y_offset、h和w、置信度、分类结果。然后看置信度,把先验框和真实框的IOU进行对比,把所有的置信度进行大小排序,取出每一类得分大于self.obj_threshold的框和得分,采用非极大抑制算法,把同一物体上的多个框筛选为一个confidence最大的框。
5.其采用反卷积UmSampling2d设计,逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算,其可以更多更好的提取出特征。
6.先验框的获得:和YOLOv2类似,只不过聚类有9个中心点.通过Kmeans算法得到9个先验框的大小,然后把它们均分在最后三个残差特征层上面进行预测。
YOLOv3优秀的检测结果主要的得益于残差网络、反卷积和多特征层的思想,这些特点使其可以很好的提取特征,同时训练效果好,且对大目标和小目标都有很好的检测效果。
关于upsampling:https://blog.csdn.net/LoseInVain/article/details/81098502
关于BatchNormalization:https://blog.csdn.net/weixin_43937316/article/details/99573134
四.YOLOv4
参考:https://blog.csdn.net/weixin_44791964/article/details/106014717
YOLOv4相对于v3的改进:
1.backbone:Darknet53->CSPDarknet53
简单来说就是在resblock_body中有一个大的残差边+多个残差网络
2.加强特征提取网络的改进,使用了SPP和PANet结构——加强特征融合
SPP:用5*5,9*9,13*13对特征层进行池化,再把它们和原特征层进行堆叠
PANet:在多次上采样+堆叠后下采样+堆叠
YOLO Head:3*3卷积+1*1卷积(维度:num_anchors*(num_classes+5))
3.数据增强方面的改进,使用了Mosaic数据增强
将4张图片进行拼接以及翻转、缩放、色域变换,并且按照4个方向摆放好,每一张都有对应的先验框
优点:丰富检测物体的背景,在BN计算的时候一下子计算4张图片的数据
参考:https://blog.csdn.net/weixin_44791964/article/details/105996954
4.LOSS方面使用CIOU作为回归LOSS
αv可以看成一个惩罚因子
5.激活函数:Mish=x×tanh(ln(1+ex)