YOLO

本来笔者已决定退CV坑了,但最近要研究生复试了,还是回顾下去年研究的YOLO顺便简单记录一下备查。

YOLO长话短说

个人感觉有深度学习基础的情况下,去学习一个YOLO的网络还是相对容易的,但笔者认为YOLO的精髓不在于网络结构而在于其One-Stage的各种思想。下图是YOLO3的网络结构,里面的小积木打开来看无非是卷积层(Conv)、正则化(BN:Batch Normalization)、激活层(Leaky Relu)以及由这3个家伙一起(DBL)构成的残差块(Res Unit)。

YOLO3

笔者在这里直接讨论YOLO3,略过了YOLO1、2和忽视更新的4、5的原因是:这是YOLO系列发展过程中的一个重要节点!

从理解算法设计思想的角度来看,学3就够了

  • YOLO1发布时,最大的贡献是做了Bounding Box的思想(下面聊),至于网络结构就是最最最简单的全卷积网络,输出一个尺度的特征图;
  • YOLO2个人认为没啥大突破,就是调卷积结构和训练技巧(当然不可否认这些工作是很重要且必要的)
  • YOLO3则是划时代的发布,正如我们观察上面框图所见,YOLO3的输出有3个不同尺寸的特征图($y_1,y_2,y_3$),每个特征图中又有针对尺寸分布设计的Anchor,直接解决了物体的多尺度问题(远近、大小);其次,用了预训练的Darknet-53做骨干网,并且从尾巴往前分别抽3个特征图,用于相应尺度的进一步识别;还有一个重要的思想——信息共享,也就是大尺寸识别网络的中间结果会传递给小一级尺寸的网络;
  • YOLO4和5就没有太多突破性的思想了,和2差不多都是网络优化和训练技巧

好,如果读者是初学者的话,想必看不懂上面这些天书在讲什么(上面这段准备面试啥的应该够了),笔者将在下文中详细记录自己学习过程中的对各个重要拗口概念的理解。

YOLO深入浅出

Anchor & Bounding Box

MultiBox

首先介绍Bounding Box这个概念,如上图所示这是网络最后输出特征图的形式(后续简写为BBox)。每个BBox依次含有的信息为:预测对象中心坐标$t_x$、$t_y$,预测对象长宽$t_w$、$t_h$,置信度$p_o$(是个东西),对象类别概率$p_i$(哪类对应数值大就是啥)。

听起来这样的一个输出结果挺合理的哈,那么每个数据对应到图片中的规则是什么呢?YOLO有一个很重要的思想,就是把原图像分割为很多个小格子(格子大或小就是后面聊的多特征图),比如上图中的小狗图片在输出张量(结果)被分为了$13\times13$格子,而每个小格子只负责识别中心点在小格子内的对象。(提前答疑:训练时由损失函数控制,推理时由NMS算法实现)

好的,那么打开一个对应目标的BBox,让我们来看看具体的映射关系$t_x,t_y,t_w,t_h\Rightarrow b_x,b_y,b_w,b_h$。下图截取自原论文,其中偏移量$c_x,c_y$是归一化的特征图格子号(比如这边是$c_x=1,c_y=1$),$\sigma$是非线性激活函数(同时起到限幅作用),这两项加起来就是目标框的中心坐标$b_x,b_y$;至于目标框的长宽尺寸,由网络输出的预测量做指数运算后(获得缩放比例),与Anchor框(可理解为参考标准尺寸)相乘得到目标框$b_w,b_h$。

DeBox

Well,这里我们又讲到了一个新词“Anchor”。
请注意一个事:上面把小狗图片切成了$13\times13$的识别小格子,但是每个小格子里有3个BBox,为什么有3个呢?考虑到一条狗的生活可是多彩多样的呀!可以蜷缩成一团(BBox长宽比1:1),也可以跳起来(BBox长宽比1:H),也可以躺平平(BBox长宽比W:1)。如果只有一个BBox,那么在长宽比分布比较离谱的时候最后得到的精度就比较差了(实际部署效果如此,才有这么个需求),所以如下图所示的蓝色框框,在一个特征图中我们设置3个参考尺寸框(分别由3个BBox负责相应类型尺寸目标的识别),这就是Anchor啦。

