yolov2
参考论文
和yolov1的区别?
相较于yolov1的"直接回归框",yolov2变成了"基于anchor box(先验框)",并且整体检测框架更稳定、更准。
简而言之,yolov2最大的升级就是引入了先验框
当然,除了先验框,yolov2还在网络中加入了批量归一化层(训练更稳定,收敛更快,减少过拟合);采用了更高分辨率的训练(特征图保留更多细节,小目标检测效果更好,使特征图具有奇数个位置);使用了Darknet-19作为新骨干网络(更深,计算量可控,特征提取能力强);使用passthrough layer(一个特征融合结构,把浅层的颗粒度特征传给后面的检测层;细粒度特征);用聚类得到更合适的auchor尺寸(对数据集里的目标框做K-means聚类,得到更适合数据集的auchor box尺寸,自定义的距离公式为 d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1-IOU(box,centroid) d(box,centroid)=1−IOU(box,centroid));多尺度训练(很好平衡速度和精度)
网络架构

Darknet-19 是 YOLOv2 使用的特征提取主干网络,由 19 个卷积层和若干池化层组成。其结构特点是通过多次最大池化逐步降低特征图的空间分辨率,同时不断增加通道数,从而实现由低级纹理特征到高级语义特征的逐层提取。网络中大量使用 1×1 卷积与 3×3 卷积交替组合,其中 1×1 卷积主要用于通道压缩与特征融合,3×3 卷积用于提取空间特征。原始 Darknet-19 最后接分类头用于 ImageNet 分类,而在 YOLOv2 中主要使用其卷积部分作为 backbone。
总结如下:
1、与VGG相似,使用了很多3×3卷积核;并且每一次池化后,下一层的卷积核的通道数 = 池化输出的通道 × 2。
2、在每一层卷积后,都增加了批量标准化(Batch Normalization)进行预处理。
3、采用了降维的思想,把1×1的卷积置于3×3之间,用来压缩特征。
4、在网络最后的输出增加了一个global average pooling层。
5、整体上采用了19个卷积层,5个池化层。
版权声明:本文为CSDN博主「AI 菌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wjinjie/article/details/107509243
优点&&创新点
引入批量归一层
BN 对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。基于此,YOLOv2 对每一层输入的数据都进行批量标准化,这样网络就不需要每层都去学数据的分布,收敛会变得更快。

引入author Box机制
在YOLOv1中,作者设计了端对端的网路,直接对边界框的位置(x, y, w, h)进行预测。这样做虽然简单,但是由于没有类似R-CNN系列的推荐区域,所以网络在前期训练时非常困难,很难收敛。于是,自YOLOv2开始,引入了 Anchors box 机制,希望通过提前筛选得到的具有代表性先验框Anchors,使得网络在训练时更容易收敛。
在 Faster R-CNN 算法中,是通过预测 bounding box 与 ground truth 的位置偏移值 t x t_x tx, t y t_y ty ,间接得到bounding_box的位置。其公式如下:

这个公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这会导致模型的不稳定性。
因此 YOLOv2 在此方法上进行了一点改变:预测边界框中心点相对于该网格左上角坐标( C x , C y ) (C_x, C_y)的相对偏移量,同时为了将bounding_box的中心点约束在当前网格中,使用sigmoid函数将 t x , t y t_x,t_y tx,ty进行归一化处理,将值约束在0-1,使得模型训练更稳定。
下图为 Anchor box 与 bounding box 转换示意图,其中蓝色的是要预测的bounding box,黑色虚线框是Anchor box。

yolov2在最后一个卷积层输出13*13的feature_map,意味着一张图片被分成了13×13个网格。每个网格有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值: t x , t y , t w , t h , t o t_x,t_y,t_w,t_h,t_o tx,ty,tw,th,to。引入Anchor Box机制后,通过简介预测得到的bounding_box的位置的计算公式为:

置信度 t o t_o to的计算公式为:

Convolution With Anchor Boxes(带锚框的卷积)

YOLOv1 有一个致命的缺陷就是:一张图片被分成7×7的网格,一个网格只能预测一个类,当一个网格中同时出现多个类时,就无法检测出所有类。针对这个问题,YOLOv2做出了相应的改进:
1、首先将YOLOv1网络的FC层和最后一个Pooling层去掉,使得最后的卷积层的输出可以有更高的分辨率特征。
2、然后缩减网络,用416×416大小的输入代替原来的448×448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格的时候只有一个中心单元格(Center Cell)。YOLOv2通过5个Pooling层进行下采样,得到的输出是13×13的像素特征。
3、借鉴Faster R-CNN,YOLOv2通过引入Anchor Boxes,预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。
4、采用Faster R-CNN中的方式,每个Cell可预测出9个Anchor Box,共13×13×9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。比YOLOv1预测的98个bounding box 要多很多,因此在定位精度方面有较好的改善。
K-means聚类选择Anchors
Faster R-CNN 中 Anchor Box 的大小和比例是按经验设定的,不具有很好的代表性。若一开始就选择了更好的、更有代表性的先验框Anchor Boxes,那么网络就更容易学到准确的预测位置了!
YOLOv2 使用 K-means 聚类方法得到 Anchor Box 的大小,选择具有代表性的尺寸的Anchor Box进行一开始的初始化。传统的K-means聚类方法使用标准的欧氏距离作为距离度量,这意味着大的box会比小的box产生更多的错误。因此这里使用其他的距离度量公式。聚类的目的是使 Anchor boxes 和临近的 ground truth boxes有更大的IOU值,因此自定义的距离度量公式为 :
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1-IOU(box,centroid) d(box,centroid)=1−IOU(box,centroid)
到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU;这样就保证距离越小,IOU值越大。具体实现方法如下:

论文中的聚类效果如下:

Fine-Grained Features(细粒度特征)
细粒度特征,可理解为不同层之间的特征融合。YOLOv2通过添加一个Passthrough Layer,把高分辨率的浅层特征连接到低分辨率的深层特征(把特征堆积在不同Channel中)而后进行融合和检测。具体操作是:先获取前层的26×26的特征图,将其同最后输出的13×13的特征图进行连接,而后输入检测器进行检测(而在YOLOv1中网络的FC层起到了全局特征融合的作用),以此来提高对小目标的检测能力。
Passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26×26×512的特征图,经Passthrough层处理之后就变成了13×13×2048的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图,然后在此特征图基础上卷积做预测。示意图如下:
