YOLO 超详细入门02 v2 (含代码及原文)

前言

代码地址:Github:ultralytics/yolov3

笔者在阅读《YOLO9000:Better, Faster, Stronger》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。

背景

  • SSD 是 YOLOv1的强大竞争对手,它在当时展示了更高的实时处理精度。与基于区域的检测器相比,YOLO 的坐标定位误差更高,recall(召回率:衡量定位所有目标物体的好坏程度)更低。YOLOv2 是YOLO的第二个版本,其目标是显着提高准确性,同时使其更快。
  • YOLOv2 在 YOLOv1的基础上做了许多改进,其中在 VOC2007 资料集上的mAP 由 63.4% 提升到 78.6%,并且保持检测速度。从预测更准确(Better),速度更快(Faster),识别物体更多(Stronger)这三个方面进行了改进。其中识别更多目标物体也就是扩展到能够检测9000种不同物体,称之为YOLO9000。

总结

  1. Better:准确度提升。 主要手段有:
    • Batch Normalization(批归一化)1.2
    • High Resolution Classifier(高分辨率的分类器)2.1
    • Fine-Grained Features(细粒度特征)2.2
    • Multi-Scale-Training(多尺度训练)2.3
    • Anchor Box(锚盒)3.1
    • Dimension Cluster(维度聚类)3.2
    • Direct location prediction(直接位置预测)3.3
  2. Faster:速度提升。 主要手段:GoogleNet+DarkNet 1.1
  3. Stronger:识别种类提升。 主要手段:YOLO9000 5

一、YOLOv2改进之框架

1.1 网络架构

在这里插入图片描述
在这里插入图片描述
YOLOv2 采用Darknet-19 作为特征提取网络,包括19个卷积层, 5个 maxpooling 层。

  • 原型设计与 VGG16 一致,主要采用3x3卷积, 2x2 maxpooling层 (feature map维度降低两倍, channles增加两倍)。

  • 与NIN (Network in Network) 类似,Darknet-19最终采用global avgpooling做预测。
    在这里插入图片描述

  • 在3x3卷积层之间使用1x1卷积层来压缩 feature map channles 以降低模型计算量和参数 (parameters)。

  • 每个卷积层后面同样使用了 batch normalization 层以加快收敛速度,降低模型over-fitting。

1.2 Batch Normalization

在这里插入图片描述

原理等可参考:《Batch Normalization(BN)超易懂!图文详解——目的,原理,本质,有效性,副作用

在每层卷积层的后面都加入 batch normalization 层,不再使用dropout,使得模型在 mAP 上提升了2.4%。

二、YOLOv2改进方法之尺寸相关

2.1 High Resolution Classifier(高分辨率的分类器)

原因

因为大部分的检测模型是使用 ImageNet 分类数据集上pre-train的模型,YOLOv1 采用 224x224 的图片分类器,但因为分辨率比较低,不利于检测模型。因此YOLO2 提高分辨率至 448x448 并在test数据集上进行 fine-tuning(微调)

步骤

如果直接切换图片尺寸即分辨率大小,模型可能难以快速地对高分辨率的图片进行反应。因此,YOLO 训练由 2 个阶段组成。我们训练一个像 VGG16 这样的分类器网络。然后我们用卷积层替换全连接层,并对其进行端到端的重新训练以进行目标检测。
Pre-training步骤如下:

  • 先采用 224x224 的 ImageNet 图像数据集进行约160个 epoch的训练,然后再将输入图像的尺寸更改为 448x448 再训练10个 epoch。训练完的这个 pre-train model也就可以适用高分辨率的图像输入了。
  • 最后再拿这个model 在test数据集上 fine-tuning。

最终使得mAP提升了3.7%。

2.2 Fine-Grained Features(细粒度特征)

在这里插入图片描述

原因

我们知道,卷积层会逐渐减小空间维度。随着相应分辨率的降低,也就更难检测到小物体
YOLOv2 图片输入大小为 416 x 416,经过5次 maxpooling 后得到13x13 的feature map,并以此 feature map 采用卷积做预测,如此已经可以达到检测大物体的作用。但如果需要检测小物体,则还需要更精细的 feature map,因此 YOLOv2 提出了一种 passthrough 层以利用更精细的 feature map。
在这里插入图片描述

步骤

它将 26 × 26 × 512 层使用按行列隔行采样的方法,抽取 2x2 的局部区域,然后将其转化为 channel 维度,便可以巧妙地reshape为 13 × 13 × 2048。然后与原始的 13 × 13 ×1024 输出层连接。现在我们在新的 13 × 13 × 3072 层上应用卷积滤波器来进行预测,相当于做了一次特征融合,有利于检测小的目标

2.3 Multi-Scale-Training(多尺度训练)

原因

由于模型仅使用卷积层和池化层,因此可以随时调整输入的大小。为了使 YOLOv2 在不同大小的图像上运行时具有鲁棒性,作者针对不同的输入大小训练了模型,就是在训练的过程中每间隔一定的 iterations 后改变输入的图片大小

训练细节