Anchor的大小选取,除了凭感觉设几个,建议使用K-Means等算法从训练数据集中实际目标框的尺寸分布中选取

multiMap

非极大值抑制

非极大值抑制,简称:NMS(Non-Maximum Suppression)。这个算法在YOLO的部署时,是必不可少的,虽然YOLO规定了每个目标只由中心在格子内的小格子负责检测,但是神经网络只是个神经网络,检测的时候实际中心格子边上的格子也会加入到检测工作中去,就像下图中最上面的许多凌乱框(已经用置信度卡掉了一些无效框)。

YOLO3

因此加入NMS算法,在可能属于同一类物品的一坨框中,求最有代表性的一个BBox。具体来说,可理解为局部最大搜索:

  1. 选取属于同类的BBox中置信度最大的哪一个,记为$\text{BBox}_{best}$,并保留它
  2. 计算$\text{BBox}_{best}$与其余的BBox的IOU
  3. 如果其IOU>0.5(或者你觉得不错的阈值)了,那么就舍弃这个BBox(因为可能这两BBox属于同目标,所以保留分数最高的那一个)
  4. 一直重复2、3直到没有BBox再被踢出
  5. 从剩余的BBox中,再找出最大置信度的一个$\text{BBox}_{best}$
  6. 回到第2步,如此循环往复直到全部做完

IOU就是两个框框的交集面积与并集面积之比,说白了就是两个框叠在一起有多严重,还不懂建议百度。

要是看这个流程有点晕,就找一张有几只猫和几只小狗的图片,跟我一起观察:首先把小狗的BBox框都提出来放一起,然后找到置信度最大的一个框,记为一只狗狗(1);接着找出在这个狗狗身上的其他框框(2),并删掉这些框(3→4);再找一个置信度最大的框,这是另一只狗狗(5),接着删掉这只狗狗身上的其他框(6→2→3→4)。

多特征图

上面说的Anchor是为了提高在一个特征图中,物体的尺寸比例带来的问题,还有一个尺度问题就是缩放,比如小狗跑远跑近在图像上来看就是缩小和放大。因此如下图所示,在YOLO3中输出了3个尺寸精度的特征图($13 \times 13$、$26 \times 26$、$52 \times 52$),分别对应从大到小的识别对象。

multiMap

信息共享

YOLO3开始就有了粗特征上采样(Upsample)后给细特征网络识别的思想,如下图是截取对应的网络结构。

concat

这里观察到有一个concat的数据合并器,不是做加法!是把两个特征图按深度拼接,相当于特征变多而张量图长宽不变。

损失函数与训练方法

  1. 首先,对数据做预处理。比如尺寸分布分析求Anchor、目标标记框(ground truce)转训练框(BBox)、数据增强等等
  2. 定义损失函数
  3. 跑训练集

YOLO3中的损失函数定义为:

$$
\begin{matrix}
Loss = & -\lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} I_{ij}^{obj} [ & CE(x,\hat{x})
\\
&&+ CE(y,\hat{y})
\\
&&+ MSE(w,\hat{w})
\\
&&+ MSE(h,\hat{h})
\\
&&+ CE(p_0,\hat{p}_0)
\\
&&+ \sum _{c \in Class} CE(p_i,\hat{p}_i)
&]\\
& -\lambda _ {noobj} \sum _{i=0}^{S^2} \sum _{j=0}^{B} I _{ij}^{noobj} & CE(p_i,\hat{p} _i)
\end{matrix}
$$

式中,两个求总和分别是特征图$\sum_{i=0}^{S^2}$和其中每个格子中的各个盒子$\sum_{j=0}^{B}$;在训练过程中,只有真实目标在的BBox盒子($I_{ij}^{obj}$)才贡献识别框Loss,中心坐标以交叉熵的形式($CE(x,\hat{x})+CE(y,\hat{y})$),长宽以MSE形式贡献,置信度和类别概率都以交叉熵形式贡献。除此之外,非目标的盒子($I _{ij}^{noobj}$),只有置信度参与贡献Loss,这样的好处是可以防止盒子中其他参数被错误训练。

参考文献

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信