‍‍

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

发现之前写R-CNN系列的文章,侧重于结构设计层面的,比较零散,我写一个侧重于从R-CNN到Mask R-CNN设计思路是如何演变的,对R-CNN、Fast R-CNN、Faster R-CNN和Mask R-CNN四篇巨作有一个宏观上的认知,R-CNN系列的思维跃迁堪称科研教科书,希望大家能从中得到一些如何做研究的启发。

01

R-CNN

在那个时间点,基于深度学习的卷积神经网络开始屠榜ImageNet,R-CNN的思路非常直接,既然在图像分类方向上卷积神经网络效果这么好,那么如果把一张图的所有目标抠出来,一个一个送入CNN,不就可以将CNN和目标检测任务结合起来使用了,于是R-CNN就诞生了。

训练流程:

1.先在ImageNet上对CNN进行supervised pre-training。

2.然后在PASCAL VOC 2012数据集上进行domain-specific fine-tuning,即把ImageNet的1000分类层替换成21分类层(20个目标类加上1个背景类,因为region proposal会多产生一个背景类)进行fine-tuning。

3.然后将21分类层替换成每个类别一个线性SVM分类器(即总共21个SVM),然后进行分类训练。

4.最后加上边界框回归分支,进行定位训练。

推理流程:

1.先对输入图片使用selective search抽取2000个region proposals。

2.然后将region proposals一个一个送入CNN进行计算。

3.最后使用SVM分类器和边界框回归分支得到最终的类别和定位。

(ps: 由于后续的Faster R-CNN没有再沿用selective search和SVM,这里就不细讲了)

贡献

另外R-CNN还有一个容易被忽略的重要贡献,R-CNN之前的方法是先unsupervised pre-training,然后fine tuning,而R-CNN是第一个提出先supervised pre-training,然后fine tuning用于下游任务(说句题外话,现在的self-supervised是要重新使用usupervised pre-training的方式啊)。

最终,R-CNN在PASCAL VOC 2012数据集上比起之前的方法提升了30%。R-CNN奠定了目标检测的总体框架,开辟目标检测领域region proposal+CNN范式的新时代。

同时R-CNN埋下了两个伏笔

伏笔一

将R-CNN和OverFeat进行比较,提到OverFeat比R-CNN速度快9倍,主要是因为OverFeat的region proposals是作用在CNN后的feature map上的,CNN参数共享大大提高region proposals的并行性。

伏笔二

R-CNN中提到,SVM可能不是必须的,可能可以精简训练流程。

02

Fast R-CNN

Fast R-CNN针对R-CNN的两个伏笔进行了改进,通过CNN并行处理所有region proposal,并且同时训练分类和定位。

训练流程:

1.先在ImageNet上进行pre-training。

2.然后在PASCAL VOC数据集上进行分类和定位多任务的fine-tuning。

在训练流程上,相对于R-CNN直接将2,3,4步骤合并成一个步骤完成,大大降低了训练的复杂程度。

推理流程:

1.先将整张图片送入CNN得到feature map。

2.然后对feature map进行selective search,得到region of interest(RoI)。

3.然后将每个RoI送入RoI pooling转化成相同维度的向量。

4.最后通过两个独立的FC,预测出类别和位置。

在推理流程上,相比于R-CNN,送入CNN的是整张图片,selective search是在更小分辨率的feature map上进行的,大大减少了计算量。

下面详细讲一下Fast R-CNN的两个部分:RoI pooling和Multi-task loss。

RoI pooling

将不同尺寸大小的RoI进行维度上的对齐,可以统一进行multi-task的训练和推理。

