webooru icon indicating copy to clipboard operation
webooru copied to clipboard

YOLO系列:V1,V2,V3,V4简介 - 知乎

Open madobet opened this issue 4 years ago • 0 comments

YOLO 系列是基于深度学习的回归方法。
RCNN, Fast-RCNN,Faster-RCNN 是基于深度学习的分类方法。

YOLO 官网:

https://github.com/pjreddie/darknet​github.com

YOLO v.s Faster R-CNN

  1. 统一网络: YOLO 没有显示求取 region proposal 的过程。Faster R-CNN 中尽管 RPN 与 fast rcnn 共享卷积层,但是在模型训练过程中,需要反复训练 RPN 网络和 fast rcnn 网络. 相对于 R-CNN 系列的 "看两眼"(候选框提取与分类),YOLO 只需要 Look Once.

  2. YOLO 统一为一个回归问题,而 R-CNN 将检测结果分为两部分求解:物体类别(分类问题),物体位置即 bounding box(回归问题)。

YOLOV1

论文下载:http://arxiv.org/abs/1506.02640

代码下载:https://github.com/pjreddie/darknet

核心思想:将整张图片作为网络的输入(类似于 Faster-RCNN),直接在输出层对 BBox 的位置和类别进行回归。

实现方法

  • 将一幅图像分成 SxS 个网格 (grid cell),如果某个 object 的中心 落在这个网格中,则这个网格就负责预测这个 object。

  • 每个网络需要预测 B 个 BBox 的位置信息和 confidence(置信度)信息,一个 BBox 对应着四个位置信息和一个 confidence 信息。confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准两重信息:

其中如果有 object 落在一个 grid cell 里,第一项取 1,否则取 0。 第二项是预测的 bounding box 和实际的 groundtruth 之间的 IoU 值。

  • 每个 bounding box 要预测 (x, y, w, h) 和 confidence 共 5 个值,每个网格还要预测一个类别信息,记为 C 类。则 SxS 个网格,每个网格要预测 B 个 bounding box 还要预测 C 个 categories。输出就是 S x S x (5*B+C) 的一个 tensor。(注意:class 信息是针对每个网格的,confidence 信息是针对每个 bounding box 的。
  • 举例说明: 在 PASCAL VOC 中,图像输入为 448x448,取 S=7,B=2,一共有 20 个类别 (C=20)。则输出就是 7x7x30 的一个 tensor。整个网络结构如下图所示:

  • 在 test 的时候,每个网格预测的 class 信息和 bounding box 预测的 confidence 信息相乘,就得到每个 bounding box 的 class-specific confidence score:

等式左边第一项就是每个网格预测的类别信息,第二三项就是每个 bounding box 预测的 confidence。这个乘积即 encode 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。

  • 得到每个 box 的 class-specific confidence score 以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行 NMS 处理,就得到最终的检测结果。

损失函数

在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。

这种做法存在以下几个问题:

  • 第一,8 维的 localization error 和 20 维的 classification error 同等重要显然是不合理的;
  • 第二,如果一个网格中没有 object(一幅图中这种网格很多),那么就会将这些网格中的 box 的 confidence push 到 0,相比于较少的有 object 的网格,这种做法是 overpowering 的,这会导致网络不稳定甚至发散。

解决办法:

  • 更重视 8 维的坐标预测,给这些损失前面赋予更大的 loss weight。
  • 对没有 object 的 box 的 confidence loss,赋予小的 loss weight。
  • 有 object 的 box 的 confidence loss 和类别的 loss 的 loss weight 正常取 1。

对不同大小的 box 预测中,相比于大 box 预测偏一点,小 box 预测偏一点肯定更不能被忍受的。而 sum-square error loss 中对同样的偏移 loss 是一样。

为了缓和这个问题,作者用了一个比较取巧的办法,就是将 box 的 width 和 height 取平方根代替原本的 height 和 width。这个参考下面的图很容易理解,小 box 的横轴值较小,发生偏移时,反应到 y 轴上相比大 box 要大。(也是个近似逼近方式)

一个网格预测多个 box,希望的是每个 box predictor 专门负责预测某个 object。具体做法就是看当前预测的 box 与 ground truth box 中哪个 IoU 大,就负责哪个。这种做法称作 box predictor 的 specialization。

最后整个的损失函数如下所示:

这个损失函数中:

  • 只有当某个网格中有 object 的时候才对 classification error 进行惩罚。
  • 只有当某个 box predictor 对某个 ground truth box 负责的时候,才会对 box 的 coordinate error 进行惩罚,而对哪个 ground truth box 负责就看其预测值和 ground truth box 的 IoU 是不是在那个 cell 的所有 box 中最大。

其他细节,例如使用激活函数使用 leak RELU,模型用 ImageNet 预训练等等

缺点

  • 由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。
  • 虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是 YOLO 方法的一个缺陷。
  • YOLO loss 函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

YOLOv2(YOLO9000)

YOLOv2 相对 v1 版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster)识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测 9000 种不同对象,称之为YOLO9000

