YOLO v1 论文笔记 01web
前言算法
看过不少的YOLO中文版学习笔记,干货比较多,可是,有点干,对于不少想要入门的童鞋来讲,看着很难理解,一些概念晦涩难懂,一些英文表述不知为什么意。因此从这一篇博客开始,我尽可能用比较简单的语言来说述YOLO v1,把我我的的理解分享给你们,但愿你们可以学懂YOLO,会用YOLO。微信
我会讲的很细,因此一篇博客来讲一篇论文,内容有点多,我会分红两个博客来说述YOLO论文还会有一部分博客做为补充,但愿你们能认真学习,文中的若是哪里写的很差或者有错误,还但愿你们可以不吝赐教。网络
一架构
Abstract(归纳)app

这篇文章提出了一个新的物体检测的方法:You Only Look Once(YOLO),以前的物体检测方法一般都转变为了一个分类问题,如 R-CNN、Fast R-CNN 等等。ide
而这篇文章将检测变为一个回归问题,YOLO 从输入的图像,仅仅通过一个 neural network,直接获得 bounding boxes 以及每一个 bounding box 所属类别的几率。正由于整个的检测过程仅仅有一个网络,因此它能够直接进行end-to-end (端对端:指的是输入原始数据,输出的是最后结果,应用在特征学习融入算法,无需单独处理)的优化。svg

这一段主要说明YOLO相对于其余神经网络的优势,那就是快,特别快(extremely fast),标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。网络较小的版本Fast YOLO在保持mAP是以前的其余实时物体检测器的两倍的同时,检测速度能够达到155 FPS。函数
相较于其余的state-of-the-art (先进的物体检测系统),YOLO在物体定位时更容易出错,可是在背景上预测出不存在的物体(false positives)的状况会少一些。并且,YOLO比DPM、R-CNN等物体检测系统可以学到更加抽象的物体的特征,这使得YOLO能够从真实图像领域迁移到其余领域,如艺术。post
二
Introduction(介绍)

人们看一眼图像并当即知道图像中的物体是什么,它们在哪里,以及它们是如何相互做用的。人类视觉系统是快速和准确的,使咱们可以执行复杂的任务,如驾驶与小有意识的想法。快速、准确的目标检测算法将容许计算机在没有专用传感器的状况下驾驶汽车,使辅助设备可以将实时场景信息传达给人类用户,并开启通用、响应性机器人系统的潜力。

如今的 detection systems(检测系统) 将物体检测问题,最后会转变成一个分类问题。在检测中,detection systems 采用一个 classifier(分类器) 去评估一张图像中各个位置必定区域的 window 或 bounding box 内,是否包含一个物体?包含了哪一种物体?
YOLO以前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不一样位置和不一样尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个sliding window(滑窗)在整张图像上均匀滑动,用分类器评估是否有物体。
在DPM以后提出的其余方法,如R-CNN方法使用region proposal(区域建议)来生成整张图像中可能包含待检测物体的可能的 bounding boxes,而后用分类器来评估这些boxes,接着经过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其余物体从新对boxes进行打分。整个流程执行下来很慢,并且由于这些环节都是分开训练的,检测性能很难进行优化。
用YOLO处理图像分为三个步骤:
图示以下:



YOLO 的 idea 十分简单,如 Figure 1:将图像输入单独的一个 CNN 网络,就会预测出 bounding boxes(边界框:找出要找的内容,用一个矩形边框将其圈出,这个矩形边框即为边界框),以及这些 bounding boxes 所属类别的几率。YOLO 用一整幅图像来训练,同时能够直接优化 detection performance(性能检测)。
YOLO 的 idea 十分简单,如 Figure 1:将图像输入单独的一个 CNN 网络,就会预测出 bounding boxes(边界框:找出要找的内容,用一个矩形边框将其圈出,这个矩形边框即为边界框),以及这些 bounding boxes 所属类别的几率。YOLO 用一整幅图像来训练,同时能够直接优化 detection performance(性能检测)。
这种统一模型的优势:
几类模型流程对比:
三
Unified Detection(统一检测)

咱们将对象检测的分离组件统一为单个神经网络。咱们的网络使用来自整个图像的特征来预测每一个 bounding boxes(边界框)。它还预测全部边界的全部图像的包围盒。这意味着咱们在总体范围内对整个图像和图像中的全部对象进行网络推理。YOLO设计使端到端的训练和实时速度成为可能,同时保持高的平均精度。

YOLO 检测系统,先将输入图像分红 S * S个 grid(栅格),若是一个物体的中心掉落在一个 grid cell (网格单元)内,那么这个 grid cell (网格单元)就负责检测这个物体。

每个 grid cell 预测 B 个 bounding boxes,以及这些 bounding boxes 的得分:score。这个 score 反应了模型对于这个 grid cell 中预测是否含有物体,以及是这个物体的可能性是多少。咱们把confidence(可信度)正式定义为

