天天看点

R-FCN-3000算法详解

R-FCN-3000算法详解

    • 论文背景
    • 算法详情
      • 算法重点
      • 算法提升
      • 算法对比
        • 迁移分类器到检测器
        • 共享过滤器
        • 共享对象特征
      • 全卷积检测器的设计
        • 有监督训练
        • Super-class
        • 神经网络结构
        • 标签
        • 损失函数
      • 实验
        • 实验细节
      • 结论

论文背景

论文全称:R-FCN-3000 at 30fps: Decoupling Detection and Classification

论文链接:https://arxiv.org/abs/1712.01802?context=cs.CV

论文日期:2017.12.5

本文提出了一个R-FCN-3000算法,针对多类别数据集的实时检测。每秒可以检测30张图片,可以检测3000类对象。 该算法将检测与分类解耦,为了获得检测分数,将目标分数与分类分数相乘。

该目标检测算法是对与R-FCN算法的优化,因为在R-FCN算法中,需要训练共享的position-sensitive filters,对于多类别的检测,训练卷积核会耗费大量的时间。

对于细粒度的分类器, position-sensitive filters是不必要的,R-FCN-3000在ImageNet数据集上可以达到34.9%mAP的准确率,YOLO-9000能每秒检测30张图片,但是只能达到18%的准确率。

==R-FCN-3000学习的对象可以泛化到新型对象上,并且表现会随着训练对象类别的增多而增强。==支持可以学习一个通用检测器的假说。

算法详情

由于CNN算法结构强大的特征学习能力,深度学习神经网络算法在目标检测领域表现优秀,尤其是在拥有十类样本的标准数据集上取得了很大进展,但是在真实案例中只有微小的进展,因为需要实时检测上千类样本。样本的数量太多, 之前的算法表现不佳。

YOLO-9000是一个基于对类别样本的检测算法,本文提出的R-FCN-3000与YOLO-9000比较,准确性有了18%mAP的提高。

本文提出了一个对于R-FCN算法的优化,全卷积检测器需要计算每一个类别的对象分数,能在有限的预算内表现出优秀的准确性。但是全卷积神经网络要求对于每一个类别的特殊过滤器集,从而阻止了将他们应用于多类的数据集。因为这会导致需要计算大量的过滤器,使得计算非常缓慢。

算法重点

目前的大尺寸检测算法都是以牺牲准确性为代价的,例如YOLO-9000。

目前的全卷积神经网络算法是需要计算每一个类别的分数。虽然对于大多数算法而言,准确率高且计算量小,但是不能共享卷积核,需要单独针对每一个类别训练大量的卷积核。 而针对3000类对象,需要训练大量的positive-special filters,会导致检测非常缓慢。

R-FCN-3000解耦目标检测与分类,定位的计算量不会随着类别的增多而增加。将相似的类别进行级联并且共享参数,

R-FCN-3000算法分为两部分,首先是固定数量的super-classes得目标检测器(带有position-sensitive filters),接着是对于每一个super-class的细粒度分类器(不带position-sensitive filters)。

super-classes是超类别,指代一个大类,例如狗类。是通过聚类图片的深度语义特征得到的(例如ResNet-101有2048维的特征)。因此不需要进行语义分层。

在检测时,将检测分为两步:

  1. 固定超类别数目的目标检测器。
  2. 每一个细类别的细粒度分类器。

将看起来相似并且共享部分特征的类别级联起来,同一个大类的目标合并为一体,一起计算。例如识别目标是否是狗,而不识别是哪类狗。使用大类替代细类,然后训练position-sensitive filters。

给定位置的细粒度类别概率通过将超类别概率与细粒度类别概率相乘。

R-FCN-3000算法详解

算法提升

为了学习使用super-class的影响,而不是独立的每一类目标。本文将super-class的数量设置为1至100,并ImageNet数据集上进行实验,结果表明,准确性得到了很大提升,即使将super-class的数量设置为1。这也表明position-sensitive filters可以学习用于检测通用对象,对象是一个通用概念,一个通用的目标检测器可以被学习。

通过分别检测一大类的目标,再进行类别的细分,可以提高目标检测的速度,并且可以增多检测的类别数量。 因为不需要训练每一个类别的position-sensitive filters。

随着类别数量的增多,在大量类别的数据集上准确性提高,且泛化性增强。泛化性随着训练类别数量的增多而增强。

算法对比

迁移分类器到检测器

最初使用深度卷积神经网络来进行多类别目标定位,利用回归来预测定位的边界框。之后RPN被用来在目标检测中进行候选区域的提取,是在ImageNet数据集上进行测试的,但没有实验在没有特殊训练的数据集上进行。弱监督检测器是过去解决多类别检测的一个主要研究领域。使用边界框训练的检测器可以别迁移至没有边界框的类别。这一假设也使训练一个固定类别数量的检测器成为可能。

对于一个无监督的类别,从一个分类器至检测器的迁移也被学习,基于级联用于迁移分类器到检测器的弱监督数据方法的多实例学习也被提出了。

