闲话YOLO三部曲

前言

  YOLO最近又出了YOLO-V3,给实时目标检测带来了更强的推力,让我们看下YOLO从V1到V3的变迁,感受下作者在改进上的思路历程。

目标检测

  通常的目标检测,是对图像中的物体识别类型,并指出该物体的位置(center_x, center_y, width, height)。比起普通的图像识别问题,难度明显增大,将物体识别和位置预测混到一起,更为棘手。针对这类问题,出现了许多解法,比如Sliding Windows Detection(1995)、R-CNN(2014)、SSD(Single Shot MultiBox Detector 2015),这些方法各有千秋,YOLO是其中的佼佼者,当然其他方法也很厉害哈。

YOLO-V1

  第一代YOLO(You Only Look Once)是开创性的,将目标检测问题整体视为回归问题,并且在速度上惊艳众人。

预测变量解释

  对这张狗车图,要预测的一共有SxSx(Bx5 + C)个值。


  SxS表示要将图grid的数量,B表示有几个不同形状的Box,5表示每个box需要有center_x, center_y, width, height, confidence五个值要表示当前的box信息,其中confidence表示该box有物体的置信度。C的数量是所要判别类的总数量,C_i表示某个类的判别概率。
意味着,每个grid-cell,都要单独预测B个不同形状的box(指出不同形状下的物体位置,及每个形状位置下存在物体的置信度),每个grid-cell都要对所有物品类型都做出判别概率预测。
   注意1:在YOLO-v1里面,center_x, center_y是相对于grid-box边缘的(偏移比例),width, height是相对于整个图像的(做归一化)。
   注意2:在YOLO-v1里面,不是grid-cell的每个box,都对所有类预测一遍概率。而是当前grid-cell仅预测一遍所有类的判别概率。YOLO-v2就改进了这点。

loss函数

   l o s s =
    1)   λ c o o r d i = 0 S 2 j = 0 B I i j o b j   [ ( x i x ^ i ) 2 + ( y i y ^ i ) 2   ]
    2)   +   λ c o o r d i = 0 S 2 j = 0 B I i j o b j   [ ( w i w ^ i ) 2 + ( h i h ^ i ) 2   ]
    3)   +   i = 0 S 2 j = 0 B I i j o b j ( C i C ^ i ) 2
    4)   +   λ n o o b j i = 0 S 2 j = 0 B I i j n o o b j ( C i C ^ i ) 2
    5)   +   i = 0 S 2 I i o b j c c l a s s e s ( p i ( c ) p ^ i ( c ) ) 2
   i 表示grid-cell的索引, j 表示box的索引, I i o b j 表示第 i 个grid-cell存在物体(当实际标注的物体中心在该cell里时,表示这个grid-cell存在物体), I i j o b j 表示the jth bounding box predictor in cell i is “responsible” for that prediction.
  其中1,2表示grid-cell存在物体时,对中心和长宽做平方差和, λ c o o r d = 5 λ n o o b j = 0.5 ,是为了避免无物体时的置信分压制含有物体时的梯度。长宽的开方是为了减小平方差和在大小box上,对长宽偏差的敏感度。3 对含有物体的置信分值误差和则无权重的处理。概率预测的误差项是5,也是仅仅对含有物体的时候做误差的计算。
  这个loss函数集中体现了YOLO将目标检测作为回归问题的特质。
  注意,该loss仅对含有物体的部分做计算。权重 λ 和开方都是为对抗将目标检测作为回归问题带来的副作用。
  疑惑,怎么理解 I i j o b j ?在当前grid-cell下,有多个box,难道不应该是 j B I i j o b j [ ( x i j x ^ i j ) 2 + ( y i j y ^ i j ) 2 ] 这样的么?然而并不是,这里将多个box做了取最大处理,当前这个grid-cell下,最具有代表性的box,才有资格参与本次loss计算。这里就隐藏这一步操作,判断当前cell内的哪个box更具代表性, a r g m a x j { I O U p r e d j t r u t h }

网络结构与训练


  网络结构如上,先在ImageNet1000上做分类训练作为 预训练(前20层 + mean-pooling + full-connect),以便能够保证网络对物体的正确特征的提取能力。然后在PASCAL VOC上做目标检测(pre-train前20层 + 4 Conv + 2 full-connect)。Yolo-v1更多借鉴了GoogLeNet的结构(含有大量的Inception结构, 详细见)。
  实际标注的box的长宽用图像的长宽做归一化,所以预测长宽值时范围在[0,1]内;预测中心位置,也是计算偏差比例 t x ,从而计算位置 x p r e d = ( t x w i d t h ) x c e l l 。注意,所有ReLU函数都使用Leaky ReLU。
   注意:有没有发现CNN天然对grid-cell分割具有适应性,可以使用stride来调节分割,避免掉了滑动窗口类的方法所需要的多次重复操作,CNN直接一遍计算就有了所有窗口的结果。

