YOLO: You Only Look Once
就目标检测与识别技术的研究现状来说,可以将其分为两大类,分别为基于传统图像处理和机器学习算法的目标检测与识别方法和基于深度学习的目标检测与识别方法.
传统的目标检测与识别方法主要可以表示为:目标特征提取、目标识别、目标定位。这里所用的特征都是认为设计的特征,例如SIFT、HOG等。
基于深度学习的目标检测与识别方法已经成为主流,主要可以表示为:图像的深度特征提取和基于深度神经网络的目标识别和定位。其中用到的主要的深度学习模型是卷积神经网络(CNN)。目前,可以将现有的基于深度学习的目标检测与识别算法分为大致三类:基于区域建议的目标检测与识别算法,具有代表性的是R-CNN、Fast R-CNN、Faster R-CNN;基于回归的目标检测与识别算法,具有代表性的是YOLO、SSD;基于搜索的目标检测与识别算法,例如,基于视觉注意的AttentionNet,基于强化学习的算法。(节选自《深度学习、优化与识别》)
YOLO安装
YOLO用的CNN网络是基于darknet的,一个纯c语言编写的神经网络框架。要把YOLO跑起来,darknet官网上面已经说的很详细了。
第一步:
安装一些必要的依赖, 这是我们能够成功编译darknet的前提
第二步:
编译darknet、下载预训练模型,然后你就可以跑出来像下图一样的东东咯!
YOLOv1
YOLO算法可以大致分为以下三步:
1、将整个图片分为
S∗S
S
∗
S
个格子;
2、将整张图片送入深度神经网络,预测每一个格子是否存在目标、目标的边界框、目标的类别;
3、将预测的边界框做非最大值抑制(NMS)筛选出最好的边界框,从而得到最好的结果。
YOLOv1里面最让人诟病的是:由于只是简单地对图像做回归而牺牲了定位的精度,所以该算法的精度没有基于区域建议的算法高,还有就是对一些小目标或者目标之间的位置很接近的情况下检测效果不好,这也是因为该算法只是对固定大小、固定位置的图像块做回归引起的。
下面是官网给出的几种算法的比较:
作者主要集中于提高recall和localization,但是同时保证分类的准确度。可见YOLOv2在吸收了RPN网络和SSD的一些有点之后有了改进, 可以看到YOLOv2相比于Old YOLO在提升精度的同时也没有牺牲速度(FPS)。
YOLOv2
批量正则化
在YOLOv1的每个卷积层之后添加了批量归一化。这本身导致mAP增加了2%。批量归一化可以在改进模型收敛性的同时对其进行归一化,因此,他们删除了YOLOv1中使用的Dropout层。
高分辨率分类器
目标检测工作的一般方式是,模型在Imagenet上进行预训练以进行分类,然后为了检测,网络被调整到更高的分辨率,特别是检测场景中的较小物体。
YOLOv2在Imagenet(224x224)上进行了预训练,然后对网络进行了调整,以便在更高分辨率的图像(448x448)上进行分类,这进一步把mAP提升了大约4%。
Anchor Boxes
预测bounding box有两种方法:直接预测object的bounding box和用一些预设的bounding box(anchor box)预测物体的实际bounding box,YOLov1直接使用卷积特征提取提取之上的全连接层来预测边界框的坐标,但是,这回造成大量的定位错误,相比直接预测,使用基于锚点框的偏移更加容易。
K-means聚类
YOLOv2并没有直接预定义这些锚点框,而是对数据集(VOC2007、COCO)中的bounding box进行K均值聚类,产生Dimension clusters.通过这一策略,得到了5%的mAP提升。
细粒度特征
YOLOv2使用13x13特征图预测结果,这对于大目标来说足矣,但是为了更好的定位较小的目标,将26x26分辨率的早期特征图与低分辨率特征连接起来,得到了1%的mAP提升。
多尺度训练
YOLOv1使用448 x 448分辨率输入。在YOLOv2中,他们将输入图像随机调整为320 x 320到608 x 608之间的不同分辨率(分辨率始终为32的倍数)。这种多尺度训练可以被认为是类似于增强,它迫使网络学习在各种输入维度上很好地进行预测。这增加了1.5%的MAP。
为什么YOLOv2会更快
大多数(也许是所有)检测应用程序(如机器人技术,自动驾驶汽车)都需要并依赖于物体检测算法的低延迟预测。尽管大多数算法依赖于VGG-16作为其基本特征提取器,但它们往往比较慢,因为VGG-16是一个复杂的网络,需要在224×224分辨率下单次传输306.99亿次浮点运算。 YOLOv1依赖于基于Googlenet架构的自定义网络,与VGG-16相比,它的速度更快,因为它仅使用了85.2亿次的正向传递操作。然而,它的准确性略低于VGG-16。
为了克服YOLOv1的缺点,YOLOv2使用了一种名为Darknet-19的新架构。它有19个卷积层和5个最大池层。 Darknet-19只需要55.8亿次操作来处理图像,但在ImageNet上却达到了72.9%的前1精度和91.2%的前5精度。完整的网络如下所示:
darknet-19
YOLOv3
darknet-53
YOLOv2使用的网络架构是darknet-19,总共有24层,其中19个卷积层(所以叫darknet-19),5个最大池化层。YOLOv2在小目标检测上面效果不是很好,这是因为在对输入进行下采样的时候丢失了一些细粒度的特征。为了解决这个问题,YOLOv2使用了恒等映射、连接之前层的feature map来获取低级的特征。
但是YOLOv2的网络架构还是没有加入现在被认为是state-of-the art的算法,比如:residual blocks, skip connections, upsampling。不过令人兴奋的是,在YOLOv3中全部都加上去了。
首先,YOLOv3使用了新的一种darknet架构,拥有53层卷积层(所以叫darknet-53),在Imagenet上进行训练。具体的网络架构如下图:
三种尺度下进行检测
YOLO v3在三个尺度上进行预测,这是通过分别将输入图像的尺寸下采样32,16和8来精确给出的。
第一次检测是由第82层做出的。对于前81层,网络对图像进行下采样,使得第81层的步幅为32.如果我们有416 x 416的图像,则所得特征图的大小为13 x 13。在这里使用1×1检测核,给我们一个13×13×255的检测特征图。然后,来自层79的特征映射经历几个卷积层,然后被上采样2x到维26×26。然后将该特征图与来自层61的特征图进行深度级联。然后组合的特征图再次经历几个1×1卷积层以融合来自较早层(61)的特征。然后,由第94层进行第二次检测,产生26×26×255的检测特征图。
类似地,其中来自层91的特征图在被深度级联之前经历少数卷积层带有来自层36的特征图。与以前一样,跟随几个1×1卷积层以融合来自前一层(36)的信息。我们在第106层产生大小为52 x 52 x 255的特征图。
更好地对小目标进行检测
不同层次的检测有助于解决检测小型目标的问题,与上一层级联的上采样图层有助于保留有助于检测小物体的细粒度特征。
13 x 13层负责检测大型目标,而52 x 52层则检测较小的目标,26 x 26层检测中等大小的物体。
对anchor box的选择
YOLO v3总共使用9个anchor box。每个比例三个。如果你在你自己的数据集上训练YOLO,你应该使用K-Means聚类来生成9个锚点。
然后,安排anchor box是一个维度的降序。为第一个尺度指定三个最大的anchor box,为第二个尺度指定下三个anchor box,为第三个指定最后三个anchor box。
更多的bounding box
对于相同尺寸的输入图像,YOLO v3预测比YOLO v2更多的边界框。例如,YOLO v2的原始分辨率为416 x 416,预测13 x 13 x 5 = 845个盒子。在每个网格单元中,使用5个锚点检测到5个箱子。
另一方面,YOLO v3预测3种不同比例的框。对于416 x 416的相同图像,预测框的数量是10647。这意味着YOLO v3预测YOLO v2预测的盒子数量的10倍。这也就是为什么它比YOLO v2慢。在每个尺度上,每个网格可以使用3个anchor预测3个框。由于有三个尺度,所以总共使用的anchor box的数量是9个,每个尺度3个。
Loss Function发生了变化
最后三项,对目标置信度和目标类别的预测误差从均方误差变成了交叉熵。
舍弃了softmax
YOLO v3现在对图像中检测到的物体执行多标记分类。在YOLO早些时候,作者习惯于softmax级别的分数,并以最高分作为包含在边界框中的对象的类。这已在YOLO v3中进行了修改。
Softmaxing类基于类是互斥的假设,或者简单地说,如果一个对象属于一个类,那么它就不能属于另一个类。这在COCO数据集中工作正常。
但是,当我们在数据集中有Person和Women这样的类时,上面的假设就失败了。这就是为什么YOLO的作者们没有将这些课程软化的原因。相反,使用逻辑回归预测每个类别的分数,并且使用阈值来预测目标的多个标签。分数高于此阈值的类别将分配给该框。
参考文献
YOLOv1
YOLOv2
YOLOv3
Logo detection using YOLOv2
What’s new in YOLOv3