faster rcnn,fast rcnn等是将整体流程划分为区域提取和目标分类两部分进行的,这样做的特点是精度高,速度慢。YOLO(you only look once)是真正实现端到端的目标检测算法。
一、YOLO v1
YOLO v1的核心思想是将目标检测作为回归问题解决。
其过程如下:
(1)将原始图片尺寸变为448×448;(2)将图片划分为SxS个网格。每个网格预测B个bounding box的置信度和box的位置(Box中心坐标x,y以及Box的宽和高);(3)每个网格预测C个条件类别概率Pr。
YOLO v1的优点:
(1) 检测物体非常快:因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。
(2) YOLO可以很好的避免背景错误,产生false positives:不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
(3) YOLO可以学到物体的泛化特征:当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。
尽管YOLO有这些优点,它也有一些缺点:
(1) YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
(2) YOLO容易产生物体的定位错误。
(3) YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。
置信度公式:
在test的非极大值抑制阶段,对于每个边界框,按照下式衡量该框是否应该予以保留。
这样既可得到每个bounding box的具体类别的confidence score。
这乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。
YOLO检测网络包括24个卷积层和2个全连接层,如图所示:
论文中:
损失函数:
对应到张量上面就是:
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
简单的全部采用了sum-squared error loss来做这件事会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的。
b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。
解决方案如下:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord ,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj ,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
激活函数:
在最后一层使用的是标准的线性激活函数,其他的层都使用leaky rectified 线性激活函数。
二、YOLO v2/YOLO 9000
YOLO v1对于bounding box的定位不是很好,在精度上比同类网络还有一定的差距,所以YOLO v2对于速度和精度做了很大的优化,并且吸收了同类网络的优点,一步步做出尝试。
YOLO v2受到faster rcnn的启发,引入了anchor。同时使用了K-Means方法,对anchor数量进行了讨论,在精度和速度之间做出折中。并且修改了网络结构,去掉了全连接层,改成了全卷积结构。在训练时引入了世界树(WordTree)结构,将检测和分类问题做成了一个统一的框架,并且提出了一种层次性联合训练方法,将ImageNet分类数据集和COCO检测数据集同时对模型训练。
2.1 更准
YOLO v2对数据进行了归一化预处理。通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它正则方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。(mAP:平均精度均值(mean Average Precision))
YOLOv1在分辨率为224×224的图片上进行预训练,在正式训练时将分辨率提升到448×448,这需要模型去适应新的分辨率。但是YOLOv2是直接使用448×448的输入,随着输入分辨率的增加,模型提高了4%的mA。
在预测框的数量上,由于YOLOv2将网络的输入分辨率调整到416×416,保证为多次卷积后,下采样率为32,得到13×13的特征图(feature map)。在这上面使用9种anchor boxes[7],得到13×13×9=1521个,这比YOLOv1大多了。
YOLOv1利用全连接层的数据完成边框的预测,会导致丢失较多的空间信息,使定位不准。在YOLOv2中作者借鉴了Faster R-CNN中的anchor思想,来改善全连接层带来的影响。
Anchor是RPN(region proposal network)网络在Faster R-CNN中的一个关键步骤,是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的候选框。
为了引入anchor boxes来预测候选框,作者在网络中去掉了全连接层。并去掉了最后的一个池化层以确保输出的卷积特征图有更高的分辨率。然后,通过缩减网络,让图片输入分辨率为416 * 416,目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个中心框(center cell)。作者观察到,大物体通常占据了图像的中间位置,可以只用中心的一个框来预测这些物体的位置,否则就要用中间的4个格子来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(采样因子为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)。
没有anchor boxes的情况下,模型召回率(recall)为81%,mAP为69.5%;加入anchor boxes,模型召回率为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%。
在使用anchor的时候作者遇到了两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors)也就是说人工选定的先验框。虽然在训练过程中网络也会学习调整框的宽高维度,最终得到准确的bounding boxes。但是,如果一开始就选择了更好的、更有代表性的先验框维度,那么网络就更容易学到准确的预测位置。
为了使网络更易学到准确的预测位置,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的框宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的框会比较小的框产生更多的误差,聚类结果可能会偏离。为此,作者采用IOU得分作为评价标准,这样的话,误差就和框的尺度无关了,最终的距离函数为:
在使用anchor的时候,遇到的第二个问题是加入anchor box的模型不稳定。作者认为模型不稳定的原因来自于预测bbox的(x,y)。如下:
在Faster R-CNN的预测中,偏移因子,是没有限制的,因此收敛会比较慢。故我们想让每个模型预测目标附近的一个部分,论文对采用了和YOLOv1一样的方法,直接预测中心点,并使用Sigmoid函数将偏移量限制在0到1之间(这里的尺度是针对网格框)。
计算公式如下:
bx,by,bw,bh,是预测的bbox的中心点坐标和宽高,中心点坐标的尺度是相对于网格。
YOLOv1在对于大目标检测有很好的效果,但是对小目标检测上,效果欠佳。为了改善这一问题,作者参考了Faster R-CNN和SSD的想法,在不同层次的特征图上获取不同分辨率的特征。作者将上层的(前面26×26)高分辨率的特征图(feature map)直接连到13×13的feature map上。把26×26×512转换为13×13×2048,并拼接住在一起使整体性能提升1%。
2.2更快
大多数目标检测的框架是建立在VGG-16上的,VGG-16在ImageNet上能达到90%的top-5(最后概率向量最大的前五名中出现了正确概率即为预测正确),但是单张图片需要30.69 billion 浮点运算,YOLO2是依赖于DarkNet-19的结构,该模型在ImageNet上能达到91%的top-5,并且单张图片只需要5.58 billion 浮点运算,大大的加快了运算速度。
YOLOv2去掉YOLOv1的全连接层,同时去掉YOLO v1的最后一个池化层,增加特征的分辨率,修改网络的输入,保证特征图有一个中心点,这样可提高效率。并且是以每个anchor box来预测物体种类的。
作者将分类和检测分开训练,在训练分类时,以Darknet-19为模型在ImageNet上用随机梯度下降法(Stochastic gradient descent)跑了160epochs,跑完了160 epochs后,把输入尺寸从224×224上调为448×448,这时候学习率调到0.001,再跑了10 epochs, DarkNet达到了top-1准确率76.5%,top-5准确率93.3%。
在训练检测时,作者把分类网络改成检测网络,去掉原先网络的最后一个卷积层,取而代之的是使用3个3×3x1024的卷积层,并且每个新增的卷积层后面接1×1的卷积层,数量是我们要检测的类的数量。
2.3更强
论文提出了一种联合训练的机制:使用识别数据集训练模型识别相关部分,使用分类数据集训练模型分类相关部分。
众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。所以在YOLOv1中,边界框的预测其实并不依赖于物体的标签,YOLOv2实现了在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。
作者选择在COCO和ImageNet数据集上进行联合训练,遇到的第一问题是两者的类别并不是完全互斥的,比如"Norfolk terrier"明显属于"dog",所以作者提出了一种层级分类方法(Hierarchical classification),根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的词树(WordTree)如下图所示:
WordTree中的根节点为"physical object",每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个路径,然后计算路径上各个节点的概率之积。
在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是 ,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。
2.4总结
通过对YOLOv1网络结构和训练方法的改进,提出了YOLOv2/YOLO9000实时目标检测系统。YOLOv2在YOLOv1的基础上进行了一系列的改进,在快速的同时达到state of the art。同时,YOLOv2可以适应不同的输入尺寸,根据需要调整检测准确率和检测速度(值得参考)。作者综合了ImageNet数据集和COCO数据集,采用联合训练的方式训练,使该系统可以识别超过9000种物品。除此之外,作者提出的WordTree可以综合多种数据集的方法可以应用于其它计算机数觉任务中。但是对于重叠的分类,YOLOv2依然无法给出很好的解决方案。
三、Yolov3集大成之作
YOLOv3是到目前为止,速度和精度最均衡的目标检测网络。通过多种先进方法的融合,将YOLO系列的短板(速度很快,不擅长检测小物体等)全部补齐。达到了令人惊艳的效果和拔群的速度。
3.1多标签分类预测
在YOLO9000[14]之后,我们的系统使用维度聚类(dimension clusters )作为anchor boxes来预测边界框,网络为每个边界框预测4个坐标,,。
在YOLOv3[15]中使用逻辑回归预测每个边界框(bounding box)的对象分数。 如果先前的边界框比之前的任何其他边界框重叠ground truth对象,则该值应该为1。如果以前的边界框不是最好的,但是确实将ground truth对象重叠了一定的阈值以上,我们会忽略这个预测,按照进行。我们使用阈值0.5。与YOLOv2不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失。
在YOLOv3中,每个框使用多标签分类来预测边界框可能包含的类。该算法不使用softmax,因为它对于高性能没有必要,因此YOLOv3使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行类别预测。对于重叠的标签,多标签方法可以更好地模拟数据。
3.2跨尺度预测
YOLOv3采用多个尺度融合的方式做预测。原来的YOLO v2有一个层叫:passthrough layer,假设最后提取的feature map的size是13*13,那么这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样的操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的上采样(upsample)和融合做法(最后融合了3个scale,其他两个scale的大小分别是26*26和52*52),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。虽然在YOLO v3中每个网格预测3个边界框,看起来比YOLO v2中每个grid cell预测5个边界框要少,但因为YOLO v3采用了多个尺度的特征融合,所以边界框的数量要比之前多很多。
3.3网络结构改变
YOLO v3使用新的网络来实现特征提取。在Darknet-19中添加残差网络的混合方式,使用连续的3×3和1×1卷积层,但现在也有一些shortcut连接,YOLO v3将其扩充为53层并称之为Darknet-53。
四、代码运行
直接运行./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
会出现以下错误:
在该命令前添加sudo即可解决
参考文献: