目标检测技术演化:从R-CNN到Faster R-CNN

摘要: 一文了解目标检测技术发展,不要错过哟。

目标检测旨在准确地找到给定图片中物体的位置,并将其正确分类。准确地来讲,目标检测需要确定目标是什么以及对其定位。

然而,想要解决这个问题并不容易。因为,目标的大小,其在空间中的方向,其姿态,以及其在图片中的位置都是变化的。

这里有一张图片,我们需要识别图片中的物体,并且用方框将该物体圈出来。

1

图像识别(分类)

  1. 输入:图像
  2. 输出:目标类型
  3. 评价指标:精确度

定位:

  1. 输入:图像
  2. 输出:方框在图片中的位置(x,y,w,h)
  3. 评价指标:检测评价函数(IOU)

如今大火的卷积神经网络帮助我们很好地进行图像识别。但是,我们仍需要一些额外的功能来进行精确定位,深度学习在这里发挥了很好的作用。

在本文中,我们将从目标定位的角度入手探讨目标检测技术的发展。我们将按着如下的演化顺序讲述:R-CNN->SPP Net->Fast R-CNN-> Faster R-CNN

在开始前,我们将对基于区域的卷积神经网络(R-CNN)进行简单的介绍。

将定位看作回归问题

如果我们将其看作是一个回归问题,则需要对(x,y,w,h)四个参数进行预测,从而得到方框所在位置。

1


步骤1

  1. 先解决最简单的问题:使用神经网络识别图片
  2. 在AlexNet VGG GoogleLenet上微调(fine-tuning)

    1

 

步骤2

  1. 在上述神经网络的尾部展开(CNN前面保持不变,我们对CNN的结尾处做出改进:加了两个头:“分类头”和“回归头”)
  2. 将其转化为分类 + 回归模型

    1

 

步骤3

  1. 在回归部分使用欧氏距离损失
  2. 使用随机梯度下降进行训练

步骤4

  1. 在预测部分结合回归和分类
  2. 实现不同的功能

接着,我们将进行两次微调操作。第一次在AlexNet上进行,第二次将头部改为回归头。

回归部分加在哪里呢?

两种解决办法:

  1. 加在最后一个卷积层后面(如VGG)
  2. 加在最后一个全连接层后面(如R-CNN)

但是实现回归操作太困难了,我们需要找到一种方法将其变为分类问题。回归的训练参数收敛的时间要长得多,所以上面的网络采取了用分类的网络来计算网络共同部分的连接权值。

取图像窗口

  1. 依旧使用前面所提及的分类+回归的思路
  2. 首先选取不同的大小的方框
  3. 让方框出现在不同的位置,计算出这个方框在不同位置的得分
  4. 取得分最高的那方框

 

1

左上角的黑框:得分0.5
右上角的黑框:得分0.75
左下角的黑框:得分0.6
右下角的黑框:得分0.8

根据这些得分,我们选择右下角的黑框作为所要预测的目标位置。

注:有的时候也会选择得分最高的两个方框,然后取两个方框的交集作为最终需要预测的位置。

问题:方框的大小如何确定呢?

当取了不同的方框后,依次从左上角扫描到右下角。

总结:

对第一张图片,我们使用不同大小的方框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的分类以及这个框图片对应的(x,y,w,h)。

 

1

但是,这个方法太耗费时间了,需要做一些优化。最初的网络模型如下图所示:

 

1

所做优化:将全连接层改为为卷积层以提高速度。

 

2

目标检测

当图中有多个物体存在的时候我们应该如何做呢?现在我们所要解决的问题就变成了:多个目标识别+定位。

现在我们还能将其看作分类问题么?

 

1

可是,将其看作分类问题的话会有如下矛盾产生:

  1. 你需要找到许多的位置,并提供不同大小的方框
  2. 你还需要对方框中的图像进行分类
  3. 当然,如果你的GPU很强大,将其看作分类问题也没什么不妥

如果将其看作分类问题,我们能做哪些优化呢?我们并不想使用太多的方框在不同的位置间来回尝试。下面,给出了一种解决方案:

首先,我们需要找出包含所有目标的方框。其中有的方框会产生重叠或者互相包含,这样我们就不用枚举出所有的方框了。

 

2

