YOLO(You Only Look Once)论文记录

前言:
{

    最近想了解以下目前比较先进的目标检测(object detection)模型和方法,所以就在github上搜到了https://github.com/amusi/awesome-object-detection,这里面介绍了不少目标检测的文章。

    YOLO(You Only Look Once)我之前见过,可只是知道它是目标识别的方法,并且效果不错,但没有了解其具体过程。这次就来分析一下。

    论文地址:https://arxiv.org/pdf/1506.02640.pdf

}

正文:

{

    在一开始的第一节,论文描述了之前方法的缺点:至少被分为两个部分——框的生成和分类,并且需要分别的训练。YOLO却只通过一个网络生成框和类别,而且没有复杂的数学原理,使用的是神经网络的回归过程。

  

    第二节介绍了其结构和原理。

    首先,输入图像被划分为S*S块网格,对每块网格都会生成B个框的预测和C个类的预测,每个框的预测包含x坐标,y坐标,宽度,高度h和置信度,网络的输出为S x S x (B*5 + C)的张量。具体结构可如图3:

  

    这种情况下,B=2,C=20,S=7,所以输出维度为7 x 7 x 30。

    我认为,从网络的输入层到第一个全连接层(4096维特征向量之前)是一般的特征提取层,和inception_V3/V4等模型的瓶颈层之前的层类似,或者说在不考虑速度的情况下可以被这些模型的部分替代。

    激活函数有两种:一种是线性函数,用在最后一层;另一种函数如式(2):

   

    损失函数由式(3)的几个部分组成:

   

    其中,x和y为框的x和y坐标,w为框宽,h为框高,C为框的置信度,pi(c)为类c的概率,并且代表对中心在网格i中的所有实际目标,计算和此目标IoU最大的预测框的相关损失(关于IoU可以参考:https://blog.csdn.net/eddy_zheng/article/details/52126641)。

    文中提到了一个问题:在一般情况下,很多网格都是没有对应的框(即对应的置信度应该都为0),但是每个网格都会有5个对应的不为0的预测置信度,这会导致训练(梯度)被集中在置信度相关的部分。所以设置=5和=0.5来修正。

    对w和h取平方根是考虑到了小的框对小的偏移比大的框对小的偏移更敏感。

   作者在来自PASCALVOC 2007 和 2012的数据集上进行了大约135个epochs的训练;batch大小为64;momentum为0.9;decay为0.0005;learning rate在刚开始的epochs(没计入135个epochs)中从0.0001持续上升到0.001,在后面的75个epochs中保持0.001,在之后30个epochs中为0.0001,并且在最后30个epochs中为0.00001,在第一个全连接层后面加了比率为0.5的dropout层;并且进行了相关数据增强。

    第二节的最后,作者介绍了YOLO的局限性:

    1,由于网格所能检测的目标数量是固定的(每快网格只能检测一个类),所以当检测重复小目标时效果不是很好。

    2,最后的全连接层的输入是一维的特征向量(论文中说relatively coarse),泛化能力不强。

    和3,就像上面所说,小的框对小的误差比大的框对小的误差更敏感。论文中只对宽度和高度做了有关处理,所以还是会因此出现定位不准确的问题。

   

    第三节第四节主要是与其他方法的对比和实验。这里就直接上实验结果,表1和图4:

   

   

    图4表明,虽然Fast R-CNN正确率更高,但是错的也更离谱。

    后面还有一个排行榜,表3:

  

}

    可以看到,在标准实时性的同时,YOLO也达到了还可以的效果。值得注意的是,Fast R-CNN + YOLO实现了比单独Fast R-CNN还要好的结果。

结语:

{

    其实YOLO的网络结构还是很容易理解的,我认为核心特点是最后的输出张量。另外,从实验结果可以看出,目标检测还是有很大研究空间。

}

猜你喜欢

转载自blog.csdn.net/fish_like_apple/article/details/82634004