YOLO-9000算法共同训练分类数据与检测数据,分类损失就是利用拥有最高分数的边界框进行反向传播计算。这假设预测框就是真实框。 YOLO-9000非常快,因为只使用一个轻量级的神经网络,并且对于每个类别只使用3个过滤器进行定位。然而,对于良好的定位,3个优先的过滤器是不足够的。

共享过滤器

== 级联可以与其他类别共享的部分,对象类别间共享卷积核来减小模型复杂度并且减小训练基于部分卷积核需要的训练数据数量。==

在过去的算法中显示,共享过滤器会使算法更泛化。 Deformable-R-FCN, R-FCN, RetinaNet都没有共享过滤器,因此检测非常慢。 本文提出了一个在多个对象类别共享过滤器的结构,共享卷积核可以提高训练速度。

共享对象特征

只检测一少部分类别的对象对于获得高回召率是足够的,检测每一类目标是不必要的,R-CNN对于每一个类别都进行了边界框回归。=首先进行一个类别不可知的回归,然后一个简单的分类层对于检测就足够了。将对象的概率与分类概率相乘。

全卷积检测器的设计

有监督训练

首先需要获得上千类的带注释的数据,使用已有的带分类标签的多类别数据集,然后在其基础上打上边界框的标签,这就使训练变成有监督的,目标检测的准确性得到了很大提升。

监督学习需要准确的边界框标签,表现比弱监督学习表现更好。

对于检测狗类,只需要学习纹理与外表特征,而不需要学习检测部分,例如腿部或者尾巴。

然而手工打标的花费是很高的,因此选用ImageNet数据集,每张图片只包含1个或2个目标,会降低打标签的花费。准确性得到了很大提升。

ImageNet基础的算法检测较快,每秒大概1-2张图片。

COCO数据集的比较慢。

因为ImageNet数据集有边界框标签,ImageNet分类数据集上训练的大尺寸准确器比弱监督检测器表现更好。

Super-class

全卷积目标检测器基于不同尺寸与比例或者以每个类别的position sensitive filters的形式学习特定类别的过滤器,因此,当类别数过大时,计算就会变得非常不灵活。

分别训练一个目标 / 背景的检测器与一个分类网络。

因此获得可以共享position sensitive filters的外表相似的对象集,获得第 j 类的对象,xj,然后计算例如ResNet-101最后一层的2048维特征向量的平均值。

Super-class是通过使用K-means聚类算法获得的。

神经网络结构

R-FCN-3000算法详解

原始的R-FCN没有解耦成两个分支:

R-FCN-3000算法详解

在conv5之后有两个独立卷积层,检测分数与边界框回归偏移。

使用RPN得到候选区域,设置被训练的独立类别的检测器集为C,super-classes是K,对于每一个super-class k,有P × P个位置敏感过滤器。

最后还加上背景这一个超类别, (K + 1)×P ×P 个filters。

检测与分类概率相乘得到最后的检测分数。

裁剪,遮盖与均等不是检测的瓶颈。

标签

检测分支:当对于i类super-class数据的所有真实框,边界框的IoU大于0.5时,我们将RoI设为正样本,否则设为背景。背景的标签为1。

对于分类分支:对于所有的细类别,IoU大于0.5的边界框为正样本,只有正样本被用于训练。分类的类别量为C,而不是K+1。

损失函数

对于检测器,使用online hard example mining (OHEM),损失函数使用L1函数,

对于细粒度的分类器,使用softmax函数,当正样本的数量太少时,分类分支的损失函数乘以参数0.05。

保持每一个分支的损失函数的平衡是非常重要的。

实验

数据集

R-FCN-3000算法详解

选用ImageNet数据集,数据集共有3130类对象,每类对象都有大约100张图片,本文只选取了其中的194类对象,并且选用6类没有边界框的对象用作测试集。

实验细节

图片的像素为375 × 500,锚框使用64,128,256三个尺寸,f (1:2), (1:1) 与 (2:1)三个比例,因此在RPN神经网络,每个像素点都有9个锚框。并且训练7个epoch。

前1000次迭代使用0.00002的学习率,然后增加至0.0002。在5.33个epoch之后学习率被提升10倍。

在两个英伟达P6000 GPU上训练3130类对象花费了两周。

为了更快的训练,不使用 position-sensitive RoI pooling,只使用双线性插值方法。使用与fast R-CNN相同的方法基于不同的集群数量以及类别数量训练变形的R-FCN,训练1000类对象只花了2天。

利用水平翻转进行数据增强,使用两个尺寸(375,500) 与 (750,1000) 进行多尺寸推测,并且结合NMS进行两个尺寸的预测。使用使用ResNet-50作为神经网络的主干。

不同尺寸的数据集的对比实验:

R-FCN-3000算法详解

与弱监督检测器的对比实验:

R-FCN-3000算法详解

不同数量的超类别的对比实验:

R-FCN-3000算法详解
R-FCN-3000算法详解

NMS中不同数量的超类别的对比实验:

R-FCN-3000算法详解

结论

R-FCN-3000算法具有很强的泛化性以及准确性,通过将分类分数与检测分数相乘计算得到对象分数,随着训练的对象数量的增多,泛化能力增强。

在未来我们要思考如何提高算法在100000类对象的场景中提高分类速度。

继续阅读