YOLO v1、v2、v3

YOLO 流程

利用整张图作为网络的输入,darknet网络特征提取,其中经过五次下采样,还是用了残差结构。(目的是使网络结构在很深的情况下,仍能收敛,继续训练下去。)然后输出的尺寸是13×13,然后两个分支经过DBL特征提取,与下采样的特征图相加,得到不同尺度的特征图。即输出3个不同尺度的特征图,每个尺度的特征图负责预测不同大小的目标。每个特征图对应3种anchor大小不同的负责预测目标。最初图像还被分成13×13个网格,目标落在哪个网格中,哪个网格就负责预测目标,一个网格对应3个anchor(anchor的尺寸根据特征图相对于原图的比例等比缩小)。
预测时,yolov3采用
多个独立的逻辑分类器
来计算属于特定标签的可能性,在计算分类损失时,它对每个标签使用二元交叉熵损失,降低了计算的复杂度。

YOLO v1、v2、v3

YOLO v1

核心思想:
利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。
实现方法:
1.将一幅图像分成 SxS 个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object
2.每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值。

置信度为该边界框是待检测目标的概率乘上该边界框和真实位置的IOU的积。通过乘上这个交并比,反映出该边界框预测位置的精度。
YOLO v1、v2、v3
损失函数:
YOLO v1全部使用了**均方差(mean squared error)**作为损失(loss)函数。由三部分组成:坐标误差、IOU误差和分类误差
YOLO v1、v2、v3
缺点:
1)由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。
2)虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是 YOLO 方法的一个缺陷。
3)YOLO 的损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

YOLO v2

核心思想:
1.受到Faster RCNN方法的启发,引入了anchor。使用了K-Means方法,对anchor数量进行了讨论。
2.修改了网络结构,去掉全连接层,改成了全卷积结构
3.训练时引入了世界树(WordTree)结构,将检测和分类问题做成了一个统一的框架,并且提出了一种层次性联合训练方法,将ImageNet分类数据集和COCO检测数据集同时对模型训练。

实现方法:

更准
Batch Normalization:
使用 Batch Normalization 对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对 YOLO 的每一个卷积层增加 Batch Normalization,最终使得 mAP 提高了 2%,同时还使模型正则化。使用 Batch Normalization 可以从模型中去掉 Dropout,而不会产生过拟合。
High resolution classifier:
现在 YOLO 从 224224 增加到了 448448,为了适应新的分辨率,YOLO v2 的分类网络以 448448 的分辨率先在 ImageNet上进行微调,微调 10 个 epochs,让网络有时间调整滤波器(filters),好让其能更好的运行在新分辨率上,还需要调优用于检测的 Resulting Network。最终通过使用高分辨率,mAP 提升了 4%。
Convolution with anchor boxes:
移除全连接层(以获得更多空间信息)使用 anchor boxes去预测 bounding boxes。并且,YOLOv2将预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标(YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding负责预测坐标)。
Dimension clusters:
在训练集的 Bounding Boxes 上跑一下 k-means聚类,来找到更好的、更有代表性的先验框维度,网络就容易学到准确的预测位置。anchor的大小使用kmeans聚类得出。
Direct location prediction:
预测方式,而是沿用YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。
Fine-Grained Features:
针对小目标检测,参考了Faster R-CNN和SSD的想法,在不同层次的特征图上获取不同分辨率的特征。作者将上层的(前面26×26)高分辨率的特征图(feature map)直接连到13×13的feature map上。把26×26×512转换为13×13×2048,并拼接住在一起使整体性能提升1%。
Multi-Scale Training:
和GoogleNet训练时一样,为了提高模型的鲁棒性(robust),在训练的时候使用多尺度[6]的输入进行训练。YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以不同的尺寸大小也选择为 32 的倍数 {320,352……608},最小 320320,最大 608608,网络会自动改变尺寸,并继续训练的过程。

更快
YOLO2是依赖于DarkNet-19的结构,该模型在ImageNet上能达到91%的top-5,并且单张图片只需要5.58 billion 浮点运算,大大的加快了运算速度。
YOLOv2去掉YOLOv1的全连接层,同时去掉YOLO v1的最后一个池化层,增加特征的分辨率,修改网络的输入,保证特征图有一个中心点,这样可提高效率。并且是以每个anchor box来预测物体种类的。
将分类和检测分开训练:
训练分类时,以Darknet-19为模型在ImageNet上用随机梯度下降法(Stochastic gradient descent)跑了160epochs,跑完了160 epochs后,把输入尺寸从224×224上调为448×448,这时候学习率调到0.001,再跑了10 epochs, DarkNet达到了top-1准确率76.5%,top-5准确率93.3%。
训练检测时,作者把分类网络改成检测网络,去掉原先网络的最后一个卷积层,取而代之的是使用3个3×3x1024的卷积层,并且每个新增的卷积层后面接1×1的卷积层,数量是我们要检测的类的数量。

更强
提出了一种联合训练的机制:使用识别数据集训练模型识别相关部分,使用分类数据集训练模型分类相关部分。
YOLOv2实现了在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。
提出了一种层级分类方法(Hierarchical classification),根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的词树(WordTree)
YOLO v1、v2、v3
每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个路径,然后计算路径上各个节点的概率之积。
在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。
在预测时,YOLOv2给出的置信度就是 ,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。

YOLO v3

核心思想:
1.多尺度预测(类FPN)
2.更好的基础分类网络(类Resnet)和分类器Darknet-53
3.分类器-类别预测
实现方法:
多尺度预测(类FPN):
在YOLO v3中采用类似FPN的上采样(upsample)融合做法(最后融合了3个scale,其他两个scale的大小分别是2626和52*52),在多个scale的feature map上做检测,提升小目标的检测效果。
darknet-53:
提出了53层的骨架(Darknet-53 ),并且借鉴了ResNet的shortcut结构
YOLO v1、v2、v3
分类损失函数:
yolov3中将yolov2中多分类损失函数softmax cross-entropy loss 换为2分类损失函数binary cross-entropy loss 。因为当图片中存在物体相互遮挡的情形时,一个box可能属于好几个物体,而不是单单的属于这个不属于那个,这时使用2分类的损失函数就更有优势。

参考:
https://zhuanlan.zhihu.com/p/37668951