对于候选框的获取,前人发现了很多种方法:比如EdgeBoxes和Selective Search。以下是候选方框获取方法的性能对比:

 

1

对于“选择性搜索”是如何选出所有候选方框这个问题,本文不作介绍,有兴趣的可以对其相关论文进行研究。

R-CNN

上述提及的思路推动了R-CNN的面世。让我们以同样的图片为例,对R-CNN进行讲解。

步骤1

下载一个分类模型(如AlexNet)

 


2

步骤2

对模型进行微调

  1. 将分类数目从1000降至20
  2. 去掉最后一个全连接层

 

3

步骤3

特征提取:

  1. 提取出图像中所有的候选方框(选择性搜索)
  2. 对每一个区域:调整区域的大小,使其与CNN的输入一致,做一次向前运算,将第五个池化层的输出存入硬盘中

 

4

步骤4

  1. 训练一个支持向量机(SVM)分类器(二分类),用以判断这个候选框里物体的类别
  2. 判断SVM是否属于对应的类别。如果是,就是positive,如果否,就是negative。下面是一个给狗分类的SVM示例。

 

5

步骤5

使用回归器对候选方框的位置进行仔细校正。对于每一个分类,都需要训练一个线性回归模型,用以判断这个方框是否足够匹配。

 

6

SPP Net

空间金字塔池化(SPP:Spatial Pyramid Pooling)概念的提出对R-CNN的发展有着非凡的意义。在此我们会对SPP进行简明的介绍。

SPP有两个特征:

1. 结合空间金字塔法,实现CNN的多尺度输入
一般来说,在CNN后面会接有一个全连接层或者一个分类器。它们都需要调整至合适大小方可作为输入,因此需要对输入数据进行分割和变形。然而,这些预处理可能会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想与CNN相结合,实现数据的多尺度输入。
如下图所示,在卷积层和全连接层之间加入一个SPP层。此时,网络的输入尺度可以是任意的,在SPP层中,池化所需的过滤器会根据输入自动调节大小,但SPP的输出尺度确实保持不变的。

 

1

2. 只对原始图像提取一次卷积特征
在R-CNN中,每个候选框会将其尺寸调至统一,然后分别作为CNN的输入,但这样的做法降低了效率。SPP Net针对这个缺点做了相应的优化:只对原始图像进行一次卷积操作,得到特征图,然后找到每个候选方框在特征图上的映射,然后将该映射作为卷积特征输入SPP层。这种优化方法节约了大量的计算时间,相比 R-CNN快上百倍。

 

2

Fast R-CNN

SPP Net非常实用,有学者就在R-CNN的基础上结合SPP Net,提出Fast R-CNN,进一步提升了性能。

R-CNN与Fast R-CNN有什么区别呢?

首先,让我们来看看R-CNN的不足之处。尽管它在提取潜在边框作为输入时,使用了选择性搜索以及其它处理方法,但是R-CNN在运算速度上仍然遇到了瓶颈。这是由于计算机在对所有区域进行特征提取时会进行大量的重复计算。

为了解决这个问题,研究学者提出了Fast R-CNN。

 

3

在Fast R-CNN中,有一个被称为ROI Pooling的单层SPP网络层。该网络层能够将不同尺寸的输入映射为一系列固定尺度的特征向量,正如我们所知,conv,pooling,relu以及一些其它操作并不需要固定尺度的输入。因此,当我们在原始图片上执行这些操作后,由于输入图片的尺寸不同,得到的特征图尺寸也不一样,不能将它们直接连接到一个全连接层上进行分类,但是我们可以在其中加入ROI Pooling层,以一个固定尺度的特征来表示每个区域,再通过softmax进行分类。

此外,前面所讲的R-CNN需要先有一个proposal,再输入到CNN中进行特征提取,之后采用SVM进行分类,最后进行边框回归。但是在Fast R-CNN模型中,作者将边框回归引入神经网络,并将其与区域分类合并,形成一个多任务模型。

实验证明,这两个任务能够共享卷积特征。Fast R-CNN的一个额外贡献是使Region Proposal+CNN这一框架得以运用,同时让人们看到进行多类检测的同时仍保证精度是能够实现的。

