我正在参加「启航方案」

本文是我和老友 @Zee 读论文后整理而来,部分表述或许存在不清晰之处、乃至或许出现过错。欢迎交流纠正。
部分图片源于互联网,如有侵权,请联系我删除


R-CNN

R-CNN(Regions with CNN features) 是深度学习范畴的经典框架之一,初次将卷积神经网络(CNN)引入了方针检测范畴,并取得了优秀的作用。为了完结这个目的,本文解决了两个主要问题:运用深度网络定位方针,以及运用少数有标示的数据集练习出高容量的模型。

本文运用的数据集为 PASCAL VOC ,详细内容能够参阅 方针检测数据集PASCAL VOC详解

本文涉及文章:Rich feature hierarchies for accurate object detection and semantic segmentation

结构

此方针检测系包括三个模块

  1. 生成各自独立的区域候选框
  2. 较大的卷积网络,用以从各区域中提取定长的特征向量
  3. 一些用以分类的线性 SVM(支撑向量机)

终究实际上还有一个部分,运用回归算法精修候选区域。根本流程如下图:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

确定候选区域

文章的这一部分用的是 Selective Search ,一种传统的方针检测算法。文章里仅是一笔带过,故在此不做赘述。详细算法原理能够参阅:理解Selective Search – 知乎 (zhihu.com)。

此处运用它生成两千个候选区域。

特征提取

此部分经过五个卷积层、两个全衔接层,将传入的 227*227 的 RGB 图片提取为 4096 维的特征向量。卷积网络的结构如下:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

关于恣意区域巨细的图片,这儿终究选用的是直接拉伸的办法转为 227*227。不过在拉伸前会对区域框做一个扩展处理,使得拉伸后的图片周围有原图的 p 像素上下文(此处 p = 16 )

文章的支撑资料里探讨了几种不同的 warp 办法。

SVM+NMS

关于每一个类别,作者运用相应的已练习好的 SVM 对已提取出的特征向量进行打分。当一切候选区域都打完分后,对每个类别运用 NMS(非极大值抑制)算法,丢掉那些 IoU 高出 给定阈值的区域。下面详细介绍这个部分:

IoU

Intersection-over-union,正如其名称所言,核算的是两个矩形框的交集区域面积除以并集区域面积

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

该值的取值范围为 [0, 1],0 代表彻底不相交,1 代表二者彻底等同

NMS

NMS 用于去除重复框,作用如下

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

它的算法原理并不杂乱,主要是下面这几个进程:

  1. 给定n个候选框,根据其分数从大到小排序
  2. 循环遍历每一个框,核算它与其他框的 IoU ,假如大于特定的阈值,就丢掉对应的框(由于那俩很或许框的是同一个东西)
  3. 重复,直至一切框处理完结(被保存或丢掉)

对应 Python 代码如下:

import numpy as np
def nms(dets, thresh):
    """ :dets 给定的候选框
        :thresh 阈值
        return 保存的框们
    """
    # 获取dets的各种信息
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = scores.argsort()[::-1]
    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        # 核算 IoU
        ovr = inter / (areas[i] + areas[order[1:]] - inter)
        # 保存 IoU 低于 thresh 的那些框
        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]
    return keep

练习

预练习

CNN 在 ILSVRC 2012 练习集上做了预练习,该数据集具有图像级别的标示(也便是没有候选框)

微调

为了使 CNN 适应于方针检测的新任务,作者运用缩放后的候选区域微调网络。这一进程中,网络的终究一层(分类输出层)从 1000 维更改为了 21 维 (20 种不同的方针 + 布景),其他层结构不变。作者将一切与人工标示的框的IoU大于 0.5 的区域认为是正类(也便是对应分类)、小于 0.3 的是布景(这俩数值是{0, 0.1, …, 0.5}以网格搜索的方式整出来的)。
梯度下降的初始学习率为 0.001 (预练习时的10%),每一轮采样 32 个正样本区域和 96 个布景区域组成 size 为 128 的 batch。鉴于相较于布景来说,正类较为稀疏,因而采样时会倾向于正类。

Bounding Box Regression

作者运用由 D. Hoiem, Y. Chodpathumwan, and Q. Dai. Diagnosing error in object detectors. In ECCV. 2012. 提出的方针检测剖析东西来探求此办法的过错模式,理解微调是怎么起作用的。一顿操作后,提出了 Bounding Box Regression 用于降低定位差错。经过运用从 Selective Search 选出的区域的 pool5pool_5 特征(CNN 的第五个卷积层后的最大值池化层) ,作者练习了个线性回归模型以猜测一个新的候选区域。成果显现,这协助修正了很多的过错定位,提高 mAP 3到4个百分点。