若是这个 cell 中不存在一个 object,则 score 应该为0 ;不然的话,score 则为 predicted box 与 ground truth 之间的 IoU(intersection over union:一种测量在特定数据集中检测相应物体准确度的一个标准)。
换句话说:若bounding box包含物体,则P(object) = 1;不然P(object) = 0。IOU(intersection over union)为预测边框与物体真实区域的交集面积(以像素为单位,用真实区域的像素面积归一化到[0,1]区间)。

每一个边框由五个预测值组成:x,y,w,h,confidence。坐标(x,y) 表明了 bounding box 的中心与 grid cell 边界的相对值。width、height 则是相对于整幅图像的预测值(边框的宽和高)。confidence 就是 IoU 值。
注意:实际训练过程当中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是边框中心位置相对于当前格子位置的偏移值,而且被归一化到[0,1]。
每个栅格还要预测C个 conditional class probability(条件类别几率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的几率。咱们只为每一个栅格预测一组(C个)类几率,而不考虑框B的数量。
注意:conditional class probability信息是针对每一个网格的。confidence信息是针对每一个bounding box的。

在测试阶段,将每一个栅格的conditional class probabilities与每一个 bounding box的 confidence相乘:

这样既可获得每一个bounding box的具体类别的confidence score。这乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。

将YOLO用于PASCAL VOC数据集时:论文使用的 S=7,即将一张图像分为7×7=49个栅格每个栅格预测B=2个boxes(每一个box有 x,y,w,h,confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。所以,最后的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor(张量)。
注意:1.因为输出层为全链接层,所以在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。2.虽然每一个格子能够预测B个bounding box,可是最终只选择只选择IOU最高的bounding box做为物体检测输出,即每一个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每一个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
一、Network Design(网络设计)
一、举例
以下图所示,图片分红7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体。图中物体狗的中心点(红色框)落入第5行、第2列的格子内,因此这个格子负责预测图像中的物体狗。
二、Training(训练)
一、训练

预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer(平均池化层)+ fully connected layer(全链接层) (此时网络输入是224*224)。

训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增长卷积和全连接层能够改善性能。在做者的例子基础上添加4个卷积层和2个全连接层,随机初始化权重。检测要求细粒度的视觉信息,因此把网络输入把224*224变成448*448。

咱们的最后一层预测类几率和包围盒坐标。咱们经过图像宽度和高度对包围盒宽度和高度进行归一化,使它们降低到0和1之间。咱们将边界框x和y坐标参数化为特定网格单元位置的偏移,所以它们也在0和1之间。
咱们使用一个线性激活函数的最终层和全部其余层使用函数(2)线性激活。
二、损失函数
须要注意的是:咱们在模型输出中求平方和偏差的优化。咱们使用和平方偏差,由于它是容易优化的,可是它并不彻底符合咱们最大化平均精度的目标。它的定位偏差与分类偏差相等,可能不是理想的。并且,在每一个图像中,许多网格单元不包含任何对象。这就把这些细胞的“置信度”分数推到零,每每超过了包含对象的细胞的梯度。这可能致使模型不稳定,致使训练早期发散。

解决方案:增长边界框坐标预测的损失,而且减小了不包含对象的框的置信度预测的损失。咱们使用两个参数来实现这一点,即

这两个参数前者g。赋值为5,后者赋值为0.5。
下图为损失函数设计图:

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的所有采用了sum-squared error loss来作这件事会有如下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的;
b) 若是一个网格中没有object(一幅图中这种网格不少),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种作法是overpowering的,这会致使网络不稳定甚至发散。
解决方案以下:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不一样大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对一样的偏移loss是同样。为了缓和这个问题,做者用了一个比较取巧的办法,就是将box的width和height取平方根代替本来的height和width。以下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。


一个网格预测多个bounding box,在训练时咱们只须要每一个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体作法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种作法称做bounding box predictor的specialization(专职化)。每一个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的更好,从而提升总体召回率。

为了不过分拟合,咱们使用dropout和普遍的数据扩充。在第一个链接层以后咱们丢弃具备速率=0.5的层,防止层之间的co-adaptation(相互影响)。对于数据加强,咱们引入随机缩放和最多原始图像大小的20%的translations。咱们还随机调整曝光和饱和度的图像多达1.5倍的HSV颜色空间。
三、Inference(推论)
四、Limitations of YOLO(YOLO的局限性)
YOLO对相互靠的很近的物体(挨在一块儿且中点都落在同一个格子上的状况),还有很小的群体 检测效果很差,这是由于一个网格中只预测了两个框,而且只属于一类。 测试图像中,当同一类物体出现的不常见的长宽比和其余状况时泛化能力偏弱。 因为损失函数的问题,定位偏差是影响检测效果的主要缘由,尤为是大小物体的处理上,还有待增强。 |
咱们的公众号
AI与区块链技术

长按二维码关注

麻烦给个在看哦!

本文分享自微信公众号 - AI与区块链技术(Math_AI_Blockchain)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。