RoI pooling如图所示。以RoI pooling后尺寸变成2x2为例,右上图的黑色矩形框对应一个RoI(h,w=5,7),RoI需要分成4个bin,由于RoI pooling切分bin的时候需要对划分尺寸进行量化(h//2=2,w//2=3),所有第一个bin包含2x3个像素,第二个bin包含2x4个像素,第三个bin包含3x3个像素,第四个bin包含3x4个像素。最后对每个bin中的像素进行max pooling得到最终的2x2 feature map。

Multi-task loss

Fast R-CNN有两个输出层。第一个输出是每个RoI的离散概率分布,总共K+1个类别(其中一个是背景类),概率表示为  。第二个输出是边界框回归的偏移量  ,其中  表示的是第k个类别对应的proposal的偏移量,xywh分别表示中心点和宽高,即输出维度为4K,每4个维度对应一个类别的偏移量。

假设gt的类别为u,gt的边界框为v。我们用多任务loss来联合训练分类和边界框回归:

其中  是指示函数,当  大于等于1时等于1,反之为0,分类损失函数为  。

其中边界框回归loss为:

贡献

Fast R-CNN极大的简化了R-CNN的训练流程,可以端到端的训练检测器,为后续Faster  R-CNN的出现奠定了基础。

Fast R-CNN同样埋下了伏笔

伏笔

Fast R-CNN指出region proposal部分还是计算量太大了,导致速度不能进一步提高。

03

Faster R-CNN

虽然Fast R-CNN极大加快了检测器的推理速度,但是region proposal部分仍然是检测器进一步提升速度的瓶颈。于是,Faster R-CNN针对Fast R-CNN埋下的伏笔,设计了RPN和Anchor两个新组件,来改善region proposal提取RoI的质量,同时提升检测器的精度和速度。

训练流程:

1.通过ImageNet pre-trained model初始化CNN,然后端到端fine-tuning RPN部分。

2.固定住RPN,然后通过RPN产生的region proposal来训练Fast R-CNN部分。

3.固定住CNN和Fast R-CNN来fine-tuning RPN网络。

4.固定住CNN和RPN来fine-tuning Fast R-CNN网络。

相当于是对RPN和Fast R-CNN两个部分交替进行训练,因为使用了RPN,导致训练难度增加,比起Fast R-CNN训练过程更加复杂了(后续开源代码对Faster R-CNN训练流程进行了简化,可以同时训练RPN和Fast R-CNN)。

推理流程:

1.先将图片输入CNN得到featmap。

2.然后通过RPN产生RoI。

3.然后将每个RoI送入RoI pooling转化成相同维度的向量。

4.最后通过两个独立的FC,预测出类别和位置。

下面详细讲一下Faster R-CNN的三个部分:Region Proposal Networks、Anchors和Loss Function。

Region Proposal Networks

Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

上图是RPN网络的具体结构。RPN网络分成2个分支,一个分支通过softmax分类得到所有anchors的分类分数,另一个分支用于计算所有anchors的边界框回归偏移量,以获得精确的proposal。最后在ProposalCreator通过分类分数和偏移量来得到合适的proposals。

Anchors

Faster R-CNN中在feature map的每个位置都设置了三种尺度三种长宽比的anchor,总共9种。

anchor数量对RPN输出维度产生的变化如图所示

  1. 原文中使用的CNN网络是ZF,CNN最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions。

  2. 在conv5之后,做了3x3卷积保持num_output=256,相当于每个点又融合了周围3x3的空间信息。

  3. 在conv5 feature map的每个位置上设置k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates。

  4. 训练时在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。

Loss Function

Faster R-CNN训练时有4个损失函数,函数形式跟Fast R-CNN的损失函数相似:

1.RPN 分类损失:anchor是否为前景(二分类)

2.RPN位置回归损失:anchor位置微调

3.RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)

4.RoI位置回归损失:继续对RoI位置微调

四个损失相加作为最后的损失,反向传播,更新参数。

贡献

Faster R-CNN设计的RPN和anchor可以极大提升region proposal质量,同时极大提升了检测器的精度和速度。Faster R-CNN是R-CNN系列的集大成者,能够用近乎实时的速度检测物体,让目标检测在更多场景应用成为可能。

04

Mask R-CNN

Faster R-CNN的RoI pooling是粗粒度的空间量化特征提取,不能做输入和输出pixel-to-pixel的特征对齐,并且不能直接应用于实例分割。于是Mask R-CNN提出用RoIAlign来替代RoI pooling,得到pixel-to-pixel的特征对齐,并且在Faster R-CNN框架的基础上简单的增加了一个mask分支就能实现实例分割。

训练流程:

1.先在ImageNet上进行pre-training。

2.然后在COCO数据集上进行分类、定位和分割三个任务fine-tuning。

推理流程:

1.先将图片输入CNN得到featmap。

2.然后通过RPN产生RoI。

3.然后将每个RoI送入RoI pooling转化成相同维度的向量。

4.最后通过两个独立的FC,预测出类别和位置,同时通过mask分支预测出分类分数前N个RoI的分割mask。

下面详细讲一下Mask R-CNN的三个部分:Region Proposal Networks、Anchors和Loss Function。

Network Architecture

Mask R-CNN把抽取特征的CNN部分定义为backbone,把分类、回归和分割部分定义为head。Mask R-CNN把ResNet第4个stage出来的feature定义为ResNet C4,同时Mask R-CNN还探索了更加有效的FPN网络。

FPN结构如图所示。FPN采用自顶向下结构,通过横向连接构建网络内部特征金字塔。FPN可以根据anchor的尺度大小分配特征层,从不同特征层提取RoI特征。

head结构如图所示。ResNet C4的backbone后面增加了一个stage5,然后进行分类、回归和分割。FPN的backbone将FPN结构收集到的RoI直接送入两个分支,然后进行分类、回归和分割。