成果和问题

其时,这一模型在 PASCAL VOC 2012 数据集上得到了 30% 的提高(相较于之前的最好成果),作用能够说是斐然、
可是,R-CNN 也有很多问题:

  1. 。尽管在原论文里,作者一直在着重“咱们这个办法很快”;但展现的数据放在今日看却慢的吓人:用(其时的)GPU 检测一张图片需求 13s,而 CPU 乃至达到了 50s+。这样的耗时不难理解:每张图要先用 Selective Search 提取 2000 个候选区域,每个候选区域都需求用 CNN 提取特征,并用 SVM 进行分类,这也是后边改善的重点。
  2. 。由于后边的进程需求前面进程发生的特征,保存这些特征需求占用很多的存储空间。
  3. 图片变形。由于送入 CNN 时图片被强制缩放到 227*227,因而难免变形

正由于有这样的问题,R-CNN 后续有很多改善。下面继续介绍

Fast R-CNN

正如名称所言,Fast R-CNN 是对 R-CNN 的改善,成果不只能运用较深的卷积神经网络(VGG16),练习上速度也快了后者仅 9 倍,测验上更是快了 200+ 倍,检测单图仅需 0.3s (不包括发生候选区域的时刻);它在 VOC 2012 上的 mAP 也达到了 66% ( R-CNN 是 62% )。
不过,在正式介绍它之前,咱们先看另一项 R-CNN 的改善:SPPnet

SPPnet

SPPnet,提出于Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,经过同享部分核算加快了 R-CNN。简单来说,SPPnet 对整张图进行卷积、核算特征(而不是像 R-CNN 一个候选区域来一次),然后运用对应部分的特征对每个物体进行分类。经过最大池化,将候选框内的特征图转化为固定巨细的输出(例如66)来提取对应候选框的特征。多输出尺度被池化后衔接成空间金字塔池。SPPnet 在测验时将 R-CNN 加快10到100倍。由于更快的候选框特征提取,练习时刻也减少了 3 倍。
简而言之,SPP 能够完结 恣意尺度输入、固定尺度输出(给全衔接层)。SPPnet 基于此完结了对不同输入尺度的适应性。

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

但 SPPnet 也有缺陷,类似 R-CNN ,它也是多阶段流水线,包括提取特征、微调、练习 SVM 以及终究的 Box Regression,这些特征也得写入到磁盘。所以接下来回到主题,看看 Fast R-CNN 的改善

长处

总的来说,相对 R-CNN 和 SPPnet,它有这几个长处:

  1. 更高的 mAP
  2. 单阶段练习,运用了多任务丢失(multi-task loss)
  3. 练习时会更新一切网络层
  4. 无需将特征存储于磁盘

结构

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

Fast R-CNN 仍然运用 Selective Search 发生候选区域,并将图片和这些候选区域作为输入。不同于对每个候选都做卷积,Fast R-CNN 对整张图片卷,并发生一个卷积特征图,然后对每个候选 RoI(Region of Interest,感兴趣区域)用 RoI 池化层发生定长的特征向量,丢入全衔接层。终究会发生两个同级输出:第一个是分类成果,第二个是精修过的区域方位。
这儿能看出比较风趣的另一点是,Fast R-CNN 将 R-CNN 终究的 Box Regression 也巧妙结合到了整个网络中。不过下面咱们先看看另一个说到的东西: RoI 池化层

RoI 池化层

此层运用最大值池化,将恣意感兴趣的有用区域转成小的、定长的特征图(长度 H*W,比方 7*7,H、W均为超参数)。本文里,RoI 运用一个四元组界说 (r,c,h,w)(r,c,h,w),别离对应左、上、高、宽
详细的操作时,RoI 池化层将 h*w 的 RoI 窗口划分为 H*W 的网格,然后将每个小格对应方位的值最大值池化、放入对应的网格内。对特征图的每个通道来说,这样的操作都是独立的。
其实这一层便是简化版的 SPP ,便是把金字塔池化缩到了一层。把不同尺度的输入丢进去,终究都能得到固定维度的特征,能够丢给全衔接层。 一个 h*w = 5*5 的输入经过 H*W = 2*2 后,成果暗示如下

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

练习

初始化

