YOLO9000论文详读

考试结束,我又回来了,芜湖~

摘要

      YOLO,提出了一种新颖且借鉴了之前工作的方法;

      YOLOv2使用一种新颖、多尺寸的训练方式,使得模型可以在尺寸多变的情况下运行,且有效的权衡了速度和准确率;

      本文提出的YOLO9000是一个可以实现实时目标检测的方法,可以检测超过9000类的目标。由于同时在COCO和ImageNet数据集上进行训练,使得YOLO9000可以对不含有标签的目标类别进行检测。

现阶段检测算法所存在的问题:

  1. 现阶段所有的检测算法都在追求更快的速度,更高的准确率,可检测的类别数目却仍然比较少。

  2. 现阶段用于目标检测的数据集与用于分类和标记的数据集相比,含有的图像数量少且类别少,不能满足需要,且对目标检测数据集进行标注是非常expensive的(耗时且耗力)。

改进方向:

  1. 利用现有的包含大量数据的用于分类的数据集来拓展目标检测的范围,提出了一种多层次的目标分类方法,把多个数据集结合在一起。

  2. 提出一种联合训练算法,使得模型在检测数据集和分类数据集上均可以进行训练——利用含标签的检测数据集学习定位目标,在其用于分类时可以增加vocabulary(可解释性)和robustness(鲁棒性)。

  3. YOLO与Faster RCNN相比,存在的定位错误比较多;与基于regions proposal 的方法相比,含有较低的recall,所以YOLO9000针对定位错误和recall进行了改进。

针对效果改进

  1. batch normalization(批处理正则化):批处理正则化可以显著提升模型的收敛性,并消除模型对其他形式正则化需要。在所有的卷积层使用batch normalization后,模型整体提升了2%的mAP,并且可以在不使用dropout的情况下可以有效避免过拟合的发生。

  2. high resolution classifier(高分辨率分类器):所有的state of the art检测算法都是使用分类器在ImageNet上进行预训练的。从AlexNet开始,分类器输入图像的分辨率一般小于256×256,初始的YOLO也是使用输入为224×224分辨率的分类器进行预训练,然后使用448×448的进行检测,这使得网络必须在由学习分类变换到学习目标检测的同时,调整网络使其适应新的输入分辨率。

    YOLOv2时,通过调整分类器的网络结构,在ImageNet上使用10次迭代来处理448×448分辨率的输入,从而使网络有时间调整filters的数量,来更好的应对更高分辨率的输入,然后再调整检测网络,提升了4%的mAP。

  3. convolution with anchor boxes(使用锚点进行卷积):YOLO使用全连接层直接预测出边界框的坐标信息,Faster RCNN使用RPN预测出每个锚点的置信度和offset。

    a.使用预测offset替代预测坐标信息,简化了问题,使得易于网络进行学习。

    b.删除了YOLO中的全连接层,使用锚点预测边界框——首先消除了一个池化层使得输出具有高分辨率。这里使用了416×416的输入而不是448×448,因为想在特征图中要一个奇数的locations,使用系数为32的下采样可以在416×416的图像中获得一个13×13的特征图作为输出。

    c.在使用锚点进行预测的同时,解耦了基于空间定位的类别预测机制,使用对每个锚点预测类别和对象进行替代。对象预测仍然是预测IOU值,类别预测是预测条件概率。

  4. dimension clusters(维度集群):在使用锚点时遇到两个问题:一个是边框的维度是手动精心挑选的,尽管网络可以学习如何选择最佳的优先级,但是如果我们事先给定一个较好的优先级,那么可以使得网络很容易获得比较好的检测结果。使用K-means聚类替代之前手选的方法。如果使用标准的欧几里得距离来进行k-means聚类,则大边框会比小边框产生更多的错误,但是我们想要的是依靠优先级获得更好的IOU分数,这和边框大小无关。距离计算公式使用:
    在这里插入图片描述
    其中centroid是质心。通过使用不同的k值,获得了如下结果:
    在这里插入图片描述
    本文选择了k=5的情况,因为此时可以较好的权衡模型的复杂度和high recall之间的关系。

    右图显示VOC和COCO的质心的相对关系(白色为VOC,紫色为COCO),可以看出两种都更倾向于thinner、taller的边框(手动精心挑选的形状一般short 且 wide),但是COCO的边框形状变化较大。

    在模型开始时,使用k-means聚类生成的边界框,会有更好的表现且会使得任务更容易被学习。

  5. direct location prediction(直接定位预测):在使用锚点时遇到的第二个问题是模型不稳定,尤其是在模型迭代的初期。不稳定性主要是预测边框坐标时产生的。本文使用预测相对于网格位置的位置坐标替代预测offset,这使得ground-truth的值在0和1之间,使用逻辑激活来确保网络的预测值落在这个范围内。该网络对每个网格输出的特征图预测出5个边界框,对每个边界框预测5个坐标值tx,ty,tw,th,to。如果网格的左上角坐标为(cx,cy),边界框原本的宽和高为pw,ph,则预测结果符合下列公式:
    在这里插入图片描述
    使用了含限制的位置预测方法,使得参数易于学习,且使得网络更稳定。

  6. fine-grained feature(细粒度特征):在YOLO得到的13×13的特征图基础上进行修改,使得其在可以检测大型对象的同时,因为细粒度的原因还可以定位一些小的对象。Faster RCNN和SSD都是在不同的特征图上运行网络,从而使网络具有一定范围的分辨率。本文使用一个不同的方法——添加一个直通层,可以直接在26×26的特征图上提前获得特征。该直通层通过把相邻特征堆叠到不同的通道来串联高分辨率特征和低分辨率特征,替代原本的空间位置。这使得原本26×26×512的特征图转换为了一个可以串联初始特征的13×13×2048大小的特征图。

  7. multi-scale training(多尺寸的训练):为了使模型具有更强的鲁棒性,每10次迭代就随机选择一个新的图像输入尺寸,因为模型的下采样参数为32,所以一般选择的都是32的倍数,如{320,352,…,608},这个方法迫使网络去学习如何在不同的输入尺寸的情况下进行预测,所以YOLOv2可以实现较好的权衡速度和准确率。

