YOLO,英文当中的You only look once的缩写,是目前最先进的实时对象检测系统。据网上撰写数据,它在台式机显卡Titan X上,能实时处理40-90fps/s的图像,准确率高达78.6%(VOC 2007)或COCO test-dev的48.1%。
作为标准数据集,voc-2007 是衡量图像分类识别能力的基准,faster-rcnn,yolo -v1, yolo-v2都以此数据集为最为演示样例。
知乎上赵丽丽老师对YOLO的详解和我的一些笔记,详解基于CVPR2016 目标检测论文 :
(赵丽丽老师知乎答案原文地址点击)
(参考网站原文地址点击)
从以下五个方面解读此论文:
以前的检测系统通过重复利用分类器和定位器来实现目标识别,它们把模型套在图像的不同位置和大小区域,通过图像各区域的最高值来判定结果。
YOLO使用了完全不同的方法,它通过把一个单独的神经网络放在整个图像上来进行识别。这个网络把图像分成区域并对边框和个区域的可能性进行预测,这些边框通过预测到的可能性进行加权。
YOLO模型相比与基于分类器的系统有几个优势,它在观测时观察整个图像,所以它的预测是基于整个图像上下文的,并且它通过一个单一的网络进行预测,不像R-CNN系统需要对一副图像运用上千的网络。这一特点使得YOLO的速度是快速R-CNN的一百倍,是R-CNN的上千倍。这也就是赵丽丽老师所说的创新。
YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。从网络设计上,YOLO与R-CNN,fast R-CNN,faster R-CNN的区别如下:
==========================================================
YOLO检测网络包括24个卷积层和2个全连接图层,如下图所示:
其中·,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。
YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用了1x1卷积层(为了跨通道信息整合)+3x3卷积简单替代。
YOLO论文中,作者还给出一个更轻快的检测网络fast YOLO,它只有9个卷积层和2个全连接层。使用Titan xGPU,fast YOLO可以达到155fps/s的检测速度,但是mAP值也从YOLO的63.4%降到了52.7%,但却仍然远高于以往的实时物体检测(DPM)的mAP的值。
本部分给出YOLO全连接输出层的定义。
YOLO将输入图像分成SxS个格子,每个格子负责检测”落入“该格子的物体,若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。如下图所示,图中物体狗的中心点(红色原点)落入第五行,第二列的格子内,所以这个格子就负责预测图像中的物体,狗。
每个格子输出B个bounding box(包含物体的矩形区域)信息,以及C个物体属于某种类别的概率信息。
Bounding box信息包含5个数据值,分别是x,y,w,h和confidence。
其中,
x,y是指当前格子预测得到的物体的bounding box的中心位置相对于当前格子位置的偏移值,并且被归一化到【0,1】。
confidence,系统对自己预测结果的自信度,反应当前bounding box是否包含物体以及物体位置的准确性。
目标检测网络之 YOLOv3
原文: https://www.cnblogs.com/makefile/p/YOLOv3.html © 康行天下
YOLOv1网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。
YOLOv1网络在最后使用全连接层进行类别输出,因此全连接层的输出维度是 S×S×(B×5+C)
2015年,R-CNN横空出世,目标检测DL世代大幕拉开。
各路豪杰快速迭代,陆续有了SPP,fast,faster版本,至R-FCN,速度与精度齐飞,区域推荐类网络大放异彩。
奈何,未达实时检测之基准,难获工业应用之青睐。
此时,凭速度之长,网格类检测异军突起,先有YOLO,继而SSD,更是摘实时检测之桂冠,与区域推荐类二分天下。然准确率却时遭世人诟病。
遂有JR一鼓作气,并coco,推v2,增加输出类别,成就9000。此后一年,作者隐遁江湖,逍遥twitter。偶获灵感,终推v3,横扫武林!
自从YOLO诞生之日起,它就被贴上了两个标签,
1.速度很快。
2.不擅长检测小物体。
而后者,成为了很多人对它望而却步的原因。
由于原理上的限制,YOLO仅检测最后一层卷积输出层,小物体像素少,经过层层卷积,在这一层上的信息几乎体现不出来,导致难以识别。
YOLOv3在这部分提升明显。先看看小物体的识别。
YOLOv3的识别结果
直观地看下和YOLOv2的对比图如下。可以看出,对于小物体的识别,提高非常明显。
无论是传统的模式识别图像检测,还是基于CNN的视觉检测,对于紧凑密集或者高度重叠目标的检测通常是非常困难的。比如对合影的人群检测在YOLOv2上的结果:
而下面是v3的结果:
前方高能预警。。。。。。。。。。。。。。。。
一次检测到图中90%的人,还增加了tie(领带)这个新类别,非常惊艳!
再看看模型的泛化能力如何:
骷髅并不在训练数据集中,但是通过训练模型强大的泛化能力,自动将其归类到了人类。(也算是最为合理的近似处理了)
这在YOLOv2中是检测不到的。
那么,模型泛化能力很强的副作用,就是分类结果跑偏,比如下面这张coser的识别图,最左侧的人识别成了马:
论文中做了详尽的对比。
和前辈们比,YOLO 的速度非常快,比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。
和同辈们比,YOLOv3-608检测准确率比DSSD更高,接近FPN,但是检测时间却只用了后面两者的三分之一不到。
原因如论文中所说,它在测试时观察整张图像,预测会由图像中的全局上下文(global context)引导。它还通过单一网络评估做出预测,而不像 R-CNN 这种系统,一张图就需要成千上万次预测。
YOLO让人联想到龙珠里的沙鲁(cell),不断吸收同化对手,进化自己,提升战斗力:YOLOv1吸收了SSD的长处(加了 BN 层,扩大输入维度,使用了 Anchor
,训练的时候数据增强),进化到了YOLOv2;
吸收DSSD和FPN的长处, 仿ResNet的Darknet-53,仿SqueezeNet的纵横交叉网络,又进化到YOLO第三形态。
但是,我相信这一定不是最终形态。。。让我们拭目以待吧!
作者:深度智能
链接:https://zhuanlan.zhihu.com/p/36899263
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
YOLO仅是用卷积层,所以它是全卷积网络(FCN)。它具有75个卷积层,具有跳过连接和上采样层。不使用任何形式的池化,使用具有步幅为2的卷积层来下采样特征图。这有助于防止由于池化导致低级特征的丢失。
作为FCN,YOLO的输入图像的大小是任意的。然而,在实践中,我们可能想要保持输入大小不变,因为各种问题只有在我们实现算法时才会显示出来。
其中的一个重要问题是,如果我们想要批量处理图像(批量图像可以由GPU并行处理,从而提高速度),我们需要固定所有图像的高度和宽度。这是为了将多个图像级联成一个大批量(将多个PyTorch张量连接成一个)
网络通过称为网络步幅的因子对图像进行下采样。例如,如果网络的步幅为32,则尺寸为416 x 416的输入图像将产生尺寸为13 x 13的输出。一般而言,网络中任何层的步幅等于该层的输出的尺寸比网络的输入图像的尺寸小的倍数。
典型地,(对于所有目标检测器都适用)卷积层学习的特征会被传递到进行检测预测(边界框的坐标,类标签等)的分类器/回归器。
在YOLO中,预测是通过使用1×1卷积的卷积层完成的。
现在,首先要注意的是我们的输出是一个特征图。由于我们使用了1 x 1卷积,所以预测图的大小恰好是之前的特征图的大小。在YOLO v3(以及它的后续版本)中,这个预测图的每个单元格可以预测固定数量的边界框。
虽然实际上描述特征图中的单元的正确术语应该是神经元,但将其称为单元格使得它在我们的上下文中更加直观。
深度方面,我们在特征图中有(B x(5 + C))个条目。 B表示每个单元可以预测的边界框的数量。根据该论文,这B个边界框中的每一个可能专门检测某种目标。每个边界框都有5 + C个属性,分别描述每个边界框的中心坐标,尺寸,目标分数(objectness score)和C个类的置信度。 YOLO v3为每个单元格预测3个边界框。
如果目标的中心位于单元格的感受野中,则希望特征图中的单元格可以通过其中一个边界框来预测目标。 (感受野是输入图像对单元格可见的区域,进一步说明请参见关于卷积神经网络的链接)。
这与YOLO是如何训练的有关,训练时只有一个边界框负责检测任何给定的目标。首先,我们必须确定这个边界框属于哪个单元格。
为此,我们将输入图像划分成与最终特征图有相同维度的网格。
作者:深度智能
链接:https://zhuanlan.zhihu.com/p/36899263
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
目标分数表示边界框内包含目标的概率。红色及其相邻网格的目标分数应该接近1,而位于角落的网格接近0。
目标分数也使用sigmoid函数来压缩数值,因为它被定义为一个概率。
类别置信度表示检测目标属于特定类别(狗,猫,香蕉,汽车等)的概率。在YOLOv3之前的版本,YOLO对类别置信度使用softmax。
但是,该设计选择已经在YOLO v3中被舍弃了,作者选择使用sigmoid。原因是对类别分数进行softmax意味着类别之间是互相排斥的。简而言之,如果一个目标属于一个类,那么它就不能属于另一个类。这对于COCO数据库来说是正确的,而我们将在COCO数据库上训练检测器。
但是,当存在“女性”和“人”这样的类别时,这种假设可能不成立。这就是作者们避免使用Softmax激活的原因。
YOLO v3可以进行3种不同尺度的预测。检测层在分别具有步幅32,16,8的三种不同尺寸的特征图上进行检测。这意味着,在输入416 x 416的情况下,我们在尺寸为13 x 13,26 x 26和52 x 52上进行检测。
网络对输入图像进行下采样直到第一个检测层,它使用具有步幅为32的层的特征图进行检测。然后,将层上采样2倍,并与具有相同特征图尺寸的前一层的特征图连接。现在在具有步幅16的层上进行另一次检测,重复相同的上采样过程。并且在步幅8的层处进行最终检测。
在每个尺度上,每个单元使用3个锚来预测3个边界框,锚的总数为9(在不同尺度上的锚是不同的)