【Deep Learning】YOLOv3 An Incremental Improvement 原理

【Deep Learning】YOLOv3: An Incremental Improvement 原理

  今年 3 月分,yolo 的第三代,也就是 yolo_v3 发布了,由于今年找工作,最近才又好好的看了一遍,这里记录一下这篇论文的大概原理。


1. 综述

  这篇论文主要内容是对上一代 yolo 的进一步升级与改进,提出了新的网络结构以及一些小的 tricks 来整体提升 yolo 的性能,使得 yolo_v3 拥有比上一代更高的准确率,并且在速度方面依旧遥遥领先于类似 Faster R-CNN 的双阶段目标检测,与 SSD 相比,论文中的原话是:

as accurate as SSD but three times faster.

因此总的来说,这是现阶段一种非常好的目标检测方案,尤其是在应用到实际项目中的时候,往往对网络的实时性具有比较高的要求,因此大多数时候会考虑这种实时性效果比较好的方案。

2. 改进方案

   总的来说,yolo_v3 融合了很多现阶段已经存在的方案用于 yolo 框架中,并且提出了一个全新的 Darknet-53 的网络结构作为整个目标检测网络的 basenet,下面分别进行介绍。

2.1 Bounding Box Prediction

  在 bounding box 的坐标预测方式上 yolo_v3 还是延续了 yolo_v2 的方法,也就是依然使用下面这个公式进行计算:
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           b_x=\sigma(t_x)+c_x\\ b_y=\sigma(t_y)+c_y\\ b_w=p_we^{t_w}\ \ \ \ \ \ \ \\ b_h=p_he^{t_h}\ \ \ \ \ \ \ \ \ bx=σ(tx)+cxby=σ(ty)+cybw=pwetw       bh=pheth         
上面的公式中, t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th 也就是模型的预测输出,其中 c x , c y c_x,c_y cx,cy 表示 grid cell 的坐标,比如某层的feature map大小是13*13,那么grid cell就有13*13个,第 0 行第 1 列的 grid cell 的坐标 c x c_x cx 就是 0, c y c_y cy 就是 1。 p w , p h p_w,p_h pw,ph 表示的是预测前bounding box 的 size, b w , b h b_w,b_h bw,bh 就是预测得到的 bounding box 的中心坐标和 size,对于上述的坐标回归使用的损失函数是平方误差损失。(如果一些坐标真实值是 t ^ ∗ \hat t_* t^,而网络的预测值是 t ∗ t_* t,则梯度为 t ^ ∗ − t ∗ \hat t_*-t_* t^t)。

2.2 Class Prediction

  在进行类别预测方面,主要的改变是将原来的单标签分类改为多标签分类,再具体实现上,将原来网络中的 softmax 替换为多个相互独立的 逻辑回归。这种做法在其余网络中也已经使用过(没记错 FPN ,Mask R-CNN 中也使用了类似的方案)。这样做的好处是,在使用 softmax 时候,我们默认了每个目标仅属于一个类别标签,但是在实际应用中,对于一些比较复杂的场景,一个目标可能同时属于多个类别,比如 dog 可以同时属于 dog 类 和 anmial 类。在实现上,使用多个相互独立的 sigmoid 函数来代替 softmax 函数,应为 sigmoid 可以很方便的将输出约束到 0~1 范围内,而且也十分用以理解,当一个目标最后经过 softmax 后,如果输出的结果大于 0.5,则说明该目标属于这个类别。

2.3 Predictions Across Scales

  这里 yolo_v3 采用了 FPN 的思想,采用多个 scale 融合的方式进行预测。其实这种操作在 yolo_v2 中已经有相关体现,也就是在 yolo_v2 中的 pass through layer,我们假设最后提取的特征图 size 是 13×13,那么这个层将会和上一层的 26*26进行连接,之前也有提到过,这种连接方式有些类似于 ResNet 中的结构。yolo_v2 中这样做是为了提升 yolo 对小目标的检测精度,尝试利用更浅层的特征。

  在 yolo_v3 中,这种思想得到了进一步地增强,也就是采用类似 FPN 的 upsampling 做法,在 COCO 数据集上,最终融合了 3 个scale 的 feature map,其余两个 scale 大小分别是 26*26 和 52*52,同时在 多个 scale 上进行检测。

  对于 bounding box 的初始尺寸 yolo_v3 依旧使用的是 yolo_v2 中使用的 k-means 聚类的方法来做,这种先验知识对于 bounding box 的初始化还是有很大提升的,作者在 COCO 数据集上使用了 9 中不同的尺度结果,从结果来看,这应该是按照输入图像尺寸是 416*416 计算得到的。

2.4 Feature Extractor

  作者采用了一种新的网络结构用于提取特征,一方面基本上采用全卷机的方式,另一方面引入了 resnet 中的残差结构,这一点也是为什么 yolo_v3 可以将网络做到 53 层,而 yolo_v2 仅有 19层的原因。Darknet-53 这个结构仅仅是一个特征提取层,但是源码中只是使用了 pooling 层前面的卷积层来进行特征提取,因此 multi-scale 的特征融合和预测支路也并没有在这个网络结构中体现出来。对于预测支路,采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是 255,是针对 COCO 数据集的 80 类而言的(3*(80+4+1)),其中 3 表示一个 grid cell 包含 3 个bounding box,4 表示预测框的 4个坐标信息,1 表示目标得分。

具体网络结构如下所示:

【Deep Learning】YOLOv3 An Incremental Improvement 原理_第1张图片

2.5 Training

  对于训练方面,采用的依旧是 yolo_v2 中的 multi-scale training 的方案。

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