其中分割分支,通过deconv来得到更大分辨率的feature map,从而得到更精确的mask预测结果,分割分支的最终feature map通道数等于类别数,每个通道预测一种类别的mask。最终多任务的损失函数为  ,相比Faster R-CNN,损失函数多了  项。

RoIAlign

分割需要pixel-to-pixel对齐的RoI特征,这促使Mask R-CNN设计了RoIAlign来替代RoI pooling。

RoIAlign如图所示。切分bin的时候和RoI pooling有所不同,避免了量化带来的误差,保证pixel-to-pixel的对齐。如右下图,RoIAlign切分bin的时候不进行量化,每个bin划分成2x2(4个红色x标记),每个红色x通过最相邻的4个像素值进行双线性插值计算,得到每个bin的4个插值,最后通过max pooling得到最终的2x2 feature map。

贡献

Mask R-CNN完美地展现了Faster R-CNN的易拓展性和强大的检测能力。但是Mask R-CNN最重要的贡献其实是提高了人们对实例分割任务思维上的认知。从现在看,先检测后分割的思路似乎非常简单,但是在Mask R-CNN出现之前,实例分割大多数都是bottom-up的思路,而Mask R-CNN是top-down的思路,在当时如何在检测框架中简洁优雅的嵌入实例分割是很困难的。

详细的讨论可以看周博磊大佬当年的回答https://www.zhihu.com/question/51704852/answer/127120264

Mask R-CNN最终夺得ICCV 2017 Best Paper。Mask R-CNN即使放到现在也依然是王者,再次感受一下Mask R-CNN的强大

R-CNN/Fast R-CNN/Faster R-CNN/Mask R-CNN比较

这里祭出我的多年珍藏(slides放在公众号了,回复R-CNN自取)

从上图可以清清楚楚的看出从R-CNN到Mask R-CNN框架是如何演变的。

可以分成两个支线看:训练流程和推理框架。

训练流程上

R-CNN -> Fast R-CNN极大精简了目标检测框架的训练流程,从4个独立训练流程精简成了2个独立训练流程。

Fast R-CNN -> Faster R-CNN因为RPN网络的引入,导致训练流程重新变成了RPN和Fast R-CNN交替训练4次(后续开源代码将RPN和Fast R-CNN联合训练了)。

Faster R-CNN -> Mask R-CNN又转变成了2个独立训练流程。

推理框架上

R-CNN -> Fast R-CNN提取RoI进行并行化处理,将分类和定位看成一个多任务,并设计RoI pooling来进行特征对齐。

Fast R-CNN -> Faster R-CNN提出RPN来对region proposal部分进行加速,并且提出anchor来适应不同形态的目标。

Faster R-CNN -> Mask R-CNN增加一个mask分支,展示了Faster R-CNN的易拓展性,并且设计了RoIAlign进行pixel-to-pixel的对齐。

05

总结

整个R-CNN系列非常经典,阵容极其华丽(RBG、何恺明、任少卿等等)。从传统视觉到深度学习,RGB简单直接的应用CNN构造了R-CNN检测器,开启基于深度学习的目标检测新时代;从R-CNN到Fast R-CNN、Faster R-CNN通过实验观察和思考,发现问题,解决问题;Mask R-CNN在已有领域,通过简单设计改造,从目标检测任务迁移到实例分割任务。无论是从设计思维,洞察力和科研敏锐性上,都无可挑剔。(ps:R-CNN的文章,看起来粗糙,实则干货满满;现在的文章都一个模子刻出来的一样,看起来精致,实则同质化严重)

最后,我想说的是计算机视觉中,从R-CNN到Mask R-CNN的思维跃迁是我最爱看的“小说”章节。

Reference

[1] Rich feature hierarchies for accurate object detection and semantic segmentation

[2] Fast R-CNN

[3] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

[4] Mask R-CNN

另外再推荐几篇Faster R-CNN的blog,非常精彩

https://zhuanlan.zhihu.com/p/31426458

https://zhuanlan.zhihu.com/p/145842317

https://zhuanlan.zhihu.com/p/32404424

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