针对速度改进

       现有的机器人以及无人驾驶等依赖低延迟的技术,而现今大部分网络使用VGG16作为基础的特征提取器,虽然VGG16效果很好,但是据有很多无用的复杂性,以至于对一个224×224的图像需要30.69亿次浮点计算。YOLO使用一种基于GoogleNet算法自定义的网络,比VGG16快(处理224×224的图像仅需8.52亿次浮点计算),但是准确率略有下降(在ImageNet数据集,VGG16的top-5准确率为90%,本算法为88%)。
在这里插入图片描述
       本文提出一个Darknet-19的新型网络,有19个卷积层和5个最大池化层(详情见上图)。只需要5.58亿次浮点运算,在ImageNet上top-1准确率为72.9%,top-5准确率为91.2%。

  1. 在分类数据集上进行训练:在标准的1000类的ImageNet分类数据集上进行训练,随机梯度下降SGD160次迭代,使用学习率为0.1,多项式rate衰减为 4,权重衰减为0.0005,动量为0.9,与此同时也使用数据增强的方法,如随机裁剪、旋转,改变色调、饱和度等。首先使用上述的参数,使用224×224的图像进行10次迭代,然后使用448×448的图像,学习率改为10-3,这种情况下,在ImageNet上top-1准确率为76.5%,top-5准确率为93.3%。
  2. 在检测数据集上进行训练:把网络中的最后一个卷积层移除,并替换为三个大小为3×3且含有1024个filter的卷积层,每个卷积层后紧跟着一个1×1的卷积层和n个需要检测的输出结果。如在VOC中需要预测5个边界框,每个边界框有5个坐标,VOC共含有20类,所以共有125个filter(5×5+5×20=125)。同时在最后一个3×3×512的卷积层和最后一个卷积层之间添加一个直通层,从而使模型可以使用细粒度特征。使用10-3的学习率进行初始迭代,并在迭代60-90次之间将其降为10-4,共迭代160次。权重衰减为0.0005,动量为0.9,使用与YOLO同样的数据增强方法。

针对健壮性进行改进

       本文提出的在检测数据集和分类数据集上进行联合训练的方式使得模型在遇到标记的输入时可以基于YOLOv2的损失函数进行反向传播,遇到分类的图像只能反向传播分类时独有部分的损失。这种方法会遇到一些挑战,首先是检测数据集的标签和对象一般都是非常普通、常见的,而分类数据集中的标签都是非常宽泛和详细的,如果想要同时在这些数据集上进行训练,需要一个合并这些标签的方式。

       一般的方法是使用一个softmax层来通过对所有可能的类别计算概率分布,有一个前提条件是所有的类别要是互斥的。该方法并不适合把ImageNet和COCO结合起来,因为Norfolk terrier 和dog并不互斥。

  1. hierarchical classification(层次分类法):很多方法进行标记是使用的是一个平的结构,这并不适合用于联合数据集,所以建立了一个层次结构树来表示各个类别之间的关系。如果一个节点有两条边连向根节点,选择较短的那条边,如此迭代最后获得了一个WordTree。为了对含有1000类数据的ImageNet建立WordTree,使用了很多中间节点,使得1000类扩充到了1369类,在训练时,前向传播真实的标签,所以一个图像获得了Norfolk terrier的标签,同时会获得dog和mammal(哺乳动物)的标签,为了计算条件概率,模型预测出一个包含1369个值的向量,然后使用softmax计算。
    在这里插入图片描述
本文合并数据库的重点

总结

       本文主要提出了两个算法,第一个是YOLOv2——一个速度快、准确率高的检测算法,可以在多尺寸输入的情况下进行检测,且有效权衡了速度和准确率的关系;第二个是YOLO9000——通过WordTree把检测数据集和分类数据集结合在一起,再使用联合训练方法进行训练,使得模型可以对9000类目标进行检测, 有效缓解检测数据集和分类数据集之间的差异而导致检测算法性能难以提升的问题。

猜你喜欢

转载自blog.csdn.net/weixin_41963310/article/details/111500999