YOLO-v4论文详解

YOLO-v4论文详解-- 潘登同学的目标检测笔记

文章目录

    • YOLO-v4论文详解-- 潘登同学的目标检测笔记
  • YOLO-v4介绍
    • 目标检测One-stage Detector与Two-stage Detector
  • Bag of freebies
  • Bag of specials
  • YOLO-v4的选择
    • 网络结构
    • 其他改进
      • PAN: 是对FPN的改进,主要有以下三个方面
    • BoF and BoS
  • DropBlock代码实现
  • DIOU-NMS的代码实现

YOLO-v4介绍

YOLO-v4做了很多的实验,将几乎所有的图像识别方法都做了实验,得到了很多在目标检测下的好用的方法,当然很多方法是随着数据集的改变而改变的,不一定普遍适用的…

目标检测One-stage Detector与Two-stage Detector

YOLO-v4论文详解_第1张图片

Bag of freebies

一袋子训练技巧的总结(只在训练的时候涉及、不影响使用):

  • data augmentation(数据增强):
    • photometric distortions(HSV上的增强),geometric distortions(旋转缩放平移等增强);
    • object occlusion(数据遮挡),随机擦除一块区域;将多个图片变成一张图片(相同位置像素点相乘);
    • CutMix将一张图片的一部分挖掉,用另一张图片的一部分来填充;
    • style transfer GAN用图片风格迁移做数据增强;
  • 解决semantic distribution bias:
    • hard negative example mining(负样本挖掘,但是只是适合用在two-stage detector上);
    • focal loss(正负样本loss权重); label smoothing proposed(用更smoothing的label代替one-hot hard representation,应该是源自知识蒸馏吧)
  • BBox regression
    • 因为之前YOLO在预测 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)的时候,都是将 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)视作独立变量,没有考虑他们之间的关系,在loss中加入IOU loss的话,就能考虑上 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)的内在联系了;
    • GIOU: 修改IOU的计算式子, G I O U : = I O U − ∣ A c − U ∣ ∣ A c ∣ GIOU:=IOU - \frac{|A_c-U|}{|A_c|} GIOU:=IOUAcAcU(其中 A C A_C AC是两个框的最小闭包面积, U U U是两个框的并集) IoU取值[0,1],但GIoU有对称区间,取值范围[-1,1]。在两者重合的时候取最大值1,在两者无交集且无限远的时候取最小值-1,因此GIoU是一个非常好的距离度量指标;与IoU只关注重叠区域不同,GIoU不仅关注重叠区域,还关注其他的非重合区域,能更好的反映两者的重合度;
    • DIOU: 在GIOU的基础上,考虑中心点的距离 D I O U : = I O U − ρ ( b , b g t ) c 2 DIOU:=IOU - \frac{\rho(b,b^{gt})}{c^2} DIOU:=IOUc2ρ(b,bgt)( ρ \rho ρ表示两个中心点的欧式距离, c c c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离;DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛快得多。对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失。
    • CIOU: 在DIOU的基础上,考虑比例问题 C I O U : = I O U − ρ ( b , b g t ) c 2 − α v CIOU:=IOU - \frac{\rho(b,b^{gt})}{c^2} - \alpha v CIOU:=IOUc2ρ(b,bgt)αv其中 V V V用来度量长宽比的相似性 v : = 4 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) 2 v:=\frac{4}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}} - arctan\frac{w}{h})^2 v:=π24(arctanhgtwgtarctanhw)2
  • Regularuzation: DropOut, DropPath,Spatial DropOut,DropBlock

Bag of specials

一袋子使用技巧总结(既在训练的是涉及又在测试时候处理)

  • SPP: 空间金字塔池化层
  • Attention: 注意力机制, 类似于虚化背景,通过掩码将框外的像素缩小,将框内的像素放大
  • feature integration: 将feature map进行特征融合(FPN思想),然后也把FPN的思想与Attention思想进行融合
  • activation function:各种ReLu家族的激活函数,其中重要的是SwithMish的激活函数
    S w i t h = x ∗ σ ( x ) M i s h = x ∗ t a n h ( ln ⁡ ( 1 + e x ) ) Swith = x * \sigma(x) \\ Mish = x*tanh(\ln(1+e^x)) \\ Swith=xσ(x)Mish=xtanh(ln(1+ex))

    YOLO-v4论文详解_第2张图片

YOLO-v4的选择

