Yolo 目标检测学习笔记
1.Yolo思想
Yolo框架主要用于目标检测,与其他目标检测框架相比(R-CNN,FAST-RCNN,FASTER-RCNN),Yolo将多个训练步骤集成在一起,从而缩短网络推理的时间开销。
首先,与其他框架依靠region proposal来检测目标不同,Yolo将整个图像作为输入,经过网络后将图像划分为S*S的格网。所谓格网就是最后层特征图,该特征图中的一个像素对应原始输入raw_input/S大小的区域。
对于格网中的每一个格网元,都要预测B个bounding box和一个置信度得分。每个bounding box包含5个具体要预测的值,分别为(x,y,w,h,confidence)。其中x和y是bounding box的真实x相对于格网的坐标的偏移值,y同理,其公式如下:
X = bounding box 的真实X / (图像宽度/S)- grid cell的X坐标
Y = bounding box 的真实Y / (图像高度/S)- grid cell的Y坐标
w和h是相对原始图像w和h的转换后的值:
W = bounding box的真实W / 原始图像的W
H = bounding box的真实H / 原始图像的H
这样做的目的是将预测归一化到0-1之间,有利于网络的回归。
同时,每个grid cell还要负责预测每个Bounding Box的置信度,该置信度表示该预测的bounding box是否包含了一个对象以及它包含的有多准。
Bounding box的置信度计算如下:
该公式为目标在该bounding box中的概率乘以预测bounding box 和真实bounding box的IOU。
最后,每个grid cell输出其与类别相关的条件概率,该条件概率表示该grid cell中包含的物体属于具体某一个类的概率。
在测试阶段,将类别条件概率和每个bounding box的置信度相乘得到每个bounding box和类别相关的置信度。
因此,对于一个S*S的个格网,网络会输出S*S*(5*B+C)个预测值。在论文中,作者使用PASCAL VOC数据集,该数据集共20个类,S设定为7,B设定为2,因此网络最后的输出为7*7(5*2+20)---->
7*7*30维的输出。
2.网络设计
基础网络通过修改googlenet而来,作者去掉了goolgenet的inception模块,只使用1*1卷积和3*3卷积,并使用2*2的最大池化将特征图的维度递减两倍。在googlenet的最后一层7*7的特征图后,接入两个全连接层,第一层全连接为4096,第二层全连接的维度为1470(7*7*30)用于输出预测值。最后将全连接层进行reshape,reshape成7*7*30的特征图并接入损失函数。
3.训练
首先使用imagenet的数据对修改后的googlenet进行分类模型的学习,随后将模型迁移至目标检测任务上去。为了获得更好的结果,作者在原始网络的基础上增加了4层卷积和2层全连接层,并将原始224*224的输入上采样到448*448进行检车任务的学习。对于最后一层,作者使用线性激活函数,其余层均使用leaky-relu激活函数,其公式如下:
因为预测的bounding box中很大一部分并不包含目标,导致了数据类别的严重不平衡们为了解决这个问题,作者给包含目标的bounding box和不包含目标的bounding box施加不同的权重,从而对损失函数进行平衡。对于前者,其权重为5而后者为0.5.
同时为了解决大的bounding box和小的bounding box的数值误差,作者预测的bounding box的h和w为其原始h和w的平方根。
对于每一个gridcell,预测其都会预测多个bounding box。作者希望对于每一个目标只有一个专门的预测器进行预测,因此作者通过实时检查当前预测的bounding box和真实bounding box的IOU,并选择其中最大的IOU进行bounding box的预测。
yolo的损失函数如上。yucek
预测阶段,使用极大值抑制(NMS)算法去除多余的预测框。