YOLO-V2

  第二代YOLO,对Yolo-v1改进得到Yolo-v2,再继续改进得到Yolo9000。
  YOLO-v2比一代,速度更快,可以直接调整计算速度和准确率的权衡,并且能够识别检测未标注过的物体。主要简化了网络,并在训练上做了重要的改进,box的选择也做了优化。(一代有20个训练类别,YOLO9000有9000个训练类别)
1)优化了预测项
  将直接预测位置,调整为预测偏差。
  
               b x = σ ( t x ) + c x
               b y = σ ( t y ) + c y
               b w = p w e t w
               b h = p h e t h
     P r ( o b j e c t ) I O U b o x t r u t h = σ ( t o )
    
   ( c x , c y ) 是grid-cell的中心相对于图像左上角的偏移位置,表示cell的
  中心坐标, ( p w , p h ) 是标注的ground-truth的长宽。 { t x , t y , t w , t h , t o }
  是预测值,再做一次转换变为实际box的位置及边缘标注。这处调整使得
  训练时更稳定。同时将YOLO-v1使用的 S × S × ( B × 5 + c l a s s e s )
   S × S × ( B × ( 5 + c l a s s e s ) )
2)更细粒度feature-map的使用
  在检测输出feature-map上,concat更靠前层的feature-map,类似于ResNet里面的Identity-mapping。
  size问题,比如更前层是26x26x512 怎么跟当前feature-size=13x13的合并到一起。
  在Inception-module里面,是精心设计Conv和Pool的尺寸从而使得concat之前各个子模块的输出尺寸大小一致的。而ResNet的直连也是在Resdual部分做了Conv和Pool的尺寸设计(哪怕不同尺寸,也有一个处理函数: w s x 转换为与Resdual输出尺寸一致),从而使得输出与输入尺寸上相同。
  这里是怎么处理的呢?文中有句话“the passthrough layer concatenates the higher resolution features with the low resolution features by stacking adjacent features into different channels instead of spatial locations, similar to the identity mappinns in ResNet”。目测是加的卷积层作为passthrough layer,并且很可能是[1x1]的卷积。
3)简化了网络,使用了BN

  在网络中大量使用[3x3] followed by [1x1]-filter,计算更快。
  Batch-normalize的大量应用,使得训练更容易收敛,命名
  该网络结构为Darknet-19(共19个Conv-layer, 5个max-pooling layer)。
  分类训练时,所使用的网络结构如右图:
  检测训练时,删除最后三层,增加3层
  [3x3]x1024 + [1x1]xout_num; o u t n u m = b o x n u m ( 5 + c l a s s e s )
4)改进了训练方法
  在使用分类任务预训练后,继续在高清图像上训练分类任务(10 epoch;
  input_size由[224x224] 变为 [448x448]),以提高对高清图像的适应性。
  训练检测任务时,采用multi-scale训练方式。每10个epoch,随机选择
  一种输入图像尺寸。 { 320 , . . . , 608 } ,以32为间隔。调整网络的输入,
  从而使得检测训练更适合于各种尺寸的输入情况,并能够在预测时很好
  地调节计算速度和计算精度的关系。
  在COCO(80分类)和VOC(20分类)上训练检测任务。
5)用聚类选择所用anchor-box
  之前选择的box都是手调的,这里使用聚类选择出效果更好的box。
  distance metrice定义为: 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 ,重合度越高距离越小。将所有标注box(长宽)抽取出来,定义不同聚类的box(长宽值),计算距离时,假设中心位置是重叠的。

  至此,YOLO-v2就训练OK。后面的是YOLO9000的设计及训练。
1)合并了大量的数据集。
  构建了一颗WordTree,描述了各个物体的隶属关系,以便能够将不同的数据集合并(对隶属关系Tree上的物体label向根label靠近)。
2)将目标检测和物体识别合并到一起联合训练。
  样本带有目标检测的标记,当是检测样本来时,则训练检测loss,当是分类样本来时,则训练分类loss。
  关键点:When it sees a classification image we only backpropagate classification loss. To do this we simply find the bounding box that predicts the highest probability for that class and we compute the loss on just its predicted tree. We also assume that the predicted box overlaps what would be the ground truth laabel by at least 0.3 IOU and we backpropagate objectness loss based on this assumption.
  这里将覆盖值IOU最大类预测(相当于先作了一步目标检测),计算分类误差作优化。从而使得目标检测能够扩大检测类的范围。