从R-CNN到Mask R-CNN的思维跃迁相关推荐

  1. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题

    [编程题] CIDR去重 时间限制:1秒 空间限制:65536K 无类别域间路由(CIDR)是一个用于对IPV4地址进行分类表述的方法.CIDR 路由描述的IP地址组的子网mask长度是可变长度, 例 ...

  2. Microsoft R 和 Open Source R,哪一个才最适合你?

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. R 是一个开源统计软件,在分析领域普及的非常快. 在过去几年中,无论业务规模如何,很多公司都采 ...

  3. 启动R环境并执行R脚本

    启动R环境并执行R脚本 # 打开window系统本身的cmd或者anaconda prompt # 输入R,就会进入R console环境: R可以用'demo()'来看一些示范程序,用'help() ...

  4. r语言线性回归_(R语言)线性回归:机器学习基础技术

    线性回归: 使用最小二乘法预测定量的结果的一种回归模型. Anscombe数据集 它由统计学家弗朗西斯·安斯库姆(Francis Anscombe)建立,用来强调数据可视化和异常值在数据分析中的重要性 ...

  5. r语言必学的十个包肖凯_30 天学会R DAY 14:R语言必学包dplyr

    原标题:30 天学会R DAY 14:R语言必学包dplyr 第14天 R语言必学包dplyr R语言非常讲究数据的整理,我们在7-13天的R语言学习内容中,着重都是关于R语言的整理,各种方法对数据进 ...

  6. 【数据分析R语言系列】R和RStudio的下载和安装, R在 Ubuntu 和CentOS 系统下的安装

    文章目录 准备工作 R 的下载和安装 RStudio 的下载和安装 配置(可选) 常见问题与方案 R 在 Linux 系统下的安装 Ubuntu 从源安装 R CentOS 从源安装 R Rtools ...

  7. 生活中回归分析实际例子_回归分析中R方和调整R方的区别

    介绍 当我开始我的数据科学之旅时,我探索的第一个算法是线性回归. 在理解了线性回归的概念和算法的工作原理之后,我非常兴奋地使用它并在问题陈述中做出预测.我相信你们大多数人也会这么做的.但是一旦我们建立 ...

  8. r语言代码html,R语言学习笔记-内附实例及代码

    R语言入门 R是开源的统计绘图软件,也是一种脚本语言,有大量的程序包可以利用. R中的向量.列表.数组.函数等都是对象,可以方便的查询和引用,并进行条件筛选. R具有精确控制的绘图功能,生成的图可以另 ...

  9. 在$x_0$处全导数可逆的函数$f:\mathbf{R^n}\to\mathbf{R^n}$的一个性质

    注:该文章宣布报废,因为结论是错误的.关键的错误证明已经用红字显示.我是看了matrix67的函数上某一点导数为正,该点邻域不一定形成单增区间才想起自己的错误的. 设$f:\mathbf{R}^n\t ...

  10. 8.编写程序,要求如下: 定义名为VolumeArea的抽象类,在其中定义圆周率的值为3.14159,并定义两个抽象方法volume(double r)和area(double r),它们的返回

    8.编写程序,要求如下: 定义名为VolumeArea的抽象类,在其中定义圆周率p的值为3.14159,并定义两个抽象方法volume(double  r)和area(double  r),它们的返回 ...

最新文章

  1. 国内操作系统OS分析(上)
  2. 卫星互联网行业深度报告:战火早已熊熊燃烧
  3. linux单用户模式修改密码(针对CentOS)
  4. php 字符串替换 正则表达式,PHP中一些可以替代正则表达式函数的字符串操作函数...
  5. 为什么很多公司转型Go语言开发?Go语言能做什么
  6. CV:基于keras利用cv2自带两步检测法对《跑男第六季第五期》之如花片段(或调用摄像头)进行实时性别脸部表情检测
  7. 解决log4net独占日志文件的问题以及 log4net的各种输出配置(Appender)
  8. java 双向链表例子_Java双向链表按照顺序添加节点的方法实例_Java_软件编程
  9. 几张旧照片,用傻瓜拍的,翻出来凑数
  10. 适用于应用程序错误的AWS警报
  11. pytorch深度学习_深度学习和PyTorch的推荐系统实施
  12. C++ 与Qt开发人机象棋(第一部分)
  13. C语言八位彩灯循环左移,利用计数器和移位寄存器设计一个八个彩灯循环电路?...
  14. hdu 1698 Just a Hook
  15. 第二个冲刺周期第五天
  16. atitit groovy 总结java 提升效率
  17. mysql监控工具_详解MySQL监控工具 mysql-monitor
  18. 利用windrose绘制风玫瑰图并解决错误问题
  19. 数控编程也是c语言吗,学数控编程需要使用个人电脑吗
  20. ios键盘done中文_IOS关闭键盘的方法

热门文章

  1. sshd 相关服务配置与使用
  2. 关于 x-requested-with 请求头 区分ajax请求还是普通请求
  3. 39岁单身程序员入住养老院,提前过上退休生活?网友:羡慕又心酸!
  4. 基于机器学习的入侵检测系统
  5. 有段位的管理者,都是怎么管理的?
  6. CAP只能三选二,可以选CA吗?
  7. Qt MySQL (ubuntu)
  8. 一键抓取sqlserver数据结构
  9. 数据库期末复习重点,临时抱佛脚高分通过考试
  10. IIS部署详细步骤、包括错误的解决办法、使用localDB