网络结构

  • 主干网络: 在分类任务上,CSPResNext50比CSPDarknet53要好;但是处理目标检测任务的时候,CSPDarknet53比CSPResNext50要好,所以选择了CSPDarknet53作为主干网络;
    • CSPNet: CSPDarknet53前面CSP的来源:
      • 随着卷积神经网络结构变得更深更宽,CNN显示出了它特别强大的功能。但是,扩展神经网络的体系结构通常会带来更多的计算,这使大多数人无法负担诸如目标检测之类的计算量繁重的任务;
      • 「轻量级计算」已逐渐受到越来越多的关注,设计CSPNet的主要目的是使该体系结构能够实现「更丰富的梯度组合,同时减少计算量」。通过将基础层的特征图划分为两个部分,然后通过提出的跨阶段层次结构将它们合并,可以实现此目标;
      • 「作者的主要想法」是通过分割梯度流,使梯度流通过不同的网络路径传播。通过切换串联和过渡步骤,传播的梯度信息可以具有较大的相关性差异;
      • CSPNet的目标检测器解决了以下三个问题: 增强了CNN的学习能力,消除计算瓶颈,消除计算瓶颈
      • Cross Stage Partial Network
        有这样四种结构
        YOLO-v4论文详解_第3张图片
        其中的transition就是之前DenseNet中的两个block块之间的卷积池化操作,CSPDarknet是上图中的b的操作范式,CSPDarknet53是在Darknet53的每个大残差块上加上CSP;对于每一个反向传播过程来说,从transition往回传的梯度,一个直接回到Part 1,一个回到Dense Block中,这就是所谓的梯度复用;而回到Dense Block中的梯度又经过了Transition,这就是所谓的截断梯度,防止不同的层学习重复的梯度信息;下图是Darknet53的第一个block中的网络拓扑结构;
        YOLO-v4论文详解_第4张图片
  • FPN module: 选择了PANet 作为特征融合的网络层
  • head: 直接把YOLO-v3的头部网络拿过来

其他改进

  • Self-Adversarial Training(SAT): 一次迭代包含两次正向传播与反向传播,第一次正向传播反向传播修改数据集x,第二次正向传播反向传播修改w;

  • Mosaic: 将四张图片拼在一起当做一张图片(数据增强的方式)
    YOLO-v4论文详解_第5张图片

  • Cross mini-Batch Normalization(CmBN): 跨迭代的数据归一化操作

  • modify SAM&PAN: 修改的SAM(在后面讲)与PAN
    YOLO-v4论文详解_第6张图片

PAN: 是对FPN的改进,主要有以下三个方面

