目录
一、YOLO,以及与其他目标检测方法的区别
二、论文思想
三、网络架构
四、YOLO的不足
五、YOLO的优点
六、学习小结
本周学习小结:
本周主要学习了yolo v1整篇论文,因为我是刚接触目标检测方面的东西,所以对论文其中涉及的一些知识点和网络细节进行了补充学习,加深了对目标检测方法的理解和认知。接下来的内容是我通过查阅论文和参考其他网上博主对于yolo的解读学习到的知识,包含对文中知识点的补充和个人理解。
论文来源:https://arxiv.org/pdf/1506.02640.pdf
YOLO的全称是:You Only Look Once,意思是只需要浏览一次就可以识别图中物体的类别和位置。yolo输入的图像仅经过一个neural network(神经网络)就可直接得到bounding boxes(边界框)以及每个边界框所属类别的概率。所以可以说yolo是将检测方法变成一个回归问题,而其他如R-CNN、Fast R-CNN这种利用分类器检测的则是分类问题。
YOLO只看一次就能得出物体的类别和位置,是单阶段模型(one-stage),相比于之前学过的R-CNN、Fast R-CNN(two-stage,两阶段模型)是一种新的物体检测方法。yolo这种方法只需扫描一次,所以相对于其他二阶段模型的神经网络,它的检测速度特别快,在输入图像为448x448像素的图像上达到了45FPS,它的一个小版本Fast YOLO更是在保持对其他实时检测器的两倍mAP的状态下,图像处理速度达到155FPS。由于yolo是直接在特征图上对anchor进行回归以及类别预测,缺乏region proposal(背景筛选),导致图像中的小物体或者挨得较近的多个物体漏检,检测精度落后于先进的检测方法,但由于速度特别快,工业上也有普遍应用。
图1.1 几种神经网络框架对比
补充知识:
对于one-stage、two-stage的知识补充
目标检测模型按照有无anchor可以划分为两类:anchor-based、anchor-free
(anchor:事先通过人为手工标注或聚类方法设定好的具有不同尺寸、宽高比的方框)
anchor-based代表算法有:Faster-rcnn、yolo v2、yolo v3....
anchor-free代表算法有:yolo v1、CenterNet....
anchor-based:
anchor-based是一种基于预设的若干固定尺度和长宽比的anchor生成预测框的方法。目前很多目标检测算法都是anchor-based,其中也包含one-tage和two-tage。
one-tage:模型思想是将图像划分成SxS个网格,然后直接在特征图上对anchor进行回归及其类别预测,避免了随机搜索得到region proposal,减少重复计算,提高了处理速度。但由于缺乏region proposal,导致图像中的小物体或者挨得较近的多个物体漏检。
two-tage:模型思想是先通过计算机图形学或者深度学习方法对图片生成一系列作为样本的候选框,再用卷积神经网络进行分类。双阶段和单阶段的划分依据为是否基于候选区域生成预测框,即是否使用了RPN。
anchor-free:
anchor-free是基于点生成预测框。将物体的中心点或区域看作前景,定义正样本,然后预测它到物体四个边的距离。
图2.1 论文截图
yolo检测方法整体流程:
1)、将输入的图像调整到448x448。
2)、在图像上运行单个卷积神经网络。
3)、根据模型的confidence(置信度)对得到的检测结果进行NMS(非极大值抑制)筛选
具体操作:
1、将输入图片划分为SxS个网格,如果图像中某个object(物体)的中心落入在某个网格中,那么这个网格就负责预测这个物体。
图2.2 论文截图
1)、A图表示输入图片被划分成7x7个网格单元
2)、B图每个网格单元生成2个边界框,一共7x7x2=98个,框的粗细表示confidence大小,框越粗代表框住的是一个完整物体的概率越大
3)、C图中不同颜色表示每个网格单元所预测的物体最有可能的分类(比如图中蓝色最有可能是狗,黄色最有可能是自行车)
4)、D图表示最终图像输出的结果
2、每个网格要预测B个bounding box(边界框),每个bounding box除了要预测坐标位置之外(x,y,w,h)还要预测confidence值以及C个类别的分数,(这里的类别指的是数据集中的分类标签),所以最终预测的结果是S*S*(B*5+C)个张量
补充:
bounding box: 由5个预测组成——x,y,w,h,confidence
(x,y):表示相对于网格单元边界的预测框的中心 w:相对于图像位置的宽度 h:相对于图像位置的高度 confidence:下文会有具体描述
(实际训练过程中,x和y、w和h的值使用图像的宽度和高度都要归一化到[0,1]区间,confidence也要归一化。)
3、bounding box预测
1)、在图2.2的B图中,YOLO为每个网格中心给出了2个预测框,框是基于网格中心的,大小自定义。
2)、每个bounding box 有4个坐标(x,y,w,h)和一个confidence。
对于论文中B=2,取两个预测框的个人理解:
一个网格内可能包含两个物体的中心,比如一个人抱着一只狗在胸前,两个物体的中心都落入一个网格中,可以预设两个框(一个竖着的矩形和一个横着的矩形)保证两个物体能都框住。
3)、confidence是YOLO系列论文中独有的参数,confidence反应了模型对于这个网格预测是否含有物体以及是这个物体的可能性大小。论文中将confidence定义为:confidence=
图2.3 论文截图
图2.3中红框的confidence定义可以这样理解:如果网格单元中不存在物体(Object),那么物体存在的概率为0即Pr(Object)=0,则可以认为confidence=0;如果网格单元中确实存在物体,那么Pr(Object)=1,则confidence=IOU,当网格单元中有物体存在时可以将confidence看成IOU,这里的IOU是指我们预测的bounding box与真实的bounding box的交并比。
4)、在测试阶段,对于每个物体的最终概率是将conditional class probably(条件类别概率,)乘上每个bounding box的confidence得出的。
图2.4 论文截图
得到的结果:有两层内容,一是它为某个物体i的概率;二是我们预测的目标边界框与我们真实的目标边界框的重合程度。
补充:
由概率公式:P(AB)=P(A)*P(B|A) 可推导
:类别i在以它为目标的前提下的概率(只预测网格单元的一组类概率,不管B(边界框)的数量)。对于每个网格单元而言,它有C个类别,就要预测C个类别分数,这个类别分数就是conditional class probably。
conditional class probably:针对每个网格单元
confidence:针对每个bounding box
4、将YOLO用于PASCAL VOC数据集时,论文使用S=7,B=2,C=20(PASCAL VOC中有20个标签类),所以我们能最终预测的是7*7*30的张量。
图3.1 论文截图
整个检测网络由24层卷积层和2层全连接层组成,输入448x448x3图像(RBG三通道图像),经过24层卷积提取特征和2层全连接层,输出了7x7x30维的张量(对最后的全连接层中4096个神经元进行reshape,得到7x7x30)。卷积层用于提取图像特征,利用1x1卷积核进行降维处理减少了前一层的图像特征;全连接层用于预测图像位置和类别概率值。对于最后输出的7x7x30维张量可以通过图3.2理解。
图3.2 7x7x30张量分析图(图片来源迪菲赫尔曼博主)
1、网络预训练
由论文可知,网络预训练过程是利用图3.1的前20个卷积层加上一个平均池化层和一个全连接层对ImageNet 1000-class数据集进行为期一周的训练,而且此时输入图像是224x224。
图3.3 预训练网络图
2、真正训练检测网络
经过预训练后,网络基本已经学习到了图像的特征,接下来在预训练网络上加上4层卷积层和1层全连接层对目标检测进行迁移学习。之前的预训练是在图像分类任务上做的,而我们接下来的迁移学习则是在目标检测任务的数据集上做,要求预测物体类别外还要预测物体的位置坐标,损失函数也要相应更改。
3、损失函数
图3.4 论文截图
由论文开头,YOLO将目标检测问题当成回归问题去解决,所以损失函数中的误差都是平方和误差。对于损失函数我们可以逐步分解:
1)、第一项
式子中S的平方即SxS=7x7=49,表示49个网格单元,B就是每个网格单元的2个bounding box。前一个表示预测的bounding box的横坐标,是经过归一化处理的,在[0,1]区间。后一个为标签值,是真实框(bounding truth)相较于该网格单元左上角的偏移量,也是和一样含义。所以第一项检查的是:负责检测物体的bounding box的中心点的定位误差,也就是看bounding box对中心点位置定位准不准确。
2)、第二项
这一项就是看预测框和真实框的宽高是不是一样。对于宽高这一项,采用平方根则是为了小框对宽高的误差更敏感一些。论文中是这样解释:因为由于大框(框中的是大物体)和小框(狂战的是小物体)的平方和误差权值相同,不能体现大框和小框的差异性。对于实际预测来讲,大框差一些可能没有太大影响,而小框差的这一点可能就会导致预测框和真实框相差较远。使用开根号处理,就会一定程度上改善这一问题。
3)、第三项
这项则是检测预测框的confidence误差,涉及到第5个参数。第一个表示置信度分数,第二个 表示预测框与真实框的交并比(bounding box与ground truth的IOU)。
4)、第四项
第四项是不负责检测物体置信度的误差。而不负责检测物体的bounding box有两种:一是bounding box所在的网格单元不包含物体的中心点 ;二是虽然bounding box所在的网格单元包含物体的中心点,但是它与真实框的IOU没有它的另外一个bounding box与真实框的IOU大。(一个网格单元有两个bounding box,选择与真实框的IOU大的来负责检测物体)。
5)、第五项
第五项则是负责检测网格单元的分类误差,在上文我们说过每个网格单元都要预测出它的条件概率 ,而且是一个20维的向量(在PASCAL VOC中有20个标签类)。预测值出的条件概率可能是[0.1,0.2,0.5,0.5...],而数据集中的标签值则是包含1,其余为0的20维向量,所以预测的误差直接可以用相应的值相减再求平方和。
6)、对于 λcoord和λnoobj
在论文中使用λcoord和λnoobj来增加边界框坐标预测损失,减少了不包含预测对象的框的预测损失。而且设置了λcoord=5,λnoobj=0.5。
由上述对损失的逐项分解,我们可以知道前两项负责预测的bounding box的中心点和宽高定位误差。第三项负责检测物体的bounding box的confidence误差,使模型预测出的该项confidence尽可能等于bounding box与ground truth的IOU。第四项则是不负责检测物体的bounding box的confidence误差。最后一项衡量了模型的分类误差,实际上就是让模型预测出的正确类别的条件概率尽可能等于1。
1、由文章我们可以知道YOLO对群体性的小目标物体检测结果较差,比如挨得很近的小物体或者成群结队的小鸟,YOLO对这些检测效果较差。这是因为这个版本的YOLO,每个网格单元只能预测2个bounding box,而且是2个bounding box都是预测同一类。也可以这么理解,一张图片被划分成7x7=49个网格单元,每个网格单元只有一个bounding box负责预测物体,要是有几只鸟聚在一起落入一个网格单元中,那这个网格单元的bounding box只能预测一个物体,造成检测精度下降或者直接预测不到。
2、对于出现新尺寸或者配置的时,检测效果较差。
3、对预测框的定位不是那么准确,这是由于作者选择直接预测目标的坐标信息,而不是像Faster RCNN那样预测anchor的回归参数。
4、检测准确率有待提高,它在PascalVOC 2007测试数据集上达到的mAP是63.4%,相比于Fast R-CNN稍微低些。
1、速度很快,实时图像处理达到45FPS,它的一个小版本Fast YOLO更是能达到155FPS。
2、YOLO整个的检测过程仅仅有一个网络,所以它可以直接进行end-to-end (端对端:指的是输入原始数据,输出的是最后结果,应用在特征学习融入算法,无需单独处理)的优化。
在学习完YOLO v1论文后收获非常大,特别是损失函数部分,这个学期上的模式识别课上老师讲解过损失函数,但是课上没有太理解。而在这周的论文学习过程中,我带着问题去一步步分解YOLO的损失函数,较好的理解了课上所学和论文中对损失函数的设置原由。