在这里插入图片描述
YOLOv2 下采样步长为32,因此输入图片大小要选择32的倍数 (最小尺寸为320x320, 最大尺寸为608x608)。在训练过程,每隔10个 iterations 随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。这起到了数据增强的作用,并迫使网络对不同的输入图像尺寸和比例进行良好的预测。
在这里插入图片描述
采用 Multi-Scale Training 策略使 YOLOv2 模型可以更好的预测不同大小的图片,由上图 VOC 2007 数据集上的结果可以看到: 采用较低分辨率的图片mAP 值略低,但速度更快。采用较高解析度的图片mAP 值较高,但速度较慢。对于 554X554 的图片 mAP 高达78.6%!

三、YOLOv2改进方法之Anchor Box

3.1 Convolutional With Anchor Boxes(带anchor的卷积)

ps:原文中anchor也被称为prior box以表示对目标检测的最佳anchor的选择。

原因

YOLOv1在训练过程中学习适应不同物体的形状比较困难,导致其在精度定位方面表现不佳。其早期训练容易受到不稳定梯度的影响。首先,YOLO对bounding box进行随机预测。这些随机的预测可能对部分目标的检测有效果,但对另一些目标识别却很糟糕,从而导致陡然的梯度变化。在早期的训练中,预测会在专门研究什么形状上去探索,尝试,甚至竞争。
在这里插入图片描述
例如上图,早期训练中,对人和车预测的bounding box形状可能都是竖着的。对人也许应该这样预测,因为行人的横纵比为0.41,但汽车显然需要更扁的bounding box来预测。
在这里插入图片描述
因为我们只需要一个猜测是正确,只要有一个猜测能找到物体就行,因此如果从生活中常见的猜测开始,那么初始训练就会更加地稳定。(比如预测一个横的,一个纵的)

想法

在这里插入图片描述

  • 一般而言,我们可以创建5个具有上面形状的anchors。
  • 借鉴 Faster R-CNN 的方法: 用卷积层与RPN( Region Proposal Network )来预测Anchor Box 的偏移值与置信度,作者发现通过预测偏移量而不是 bounding box坐标值能够简化问题,让神经网络学习起来更容易,因此 YOLOv2 也尝试使用不同形状的矩形来作为锚框 (Anchor Box)。
  • YOLOv2首先移除掉 YOLOv1 网路的全连接层 (FC层),改用 Anchor Box 来预测bounding box。跟 YOLOv1 不一样的是 Anchor Box 不是直接预测 bounding box 的坐标值,而是预测 Anchor Box的 offset (坐标的偏移值) 与 confidence scores (置信度)。如果我们限制偏移值,我们可以保持预测的多样性并使每个预测都集中在一个特定的形状上。所以初期训练会比较稳定。

为什么采用416 x 416大小的输入代替原来的448 x 448?

在这里插入图片描述

奇数可以使grid只有唯一Center cell
  • 为了使最后的卷积层可以有更高分辨率的特征YOLOv2 将其中一个Pooling层去掉,并且用 416x416 大小的输入代替原来的 448x448,目的是为了使网路输出的特征图 (feature map) 有奇数大小的宽和高,进而使每个特征图在划分网格 grid) 的时候只有一个中心单元格 (Center Cell)
  • 因为物体倾向出现在照片中央,物体中心点往往落入图片中心位置,因此使用这个中心单元格去预测这些物体的边界框相对容易。

3.2 Dimension Clusters(维度聚类)

在这里插入图片描述

目的

**为了识别对训练数据具有最佳覆盖率的 top-K 边界框,我们对训练数据运行 K-means 聚类来定位 top-K 聚类的质心。**在许多问题域中,边界框具有很强的模式。在 Faster R-CNN 和 SSD 中,Anchor Box 的尺寸是手动选择的,有一定的主观性。若能选取合适的 Anchor Box,可以使模型更容易学习并预测出准确的 bounding box。例如,在自动驾驶中,最常见的 2 个边界框则是不同距离的汽车和行人。

公式

聚类目的为提高选取的 Anchor Box 和同一个聚类下的 ground truth 之间的 IoU,采用的距离公式如下:
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 ) d(box,centroid) = 1-IoU(box,centroid) d(box,centroid)=1IoU(box,centroid) p s : 1. c e n t r o i d 为聚类时被选作中心的 b o u n d i n g   b o x ps:1.centroid为聚类时被选作中心的bounding\ box ps1.centroid为聚类时被选作中心的bounding box 2. b o x 为其他的 b o u n d i n g   b o x 2.box为其他的bounding\ box 2.box为其他的bounding box

思路

在这里插入图片描述
5个红色框代表VOC 2007数据集集中对象的平均尺寸和位置。
在这里插入图片描述

在训练集边界框上针对各种 k 值运行k-means 聚类,并绘制具有最近质心的平均 IOU,但作者没有使用欧几里德距离,而是使用边界框和质心之间的 IOU,公式如上。
在这里插入图片描述
作者权衡了模型复杂度和高召回率(Recall),选择 k = 5 (也就是选择了5个不同大小的Anchor Box来进行定位预测)作为模型复杂性和高召回率(Recall),如上图。

效果