YOLO-V3

  第三代YOLO,写得很轻松随意。主要工作是将模型搞得更准确,与之同时模型复杂度更高,但是计算速度并无明显损失。
  性能对比及分类网络结构如下图,命名为Darnet-53。


  对YOLO并无卵用的改进尝试:
  1) 对长宽的预测改为线性的预测,会让模型不稳定并性能下降。
  2) focal loss 会导致性能下降。
  3) 训练时,双IOU然并卵。

最终预测结果

  怎么来做最终的判断呢?
  这么多的预测值,怎么使用呢?整体比较取最优是OK的。
1)confidence-score
  定义存在物体的置信度 c o n f i d e n c e = P r ( o b j e c t ) I O U p r e d t r u t h ,也就是存在物体的概率,乘以 s i z e ( p r e d b o x t r u t h b o x ) s i z e ( p r e d b o x t r u t h b o x ) 。该grid-cell存在物体的概率是1/0,当物体的center在该grid-cell内时,Pr(object)=1,否则=0。
  如何在某个grid-cell内,选择当前cell的某个box是预测的哪个类呢?
  考虑存在物体的置信度与类型概率= P r ( c l a s s i | o b j e c t ) P r ( o b j e c t ) I O U p r e d t r u t h ,基于此值选择,当前grid-cell的cur-box的预测类就是此值最大的那个类。
2)IOU足够充分
  在当前grid-cell下,有多个box,都做预测太混乱了,怎么办呢?
  其实多个box是为了避免物体重叠时的问题。只需要保留下IOU足够大的预测即可。同时,多box可以适应目标不同的形状。
3)同目标多预测
  此时,还存在大量的对同一物体的多个预测的,怎么办?
  因为上面处理的是同grid-cell内的多预测,但是跨格的同目标多预测还是大量存在的。怎样保留局部范围内的最佳预测呢?使用Non-maximal Suppression,对每个类型的预测值保留最大的IOU的预测。为什么会有跨格的同目标多预测情况呢?因为某些较大的目标,会被多个grid-cell预测到。(虽然在loss设计上做了偏重处理,但是仍然会出现这种问题)
  疑惑:在一张图上,有多个同类型目标时,non-maximal suppression还能起作用么?可以的,NMS是局部最优去重。详见后面的基础补充。
  YOLO本身的优势:在训练时,对整个图片做了隐式地上下文信息的编码,将分类及其出现整合到了一起。
  值得注意的是:YOLO对IOU=0.5非常适配。

基础知识补充

IOU

  IOU: Intersection Over Union(交并比)
  计算两个box的交集部分占整体的比例,可以用来表示预测box对真实box的覆盖率,准确度。
   I O U = s i z e ( P r e d B o x T r u t h B o x ) s i z e ( P r e d B o x T r u t h B o x ) = s i z e ( A B ) s i z e ( A B )

anchor-box

  anchor box是什么?做神马用的?
  anchor box是预先定义的用来拟合目标大小形状的锚箱。
  通过预先定义一些尺寸比例不同的box,当表达同一物体时,可以更从容地表示该物体的各种可能形状;当不同物体重叠时,可以依据物体的不同形状将它们区分出来。
  预定义这些box的好处,更方便地拟合实际标注ground-truth(在计算loss时),且用来区分重叠物体。
  anchor-box的最初使用是在R-CNN里面,主要用来更方便地处理多尺度目标区域抽取问题。

Non-maximal Suppression

  目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框(局部最大搜索)。上个奥黛丽·赫本的美图举作例子。


基本处理如下:
1)将所有的box按照confidence-score排序,作为集合M。
2)选择最高的分值对应的box,不放回地取出放入到保留集合S中。
3)M中剩余box,分别计算与S中的box的IOU, 高于某阈值的,则从M中删除。( 相当于局部去重操作;低于某阈值的,则可能是其他分类的,留待下轮
4)再不放回地取M中的最高分对应的box,放入到保留集合S中,重复。
5)直到集合M中没有box。
注意:此处的IOU阈值,一般在[0.3,0.5]内。

Leaky ReLU

   f ( x ) = { x i f x > 0 0.1 x e l s e

mAP

  AP:average precision
  某一类别的平均精度。
  按照PASCAL VOC的定义,设定一组阈值,[0, 0.1, 0.2, …, 1],共11个,按照每个recall>阈值,都有一个最大precision,计算 A P = 1 11 P r e c s i o n r e c a l l 。(recall-precision的曲线的曲线下面积)
  mAP:mean average precision
  多个分类的平均精度的均值。 m A P = 1 C c C A P

Reference

  1. 官方YOLO网站:https://pjreddie.com/darknet/yolo/
  2. 2016-You Only Look Once: Unified, Real-Time Object Detection
  3. 2017-YOLO9000: Better, Faster, Stronger
  4. 2018-YOLOv3: An Incremental Improvement
  5. 2017-Learning Non-maximum Suppression

猜你喜欢

转载自blog.csdn.net/yujianmin1990/article/details/80212687