您的位置:首页 > 其它

目标检测之YOLO_v1解读

2019-03-14 14:50 465 查看

YOLO:You Only Look Once: Unified, Real-Time Object Detection,入门小白,若博文有不妥之处,望加以指点,笔者一定及时修正。

  • ② 阅读笔记及总结
  • ① 全文翻译

    摘要

    我们提出了一种新的物体检测方法YOLO。 先前工作重新训练分类器来执行检测。 相反,我们将目标检测作为回归问题,空间上分离边界框和相关的类概率,也就是Bounding Box和Class Probabilities。 单个神经网络在一次评估中直接从一张完整图像中预测边界框和类概率。 整个检测流水线过程是单个网络,因此可以直接在检测上进行端到端优化。

    我们的统一网络架构非常快。 我们的基础YOLO模型可以以每秒45帧的速度实时处理图像。 较小版本的网络Fast YOLO每秒可以处理惊人的155帧,同时仍然可以达到其他实时检测器的mAP的两倍。 与最先进的检测系统相比,YOLO产生更多的定位误差,但不太可能预测背景上的误报。 最后,YOLO学习了对象的非常一般的表示。 当从自然图像推广到其他领域(如艺术品)时,它优于其他检测方法,包括 DPM 和 R-CNN。

    1、引言

    人类扫了一眼图像,立即知道图像中的物体,它们在哪里,以及它们如何相互作用。 人类视觉系统快速而准确,使我们能够在很少意识的情况下执行复杂的任务。 快速,准确的物体检测算法将允许计算机在没有专用传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时场景信息,潜力巨大。

    当前关于目标检测的检测系统大多数是重新训练分类器进行检测。 为了检测目标,这些系统对目标采用分类器并在不同位置对其进行检测评估并在测试图像中进行缩放。 像DPM这样的系统使用滑动窗口方法,其中分类器在整个图像上以均匀间隔的位置运行。

    像R-CNN这样的最新方法使用区域建议方法首先在图像中生成潜在的边界框,然后在这些潜在的框上运行分类器。 分类后,后处理操作用于重新定义边界框,消除重复检测,并根据场景中的其他对象重新排列框。 这些复杂的过程很慢且难以优化,因为每个单独的部分必须单独进行培训。因为 proposal 和 classification 是分开的过程。

    我们将对象检测重新定义为单个回归问题,直接从图像像素得到边界框坐标类概率。 使用我们的系统,你只需在图像上查看一次(YOLO)即可预测出现的对象和位置。

    YOLO简洁明了:参见图1.单个卷积网络同时预测这些目标的多个边界框和类概率。 YOLO训练全图像并直接优化检测性能。 这种统一模型与传统的物体检测方法相比有几个好处。

    首先,YOLO非常快。 由于我们将检测框架作为回归问题,因此我们不需要将这个检测过程分为几个复杂的过程。 我们只是在测试时在新图像上运行我们的神经网络来预测检测。此外,YOLO的MAP是其他实时系统的两倍多。

    其次,YOLO在进行预测时全局了解图像与滑动窗口和基于proposal的f方法不同,YOLO在训练和测试时间内看到整个图像,因此它包含了上下文信息。 与Fast R-CNN相比,YOLO的背景错误数量不到一半。

    第三,YOLO学习对象的一般化表示(泛化能力强)。 在对自然图像进行训练并对艺术作品进行测试时,YOLO很大程度上优于DPM和R-CNN等顶级检测方法。 由于YOLO具有很高的泛化能力性,因此在应用于新的域或意外输入时不太可能发生故障。 YOLO在准确性方面仍然落后于最先进的检测系统。 虽然它可以快速识别图像中的物体,但它很难精确地定位某些物体,特别是小物体。

    图1:a) resize image into 448x448 ;
    b)然后输进一个卷积神经网络;
    c)非极大值抑制,消除重复框;

    2、检测细节

    我们将目标检测的几个单独的过程中统一到单个神经网络中。 我们的网络使用整个图像中的特征来预测每个边界框。 它还同时预测所有类的所有边界框。 这意味着我们的网络全局了解整个图像和图像中的所有对象。 YOLO设计支持端到端训练和实时速度,同时保持较高的平均精度。

    我们的系统将输入图像分成S×S网格。 如果对象的中心落入网格单元格中,则该网格单元格负责检测该对象。每个网格单元预测 B个边界框和置信分数。 这些置信分数反映了模型是如何预测格子里面是否包含一个物体,以及它对格子预测的准确程度(也就是预测框和真实框之间的IOU)。 在形式上我们定义为Pr(Object)* IOUtruth - pred。 如果该单元格中不存在对象,则Pr(Object)应为零,否则,Pr(Object)为1。我们希望置信分数等于预测框和地面实况之间的联合交叉(IOU)。

    每个预测框框由5个预测组成:x,y,w,h 和 confidence(置信度)。 (x,y)坐标表示相对于网格单元边界的预测框的中心。w,h 表示相对于整个图像预测的框宽度和高度。 最后,置信度代表预测框和任何地面实况框之间的IOU。

    每个网格单元还预测C条件类概率Pr(Class_i | Object)。 有这个概率的条件是:网格单元包含对象的中心点。 我们只预测每个网格单元的一组类概率,而不管预测的方框 B 的数量。(这边就有一个缺陷,小目标小,两个小目标的中心点落在同一个网格中,这个网格只能检测出一个物体。)

    在测试时,我们将条件类概率与单个框的置信预测相乘:

    这就可以得到每个框的每个特定类的置信度分数。这个分数表示:该类出现在这个预测框里面的概率以及预测框与真实框的相交程度。

    图2:模型。我们的系统将检测模型作为回归问题。 它将图像划分为S×S网格,并且每个网格单元预测B边界框,这些框的置信度(x,y,w,h,c)和C类概率(VOC是20类)。 这些预测最后为S×S×(B * 5 + C)张量。

    为了评估POLCAL VOC上的YOLO,我们使用S = 7,B = 2。PASCAL VOC有20个标记类别,因此C = 20。我们的最终预测是7×7×30张量。

    2.1 网络设计

    我们将此模型实现为卷积神经网络,并在PASCAL VOC检测数据集上进行评估。 网络的前部分卷积层从图像中提取特征,而全连接的层预测输出概率和类坐标

    我们的网络架构受到用于图像分类的GoogLeNet模型的启发。 我们的网络有24个卷积层,后面是2个全连接的层。 而不是GoogLeNet使用的初始模块,我们简单地使用1×1减少层,然后使用3×3卷积层。 完整的网络如图3所示:

    我们还训练快速版的YOLO,旨在突破快速物体检测的界限。 快速YOLO使用具有较少卷积层(9而不是24)的神经网络,并且在这些层中使用较少的过滤器。 除了网络的大小,YOLO和Fast YOLO之间的所有训练和测试参数都是相同的。我们网络的最终输出的是预测的7×7×30张量。

    图3:架构。 我们的检测网络有24个卷积层,后面是2个全连接层。 交替的1×1卷积层减少了前面层的特征空间。 我们在ImageNet分类任务上以一半的分辨率(224×224输入图像)预先训练卷积层,然后将分辨率加倍以进行检测。

    2.2 训练

    我们在ImageNet 1000级竞赛数据集上预先训练我们的卷积层。 对于预训练,我们使用图3中的前20个卷积层,然后是平均池和完全连接的层。 我们训练这个网络大约一周,并在ImageNet 2012验证集上实现88%的单一作物前5精度,与Caffe模型动物园中的GoogLeNet模型相当。 我们使用Darknet框架进行所有培训和推理。

    然后我们转换模型以执行检测。 有研究表明将卷积和连接层添加到预训练网络可以提高性能。 依照他们的实验,我们添加四个卷积层和两个完全连接的层,随机初始化权重。 检测通常需要细粒度的视觉信息,因此我们将网络的输入分辨率从224×224增加到448×448。

    我们最后面的全连接层预测了类概率和边界框坐标。 我们将边界框宽度和高度按图像宽度和高度比例缩放,使它们落在0和1之间。我们将边界框x和y坐标参数化为特定网格的偏移,因此它们也在0和1之间。

    我们对全连接层使用线性激活函数,其他层使用以下LReLu:

    我们使用输出的求和平方误差进行优化,因为它很容易优化,但它与我们最大化平均精度的目标并不完全一致。 它将定位误差与分类误差相等地加权,这可能并不理想。 此外,在每个图像中,许多网格单元是不包含任何对象的。 这将这些单元格的“信心”分数置于0。

    为了解决这个问题,我们增加了边界框坐标预测的损失,并减少了不包含对象的框的置信预测损失。 我们使用互参数,λcoord和λnoobj来完成这个。 我们设置 λcoord= 5 和 λnoobj= 0.5。

    求和误差也同样可以加大目标和小目标中的误差。 我们的误差度量方案应该反映出大目标中的小偏差比小目标中的小偏差更重要。 为了部分解决这个问题,我们直接预测是边界框宽度和高度的平方根,而不是宽度和高度。

    YOLO预测每个网格单元有B个边界框。 在训练时,我们只希望一个边界框负责预测对象。 我们根据哪个预测具有最高当前IOU和有目标,将这个预测框分配为“负责”预测对象。

    损失函数:

    论文后半部分的实验细节,笔者就不描述啦。。。。想深究的童鞋可以细致的阅读论文。

    ② 阅读笔记及总结

    ① YOLO将输入图片划分成 S*S 个格子,每一个格子预测 B 个 bounding boxes 以及这些 bounding boxes 的confidence scores。数据集是VOC, 取S = 7,B = 2。每一个格子最终是出30维的向量,B=2时候,占10维,(x1,y1,w1,h1,c1;x2,y2,w2,h2,c2)(x_1,y_1,w_1,h_1,c_1;x_2,y_2,w_2,h_2,c_2)(x1​,y1​,w1​,h1​,c1​;x2​,y2​,w2​,h2​,c2​)。
    坐标 x,yx,yx,y 代表了预测的 bounding boxbounding \ boxbounding box 的中心与格子边界的相对值。
    坐标 w,hw,hw,h 代表了预测的 bounding boxbounding \ boxbounding box 的 width、heightwidth、heightwidth、height 相对于整幅图像 width,heightwidth,heightwidth,height 的比例。
    confidenceconfidenceconfidence 就是预测的 bounding boxbounding \ boxbounding box 和 ground truth boxground \ truth \ boxground truth box 的 IOUIOUIOU 值。
    那下面如何求 Confidence scoresConfidence \ scoresConfidence scores:
    Confidence=Pr(Object)∗IOUpredtruthConfidence = Pr(Object)*IOU^{truth}_{pred}Confidence=Pr(Object)∗IOUpredtruth​如果这个格子里面不存在一个ObjectObjectObject,那么这个Confidence scoresConfidence \ scoresConfidence scores为 0;否则的话,Confidence scoresConfidence \ scoresConfidence scores等于预测框与真实框之间的 IOU。这是针对每个bounding boxesbounding \ boxesbounding boxes的。
    每一个栅格还要预测 CCC个 conditional class probabilityconditional \ class \ probabilityconditional class probability(条件类别概率):Pr(Classi∣Object)Pr(Classi|Object)Pr(Classi∣Object)。即在一个栅格包含一个ObjectObjectObject的前提下,它属于某个类的概率。 我们只为每个栅格预测一组(CCC个)类概率,而不考虑框B的数量。剩下的20维是格子对于每一具体类的分数,因为VOC有20类。这是针对每个格子的。

    ②而在测试阶段:
    这边是将每个网格的 conditional class probabilityconditional \ class \ probabilityconditional class probability 与每个 bounding box 的 confidenceconfidenceconfidence 相乘:

    这样既可得到每个 bounding boxbounding \ boxbounding box 的具体类别的 confidence scoreconfidence \ scoreconfidence score,也就是预测的两个框对于每一个特定类的概率。
    这乘积既包含了 bounding boxbounding \ boxbounding box 中预测的 classclassclass 的 probabilityprobabilityprobability 信息,也反映了 bounding boxbounding \ boxbounding box 是否含有 ObjectObjectObject 和bounding boxbounding \ boxbounding box坐标的准确度。

    ③非极大值抑制(NMS)

    NMS是大部分深度学习目标检测网络所需要的,大致算法流程为:
    1.对所有预测框的置信度降序排序
    2.选出置信度最高的预测框,确认其为正确预测(下次就没有他了,已经被确认了),并计算他与其他预测框的IOU
    3.根据2中计算的IOU去除重叠度高的,IOU>threshold就删除
    4.剩下的预测框返回第1步,直到没有剩下的为止
    非极大值抑制参考链接:https://www.cnblogs.com/makefile/p/nms.html, 写的很好。

    ③YOLOV1将 候选区域 和 对象识别合二为一。YOLOV1 采用了预测框,把图片大致分成98个区域,每个区域看下有没有对象存在,以及具体位置在哪里。**RCNN使用边框回归:找到候选框,等真正识别出里面的对象以后,对候选框进行微调,使之更接近真正的 bounding boxesbounding \ boxesbounding boxesYOLOV1不去细致寻找这些候选框,而是有个大概的位置范围,直接边框回归。**那为什么这样会有作用呢?网上有位大牛的解释我觉得比较合理:分类中已经包含了位置信息,如同你看了猫的脸和身体,就能推测出耳朵和尾巴的位置。

    ④YOLO的网络结构:

    最后的输出层是使用线性函数做激活函数,因为需要预测 bounding boxesbounding \ boxesbounding boxes 的位置,这个位置是数值型,不仅仅是对象的概率。

    ⑤下面谈一下 B,也就是每个网格预测 B 个框。这个 bounding boxesbounding \ boxesbounding boxes 与 Faster RCNNFaster \ RCNNFaster RCNN 与 SSDSSDSSD 的 AnchorAnchorAnchor是不一样的。因为 Faster RCNNFaster \ RCNNFaster RCNN 与 SSDSSDSSD 的 AnchorAnchorAnchor的框是预先设置好的,有不同的大小和宽高比。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。如果这个格子里面有对象,仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。 这2个bounding boxesbounding \ boxesbounding boxes,事先并不知道会在什么地方,经过前向计算,网络会输出2个 bounding boxesbounding \ boxesbounding boxes(也就是这两个预测框是网络训练出来的)。这两个 bounding boxesbounding \ boxesbounding boxes 与样本中对象的实际 ground truthground \ truthground truth 计算 IOU。这时候才会确定两个中哪一个来预测该对象的 bounding boxbounding \ boxbounding box。

    训练开始阶段,网络预测的bounding box可能都是乱来的,但总是选择IOU相对好一些的那个,随着训练的进行,每个bounding box会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想(而在YOLOV2中是使用了聚类K−meansK-meansK−means进行选择框的)。

    嘿!后期调试代码及代码解读会上传至Github,敬请期待!

    参考:
    1、https://blog.csdn.net/tianguiyuyu/article/details/81347846
    2、https://www.jianshu.com/p/a0aa94ef8ab2
    3、https://zhuanlan.zhihu.com/p/46691043(以上阅读笔记及总结中③④⑤参考该链接)

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: