业界对于目标检测的热度只增不减,但目前的框架也难于逾越RCNN系列、SSD、YOLO系列这三座大山,很多新的方法也是在此基础上做一些改进,所以有必要做一些整理,方便自己后续查看,这里先对YOLO系列做一些整理。没看过文章的可以回头细细品味下yolo-v1(发表于2016.5)、yolo-v2(发表于2016.12)、yolo-v3(发表于2018.4)
这是继RCNN系列(two-stage)后针对目标检测速度问题提出的另一种框架(one-stage),所以其在速度上具有一定优势。
YOLO-v1
1.核心思想
YOLO v1的核心思想在于将目标检测作为回归问题解决,采用一个单独的CNN模型实现end-to-end的目标检测,利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别,不同于faster-RCNN中的proposal+classifier 的思想
2.实现方法
a.将一幅图像分成 SxS 个网格(grid cell),如果哪个 object 的中心落在这个网格中,则这个网格就负责预测这个 object;
b.每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值;
c.这个confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准这两重信息,值计算如下:
若object落在grid cell 里,则Pr(Object)取1,否则为0,第二项是predicted bounding box 和实际的 groundtruth 之间的 IoU 值
d.每个 bounding box 要预测 位置(x, y, w, h) 和 confidence( 针对bounding box)共5个值,每个网格还要预测一个class信息(针对grid cell,每个网格最多只能预测一个类别,只会选择与groundtruth IOU 最高的 bounding box 作为物体检测输出,这也是yolo1不能很好预测有物体重叠情况的原因之一),记为 C 类。则 SxS个 网格,每个网格要预测 B (文献中为2)个 bounding box 还要预测 C (PASCAL VOC为20类)个 类别,输出shape就是 S x S x (5*B+C) ;
e.在 test 的时候,每个网格预测的 class 信息和 bounding box 预测的 confidence信息相乘,就得到每个 bounding box 的 class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二、三项就是每个 bounding box 预测的 confidence。这个乘积即 encode 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。
实现细节:
a.PASCAL VOC数据集中5B+C=52+20=30,每个grid有30维,其中2*4=8维是box坐标,2维是box的 confidence,20维是类别;
b.坐标的 x, y 用对应网格的 offset 归一化到 0-1 之间,w, h 用图像的 width 和 height 归一化到 0-1 之间;
损失函数:
设计原则:坐标误差、bounding box confidence、类别误差要处理平衡
设计实现:采用 sum-squared error loss
但是单纯采用 sum-squared error loss 会存在以下几个问题:
a.8维位置误差、2维bounding box confidence、20维classification error看做同等重要显然不合理
b.若grid cell中没有物体中心,则confidence 会置0,实际中会存在大量没有物体中心的grid cell,会造成失衡,网络不稳定甚至发散;
解决方法:
a.更重视8维的坐标预测,给这些损失前面赋予更大的 loss weight, 记为在 pascal VOC 训练中取 5;
b.对没有 object 的 box 的 confidence loss,赋予小的 loss weight,记为在 pascal VOC 训练中取 0.5;
c.有 object 的 box 的 confidence loss 和类别的 loss 的 loss weight 正常取 1;
d.对不同大小的 box 预测中,相比于大 box 预测偏一点,小 box 预测偏一点肯定更不能被忍受的。而 sum-square error loss 中对同样的偏移 loss 是一样,为了缓和这个问题,作者用了一个比较取巧的办法,就是将 box 的 width 和 height 取平方根代替原本的 height 和 width;
e.一个网格预测多个 box,希望的是每个 box predictor 专门负责预测某个 object。具体做法就是看当前预测的 box 与 ground truth box 中哪个 IoU 大,就负责哪个。这种做法称作 box predictor 的 specialization;
最后整个的损失函数如下所示:
这个损失函数中:
a.只有当某个网格中有 object 的时候才对 classification error 进行惩罚;
b.只有当某个 box predictor 对某个 ground truth box 负责的时候,才会对 box 的 coordinate error 进行惩罚,而对哪个 ground truth box 负责就看其预测值和 ground truth box 的 IoU 是不是在那个 cell 的所有 box 中最大;
注:
a.YOLO 方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO 的检测效果并不理想;
b.YOLO 采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果;
c. YOLO 的损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性;
3.YOLO的缺点
a.YOLO 对相互靠的很近的物体,还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类;
b.同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱;
c.由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强;
YOLO-v2
YOLO-v2:当时物体检测的state-of-art,它的速度在一定程度上要快过于当时的FasterR-CNN、SSD(SSD可以把原作者中基础网络VggNet替换为MobileNet加速),使用者可以在速度和精度之间权衡。
YOLO-9000:基于YOLO-v2,可以检测超过9000种物体分类,这归功于使用了WordTree来混合物体检测数据集和类别数据集的数据。
目前的物体检测都是基于相关数据集,如PascalVOC、COCO等,如下:
此类数据集大多数分类标签信息较少,数量也少于分类数据集ImageNet,训练物体检测中类别信息时,数据量偏小。
文章提出了一种新的训练方法-联合训练方法,思路是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升鲁棒性。即YOLO9000 使用 COCO 检测数据集学习检测图片中的物体的位置,使用 ImageNet 分类数据集学习类别分类。
YOLO-9000相对于YOLO-v1提到了better、faster、stronger,这也是对YOLO-v1的进一步改进。
1.更准(Better)
YOLO 一代有很多缺点,作者希望改进的方向是改善 recall,提升定位的准确度,同时保持分类的准确度。
目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种模型综合到一起。但是 YOLO v2 则着力于简化网络。具体的改进见下表:
Batch Normalization
使用 Batch Normalization 对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对 YOLO 的每一个卷积层增加 Batch Normalization,最终使得 mAP 提高了 2%,同时还使模型正则化。使用 Batch Normalization 可以从模型中去掉 Dropout,而不会产生过拟合。
High resolution classifier
目前业界标准的检测方法,都要先把分类器(classifier)放在ImageNet上进行预训练。从 Alexnet 开始,大多数的分类器都运行在小于 256256 的图片上。而现在 YOLO 从 224224 增加到了 448*448,这就意味着网络需要适应新的输入分辨率。
为了适应新的分辨率,YOLO v2 的分类网络以 448*448 的分辨率先在 ImageNet上进行微调,微调 10 个 epochs,让网络有时间调整滤波器(filters),好让其能更好的运行在新分辨率上,还需要调优用于检测的 Resulting Network。最终通过使用高分辨率,mAP 提升了 4%。
Convolution with anchor boxes
YOLO 一代包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。 Faster R-CNN 的方法只用卷积层与 Region Proposal Network 来预测 Anchor Box 偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
所以最终 YOLO 去掉了全连接层,使用 Anchor Boxes 来预测 Bounding Boxes。作者去掉了网络中一个池化层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在 416416 而不是 448448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO 的卷积层采用 32 这个值来下采样图片,所以通过选择 416416 用作输入尺寸最终能输出一个 1313 的特征图。 使用 Anchor Box 会让精确度稍微下降,但用了它能让 YOLO 能预测出大于一千个框,同时 recall 达到88%,mAP 达到 69.2%。
Dimension clusters
之前 Anchor Box 的尺寸是手动选择的,所以尺寸还有优化的余地。 为了优化,在训练集的 Bounding Boxes 上跑一下 k-means聚类,来找到一个比较好的值。
如果我们用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,这依赖于 Box 的大小,所以距离度量的使用:
通过分析实验结果(Figure 2),左图:在模型复杂性与 high recall 之间权衡之后,选择聚类分类数 K=5。右图:是聚类的中心,大多数是高瘦的 Box。
Table1 是说明用 K-means 选择 Anchor Boxes 时,当 Cluster IOU 选择值为 5 时,AVG IOU 的值是 61,这个值要比不用聚类的方法的 60.9 要高。选择值为 9 的时候,AVG IOU 更有显著提高。总之就是说明用聚类的方法是有效果的。
Direct location prediction
用 Anchor Box 的方法,会让 model 变得不稳定,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测 Box 的(x,y)位置的时候。按照之前 YOLO的方法,网络不会预测偏移量,而是根据 YOLO 中的网格单元的位置来预测坐标,这就让 Ground Truth 的值介于 0 到 1 之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation 来对于网络预测结果进行限制,让结果介于 0 到 1 之间。 网络在每一个网格单元中预测出 5 个 Bounding Boxes,每个 Bounding Boxes 有五个坐标值 tx,ty,tw,th,t0,他们的关系见下图(Figure3)。假设一个网格单元对于图片左上角的偏移量是 cx、cy,Bounding Boxes Prior 的宽度和高度是 pw、ph,那么预测的结果见下图右面的公式:
因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。Dimension clusters和Direct location prediction,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%。
Fine-Grained Features
YOLO 修改后的特征图大小为 1313,这个尺寸对检测图片中尺寸大物体来说足够了,同时使用这种细粒度的特征对定位小物体的位置可能也有好处。Faster-RCNN、SSD 都使用不同尺寸的特征图来取得不同范围的分辨率,而 YOLO 采取了不同的方法,YOLO 加上了一个 Passthrough Layer 来取得之前的某个 2626 分辨率的层的特征。这个 Passthrough layer 能够把高分辨率特征与低分辨率特征联系在一起,联系起来的方法是把相邻的特征堆积在不同的 Channel 之中,这一方法类似与 Resnet 的 Identity Mapping,从而把 2626512 变成 13132048。YOLO 中的检测器位于扩展后(expanded )的特征图的上方,所以他能取得细粒度的特征信息,这提升了 YOLO 1% 的性能。
Multi-Scale Training
作者希望 YOLOv2 能健壮地运行于不同尺寸的图片之上,所以把这一想法用于训练模型中。
区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以不同的尺寸大小也选择为 32 的倍数 {320,352…..608},最小 320320,最大 608608,网络会自动改变尺寸,并继续训练的过程。
这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在 YOLOv2 的速度和精度上进行权衡。
更快(Faster)
YOLO 使用的是 GoogLeNet 架构,比 VGG-16 快,YOLO 完成一次前向过程只用 85.2 亿次运算,而 VGG-16 要 306.9 亿次,但是 YOLO 精度稍低于 VGG-16。
Draknet19
YOLO v2 基于一个新的分类模型,有点类似于 VGG。YOLO v2 使用 3*3 的 filter,每次池化之后都增加一倍 Channels 的数量。YOLO v2 使用全局平均池化,使用 Batch Normilazation 来让训练更稳定,加速收敛,使模型规范化。
最终的模型–Darknet19,有 19 个卷积层和 5 个 maxpooling 层,处理一张图片只需要 55.8 亿次运算,在 ImageNet 上达到 72.9% top-1 精确度,91.2% top-5 精确度。
Training for classification
在训练时,把整个网络在更大的448*448分辨率上Fine Turnning 10个 epoches,初始学习率设置为0.001,这种网络达到达到76.5%top-1精确度,93.3%top-5精确度。
更强(Stronger)
在训练的过程中,当网络遇到一个来自检测数据集的图片与标记信息,那么就把这些数据用完整的 YOLO v2 loss 功能反向传播这个图片。当网络遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的 loss 功能反向传播这个图片。
作者的目的是:训练一个 Extremely Large Scale 检测器。所以训练的时候使用 WordTree 混合了 COCO 检测数据集与 ImageNet 中的 Top9000 类,混合后的数据集对应的 WordTree 有 9418 个类。另一方面,由于 ImageNet 数据集太大了,作者为了平衡一下两个数据集之间的数据量,通过过采样(oversampling) COCO 数据集中的数据,使 COCO 数据集与 ImageNet 数据集之间的数据量比例达到 1:4。
YOLO9000 的训练基于 YOLO v2 的构架,但是使用 3 priors 而不是 5 来限制输出的大小。当网络遇到检测数据集中的图片时则正常地反方向传播,当遇到分类数据集图片的时候,只使用分类的 loss 功能进行反向传播。同时作者假设 IOU 最少为 0.3。最后根据这些假设进行反向传播。
使用联合训练法,YOLO9000 使用 COCO 检测数据集学习检测图片中的物体的位置,使用 ImageNet 分类数据集学习如何对大量的类别中进行分类。
为了评估这一方法,使用 ImageNet Detection Task 对训练结果进行评估。
评估结果:
+YOLO9000 取得 19.7 mAP。 在未学习过的 156 个分类数据上进行测试, mAP 达到 16.0。
+YOLO9000 的 mAP 比 DPM 高,而且 YOLO 有更多先进的特征,YOLO9000 是用部分监督的方式在不同训练集上进行训练,同时还能检测 9000个物体类别,并保证实时运行。
虽然 YOLO9000 对动物的识别性能很好,但是对类别为“sungalsses”或者“swimming trunks”这些衣服或者装备的类别,它的识别性能不是很好,见 table 7。这跟数据集的数据组成有很大关系。
总结
YOLO v2 代表着当时最先进物体检测的水平,在多种监测数据集中都要快过其他检测系统,并可以在速度与精确度上进行权衡。
YOLO 9000 的网络结构允许实时地检测超过9000种物体分类,这归功于它能同时优化检测与分类功能。使用 WordTree 来混合来自不同的资源的训练数据,并使用联合优化技术同时在 ImageNet 和 COCO 数据集上进行训练,YOLO9000 进一步缩小了监测数据集与识别数据集之间的大小代沟。
YOLO-v3
YOLOv3 在 Pascal Titan X 上处理 608x608 图像速度可以达到 20FPS,在 COCO test-dev 上 [email protected] 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快 4 倍。
YOLO v3 的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。
YOLOv3 在实现相同准确度下要显著地比其它检测方法快。时间都是在采用 M40 或 Titan X 等相同 GPU 下测量的。
简而言之,YOLOv3 的先验检测(Prior detection)系统将分类器或定位器重新用于执行检测任务。他们将模型应用于图像的多个位置和尺度。而那些评分较高的区域就可以视为检测结果。此外,相对于其它目标检测方法,我们使用了完全不同的方法。我们将一个单神经网络应用于整张图像,该网络将图像划分为不同的区域,因而预测每一块区域的边界框和概率,这些边界框会通过预测的概率加权。我们的模型相比于基于分类器的系统有一些优势。它在测试时会查看整个图像,所以它的预测利用了图像中的全局信息。与需要数千张单一目标图像的 R-CNN 不同,它通过单一网络评估进行预测。这令 YOLOv3 非常快,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。
改进之处:
a.多尺度预测 (类FPN);
b.更好的基础分类网络(类ResNet)和分类器 darknet-53,见下图
c.分类器-类别预测:
YOLOv3 不使用 Softmax 对每个框进行分类,主要考虑因素有:
a.Softmax 使得每个框分配一个类别(得分最高的一个),而对于 Open Images这种数据集,目标可能有重叠的类别标签,因此 Softmax不适用于多标签分类。
b.Softmax 可被独立的多个 logistic 分类器替代,且准确率不会下降。
c.分类损失采用 binary cross-entropy loss。
多尺度预测
每种尺度预测 3 个 box, anchor 的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给 3 个尺度。
尺度1: 在基础网络之后添加一些卷积层再输出box信息。
尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个 16x16 大小的特征图相加,再次通过多个卷积后输出 box 信息,相比尺度1变大两倍。
尺度3: 与尺度2类似,使用了 32x32 大小的特征图
darknet-53 与 ResNet-101 或 ResNet-152 准确率接近,但速度更快,对比如下:
检测结构如下:
YOLOv3 在 [email protected] 及小目标 APs 上具有不错的结果,但随着 IOU的增大,性能下降,说明 YOLOv3 不能很好地与 ground truth 切合.
1.https://pjreddie.com/darknet/yolo/
2.https://blog.csdn.net/guleileo/article/details/80581858