本文测验三个从 ImageNet 练习出来的模型,别离是 R-CNN 用的 CaffeNet(AlexNet 改善版)、VGG_CNN_M_1024 和 VGG16,从小到大别离称为SML。为了适应本文作用,模型做了如下三个改换:

  1. 终究的最大值池化层改为了 RoI 池化层,对每个模型固定了这一层输出的巨细 H*W (比方 L模型便是 7*7)
  2. 终究的全衔接层和 softmax 换成了上面描绘的并行层
  3. 模型的输入被改成了两个部分:图片自身和相应的 RoI 区域

微调

对R-CNN 和 SPPnet 来说,当练习时,它们的某一批候选区域是随机挑的,比方 128 个候选区域或许来自 128 张不同的图片,但 Fast R-CNN 则是从 N 张图片里每张取 R/N 的候选区域出来,比方 N=2,R=128 两张图各取 64 个。更重要的是,由于同一张图的 RoI 能够同享核算,因而相较于之前的两个网络,它能大幅加快核算速度。

多任务丢失

由于输出是两个并行的层,Fast R-CNN 的丢失函数也便是二者之和。详细界说为

L(p,u,tu,v)=Lcls(p,u)+[u≥1]Lloc(tu,v)L(p, u, t^u , v) = L_{cls}(p, u) + [u ≥ 1]L_{loc}(t^u , v)

前半部分 Lcls(p,u)=−log⁡puL_{cls}(p, u) = – \log p_u 即为猜测类别(p)和实在类别(u)的对数丢失;后半部分则为区域的丢失。其间,\lambda为二者的平衡系数(在本文里均运用 1 ),[u ≥ 1]则表明仅当 u 为实在类别时才核算,u = 0 (布景类)时不核算。终究的部分界说如下:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

同 R-CNN 运用的 L2L_2 丢失(x2x^2)不同,此处的丢失更平滑。当 x 较大时,前者的梯度(2x2x)较大,简单导致梯度爆炸;而此处的式子会坚持梯度恒小于等于 1。

Mini-batch 采样

如上面已经展现的那样,Fast R-CNN 用 2*64 个 RoI 组成 mini-batch,类似于 R-CNN ,里边包括 25% 的方针样本(IoU >= 0.5)和 75% 的布景样本(0.1 <= IoU < 0.5)。在练习时,每个图片有 0.5 的概率水平翻转。

其他练习时的一些细节,如超参数的选择等此处省略,感兴趣的能够参阅原文。

检测

检测的根本进程已经在结构里概述过,此处不再赘述。说一句,在得到成果的分类框和各自的分数后,Fast R-CNN 也对运用了 NMS,对每个类别的重复框做了处理。
在做检测时,作者发现,有比较多的时刻花在了全衔接层上。而咱们知道,全衔接层其实便是在核算矩阵 WxWx。为了加快这一进程,作者用到了 SVD(奇特值分解)。

SVD

简单来说,对给定的恣意形状矩阵 MM,都能够分解成下列方式

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

假定原始矩阵巨细为 n*m,则分解出的三个矩阵巨细别离如下

【深度学习】读论文——目标检测 R-CNN、Fast、Faster
矩阵 \Sigma 仅在对角线上有值,称为奇特值,按重要程度从左上到右下排序。因而,咱们能够仅保存前 kk 个奇特值,一起舍去U和VTU和V^T多余的行和列,就能起到压缩的作用。被保存的区域如下图所示:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

压缩后的三个矩阵相乘,巨细仍为 m*n,且信息根本坚持不变(在k值适其时)。

终究到完结时,相当于把一个全衔接层改为两个,第一个不含偏置,第二个才加上偏置。

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

一些成果

下表来自原文,别离展现了三者在练习和测验上的速度

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

能够看到,关于 L 模型,Fast R-CNN 在练习上比 R-CNN 快到了 8.8 倍,测验上则达到了 213 倍(加上 SVD 的状况);一起,它的 mAP 也高于 R-CNN。

除此之外,作者还做了不少的比照试验,检验了对微调层的选择、多任务练习是否有协助、scale 的策略、练习数据添加是否有协助、softmax 和 SVM 比照、更多的候选框是否有用等,感兴趣的同学能够阅览原文,此处不再赘述。

缺陷

尽管 Fast R-CNN 有不少长处,但仍然存在一些缺陷。其间,由于它选择候选框仍然运用 Selective Search 算法,这成了耗时的主要来源。后文的 Faster R-CNN 就针对此做了改善。

Faster R-CNN

此部分由我的老友 @Zee 撰写的 PPT 整理而来,由衷感谢他的支撑。
对应文章:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

结构

Faster R-CNN 相较于 Fast R-CNN 的最大改善便是,它提出了 RPN 结构来代替 Selective Search 生成候选框,而且与方针检测的卷积层进行同享来缩短练习时刻和测验时刻,一起提高方针检测的精度。二者结构的比照方下所示:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

