注释:全文根据别人笔记学习,自己做的笔记【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)-优快云博客
介绍
yolov2的全名叫做 yolo9000,最终能够检测的目标类别是9000。相比于v1有了更大的提升以及召回率
尝试
1.Batch Normalization
2.High Resolution Classifier
3.Convolution With Anchor Box
4.Dimension Clusters
5.Direct location prediction
6.Fine -Grained Features
7.Multi -Scale Training
1.Batch Normalization
- 提升了2%mAP
- 提供了正则化的效果
- 代替了全连接层的drop out(减轻过拟合),每一个卷积后全部加入BN,使得每一层卷积之后可以控制它朝收敛方向走。(后续但凡有卷积之后肯定有BN)
- BN已经成为网络必备
BN介绍(复习)
2.High Resolution Classifier
- 采用更高层的分类器
- 采用了训练时加入448*448的分辨率分类器
- 提升了4%mAP
解释
1.检测方法都使用在ImageNet上预先训练的分类器作为预训练模型
2.在AlexNet之前,大多数的网络输入图片分辨率是小于256*256
3.yolo_v1中预训练使用的分类数据集分辨率大小是224×224 ,使用YOLO模型做目标检测的时候又将输入变成448 × 448。这样后续改变尺寸,网络就要多重新学习一部分,会带来性能损失
4.v2直接在预训练中加入了448×448的尺寸,刚开始还是224*224,但在训练时最后10个epoch的时候进行448*448的微调。检测的时候也是448 × 448。
5.因为主干网络darknet19有经过5次下采样,一次w和h变为原来的一半,五次就是1/32.因此输入的图片需要可以被32整除,因此一般调整为416*416的输入
3.Convolution With Anchor Box
采用了基于anchor去预测目标
mAP降了,但召回率升了
(召回率表示得找全,mAP表示得找准。)
precision: 预测框中包含目标的比例。
recall: 真正目标被检测出来的比例。
解释
1.什么是anchor:
Anchor(先验框) 就是一组人为决定大小的边框,在训练时,以真实的边框位置相对于预设边框的偏移 来构建训练样本。就是先自己描出来大致的边框,然后训练偏移调整。
2.anchor box 和 v1的bounding box区别()
- 在yolov1中,我们预测选择的bounding box大小都是人为设定的,根据经验得到的。一般就是长方形和正方形。
- 在fasterRcnn中,anchor大小固定。我们每个gridcell会有9个anchorbox来进行预测,anchor box规定有9种,三种scal(小尺寸、中尺寸、大尺寸),每一种scal有三种比例大小。
- 在yolov2中,也使用anchor box,但是anchor的大小是聚类得到的。系统会根据人为标注好的真实框,进行k-means聚类分k类,每一类都会有差不多的标注框大小比例。这样anchor可以根据实际选择框的比例,所以每个cell有k个anchorbox。根据实验k=5最佳。kmeans的距离=1-IOU(anchorbox,真实框)【相交越多越趋近于0,越少越趋近于1】
3.结构上的改进
- 删掉全连接层和最后一个pooling层,使得最后的卷积层可以有更高分辨率的特征。
- 使用Anchor Boxes
- 缩小网络操作的输入图像为416×416
Q:为什么是416*416,不是448*448?
因为输入大小是416*416的时候,经过一系列卷积操作,最终得到特征图是13*13。长和宽都是奇数,所以矩阵中心只有1个,而不是4个。
另外416可以被32整除
4.yolov1和v2对比
每个grid cell携带信息量
v1:每个grid cell有2个boundingbox,bound ingbox只包含5个信息:4位置参数+confidence(2个bound ingbox*5个信息)+20类
v2:每个grid cell有5个anchor box,每个anchorbox包含25个信息:分类20+4位置参数+confidence(5个信息+20个类)*5个anchor
效果对比
v1中二个boundingbox只预测一个物体
v2中每个anchorbox预测一个物体,一个gridcell有多个物体,每个anchor可以预测一个
4.Dimension Cluster
Q:当选择anchor时候,box的尺寸是人为定的,如果选的非常好,那么效果会更好。那么怎么选择好的box尺寸呢?
在训练集的边界框上运行K-means聚类训练bounding boxes,可以自动找到更好的boxes宽高维度。
我们设置先验Anchor Boxes的主要目的是为了使得预测框与真值的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标
K-means算法步骤:
1.选择初始化的K个样本作为初始聚类中心
2.针对数据集中每个样本,计算它到K个聚类中心的距离,并将其分到距离最小的聚类中心所对应的类中
3.针对每个类别,重新计算它的聚类中心
4.重复上面的步骤2、3,直到达到某个终止条件(迭代次数、最小误差变化)
5.Direct location prediction
Q:大多数anchor不稳定的原因是来自于对边框中心点(x, y)位置的预测。
早期,我们预测边界框的方式是
但是因为和
(anchor的偏移)的范围是没有限制的,所以anchorbox经过位置参数调整后,预测框可能跑到其他gridcell里面去了。
比如下面的橙色框,本应该预测自己这个gridcell的,但是跑到下角去了。下角的有它的anchor box来预测,用不到你。
解决办法:使用一个函数 logisitic activation(类似sigmoid)对偏移量
和
进行限制。
这样使得anchorbox限制在自己的grid cell内进行预测。
6.Fine -Grained Features
把细粒度变更小,这个修改后的YOLO在13 × 13特征图上进行检测。虽然这对于大型对象来说已经足够了,但是对于较小的对象来说,更细粒度的特性可能会使得检测效果更好。
使得mAP提升了1%
7.Multi_Scale
不管输入什么尺度的输入图像,都可以做。多次迭代之后,输入图片大小可以变
Pass Through层
Q:为什么要有passtrough层?
为了检测小目标。
感受野:卷积之后特征图上一个点对应原图多大的区域。
所以,卷积层数越多,感受野就越大。最后一层的感受野很大,对应原图的区域大。这样就利于检测大目标,但是不利于检测小目标。
因此v2中为了检测小目标,用最后一层特征图检测大目标,用中间某一层的特征图检测小目标。(中间层的感受野肯定小一点,对应原图区域小一点)
那么就是挑选下面的26*26*512的那一层卷积的特征图,通过passtrough层来处理,为了用来检测小目标
把特征矩阵,分成4块,相同颜色的组成一个2*2的矩阵。
这样得到的效果是原来 4*4*1,变成了2*2*4的矩阵
宽高缩减一半,channel变为4倍
passtrough层之后把原来的13*13*1024的和4个13*13*512的深度合并。
这样既能检测大目标(13*13*1024),又能检测小目标(4*13*13*512)
为网络简单地添加一个直通层( passthrough layer),获取前层26×26分辨率特征。可以看到经过PassTrough层之后,把26*26的feature map,变成了13*13的。然后再与13*13*1024的特征图进行深度上的拼接。得到13*13*1280
yoloV2的主干网络
yolov2使用的是一个全新的架构: Darknet-19
最终模型,称为Darknet-19,有19个卷积层和5个maxpooling层,Darknet-19网络如下
输入是416*416(看第三条,要可以被32整除)
没有FC层(容易过拟合),所有层都是卷积
5次maxpoll降采样,一次尺寸变为一半。5次变为32分之一。输入的h和w变为h/32,w/32。所以根据416的输入,5次之后最终得到的特征图是13*13
卷积基本是3*3和1*1,节省很多参数。卷积不改变尺寸大小,用3*3代替v1中7*7得到相同感受野,但是会增加深度,所以用1*1的再降深度
在Darknet-19的基础上,去掉了最后一个卷积层,然后加上了3个3*3的卷积层。
最后一个1×1的卷积层,输出的数量是我们检测所需的参数,VOC数据集。5个boundingbox,分20类。每个bound ingbox参数量是(5+20),5个,所以每个gridcell输出(5+20)*5的参数量。
倒数第二个3X3卷积到最后一个3X3卷积层增加passthrough层。模型可以使用细粒度的特征。