@(Aaron) [深度学习, 目标检测]

主要内容包括:

  • 网络结构
  • 预测细节
  • 损失函数

  针对YOLO v1的不足,2016年诞生了YOLO v2。相比起第一个版本,YOLO v2预测更加精准(Better)、速度更快(Faster)、识别的物体类别也更多(Stronger),在VOC 2007数据集上可以得到mAP 10%以上的提升效果。

  YOLO v2从很多方面对YOLO做出了改进,大体可以分为网络结构的改善、先验框的设计及训练技巧3个方面。

1、网络结构的改善

  YOLO v2对于基础网络结构进行了多种优化,提出了一个全新的网络结构,称之为DarkNet。原始的DarkNet拥有19个卷积层与5个池化层,在增加了一个Passthrough层后一共拥有22个卷积层,精度与VGGNet相当,但浮点运算量只有VGGNet的1/5左右,因此速度极快,具体结构如图1所示。

YOLOv2解析
图 1.1 YOLOv2-Darknet-19

  相比起v1版本的基础网络,DarkNet进行了以下几点改进:

  • BN层:DarkNet使用了BN层,这一点带来了2%以上的性能提升。BN层有助于解决反向传播中的梯度消失与爆炸问题,可以加速模型的收敛,同时起到一定的正则化作用。BN层的具体位置是在每一个卷积之后,**函数LeakyReLU之前。
  • 用连续3×3卷积替代了v1版本中的7×7卷积,这样既减少了计算量,又增加了网络深度。此外,DarkNet去掉了全连接层与Dropout层。
  • Passthrough层:DarkNet还进行了深浅层特征的融合,具体方法是将浅层26×26×512的特征变换为13×13×2048,这样就可以直接与深层13×13×1024的特征进行通道拼接。这种特征融合有利于小物体的检测,也为模型带来了1%的性能提升。
  • 由于YOLO v2在每一个区域预测5个边框,每个边框有25个预测值,因此最后输出的特征图通道数为125。其中,一个边框的25个预测值分别是20个类别预测、4个位置预测及1个置信度预测值。这里与v1有很大区别,v1是一个区域内的边框共享类别预测,而这里则是相互独立的类别预测值。

2、先验框的设计

  YOLO v2吸收了Faster RCNN的优点,设置了一定数量的预选框,使得模型不需要直接预测物体尺度与坐标,只需要预测先验框到真实物体的偏移,降低了预测难度。关于先验框,YOLO v2首先使用了聚类的算法来确定先验框的尺度,并且优化了后续的偏移计算方法,下面详细介绍这两部分。先验框的设计为YOLO v2带来了7%的召回率提升。

2.1 聚类提取先验框尺度

  Faster RCNN中预选框(即Anchor)的大小与宽高是由人手工设计的,因此很难确定设计出的一组预选框是最贴合数据集的,也就有可能为模型性能带来负面影响。

  针对此问题,YOLO v2通过在训练集上聚类来获得预选框,只需要设定预选框的数量k,就可以利用聚类算法得到最适合的k个框。在聚类时,两个边框之间的距离使用式(2.1)计算,即IoU越大,边框距离越近。

d(box,centroid)=1IoU(box,centroid)(2-1) d(\text {box,centroid})=1-\text {IoU}(\text {box,centroid})\tag{2-1}

  在衡量一组预选框的好坏时,使用真实物体与这一组预选框的平均IoU作为标准。值得一提的是,这一判断标准在手工设计预选框的方法中也可以使用。

  至于预选框的数量选取,显然数量k越多,平均IoU会越大,效果会更好,但相应的也会带来计算量的提升,YOLO v2在速度与精度的权衡中选择了预选框数量为5。

2.2 优化偏移公式

  有了先验框后,YOLO v2不再直接预测边框的位置坐标,而是预测先验框与真实物体的偏移量。在Faster RCNN中,中心坐标的偏移公式
如式(2-2)所示。