观察上图,咱们能发现,Faster R-CNN 运用 RPN 结构从特征图中发生候选区域,而其他部分均与 Fast R-CNN 类似。文章里作者运用了两种卷积网络:ZFVGG16,下图是运用 ZF 网络的详细结构图

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

所以接下来,咱们就来看看 RPN 是个什么东西?

RPN

关于特征图 ,咱们运用一个 n*n(文章中n=3) 的滑动窗口, 对每个中心点生成个 个 (原文为 3×3 共九个, 三种比例别离为 1:1, 1:2, 2:1,三个尺度别离为 128 , 256, 512) anchors。发生的 anchors 暗示如图:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

之后对一切的 anchors 做 bounding box regression 回归,这样假如对应的 anchor 有对应方针,就能找到尺度最匹配的框。
经过 33 卷积层后,每个滑动窗口被映射为一个维度为 d 的低纬特征向量 (关于 ZF 是 256, VGG16 则为 512 ) , 它被送入到两个并行的 11 的卷积层,别离生成 2 和 4 的输出。前者 H*W 代表 anchors 的组数,每组包括 k 个 anchor,相邻的两个数字别离代表猜测为方针物体和布景的概率;后者其他类似,4 个数字代表终究框的宽高以及方位偏移的相关量。
终究,将两个输出和 reshape 信息一起结合,生成对应于原始图片尺度的 proposal, 与 feature map 一起送入 RoI pooling 层。后续结构与 Fast RCNN 共同。

丢失函数

类似于 Fast R-CNN ,Faster 的丢失函数也由两部分组成:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

  • 分类丢失是 log 丢失, i 是每一个 minibatch 中每个 anchor 的索引
  • 假如 anchor 为 positive,pi∗p_i^* 为 1, 否则为 0; pip_i 表明 anchor 为 positive 的概率
  • 回归丢失函数是 smooth L1L_1
  • tit_i 是表明(, , , ℎ)四个参数的猜测向量,ti∗t_i^* 是表明 ground truth 对应的向量
  • 终究运用 NN_{}_{} 来进行规范化,原文中设置 N=256N_{}=256Nreg=2400N_{reg}=2400=10\lambda =10; 代码中 N=256N_{}=256Nreg=128N_{reg}=128=1\lambda =1。由于只有正 anchor 才会被核算回归丢失, 而 mini-batch 一般是 128 个正样本和 128 个负样本

练习

在练习时,作者选用了四步练习法来完结 RPN 和 Faster R-CNN 的卷积层参数同享。详细进程如下:

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

试验

文章做了很多的试验,以验证各要素对算法作用的影响。

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

【深度学习】读论文——目标检测 R-CNN、Fast、Faster

缺陷

当然,Faster R-CNN 也存在一些缺陷,咱们的归纳如下所示

  • 卷积提取网络:无论是 VGGNet 还是 ResNet,其特征图仅仅是单层的,分辨率通常也较小,这些都不利于小物体及多尺度的物体检测,因而多层融合的特征图、增大特征图的分辨率等都是能够优化的方向。
  • NMS:在 RPN 发生 Proposal 时,为了避免重叠的框,运用了 NMS,并以分类得分为筛选规范。但 NMS 自身的过滤关于遮挡物体不是特别友爱,自身属于两个物体的 Proposal 有或许由于 NMS 而过滤为 1 个,形成漏检,因而改善优化 NMS 是能够带来检测功能提高的。
  • RoI Pooling:Faster R-CNN 的原始 RoI Pooling 两次取整带来了精度的丢失,因而后续 Mask RCNN 针对此 Pooling 进行了改善,提高了定位的精度。
  • 全衔接:原始 Faster R-CNN 终究运用全衔接网络,这部分全衔接网络占据了网络的大部分参数,而且 RoI Pooling 后每一个 RoI 都要经过一遍全衔接网络,没有同享核算。
  • 正负样本:在 RPN 及 RCNN 部分,都是经过超参数来限制正、负样本的数量,以确保正、负样本的均衡。而关于不同任务与数据,这种正、负样本均衡办法是否都是最有用的值得考虑,且现实生活中得到均衡的正负样本有时难以完结。
  • 两阶网络:Faster R-CNN 的 RPN 与 R-CNN 两个阶段分工明确,带来了精度的提高,但速度相对较慢,实际完结上还没有达到实时。因而,网络阶数也是一个值得考虑的问题。

感谢阅览,如有协助,欢迎不惜点赞。
本文仅发于和个人渠道,作者 FunnySaltyFish。