R-CNN系列其三:Fast_R-CNN

介绍

R-CNN的创始人Girshick(同样来自微软)对R-CNN与SPP-Net有了更多思考后,对这种需要多阶段进行训练的目标检测框架做了重大更新。使得整体的目标检测这一部分不再由多阶段来完成,而是统一使用一个CNN网络来完成特征提取,区域提案分类及后期对检测框的微调等三样工作。这个创新算是不小,相对于之间流程的复杂,简单后了的模型不只实现了训练与推理速度的提升,同时也带来了目标检测精度的增加。大牛水平就是高啊!往往能够通过将模型简单化来使得问题得到更好的解决。高山仰止!

R-CNN目标检测框架的缺点

  • 它的训练是多阶段的:我们在使用像Selective Search等方法获得图片的区域提案后,先使用这些提案作为输入来训练出一个收敛、精度还算可以的CNN网络;然后去掉此CNN网络最后的Softmax层/FC层后,直接使用网络最后的CNN层输出的feature maps作为一个SVM分类器的输入,对SVM分类器进行训练以识别出此区域提案可能的分类;最后第三个阶段同样是利用第一阶段训练得到的CNN前端网络拿到处理过的CNN层的feature maps,将之作为输入来训练一个逻辑回归模型以来对区域位置进行较正;多阶段训练本身就是复杂的,难操作的;
  • 训练时的空间与时间复杂度高:训练第二、三阶段所用的SVM与逻辑回归分类器都需要将图片区域提案通过第一阶段训练得到的CNN网络以生成相应的特征向量;一般这些特征向量都会存储在硬盘当中;对于VGG16的前端CNN网络,一般需要2.5天的GPU时间来处理5000张VOC07 图片,而这些图片产生的特征向量则需要数百GB的硬盘空间来存储;
  • 对象检测慢:因为R-CNN网络需要对每个图片之上的每一个区域提案进行三阶段处理,因此需要的时间极长,当使用VGG16网络时一般需要47秒来处理一副图片。

SPP-Net应用在目标检测框架上的缺点

  • 它的训练同样是多阶段的,所以与前面章节所说的R-CNN有着类似的缺点;
  • 由于SPP层的引入,它可以对整张图直接计算,以节省同张图上面多个区域提案在前端网络计算上所需的时,但在使用finetue方式进行训练模型增强时只对SPP层之后的FC层进行finetune,因此整体模型的准确度会受些影响。

Fast_R-CNN带来的改进

  • 它在多个数据集上取得了比R-CNN与SPP-Net更高的mAP准确率;
  • 使用单个阶段完成目标区域检测;(可以说是最本质的创新)
  • 训练时对所有的层进行同步更新;
  • 因为是单阶段训练所以不需要额外的硬盘空间来存储中间特征。

Fast_R-CNN网络结构

下图所示为Fast_R-CNN的基本网络结构,同过跟上篇的SPP-Net的网络结构对比,我们能够发现它结构最本质的创新即在于直接将最后FC层后得到的特征向量分别使用Softmax层与Regressor层来直接对区域方案的类别与位置进行预测与调整,这一网络结构改进后来也为其它的模型像Yolo系列与SSD所采用。

Fast_R-CNN网络结构
  • ROI池化层: ROI层的引入本质上是Fast_R-CNN对SPP-Net里面idea的最大借鉴;ROI池化层有两个参数H,W,分别表示此池化层处理后最终能得到的feature map的高与宽;任意一个ROI特征(经过之间的CNN网络处理后)都可以视为一个(r,c,h,w)的四元组,其中(r,c)表示区域左上角的位置,(h,w)则为此区域的高宽大小;ROI层在对这么一个ROI特征四元组进行处理时,会先将其分别H x W个网格单元,每个单元的大小为h/H x w/W,然后分别对每个单元做MaxPool处理以得到一个极大值,这样最终就能得到一个大小为H x W的特征输出。就此我们容易看出本质上ROI层是只有一个空间池化级别的金字塔式空间池化层。
  • 前端CNN网络的初始化:任意一个CNN分类网络都可作为它的前端CNN网络;不过对用于分类的CNN网络我们需要进行一些变形以来满足Fast_R-CNN需求,首先需要将最后一个MaxPool层替换为ROI层以来输出与接下来FC层输入大小相匹配的feature maps;另外则需要将CNN分类网络最后端的FC层(如对于Imagenet相关的CNN网络即其最后的1000维输入的FC层)替换为两个兄弟层,一个为用于分类的Softmax层,另一个则用于区域位置检测的回归层,一般为L1回归;最后整个CNN网络的输入需要由两部分组成,分别为输入图片数据与对应的ROI区域位置提案。
  • Fast_R-CNN的训练损失函数:如下所示,可以知道它共有两个部分构成,分别对应两个层的输出(Softmax层与L1回归层);
    L(P, U, Tu, V) = Lcls(P, U) + λ[U ≥ 1]Lloc(Tu, V), 其中Lcls(P, U) = − log Pu是ROI计算得到的相对于正确类别U的交叉熵损失;而Lloc 则是此ROI最终调整过后得到的目标区域与正确目标区域之间的L1损失。

Fast_R-CNN检测模型部署

一旦我们训练出了正确的Fast_R-CNN模型,那么可按以下步骤来进行模型部署。

  • 以一张图片及其上的R个目标提案作为输入;(R一般为2000左右)
  • 一个前向运算后我们能得出每个ROI所对应的类别分布与相应的目标位置框的位置偏移(相对于输入的RoI窗口位置);
  • 接下来可使用与R—CNN类似的NMS(非最大值抑制)方法来减少预测得到的目标检测框的数目,最终得到的类别及框位置即为此图片所检测得到的类别与框。

实验得到的发现

  • 作者通过实验证实通过多目标学习来一起学习目标类别与位置相对于像之前R-CNN或SPP-Net那样对目标类别与位置分别进行学习相比,多目标学习可取得更好的mAP值;
  • 较深的网络在进行图片特征学习时会自动地学会图片大小无关的特征提取方法;因此作者认为在使用像VGG16这样较深的网络时,只使用单一缩放图片数据集进行模型训练在时间与精度权衡上效果更好。

Fast_R-CNN Caffe代码

本质上它相对于SPP-Net的主要改进在于将原来R-CNN框架下分为三个阶段去做的事情整合为一个阶段,反映在caffe model 上面即是最终的loss层实现了多目标损失函数学习。另外因为ROI层也是SPP层的一个特例,因此我们也放在这里。

---------------ROI层-----------------------

layer {
  name: "roi_pool5"
  type: "ROIPooling"
  bottom: "conv5"
  bottom: "rois"
  top: "pool5"
  roi_pooling_param {
    pooled_w: 6
    pooled_h: 6
    spatial_scale: 0.0625 # 1/16
  }
}

---------------最后几层的损失函数层----------------------

layer {
  name: "cls_score"
  type: "InnerProduct"
  bottom: "fc7"
  top: "cls_score"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 21
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

layer {
  name: "bbox_pred"
  type: "InnerProduct"
  bottom: "fc7"
  top: "bbox_pred"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 84
    weight_filler {
      type: "gaussian"
      std: 0.001
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

layer {
  name: "loss_cls"
  type: "SoftmaxWithLoss"
  bottom: "cls_score"
  bottom: "labels"
  top: "loss_cls"
  loss_weight: 1
}

layer {
  name: "loss_bbox"
  type: "SmoothL1Loss"
  bottom: "bbox_pred"
  bottom: "bbox_targets"
  bottom: "bbox_loss_weights"
  top: "loss_bbox"
  loss_weight: 1
}

参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容