在这里插入图片描述
作者采用5个不同大小的 Anchor Box (Cluster IOU 5),Avg IOU 是61,比不使用聚类方法的9种 Anchor Box 的 Avg IOU高一些。若选择 Cluster IOU 9,Avg IOU更显著提高。

3.3 Direct location prediction(直接位置预测)

在这里插入图片描述
我们对锚点的offset(偏移量)进行预测。然而,如果它不受约束,我们的预测将再次随机化。因此YOLOv2此次预测 5 个参数( t x 、 t y 、 t w 、 t h t_{x}、t_{y} 、t_{w}、t_{h} txtytwth t o t_{o} to ,并应用 sigmoid( σ \sigma σ) 函数来限制其可能的偏移范围,即 ( 0 , 1 ) (0,1) 01之间。

  • t x 、 t y 、 t w 、 t h t_{x}、t_{y} 、t_{w}、t_{h} txtytwth是预测的bounding box中心点左边和宽高, P r ( 𝑜 𝑏 𝑗 𝑒 𝑐 𝑡 ) ∗ 𝐼 𝑂 𝑈 ( 𝑏 , 𝑜 𝑏 𝑗 𝑒 𝑐 𝑡 ) Pr(𝑜𝑏𝑗𝑒𝑐𝑡)∗𝐼𝑂𝑈(𝑏, 𝑜𝑏𝑗𝑒𝑐𝑡) Pr(object)IOU(b,object) 是预测的bounding box的 confidence score。
  • c x , c y c_{x}, c_{y} cx,cy 是当前网格左上角到图像左上角的距离 (要先将网格大小归一化,即令grid的宽高都为1)。
  • p w , p h p_{w}, p_{h} pw,ph 是 Anchor Box 的宽和高。
    在这里插入图片描述
    上图为可视化效果,蓝色框为预测的bounding box,虚线矩形是Anchor Box。

四、YOLOv1 vs YOLOv2 输出

在这里插入图片描述

  • YOLOv1 在 feature map (7x7) 的每一个 grid中预测出 2个bounding box 及分类概率值,即每个bounding box预测出5个值(4个位置值+1个置信度)。
总输出: 7 x 7 x ( 5 x 2 + 20 )
  • YOLOv2 在 feature map (13x13) 的每一个 grid 中预测出 5个 bounding box (对应5个 Anchor Box,如上一图),每个 bounding box 预测出5个值(4个位置值+1个置信度)及分类概率值(置信度)。
总输出: 13 x 13 x 5 x ( 5 + 20 )

五、YOLO9000

YOLO9000 是在 YOLOv2 的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类检测联合训练策略

目标检测 label 的成本比分类数据集高很多(物体类别、框出物体在图片中的位置),因此分类数据集比检测数据集的数量多很多。
而边界框的预测又不依赖于类别检测,因此 YOLO 可以在分类和检测数据集上的联合训练。

5.1 策略和方式

在这里插入图片描述

  • 联合训练策略方式: 对于testing data(检测数据集),用来学习预测物体的边界框 (bounding box)、置信度 (confidence) 以及物体(class)分类,而对于分类数据集仅用来学习(class)分类,但这样一来便可以大大扩充模型所能检测的物体种类。

  • 训练方式: 首先在检测数据集上训练一定的epoch,待预测框的 loss 基本稳定后,再联合分类数据集、检测数据集进行交替训练。同时为了分类、检测数据量平衡,作者对 COCO 数据集进行了上采样,使得 COCO、ImageNet 数据总数的比例为 4:1。

5.2 Loss

  • 计算 loss 方式: 若是检测样本,按照 YOLOv2 的 loss 计算误差。若是分类样本,只计算分类误差。

5.3 Word Tree

在这里插入图片描述

结合 COCO 和 ImageNet 建立的 WordTree

原因

联合数据集训练遇到的问题: 类别之间不一定是互斥关系,例如人与女生。所以作者提出了一种层级分类方法 (Hierarchical classification),根据类别之间的从属关系建立一种树结构word Tree。

思想

正如我们所看到的,所有的类都在根(physical object)下。作者在 WordTree 上训练了 Darknet-19 模型。作者从 WordTree 中提取了 1000 类 ImageNet 数据集,并将所有中间节点添加到其中,从而将标签空间从 1000 扩展到 1369,并将其称为WordTree1k。现在,darknet-19 的输出层大小变为 1369 而不是 1000。

在这里插入图片描述
Word Tree 的根节点为 physical object,每个节点的子节点都是属于同一个子类,在进行 softmax 时,不对所有类别进行,而是对同一层级的类别进行操作。如上图,对同一个颜色 (同一层级) 的类别进行 softmax
在这里插入图片描述
在进行预测时,会从根结点向下遍历,每一层级选取机率最高的子节点,并计算该节点至根节点的所有条件机率之积。当该条件机率之积小于某个阈值时停止,以当前节点表示预测的类别。计算公式如下:
在这里插入图片描述

输出及效果

预测输出为confidence: Pr(physical object)、bounding box位置、一个树状机率图。最终,通过联合训练策略,YOLO9000 可以快速的检测出超过 9000个类别的物体,总值 mAP 为19.7%。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湘粤Ian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值