YOLO-v4论文详解_第7张图片

  • Bottom-up Path Augmentation
    FPN 已经证明了加入一条 top-down 的旁路连接,能给 feature 增加 high-level 的语义性有利于分类。
    但是 low-level 的 feature 是很利于定位用的,虽然 FPN 中 P5 也间接得有了 low-level的特征,但是信息流动路线太长了如红色虚线所示(其中有 ResNet50/101 很多卷积层),PAN在 FPN 的 P2-P5 又加了 low-level 的特征,最底层的特征流动到 N2-N5 只需要经过很少的层如绿色需要所示(仅仅有几个降维的卷积;

    • 具体操作如下图所示,P2 直接 copy 到 N2,然后 N2 通过步长为 2 的 3*3 卷积后分辨率缩小 2 倍,和 P3 尺寸一致,然后 element-wise 相加。注: 所有 channel 和 FPN 中一致 P2-P5, N2-N5 都是 256。
      YOLO-v4论文详解_第8张图片

    • 构建该新支路的优势在于缩短了底层尺寸大的特征到高层尺寸小的特征之间的距离,让特征融合更加有效。其变化可以参考网络结构图中红色(原 FPN 特征融合路径)和绿色(PANet 特征融合路径)虚线。绿色虚线所跨越的卷积层会更少。

  • 改进之前的 pool 策略:Adaptive Feature Pooling
    在 YOLO-v3中FPN 那篇论文的解读中我们也讲过 FPN 从 P2-P6(P6 仅用作生成 proposal,不用作 RoIPooling 时提取特征)多尺度地生成 proposal,然后做 RoIPooling 时会根据 proposal的大小将它分配到不同的 level 去 crop 特征,小的 proposal 去 low-level 的层,大的proposal 去 high-level 的层。

    • 这样做虽然简单也蛮有效,但它不是最好的处理方式,尽管 P2-P5(N2-N5)已经融合了low-level 和 high-level 的特征,然后它们的主要特征还是以它本有的 level 为主 这时如果小的 proposal 能从 high-level 层获取到更多的上下文语义信息是有利于它分类的,而大的 proposal 能从 low-leve 层获取到更好的细节是有利于它定位的;

    • PAN的作者则认为高低层特征各有其优势。高层特征的视野域更大,小的 RoI 可以在这些特征上获取更丰富的上下文信息。低层特征可以帮助大的 proposal 更好地定位。这里提出的池化方法则是在所有尺度的特征上操作,之后进行融合,如下图所示:
      YOLO-v4论文详解_第9张图片

  • 改进 mask 分支: Fully-connected Fusion
    Mask RCNN 中 Mask 分支就是个简版的 fcn,fcn 是全卷积网络,它根据一个局部的视野域来预测,且参数是全图共享,而全连接 fc 是全图视野域对位置更敏感,看得更大,这一点 sunjian 老师的 large kernel 也间接证明了大视野域的作用。因此本文打算多加一条用全连接层预测的支路来做 mask 预测,然后和 fcn 融合,具体做法如下图所示,至于 conv4_fc 接在 fcn 支路哪一个卷积后后面消融实验有做对比,conv3 后面结果更好一点(可以理解为注意力机制)
    YOLO-v4论文详解_第10张图片

BoF and BoS

  • BoF for backboneCutMux, Mosaic data augmentation, DropBlock regularization,Class label smooting;

    • DropBlock:A regularization method for convolutional networks (用于 conv 的dropout)
      传统 dropout 在 conv 上效果不好的原因:conv 具有空间相关性,所以即使对一些单元随机进行 dropout,仍然可以有信息流向后面的网络,导致 dropout 不彻底。很自然地提出 dropblock 来解决这一问题,算是一种结构化的、二维的 dropout,思想非常简单:既然随机丢弃独立的单元可能导致丢弃不彻底,那不如一次丢弃一个 block,该 block 内的单元在空间上是相关的。DropBlock与dropout的主要区别在于,它从某层的feature map中删除相邻区域,而不是删除独立的随机单元。

      DropBlock有两个主要参数,block_size和γ。block_size是要删除的块的大小,γ控制要删除多少个激活单元

      • block_size:表示dropout的方块的大小(长,宽),当block_size=1,DropBlock 退化为传统的dropout,正常可以取3,5,7
      • γ:表示drop过程中的中心点取值的概率,也就是伯努利函数的概率
        D r o p B l o c k d r o p 的 元 素 个 数 和 传 统 d r o p o u t d r o p 的 元 素 个 数 相 等 为 了 保 证 d r o p 的 b l o c k 不 会 超 出 原 始 图 像 , 需 要 先 设 置 一 个 d r o p 的 有 效 区 域 有 效 的 区 域 面 积 = ( f e a t s i z e − b l o c k s i z e + 1 ) ∗ ( f e a t s i z e − b l o c k s i z e + 1 ) D r o p B l o c k 的 概 率 = γ ∗ ( b l o c k s i z e ∗ b l o c k s i z e ) d r o p 掉 的 元 素 数 目 = γ ∗ b l o c k s i z e 2 ∗ ( f e a t s i z e − b l o c k s i z e + 1 ) 2 d r o p o u t = = D r o p B l o c k ( 1 − k e e p p r o b ) ∗ ( f e a t s i z e ∗ f e a t s i z e ) = γ ∗ b l o c k s i z e 2 ∗ ( f e a t s i z e − b l o c k s i z e + 1 ) 2 γ = ( 1 − k e e p p r o b ) f e a t s i z e 2 b l o c k s i z e 2 ∗ ( f e a t s i z e − b l o c k s i z e + 1 ) 2 DropBlock drop的元素个数和传统dropout drop的元素个数相等 \\ 为了保证drop的block不会超出原始图像,需要先设置一个drop的有效区域 \\ 有效的区域面积 =(feat_{size}-block_{size}+1)*(feat_{size}-block_{size}+1) \\ DropBlock 的概率 = γ*(block_{size}*block_{size}) \\ drop掉的元素数目 = γ*block_{size}^2 *(feat_{size}-block_{size}+1)^2 \\ dropout==DropBlock \\ (1-keep_{prob})*(feat_{size}*feat_{size}) = γ*block_{size}^2 *(feat_{size}-block_{size}+1)^2 \\ γ = \frac{(1-keep_{prob})feat_{size}^2}{block_{size}^2 *(feat_{size}-block_{size}+1)^2} DropBlockdropdropoutdropdropblockdrop=(featsizeblocksize+1)(featsizeblocksize+1)DropBlock=γ(blocksizeblocksize)drop=γblocksize2(featsizeblocksize+1)2dropout==DropBlock(1keepprob)(featsizefeatsize)=γblocksize2(featsizeblocksize+1)2γ=blocksize2(featsizeblocksize+1)2(1keepprob)featsize2
        算法流程
        YOLO-v4论文详解_第11张图片
      • (1,2,3,4)如果是测试模式,直接返回特征
      • (5)根据输入的概率γ,使用伯努利函数对生成的随机数mask矩阵进行drop,最终该步骤得到的mask只有0,1值,如上图(a)
      • 对上一步得到的mask进行max pooling操作(stride=1,kernel_size=block_size),得到最终需要使用的mask。如上图中(b)
      • 输入矩阵和Mask矩阵相乘,得到输出矩阵
      • 将上一步的输出矩阵进行归一化操作,保证做DropBlock 之前和做DropBlock 之后,该层都具体相同的均值,方差。
  • BoS for backbone: Mish activation, Cross-stage partial connections(CSP), Multi-input weighted residual connections(MiWRC);

  • BoF for detector: CIOU-loss,CmBN,DropBlock regularization,Mosaic data augmentation,Self-Adversarial Training(SAT), Eliminate grid sensitivity,Using multip anchors for a single ground truth,Cosine annealing scheduler,Optimal hyper-parameters,Random training shapes;

    • CIOU Loss: L o s s C I O U = 1 − C I O U Loss_{CIOU} = 1 - CIOU LossCIOU=1CIOU

    • CBN: Cross-Iteration Batch Normalization

      • 当 batch 很小的时候,BN 的一个众所周知的问题就是它的有效性大大降低。这是因为小批量包含很少的样本,在训练迭代期间,无法从中可靠地估计定义规范化的统计信息。为了解决这个问题,我们提出了交叉迭代批处理规范化(CBN),其中联合使用来自多个最近迭代的示例来提高估计质量。然而计算多个迭代的统计信息的一个挑战是,由于网络权值的变化,不同迭代的网络激活是不可比较的。
      • Cross-Iteration Batch Normalization (CBN) 的动机是观察到由于随机梯度下降(SGD)的迭代性质,网络权值在连续训练迭代之间逐渐变化,而不是突然变化。因此,针对当前网络权重,最近迭代的样本的均值和方差可以通过一个低阶泰勒多项式很好地逼近。将最近多次迭代的补偿均值和方差与当前迭代的均值和方差进行平均,以产生更好的统计估计;
        YOLO-v4论文详解_第12张图片

      YOLO-v4论文详解_第13张图片

    • CmBN:

      • BN: 对于yolo-v3来说,在训练的时候一个batch是64,而在一个batch下有4个mini-batch,mini-batch=16,而当只使用BN层的时候,对于每一个mini-batch,网络都会计算一次W参数的改变幅度(梯度乘步长),但是只有一个batch中所有mini-batch都计算完毕之后,才会对W参数进行一次更新(将每个改变幅度相加得到)
        YOLO-v4论文详解_第14张图片

      • CBN: 而CBN是在多个批次间,运用上面说的泰来展开来逼近每一个BN的均值和方差

      • CmBN: 而CmBN是综合了BN与CBN的特点,在一个batch的多个mini-batch中,计算W矩阵和BN层的改变幅度,直到所有mini-batch都跑完,最终才更新W参数与BN层的参数

  • BoS for detector: Mish activation,SPP-block,SAM-block,PAN path-aggregation block,DIOU-NMS

    • SAM-block: SAM-block是CV中常用的注意力机制,通过将feature map转化成0-1的数值来对featrue map进行转化,将一些像素向0缩小以视作不关注…
      YOLO-v4论文详解_第15张图片

    • DIOU-NMS: DIOU-NMS是一种基于soft-NMS的做法,主要思想是,有一些与最大得分框IOU大于threshold的框可能是另外的物体,只不过两个物体在实体空间中真的重合度很大, 以往那种只是以IOU的绝对值是否大于threshold作为选取的方式不太合理, 转为使用soft-NMS, 每次选取一个框后,对剩下的所有框以IOU的某个函数进行更新,一般有以下两种形式,线性加权和高斯加权,高斯加权比较常见(文章最后有代码实现)

      • 线性加权:
        s i = { s i , i o u ( M , b i ) < N t s i , ( 1 − I O U ( M , b i ) ) ≥ N t s_i = \begin{cases} s_i, iou(M,b_i) < N_t \\ s_i,(1-IOU(M,b_i)) \geq N_t \\ \end{cases}\\ si={si,iou(M,bi)<Ntsi,(1IOU(M,bi))Nt

      • 高斯加权:
        s i = s i e − I O U 2 ( M , b i ) σ , ∀ b i ∉ D s_i = s_ie^{-\frac{IOU^2(M,b_i)}{\sigma}}, \forall b_i \notin D si=sieσIOU2(M,bi),bi/D
        其中M表示目前score中最大的那个框, b i b_i bi表示剩下的其他框, D D D表示已经被选中的框, s i s_i si就是score; 而DIOU-NMS则是将上式中的IOU转化为了DIOU(我的代码实现里面就是用DIOU做的)

DropBlock代码实现

YOLO-v4论文详解_第16张图片

YOLO-v4论文详解_第17张图片

DIOU-NMS的代码实现

YOLO-v4论文详解_第18张图片

你可能感兴趣的:(Tensorflow,目标检测,深度学习)