R-CNN总结:

  1. R-CNN有一些缺点
  2. 主要缺点:因为每一个候选方框都需要独立地输入到CNN中,此操作十分耗费时间
  3. 次要缺点:在共享层,不是每个候选方框都作为输入进入到CNN中。相反,输入的是一张完整的图片,在第五个卷积层提取出每个候选方框的特征
  4. 原始方法:大量候选方框(例如2000个)→CNN→得到每个候选方框的特征→分类+回归
  5. 现在的方法:完整的图片→CNN→得到每个候选方框的特征→分类+回归
    很明显,Fast R-CNN比R-CNN在速度上有了大幅提升;与R-CNN对每个候选方框输入到CNN中提取特征不同的是,Fast R-CNN只对输入的整张图片提取一次特征,然后在第五个卷积层上提取每个候选方框的特征,此操作只需要计算一次特征,剩下的操作在第五个卷积层上完成即可。

性能的提升也十分明显:

 

4

Faster R-CNN

毫无疑问,Fast R-CNN与传统的CNN相比,在性能上有了大幅提升。但Fast R-CNN的一个主要问题在于它使用选择性搜索去找所有的候选方框,这是非常耗时的。

是否有更加高效的方法去找出所有的候选方框呢?

解决办法:增加一个可以对边缘进行提取的神经网络。换句话说,利用神经网络去寻找所有的候选方框。能够实现这种操作的神经网络叫做区域生成网络(RPN:Region Proposal Network)。

让我们看看RPN有哪些提升:

  1. 在最后一个全连接层后加入RPN
  2. RPN直接训练得到候选区域

 

5

RPN总结:

  1. 在特征图上进行窗口滑动
  2. 建立一个神经网络用于目标分类以及方框的位置回归
  3. 滑动窗口的位置提供关于目标的大致位置信息
  4. 回归能够提供一个更加精确的方框位置

 

6

四种损失函数:

  1. RPN分类
  2. RPN回归
  3. Fast R-CNN分类
  4. Fast R-CNN回归

 

7

 

8

 

速度比较

Faster R-CNN的贡献在于它设计了一个RPN网络对候选区域进行提取,此步骤代替了耗时过多的选择性搜索,使速度得到大幅提升。

总结

总的来说,从R-CNN,SPP-NET,Fast R-CNN到R-CNN,基于深度学习进行目标检测的步骤得到了简化,精度得到了提高,速度得到了提升。可以说,基于区域生成的系列R-CNN目标检测算法在目标检测领域已经成为最主要的分支。

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

原文链接 

本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于解决jdbc版本错误问题

关于解决jdbc版本错误问题 最近在做一个项目,在使用IDEA测试某个接口时出现了这个异常: 然后百度了一下发现很多都说是mysql-connector-java.jar包版本不一样,或者是jdbc.properties文件内容出错。 一定要仔细检查自己的数据库名跟账户密码…

深度学习之优化详解:batch normalization

摘要: 一项优化神经网络的技术,点进来了解一下? 认识上图这些人吗?这些人把自己叫做“The Myth Busters”,为什么?在他们的启发下,我们才会在Paperspace做类似的事情。我们要解决是Batch Normal…

无法通过sak判断卡片类型_如何判断你家门能否更换智能锁?选锁门道你要懂!...

选择智能锁有三个门道,你不可不知。门道一:小心“特斯拉线圈”攻击去年在智能锁行业,最能刷屏的是“特斯拉线圈”事件,多个智能锁品牌被轻易入侵攻陷,让消费者关注智能锁的安全问题。行业人士建议消费者:将…

@程序员 天冷了,你准备抱键盘还是抱女朋友取暖?

01恭喜你已经过完了2019年所有的法定节假日有没有一点心寒但随之而来的冷空气更是肉体上的折磨真想说这个天气说好的春夏秋冬的呢为什么我只感受到了夏天和冬天骗子!02手里拿着抽纸随时准备擦去感冒导致的鼻涕不行,我要穿厚衣服打开我的衣橱咦&#xff1…

改变世界的七大NLP技术,你了解多少?(下)

摘要: 这里有改变世界的7大NLP技术,点进来了解一下吧! 改变世界的七大NLP技术,你了解多少?(上) 在第1部分中,我介绍了自然语言处理(NLP)领域以及为其提供支持…

windows如何生成ssh密钥