{x=(tx×wa)+xay=(ty×ha)+ya(2-2)\left\{\begin{array}{l} x=\left(t_{x} \times w_{a}\right)+x_{a} \\ y=\left(t_{y} \times h_{a}\right)+y_{a} \end{array}\right.\tag{2-2}

  公式中waw_{a}hah_axax_ayay_a代表Anchor的宽高与中心坐标,txt_xtyt_y是模型预测的Anchor相对于真实物体的偏移量,经过计算后得到预测的物体中心坐标x和y。

YOLOv2解析
图 2.1 YOLOv2-预测值含义

  YOLO v2认为这种预测方式没有对预测偏移进行限制,导致预测的边框中心可以出现在图像的任何位置,尤其是在训练初始阶段,模型参数还相对不稳定。例如txt_x是1与-1时,预测的物体中心点会有两个宽度的差距。

  因此,YOLO v2提出了式(2-3)所示的预测公式:

{bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethpr(object)×IoU(b,object)=σ(t0)(2-3)\left\{\begin{array}{c} b_{x}=\sigma\left(t_{x}\right)+c_{x} \\ b_{y}=\sigma\left(t_{y}\right)+c_{y} \\ b_{w}=p_{w} e^{t_{w}} \\ b_{h}=p_{h} e^{t_{h}} \\ p_{r}(\text {object}) \times I o U(b, \text {object})=\sigma\left(t_{0}\right) \end{array}\right.\tag{2-3}

  公式中参数的意义可以与图2.1结合进行理解,图中实线框代表预
测框,虚线框代表先验框。

3、损失函数与正负样本的选取

  关于正、负样本的选取,YOLO v2基本保持了之前的方法,其基本流程如下:

  • 首先利用式(2-3),将预测的位置偏移量作用到先验框上,得到预测框的真实位置。
  • 如果一个预测框与所有真实物体的最大IoU小于一定阈值(默认为0.6)时,该预测框视为负样本。
  • 每一个真实物体的中心点落在了某个区域内,该区域就负责检测该物体。具体做法是将与该物体有最大IoU的预测框视为正样本。

  确定了正样本与负样本后,最后是网络损失的计算。由于利用了先验框,YOLO v2的损失函数也相应的进行了改变,公式如式(3-1)所示。

Losst=i=0Wj=0Hk=0A(1max10U<Thresh×λnoobj×(bijko)2+1t<12800×λprior×r(x,y,w,h)(priorkrbijkr)2+1ktruth×λcoord×r(x,y,w,h)(truthrbijkr)2+λobj×(IoUtruthkbijko)2+λclass×c=1C(truthcbijkc)2)(3-1)\begin{aligned} \operatorname{Loss}_{t} &=\sum_{i=0}^{W} \sum_{j=0}^{H} \sum_{k=0}^{A}\left(1_{\max 10 U<T h r e s h} \times \lambda_{n o o b j} \times\left(-b_{i j k}^{o}\right)^{2}\right.\\ &+1_{t<12800} \times \lambda_{p r i o r} \times \sum_{r \in(x, y, w, h)}\left(\text {prior}_{k}^{r}-b_{i j k}^{r}\right)^{2} \\ &+1_{k}^{\text {truth}} \times \lambda_{\text {coord}} \times \sum_{r \in(x, y, w, h)}\left(\text {truth}^{r}-b_{i j k}^{r}\right)^{2} \\ &+\lambda_{\text {obj}} \times\left(\operatorname{IoU}_{\text {truth}}^{k}-b_{i j k}^{o}\right)^{2} \\ &\left.+\lambda_{\text {class}} \times \sum_{c=1}^{C}\left(t r u t h^{c}-b_{i j k}^{c}\right)^{2}\right) \end{aligned}\tag{3-1}

  损失一共有5项组成,意义分别如下:

  • 第一项为负样本的置信度损失,公式中1maxIoU<Thresh1_{max IoU<Thresh}表示最大IoU小于阈值,即负样本的边框,λnoobjλ_{noobj}是负样本损失的重,bijkob^{o}_{ijk}为置信度σ(to)σ(t_o)
  • 第二项为先验框与预测框的损失,只存在于前12800次迭代中,目的是使预测框先收敛于先验框,模型更稳定。
  • 第三项为正样本的位置损失,表示筛选出的正样本,λcoordλ_{coord}为权重。
  • 后两项分别为正样本的置信度损失与类别损失,为置信度的真值。

  在计算正、负样本的过程中,虽然有些预测框的最大IoU可能小于0.6,即被赋予了负样本,但如果后续是某一个真实物体对应的最大IoU的框时,该预测框会被最终赋予成正样本,以保证recall。

  有些预测框的最大IoU大于0.6,但是在一个区域内又不是与真实物体有最大IoU,这种预测框会被舍弃掉不参与损失计算,既不是正样本也不是负样本。

4、训练技巧

  除了模型上的改进,YOLO v2也是一个充满工程技巧的检测模型,下面从两个方面介绍其工程上的特点。

4.1 多尺度训练

  由于移除了全连接层,因此YOLO v2可以接受任意尺寸的输入图片。在训练阶段,为了使模型对于不同尺度的物体鲁棒,YOLO v2采取了多种尺度的图片作为训练的输入。

  由于下采样率为32,为了满足整除的需求,YOLO v2选取的输入尺度集合为{320,352,384,…,608},这样训练出的模型可以预测多个尺度的物体。并且,输入图片的尺度越大则精度越高,尺度越低则速度越快,因YOLO v2多尺度训练出的模型可以适应多种不同的场景要求。

4.2 多阶段训练

  由于物体检测数据标注成本较高,因此大多数物体检测模型都是先利用分类数据集来训练卷积层,然后再在物体检测数据集上训练。例如,YOLO v1先利用ImageNet上224×224大小的图像预训练,然后在448×448的尺度上进行物体检测的训练。这种转变使得模型要适应突变的图像尺度,增加了训练难度。

  YOLO v2针对以上问题,优化了训练过程,采用如图4.1所示的训练方式。

YOLOv2解析
图 4.1 YOLOv2-多阶段训练

总结

  总体上来看,YOLO v2相较于之前的版本有了质的飞跃,主要体现在吸收了其他算法的优点,使用了先验框、特征融合等方法,同时利用了多种训练技巧,使得模型在保持极快速度的同时大幅度提升了检测的精度。YOLO v2已经达到了较高的检测水平,但如果要分析其不足的话,大体有以下3点:

  • 单层特征图:虽然采用了Passthrough层来融合浅层的特征,增强多尺度检测性能,但仅仅采用一层特征图做预测,细粒度仍然不够,对小物体等检测提升有限,并且没有使用残差这种较为简单、有效的结构。
  • 受限于其整体结构,依然没有很好地解决小物体的检测问题。
  • 太工程化:YOLO v2的整体实现有较多工程化调参的过程,尤其是后续损失计算有些复杂,不是特别“优雅”,导致后续改进与扩展空间不足。

相关文章: