YOLOV2相较YOLOV1,是在其基础上做了优化。主要在预测更准确(Better)、速度更快(Faster)、识别对象更多(stronger)。其中识别更多对象就是扩展到能够检测9000种不同对象(YOLO9000)。
1.1 batch normalization (批量归一化)
mAP提升2.4
操作:替代了YOLOV1的dropout
batch norm有助于解决方向传播过程中的梯度消失和梯度爆炸的问题,降低一些超参数(eg.学习率、网络参数的数量、激活函数的选择)的敏感性。 具有一定的正则化效果,从而加速训练的收敛。
1.2 high Resolution Classifier(高分辨率图像微调分类模型)
mAP提升3.7
操作:
- 预训练阶段提高输入的分辨率(ImageNet):
1 使用224x224的输入,从头开始训练网络,约160个eopch
2 然后提高输入分辨率为448x448进行训练,10个epoch- 检测时修改为416x416
图像分类的训练样本很多,具有目标框的样本数量较少(标注边框的人工成本较高)。所以目标检测模型的训练,通常会先用图像分类样本训练卷积模型用于提取图像特征。所带来的问题:图像分类样本的分辨率(224x224)不够高,然后训练好分类的网络,直接切换成448x448的目标检测网络,一定程度上会影响模型的性能。
所以在图像分类最后,将网络输入分辨率升为448x448训练,使网络使用大分辨率的特征提取。
.
检测时,使用416x416的输入。YOLOv2模型下采样的总步长为32,对于416x416大小的图片,网络最终的特征图大小为13x13,维度时奇数,这样的特征图恰好有一个中心位置。(大一些的物体,它们的中心更容易落入图片的中心位置,此时使用特征图的一个中心点去预测这些物体的边界框会更容易)如果输出时偶数维度,那么图像就会有4个中心位置。
1.3 Anchor Boxes(先验框)
召回率大幅提升到88%,mAP下降了0.2
操作:
借鉴了 Fast RCNN的anchor想法。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度
- 对于YOLOv1,每个grid 能够预测2个bboxes,每个box包括5个值 ( c e n t e r x , c e n t e r y , w i d t h , h e i g h t , c o n f i d e n c e ) (center_x,center_y,width,height,confidence) (centerx,centery,width,height,confidence),两个bbox共享一套分类结果。
- 对于YOLOv2,每个grid采用9个先验框,共13x13x9=1521个先验框。每个grid 的anchor boxes 都单独预测一套分类概率值。
然后YOLOv2对先验框进行了改良。
1.4 (Dimension Clusters)+(location prediction)
mAP提升4.8
1.41 Dimension Clusters(聚类提取先验框的尺寸)
操作:
- Faster RCNN和SDD中,使用的先验框是提前手动设定的,具有一定的主观性。
- YOLOv2采用k-means聚类方法,统计出符合样本中对象尺寸的先验框,这样可以减少网络微调先验框到实际框的难度。
因为设置先验框的是为了 使预测框与真实框的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)其中, c e n t r o i d centroid centroid是聚类时被选择中心的边框, b o x box box是其它边框, d d d就是两者间的“距离”。IOU越大,距离越近。
上面左边是选择不同的聚类K值情况下,得到的k个centroid边框,计算标注的边框与各centroid的平均IOU。显然,k越大,avgIOU越大。YOLOv2选择k=5作为边框数量与IOU的折中。(对比手动选择的先验框,使用5个聚类框即可达到61avgIOU,相当于9个手工设置的先验框60.9 avgIOU)注意:这里聚类时,并不关注边界框内部对象的类别问题。获取的是边框的坐标,也就是位置和大小信息。
1.4.2 location prediction(位置预测)
借鉴Faster RCNN的先验框方法,其位置预测公式为 x = ( t x ∗ w a ) + x a , y = ( t y ∗ h a ) + y a x=(t_x*w_a)+x_a, y=(t_y*h_a)+y_a x=(tx∗wa)+xa,y=(ty∗ha)+ya其中
- x , y x,y x,y是预测边框的中心
- x a , y a x_a,y_a xa,ya是先验框的中心点坐标; w a , h a w_a,h_a wa,ha是先验框的宽和高
- t x , t y t_x,t_y tx,ty是要学习的参数
注意YOLO论文中写的是 x = ( t x ∗ w a ) − x a x=(t_x*w_a)-x_a x=(tx∗wa)−xa,根据Faster RCNN,应该是“+”。
.
由于 t x , t y t_x,t_y tx,ty的取值没有任何的约束,因此预测边框的中心可能出现在任意位置,训练早起阶段不易稳定,需要较长的时间来训练得到正确的offsets。
YOLOv2沿用了v1的办法并做了调整,预测边界框中心相对应的grid左上角位置的相对偏移量,将预测边框的中心约束在特定的grid网格中。使用了sigmoid函数处理偏移值,这样的偏移值在(0,1)之间。 b x = σ ( t x ) + c x b_x=\sigma (t_x)+c_x bx=σ(tx)+cx b y = σ ( t y ) + c y b_y=\sigma (t_y)+c_y by=σ(ty)+cy b w = p w e t w b_w=p_we^{t_w} bw=pwetw b h = p h e t n b_h=p_he^{t_n} bh=phetn P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o ) Pr(object)*IOU(b,object)=\sigma (t_o) Pr(object)∗IOU(b,object)=σ(to)
其中:(事先以grid的w,h为单位,将所有的尺寸归一化)
- b x , b y , b w , b h b_x,b_y,b_w,b_h bx,by,bw,bh是预测边框的中心和宽高
- P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) Pr(object)*IOU(b,object) Pr(object)∗IOU(b,object)是预测边框的置信度。(YOLOv1是直接预测置信度的值,这里对预测参数 t o t_o to进行 σ \sigma σ变换后作为置信度的值)
- c x , c y c_x,c_y cx,cy是当前网格左上角到图像左上角的距离(要先将网格大小归一化)
- σ ( t x ) , σ ( t y ) \sigma (t_x),\sigma (t_y) σ(tx),σ(ty)是基于矩形框中心点左上角格点坐标的偏移量
- p w , p h p_w,p_h pw,ph是先验框的宽和高(归一化后的)
- σ \sigma σ是sigmoid函数
- 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是网络输出的内容,分别用于预测边框的中心和宽高,以及置信度
由于 σ \sigma σ函数将 t x , t y t_x,t_y tx,ty约束在(0,1)范围内,所以上图中,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置是的模型更容易学习,而且预测更加稳定
1.5 passthrough层检测细粒度特征
mAP提升1.0
目标检测中的物体会有大有小,当输入经过卷积模块后的特征中(这里是13x13),较小物体的特征已经不明显或者被忽略掉了。所以要检测小物体就需要更加精细的特征图。
.
操作
- SSD:使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图用来预测小物体。
- YOLOv2:使用了passthrough层的方法在特征图中保留一些细节信息。具体的,就是在最后一个pooling之前,Darknet-19模型是26x26x512的特征图,a)将其拆成4份然后concat (13x13x2048),b)直接传递到pooling后(并且又经过一组卷积)的特征图 (13x13x1024),将两者进行叠加在一起作为输出的特征图。自己根据理解画了张很直观的图片
另外:作者在后期实现中借鉴了ResNet网络,不直接对高分辨率特征处理,而是在拆分之前,添加一个1x1x64卷积核进行卷积,(26x26x512 --> 26x26x64),然后再经过passthrough处理(26x26x64 --> 13x13x256)。
1.6 multi-scale(多尺度图像训练)
mAP提升1.4
操作:
- 网络的下采样倍数是32,所以作者采用了{320, 352,…,608} 等10中尺寸输入图像尺寸,所对应的输出的特征图宽和高是{10,11,…,19}。训练过程中,每隔10个iterations随机选择一种输入图片的大小,使网络能够适应各种大小的检测
另外:
有个 hi-res detector,使mAP提高了1.8。
YOLOv2调整网络结构后能够支持多种尺寸的输入。小分辨率的图像mAP低,速度快,大图片反之。通常使用416x416的尺寸,如果使用较高分辨率544x544,则mAP可以达到78.6,有1.8的提升。
2.1 网络结构的修改(速度更快)
为了进一步提升速度,YOLOv2提出了Darknet-19(有19个卷积层和5个maxpooling层)网络结构。
- 相邻3x3卷积之间,增加1x1卷积来压缩特征图channels,以降低模型计算量和参数
- 使用maxpooling,降低特征图尺寸2倍,channels增加2倍
- 采用global avgpooling来预测
- 每个的卷积后面使用batchnorm层,加快收敛速度,降低模型过拟合。
.
Darknet-19比VGG-16 模型参数小一些(在ImageNet上, top-1准确度72.9%,top-5准确度为91.2%),但浮点运算量减少到约1/5,以保证更快的运算速度。
使用Darknet-19的YOLOv2,mAP没有显著的提升,但总计算量减少了约33%
下面的图是我自己理解后画的,便于自己更好的理解和记忆。
红虚框内的蓝颜色代表conv,黄颜色代表maxpooling;红色的尺寸数值表示某层网络的输出维度。
2.2 神经网络的训练
分3个阶段
在ImageNet分类数据上预训练DarkNet-19
…epoch:160
…InputSize:224x224
…SGD
…learningrate:初始学习率0.1
…polynomial rate decay:4
…weight decay:0.0005
…momentum:0.9在ImageNet数据上,增大网络的输入分辨率
…epoch:10
…InputSize:448x448进行finetune
…learning rate:0.001此时分类模型的top-1准确度为76.5%,top-5准确度为93.3%
- 将DarkNet-19分类模型修改为检测模型,在检测数据上fineturn。
…learning rate:
… …0-60 iteration:0.001
… …61-90 iteration:0.0001
… …91-160 iteration:0.00001
…weight decay:0.0005
…momentum:0.9
网络修改内容:移除最后一个卷积层,global avgpooling层以及stfmax层。新增了3个3x3x2014卷积层,同时增加一个passthrough层,最后使用1x1卷积层输出预测结果,输出的channels为: n u m a n c h o r s ∗ ( 5 + n u m c l a s s e s ) num_{anchors} *(5+num_{classes}) numanchors∗(5+numclasses)。.
这里 a n c h o r anchor anchor的数量为5,对于VOC数据集输出的channels为125=5x(5+20),对于COCO数据集则为425=5x(5+80)。
以VOC为例,最终的预测矩阵T的shape为 ( b a t c h s i z e , 13 , 13 , 125 ) (batchsize,13,13,125) (batchsize,13,13,125),先将其reshape为 ( b a t c h s i z e , 13 , 13 , 5 , 25 ) (batchsize,13,13,5,25) (batchsize,13,13,5,25),其中 T [ : , : , : , : , 0 : 4 ] T[:,:,:,:,0:4] T[:,:,:,:,0:4]为边界框的位置和大小, T [ : , : , : , : , 4 ] T[:,:,:,:,4] T[:,:,:,:,4]为边界框的置信度,而 T [ : , : , : , : , 5 : ] T[:,:,:,:,5:] T[:,:,:,:,5:]为类别预测值。
2.3 loss的设计
- 与YOLOv1一样,YOLOv2同样需要嘉定每个grid之多含有一个ground-truth,而在实际上基本不会出现多于1个的情况。
- 匹配时候IOU的计算方法:
当前的grid中存在物体时: 计算IOU值时不考虑坐标,只考虑形状和大小,所以将先验框与标签(ground truth)的中心点偏移到同一位置,然后计算出对应的IOU值。
- 如果IOU小于设定阈值(yolov2中取0.6)的bbox作为background类处理。(这些bbox的置信度参与了loss的计算)
- 将最大的IOU的box,作为负责对该物体的预测。(这些bbox的置信度、位置信息、分类参与了loss的计算)
- 其余的box直接忽略(对,直接忽略,没有任何项参与)
其中:
- b i j k o b_{ijk}^{o} bijko:预测的bbox的置信度信息。 b i j k r b_{ijk}^{r} bijkr:预测的bbox的坐标信息。 b i j k c b_{ijk}^{c} bijkc:预测的bbox的分类信息
- p r i o r k r prior_{k}^{r} priorkr:设定的先验框
- I O U t r u t h k IOU_{truth}^{k} IOUtruthk:真实标签的置信度信息。 t r u t h r truth^r truthr:真实标签的的坐标信息。 t r u t h c truth^c truthc:真实标签的分类信息。
第一行:当bbox为 background类时,置信度参与loss的计算
第二行:在前12800轮时,计算先验框和预测框的误差。是为了网络训练前期使预测框快速学习到先验框的形状
第三行:负责预测物体的bbox,置信度、位置信息、分类信息 三项都参与loss的计算。其中分类是对网络相应得输出使用了softmax,然后进行均方差运算
.
注意:
- yolov1:计算boxes的尺寸误差时,采用的是平方根来降低boxes的大小对误差的影响
- yolov2:都是采用的均方差计算的loss。对尺寸误差采用的是权重系数进行修正: c o o r d s c a l e ∗ ( 2 − t r u t h . w ∗ t r u t h . h ) coord_{scale}*(2-truth.w*truth.h) coordscale∗(2−truth.w∗truth.h)
VOC数据集可以检测20种对象,但实际上对象的种类非常多,只是缺少相应的用于对象检测的训练样本。YOLO2尝试利用ImageNet非常大量的分类样本,联合COCO的对象检测数据集一起训练,使得YOLOv2即使没有学过很多对象的检测样本,也能检测出来这些对象。
基本思路:如果是检测样本,训练时其Loss包括分类误差和定位误差;如果是分类样本,则Loss只包括分类误差。
3.1 构建WordTree
要检测更多对象,比如从原来的VOC的20中对象,扩展到ImageNet的9000种对象。如果把原来输出的20维的softmax改成9000维的softmax就可以了,但ImageNet的对象类别与COCO的对象类别不是互斥的。比如“Norfolk terrier”属于“dog”,所以作者提出了一种层级分类的方法(Hierarchical classification)。主要思路:根据各个类别之间的从属关系(WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示:
具体方法为:
- 遍历ImageNet/COCO的label,然后在WorkNet中寻找该label到根节点的路径;
- 如果路径只有一条,那么就将路径直接加入到分层树结构中;
- 如果路径存在多条,那么就将路径中最短的一条,加入到分层树。
3.2 训练标签的设定 & 损失函数
- 通常,对象互斥的情况下,用一个n维向量(n是预测对象的类别数)来表达一个预测对象(预测对象的那一维数值为1,其余为0)。
- 现在的WordTree,这里有9418个节点(对象),即9418维向量,使预测的对象那一位为1,以及该对象到根节点的路径上所有的节点都为1,。这样就体现了包含的关系。
.
训练的标签的设置,其实模型学习的是各节点的条件概率。例如:父节点mammal=1,样本为dog的标签是dog,那么dog=1;同级节点cat=0。也就是P(dog|mammal)=1,P(cat|mammal)=0。
WordTree的根节点为"physical object",每个节点的子节点都属于同一子类,属于互斥关系,可以对它们进行softmax处理。
3.3 预测时确定一个WorkTree的对象
上面说过,模型学习的是各节点的条件概率。那么一个节点的绝对概率,遍历这个path后 计算path上各个节点的条件概率之积。
不过,为了计算方便,实际中并不计算出所有的节点的绝对概率。而是采用一种比较贪婪的算法,从根节点开始向下遍历,对每一个节点,在它的所有的子节点中,选择概率最大的那个(一个节点下面的所有子节点是互斥的)。|| 一直向下遍历直到某个节点的子节点概率低于设定的阈值(意味着很难确定它的下一层对象到底是哪个),或达到叶子节点,那么该节点就是该WordTree对应的对象。
3.4 分类和检测联合训练
由于ImageNet样本比COCO多很多,所以对COCO样本会多做一些采样,适当平衡下样本数量,使两者样本数量比为4:1.
.
YOLO9000采用的是YOLOv2的网络结构,5个先验框减少到3个先验框,以减少计算量。YOLO2的输出为 13 ∗ 13 ∗ 5 ∗ ( 4 + 1 + 20 ) 13*13*5*(4+1+20) 13∗13∗5∗(4+1+20),现在的YOLO9000的输出是 13 ∗ 13 ∗ 3 ∗ ( 4 + 1 + 9418 ) 13*13*3*(4+1+9418) 13∗13∗3∗(4+1+9418)。
对于分类样本,则只计算分类误差,YOLO9000总共会输出 13 ∗ 13 ∗ 3 = 507 13*13*3=507 13∗13∗3=507个预测框,计算它们对样本标签的预测概率,选择概率打的那个框负责预测该样本的对象。
模型计算量更少,速度更快:采用了Darknet19网络结构,层数比YOLO1更少
解除了输入大小的限制:使用卷积代替全连接
使得模型对不同尺度的图片的检测更加鲁棒:进行多尺度的训练
提高了召回率 :每个cell生成5个统计的anchor box进行预测