windows如何生成ssh密钥 1.安装git,先去git官网下载git,https://git-scm.com/downloads,直接点击windows下载就可以了。 2.下载完可以到桌面点击鼠标右键,可以看到多出两个东西git gui跟git bash 3.也可以点击你下载的文件所…

谈谈社区、产品和新Dubbo | 从Dubbo 的社区star 数突破 2 万说起

摘要: Dubbo近况,了解一下。 近期,阿里巴巴的高性能分布式服务框架 Dubbo,在 Github 上获得了超过 2万的 star 数,据了解这是截止目前国内第一家也是唯一一家超过2万 star 数的 Java 开源产品。 -无社区,不…

9008线刷_小米红米手机新机9008模式怎么进入?小米线刷救砖模式

说起了9008刷机,其实对于玩机党来说非常不模式,市面上大部分机型都是高通处理器而高通处理器一般都有9008模式。到底9008模式怎么进入呢?9008模式下我们又可以做哪些刷机操作呢?下面ROM乐园小编就带大家了解下红米和小米新机的900…

关于IDEA代码的整理以及函数

关于IDEA代码的整理以及函数 最近在写一个项目,发现有些代码比较冗长重复率较高,比如try{}catch(){}这个代码的重复率就比较高,我们可以把try、catch删除,然后用CttrlAltL来格式化,这样子比较美…

基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战

作者:欧创新、邓頔、文艺你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案。本文是基于 DDD 的微服务设计和开发实战篇&#xff…

把 14 亿中国人都拉到一个微信群,在技术上能实现吗?

戳蓝字“CSDN云计算”关注我们哦!作者 | 知乎网友责编 | 阿秃“最近,知乎上有一个非常热门的问题:“把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?”(https://www.zhihu.com/question/293021546)实…

列赋值为列表_Pandas入门-3-新增数据列操作

在数据分析过程中,常常会依据一定条件进行新数据列的增加,以便于我们对数据更好地分析。接下来,一起学习如何在Pandas的数据类型中进行新增数据列操作。知识点:直接赋值.apply.assign按条件选择分组再分别赋值我想要新增一列“温差…

Cannot obtain primary key information from the database, generated objects may be incomplete

问题描述 在整合mybatis时只是生成了两个insert()函数,并且提示 [WARNING] Cannot obtain primary key information from the database, generated objects may be incomplete 解决方法 在jdbc连接url上加nullCatalogMeansCurrenttrue urljdbc:mysql://localhost:3…

三问(why?what?how?)金融领域的机器学习

摘要: 都喜欢人生三问,那么金融领域的机器学习三问了解一下。 机器学习可能会很有魔力,即使它背后没有魔法。尽管如此,机器学习项目的成功更多地取决于构建高效的基础架构,收集合适的数据集以及应用正确的算法。 机器…

git拉取项目以及提交项目

git拉取项目以及提交项目 1.打开cmd,键入cd d: d: cd project 输入git clone 你要拉区项目的地址 2.项目地址可以在gitee.com的项目代码那里去复制 3.提交项目也可以用cmd键入命令来提交 4.一直在d盘这里键入dir cd 项目名字 git comt -…

python中int input_python中的input是什么

Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。 Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。 raw_input() 将所有输入作为字符串看待,返回字符串类型。而 input() 在对待纯数字输入…

阿里巴巴机器翻译在跨境电商场景下的应用和实践

摘要: 本文将与大家分享机器翻译相关背景知识,再深入介绍机器翻译在阿里生态中的具体应用实践,介绍基于机器翻译技术搭建的一套完善的电商多语言解决方案,最后将会从技术角度介绍阿里机器翻译在解决实际业务问题中的技术创新和亮点…

【内含福利】全球第一例:苹果Apple Card遭盗刷,物理卡或被克隆;谷歌正在试产5G智能手机,最快下周发布……...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

tomcat内存溢出

-Xms1024m -Xmx1536m -XX:PermSize128M -XX:MaxPermSize556M -Dfile.encodingUTF-8

如何用Java代码解析json

如何用Java代码解析json 今天在写项目的时候用到了json,然后尝试着Java代码解析了一下json 用相同的类型定义一个参数,然后json.与定义的参数类型一样的get方法,括号里面就是要解析的key 我图片的是嵌套json,解析两次在输出。