文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。

联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。

YOLO9000 就是使用联合训练算法训练出来的,他拥有 9000 类的分类信息,这些分类信息学习自 ImageNet 分类数据集,而物体位置检测则学习自 COCO 检测数据集。

YOLOv2 相比 YOLOv1 的改进策略

改进:

Batch Normalization(批量归一化)

mAP 提升 2.4%。

批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个 batch 分别进行归一化的时候,起到了一定的正则化效果(YOLO2 不再使用 dropout),从而能够获得更好的收敛速度和收敛效果。

通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN 层进行如下变换:①对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值 0,方差 1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。②对上一步的输出再做一次线性变换,假设上一步的输出为 Z,则 Z1=γZ + β。这里γ、β是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。

关于批规一化的更多信息可以参考 Batch Normalization 原理与实战

High resolution classifier(高分辨率图像分类器)

mAP 提升了 3.7%。

图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以 YOLO v1 使用 ImageNet 的图像分类样本采用 224*224 作为输入,来训练 CNN 卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448*448 的图像作为输入。但这样切换对模型性能有一定影响。

所以 YOLO2 在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10 个 epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。

Convolution with anchor boxes(使用先验框)

召回率大幅提升到 88%,同时 mAP 轻微下降了 0.2。

YOLOV1 包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。 Faster R-CNN 的方法只用卷积层与 Region Proposal Network 来预测 Anchor Box 的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

借鉴 Faster RCNN 的做法,YOLO2 也尝试采用先验框(anchor)。在每个 grid 预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

之前 YOLO1 并没有采用先验框,并且每个 grid 只预测两个 bounding box,整个图像 98 个。YOLO2 如果每个 grid 采用 9 个先验框,总共有 13*13*9=1521 个先验框。所以最终 YOLO 去掉了全连接层,使用 Anchor Boxes 来预测 Bounding Boxes。作者去掉了网络中一个 Pooling 层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在 416*416 而不是 448*448。

由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO 的卷积层采用 32 这个值来下采样图片,所以通过选择 416*416 用作输入尺寸最终能输出一个 13*13 的 Feature Map。 使用 Anchor Box 会让精确度稍微下降,但用了它能让 YOLO 能预测出大于一千个框,同时 recall 达到 88%,mAP 达到 69.2%。

Dimension clusters(聚类提取先验框的尺度信息)

之前 Anchor Box 的尺寸是手动选择的,所以尺寸还有优化的余地。 YOLO2 尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2 的做法是对训练集中标注的边框进行 K-mean 聚类分析,以寻找尽可能匹配样本的边框尺寸。

如果我们用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,这依赖于 Box 的大小,所以距离度量的使用:

centroid 是聚类时被选作中心的边框,box 就是其它边框,d 就是两者间的 “距离”。IOU 越大,“距离” 越近。YOLO2 给出的聚类分析结果如下图所示:

通过分析实验结果(Figure 2),左图:在 model 复杂性与 high recall 之间权衡之后,选择聚类分类数 K=5。右图:是聚类的中心,大多数是高瘦的 Box。

Table1 是说明用 K-means 选择 Anchor Boxes 时,当 Cluster IOU 选择值为 5 时,AVG IOU 的值是 61,这个值要比不用聚类的方法的 60.9 要高。选择值为 9 的时候,AVG IOU 更有显著提高。总之就是说明用聚类的方法是有效果的。

Direct location prediction(约束预测边框的位置

借鉴于 Faster RCNN 的先验框方法,在训练的早期阶段,其位置预测容易不稳定。其位置预测公式为:

其中, 是预测边框的中心, 是先验框(anchor)的中心点坐标, 是先验框(anchor)的宽和高, 是要学习的参数。 注意,YOLO 论文中写的是 ,根据 Faster RCNN,应该是 "+"。

由于 的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO 调整了预测公式,将预测边框的中心约束在特定 gird 网格内。

其中, 是预测边框的中心和宽高。 是预测边框的置信度,YOLO1 是直接预测置信度的值,这里对预测参数 进行σ变换后作为置信度的值。 是当前网格左上角到图像左上角的距离,要先将网格大小归一化,即令一个网格的宽 = 1,高 = 1。 是先验框的宽和高。 σ是 sigmoid 函数。 是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。

因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。

Fine-Grained Features(passthrough 层检测细粒度特征)

passthrough 层检测细粒度特征使 mAP 提升 1。

对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如 YOLO2 中输入 416*416 经过卷积网络下采样最后输出是 13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。

YOLO2 引入一种称为 passthrough 层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个 pooling 之前,特征图的大小是 26*26*512,将其 1 拆 4,直接传递(passthrough)到 pooling 后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

具体怎样 1 拆 4,下面借用一副图看的很清楚。图中示例的是 1 个 4*4 拆成 4 个 2*2。因为深度不变,所以没有画出来。

另外,根据 YOLO2 的代码,特征图先用 1*1 卷积从 26*26*512 降维到 26*26*64,再做 1 拆 4 并 passthrough。下面图 6 有更详细的网络输入输出结构。

Multi-ScaleTraining(多尺度图像训练)

作者希望 YOLO v2 能健壮的运行于不同尺寸的图片之上,所以把这一想法用于训练 model 中。

区别于之前的补全图片的尺寸的方法,YOLO v2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以不同的尺寸大小也选择为 32 的倍数 {320,352…..608},最小 320*320,最大 608*608,网络会自动改变尺寸,并继续训练的过程。

这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在 YOLO v2 的速度和精度上进行权衡。

Figure4,Table 3:在 voc2007 上的速度与精度

hi-res detector(高分辨率图像的对象检测)

图 1 表格中最后一行有个 hi-res detector,使 mAP 提高了 1.8。因为 YOLO2 调整网络结构后能够支持多种尺寸的输入图像。通常是使用 416*416 的输入图像,如果用较高分辨率的输入图像,比如 544*544,则 mAP 可以达到 78.6,有 1.8 的提升

YOLOV3

YOLO v3 的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

速度对比如下:

简而言之,YOLOv3 的先验检测(Prior detection)系统将分类器或定位器重新用于执行检测任务。他们将模型应用于图像的多个位置和尺度。而那些评分较高的区域就可以视为检测结果。此外,相对于其它目标检测方法,我们使用了完全不同的方法。我们将一个单神经网络应用于整张图像,该网络将图像划分为不同的区域,因而预测每一块区域的边界框和概率,这些边界框会通过预测的概率加权。我们的模型相比于基于分类器的系统有一些优势。它在测试时会查看整个图像,所以它的预测利用了图像中的全局信息。与需要数千张单一目标图像的 R-CNN 不同,它通过单一网络评估进行预测。这令 YOLOv3 非常快,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。

改进之处

  • 多尺度预测 (类 FPN)
  • 更好的基础分类网络(类 ResNet)和分类器 darknet-53, 见下图。
  • 分类器 - 类别预测。

YOLOv3 不使用 Softmax 对每个框进行分类,主要考虑因素有两个:

  1. Softmax 使得每个框分配一个类别(score 最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此 Softmax 不适用于多标签分类。
  2. Softmax 可被独立的多个 logistic 分类器替代,且准确率不会下降。

分类损失采用 binary cross-entropy loss。

多尺度预测

每种尺度预测 3 个 box, anchor 的设计方式仍然使用聚类, 得到 9 个聚类中心, 将其按照大小均分给 3 个尺度.

  • 尺度 1: 在基础网络之后添加一些卷积层再输出 box 信息.
  • 尺度 2: 从尺度 1 中的倒数第二层的卷积层上采样 (x2) 再与最后一个 16x16 大小的特征图相加, 再次通过多个卷积后输出 box 信息. 相比尺度 1 变大两倍.
  • 尺度 3: 与尺度 2 类似, 使用了 32x32 大小的特征图.

参见网络结构定义文件yolov3.cfg

基础网络 Darknet-53

darknet-53

仿 ResNet, 与 ResNet-101 或 ResNet-152 准确率接近, 但速度更快. 对比如下:

主干架构的性能对比

检测结构如下:

YOLOv3 在 [email protected] 及小目标 APs 上具有不错的结果, 但随着 IOU 的增大, 性能下降, 说明 YOLOv3 不能很好地与 ground truth 切合.

边框预测

图 2:带有维度先验和定位预测的边界框。我们边界框的宽和高以作为离聚类中心的位移,并使用 Sigmoid 函数预测边界框相对于滤波器应用位置的中心坐标。

仍采用之前的 logis,其中 cx,cy 是网格的坐标偏移量, pw,ph 是预设的 anchor box 的边长. 最终得到的边框坐标值是 b_, 而网络学习目标是 t_,用 sigmod 函数、指数转换。

优点

  • 快速, pipline 简单.
  • 背景误检率低。
  • 通用性强。YOLO 对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于 DPM 和 RCNN 系列检测方法。

但相比 RCNN 系列物体检测方法,YOLO 具有以下缺点:

  • 识别物体位置精准性差。
  • 召回率低。在每个网格中预测两个 box 这种约束方式减少了对同一目标的多次检测 (R-CNN 使用的 region proposal 方式重叠较多), 相比 R-CNN 使用 Selective Search 产生 2000 个 proposal(RCNN 测试时每张超过 40 秒),yolo 仅使用 7x7x2 个.

YOLOV4

YOLOv4: Optimal Speed and Accuracy of Object Detection

论文:https://arxiv.org/abs/2004.10934

代码:https://github.com/AlexeyAB/darknet

YOLOv4!

YOLOv4 在 COCO 上,可达 43.5% AP,速度高达 65 FPS!

YOLOv4 的特点是集大成者,俗称堆料。但最终达到这么高的性能,一定是不断尝试、不断堆料、不断调参的结果,给作者点赞。下面看看堆了哪些料:

  • Weighted-Residual-Connections (WRC)
  • Cross-Stage-Partial-connections (CSP)
  • Cross mini-Batch Normalization (CmBN)
  • Self-adversarial-training (SAT)
  • Mish-activation
  • Mosaic data augmentation
  • CmBN
  • DropBlock regularization
  • CIoU loss

本文的主要贡献如下:

  1. 提出了一种高效而强大的目标检测模型。它使每个人都可以使用 1080 Ti 或 2080 Ti GPU 训练超快速和准确的目标检测器(牛逼!)。

  2. 在检测器训练期间,验证了 SOTA 的 Bag-of Freebies 和 Bag-of-Specials 方法的影响。

  3. 改进了 SOTA 的方法,使它们更有效,更适合单 GPU 训练,包括 CBN [89],PAN [49],SAM [85] 等。文章将目前主流的目标检测器框架进行拆分:input、backbone、neck 和 head.

具体如下图所示:

  • 对于 GPU,作者在卷积层中使用:CSPResNeXt50 / CSPDarknet53
  • 对于 VPU,作者使用分组卷积,但避免使用(SE)块 - 具体来说,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

作者的目标是在输入网络分辨率,卷积层数,参数数量和层输出(filters)的数量之间找到最佳平衡。

总结一下 YOLOv4 框架:

  • Backbone:CSPDarknet53
  • Neck:SPP,PAN
  • Head:YOLOv3

YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3

其中 YOLOv4 用到相当多的技巧:

  • 用于 backbone 的 BoF:CutMix 和 Mosaic 数据增强,DropBlock 正则化,Class label smoothing
  • 用于 backbone 的 BoS:Mish 激活函数,CSP,MiWRC
  • 用于检测器的 BoF:CIoU-loss,CmBN,DropBlock 正则化,Mosaic 数据增强,Self-Adversarial 训练,消除网格敏感性,对单个 ground-truth 使用多个 anchor,Cosine annealing scheduler,最佳超参数,Random training shapes
  • 用于检测器的 Bos:Mish 激活函数,SPP,SAM,PAN,DIoU-NMS

看看 YOLOv4 部分组件:

感受一下 YOLOv4 实验的充分性(调参的艺术):

感受一下性能炸裂的 YOLOv4 实验结果:

[1][2]

参考

  1. ^V1,V2,V3 参考地址: https://blog.csdn.net/App_12062011/article/details/77554288

  2. ^V4 转载地址: https://mp.weixin.qq.com/s/Ua3T-DOuzmLWuXfohEiVFw

    https://zhuanlan.zhihu.com/p/136382095

madobet avatar Jun 08 '20 08:06 madobet