基于深度学习的目标检测技术的演进:从R-CNN到Faster R-CNN
导语
什么是Objection Detection?就是在给定的图片中精确的找到物体所在位置,并且标注出物体的类别。目标检测要解决的问题就是物体在哪里?是什么?这样的问题。然而,这个问题并不是那么容易解决的,物体尺寸变化范围很大,摆放物体的角度、姿态不固定,而且可以出现在图片的任何地方,更何况物体还可以是多种类别。
以本文中的图像识别任务为例,既要把图像中的物体识别出来,而且要用方框框选出它的位置。
以上的任务用专业术语描述就是:图像识别+定位
图像识别(分类)
输入:图像
输出:物体的类别
评估方法:准确率
定位:
输入:图像
输出:方框在图像中的位置(x,y,w,h)
评估方法:检测评价函数intersection-over-union(IOU)
卷积神经网络(CNN)已经帮助我们完成了图像识别的任务,我们只需要添加一些额外的功能来完成定位任务。这需要深度学习发挥它强大的作用。
在本文中,我们将从目标定位的角度讨论目标检测技术的发展,它的演进过程是这样的:R-CNN -> SppNET -> Fast R-CNN -> Faster R-CNN
在开始之前,让我们仔细的看一下R-CNN。
定位可以看做回归问题
如果看做是回归,我们需要预测出(x, y, w, h)四个参数的值,从而得到方框的位置。
第1步:
•先解决简单问题, 搭建一个识别图像的神经网络
•在AlexNet VGG GoogleLenet上fine-tuning一下
第2步:
•在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)
•成为classification + regression模式
第3步:
•Regression部分用欧氏距离损失
•使用SGD训练
第4步:
•预测阶段把2个头部拼上
•完成不同的功能
这里需要进行两次fine-tuning。第一次在ALexNet上做,第二次将头部改成
regression head,前面保持不变,做一次fine-tuning。
在哪里添加回归?
有两种处理方法:
加在最后一个卷积层后面(如VGG)
加在最后一个全连接层后面(如R-CNN)
回归问题太难了,需要想办法转换为分类问题。回归的训练参数收敛的时间要长的多,所以上面的网络采用了分类的网络计算出网络共同部分的连接权值。
获取图像窗口
还是刚才的分类+回归思路
取不同大小的框
让框出现在不同的位置,对框进行打分
取分数最高的那个框
左上角的黑框:0.5分
右上角的黑框:0.75分
左下角的黑框:0.6
右下角的黑框:0.8
根据分数的高低,我们选择右下角的黑框作为目标位置的预测。
注意:有时候也会选择得分最高的两个框,然后取两个框的交集作为最终的位置预测。
疑问:框要取多大?
非常简单粗暴的取不同的框,依次从左上角扫到右下角。
总结一下思路:
对于第一张图,使用各种尺寸的框(遍历整个图像)截取图像,输入到CNN。然后,CNN会输出这个框的分类,然后输出框中图像的x,y,w,h(回归)。
这个方法实在太耗时,对它进行优化。原来的网络是这样的:
优化为这样:把全连接层改为卷积层,这样可以提高速度。
目标检测
当图像中有多个目标该怎么办呢?难度增加了很多。如此以来,任务就变成了:多目标识别+多目标定位。
那么,把这个任务看做分类问题?
看做分类问题有何不妥呢?
你需要找很多位置,给很多个不同大小的框
还需要对框内的图像分类
当然,如果你的GPU很强大,那加油吧
看做分类问题有没有办法优化呢?我们并不想尝试那么多框和那么多位置。当然,还是有好的解决办法的。
先找出可能含有目标的框(即候选框,比如选1,000个候选框),这些框之间是可以相互重叠相互包含的,这样我们就可以避免暴力枚举所有框了。
很多大牛们发明了很多选定候选框的方法,如EdgeBoxes和Selective Search。一下是各种选定候选框的方法的性能对比。
有一个疑问,提取候选框用到的算法“Selective Search”是如何选出这些候选框的呢?
从R-CNN到Faster R-CNN的进化
横空出世的R-CNN
基于以上思路,R-CNN出现了。
第1步:训练(或下载)一个分类模型(如AlexNet)
第2步:对该模型做fine-tuning
将分类数从1,000改为20
去掉最后一个全连接层
第3步:特征提取
提取图像的所有候选框(Selective Search)
对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(即对候选框提取到的特征)存到硬盘
第4步:
训练一个SVN分类器(二分类)判断这个候选框里的物体类别
每个类别对应一个SVM,判断是否属于该类别,是:positive,否Lnagative。如下图就是狗分类的SVM
第5步:
使用回归器精细的修正候选框位置。对于每一个类,训练一个线性回归模型判定该框是否框选的完美。
R-CNN的进化中Spp Net的思想对其贡献非常大,这里简单的介绍一下Spp Net。
SPP Net
SPP是Spatial Pyramid Poolong它的特点有以下两个:
结合SPP方法实现CNNs的尺度输入
一般CNN后接全连接层或分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行裁剪或扭曲,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献是将SPP的思想加入到CNN,实现了数据的多尺度输入。
如下图所示,在卷积层和全连接层之间加入SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每个池的过滤器将根据输入调整大小,而SPP的输出尺度始终是固定的。
2. 只对原图提取一次卷积特征
在R-CNN中,每个候选框先重置到同样大小,然后分别作为CNN的输入,这样效率很低。
因此SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的特征映射,然后找到每个候选框zaifeature上的映射补丁,将此补丁作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大朗的计算时间,比R-CNN提速100倍。
Fast R-CNN
SPP Net真是个好方法。R-CNN的进阶版Fast R-CNN就是在R-CNN的基础上采纳SPP Net方法,对R-CNN作了改进,使得性能进一步提高。
R-CNN和Fast R-CNN的区别有哪些呢?
先说R-CNN的缺点:即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是R-CNN仍会有严重的速度瓶颈,原因很明显,就是计算机对所有区域进行特征提取时会重复计算,Fast R-CNN正是为了解决这个问题而诞生的。
有人提出了一个可以看做单层SPP Net的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定尺寸的输入,因此,在原始图像上执行这些操作后,虽然输入图像的尺寸不同导致得到的特征映射尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个区域都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。
另外,之前R-CNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox回归,而在Fast R-CNN中,巧妙的将bbox回归放进了神经网络内部,与区域分类和并成为一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
Fast R-CNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升速度,也为后来的Fast R-CNN做了铺垫。
总结一下Fast R-CNN:
R-CNN有一些相当大的缺点(把这些缺点都改掉后,就成了Fast R-CNN)
大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多
小缺陷:在共享卷积层中,并非每一个候选框都作为输入进入CNN。相反,它作为完整的图片输入,然后在第五个卷积层再得到每个候选框的特征。
原始方法:许多候选框(如两千个)->CNN->获取每个候选框的特征->分类+回归
现在的方法:完整图片->CNN->获取每个候选框的特征->分类+回归
这样就很容易理解为什么Fast R-CNN比R-CNN快的多。不过不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层操作就可以了。
性能方面的改进也很明显:
Faster R-CNN
毫无疑问,Fast R-CNN作为传统的CNN带来重大改进。然而,Fast R-CNN的一个主要问题是它使用selective search查找所有的后选框,这样非常耗时。
有什么更有效的方法来找到这些候选框呢?
解决方案:添加一个提取边缘的神经网络。也就是说,使用神经网络来查找后选框。执行此类任务的神经网络成为Region Proposal Network(RPN)。
具体的实现:
将RPN放在最后一个卷积层后面
RPN直接训练以后的候选区域
RPN简介:
在特征映射上滑动窗口
构建一个神经网络用于物体分类+框位置的回归
滑动窗口的位置提供物体的大体位置信息
框的回归提供了更精确的位置
一个具有四个损失函数的网络:
•RPN calssification(anchor good.bad)
•RPN regression(anchor->propoasal)
•Fast R-CNN classification(over classes)
•Fast R-CNN regression(proposal ->box)
速度对比:
Faster R-CNN的主要优点是它设计了一个网络RPN提取候选区域,而不是在selective search上浪费时间,这明显的加速了检测。
结论
RCNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索)
2. 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一特征的候选框,用回归器进一步调整其位置
Fast RCNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索)
2.对整张图片输进CNN,得到feature map
3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一特征的候选框,用回归器进一步调整其位置
Faster RCNN
1.对整张图片输进CNN,得到feature map
2.卷积特征输入到RPN,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一特征的候选框,用回归器进一步调整其位置
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。
长按二维码 ▲
订阅「架构师小秘圈」公众号
如有启发,帮我点个在看,谢谢↓
基于深度学习的目标检测技术的演进:从R-CNN到Faster R-CNN相关推荐
- 基于深度学习的目标检测技术演进:从目标检测到人脸检测
本篇博客主要转载两篇写得好的分别介绍基于深度学习的目标检测和人脸检测的文章,最近在调研基于深度学习的人脸检测相关的文章,在网上查相关资料时,有幸看到.文末附带基于深度学习的目标检测和人脸检测相关经典文 ...
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...
- 综述 | 基于深度学习的目标检测算法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 导读:目标检测(Object Det ...
- 基于深度学习的目标检测算法综述(一)
基于深度学习的目标检测算法综述(一) 基于深度学习的目标检测算法综述(二) 基于深度学习的目标检测算法综述(三) 本文内容原创,作者:美图云视觉技术部 检测团队,转载请注明出处 目标检测(Object ...
- 病虫害模型算法_基于深度学习的目标检测算法综述
sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...
- 基于深度学习的目标检测的研究进展2
普通的深度学习监督算法主要是用来做分类,如图1(1)所示,分类的目标是要识别出图中所示是一只猫.而在ILSVRC(ImageNet Large Scale Visual Recognition Cha ...
- 独家总结| 基于深度学习的目标检测详解
欢迎关注微信公众号[计算机视觉联盟] 获取更多前沿AI.CV资讯 基于深度学习的目标检测 基于深度学习的目 ...
- 一种基于深度学习的目标检测提取视频图像关键帧的方法
摘要:针对传统的关键帧提取方法误差率高.实时性差等问题,提出了一种基于深度学习的目标检测提取视频图像关键帧的方法,分类提取列车头部.尾部及车身所在关键帧.在关键帧提取过程中,重点研究了基于SIFT特征 ...
- 基于深度学习的目标检测研究综述
基于深度学习的目标检测研究综述 摘要:深度学习是机器学习的一个研究领域,近年来受到越来越多的关注.最近几年,深度学习在目标检测领域取得了不少突破性的进展,已经运用到具体的目标检测任务上.本文首先详细介 ...
最新文章
- pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )
- 开发日记-20190610 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- ceph pool 管理(基础操作)
- 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
- datagrid单选多选
- Redis的List操作
- SQL SERVER 2005 进行XML查询
- Linux之移动复制和删除
- Android studio JNI jni实例
- android9的手机,可防手机上瘾?安卓9.0首批升级的机型都在这里
- 开发者必备Mysql命令
- SurfaceFlinger与Hardware Composer
- ModbusTcp协议详解
- 白盒测试 | 用例设计方法之条件组合覆盖
- mysql的pdb文件在哪里_pdb是什么文件?pdb数据库文件怎么打开?
- Permission is only granted to system apps解决方法
- 功率单位mw和dbm换算
- Root检测与反检测
- 英文邮件 —— 祝贺应聘成功
- three.js小结
热门文章
- linux安装软件tar.bz,CentOS下的几种软件安装方式
- 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)
- linux6.5下安装oracle 11,centos6.5下安装oracle11g
- asp php 语法区别,asp与php语法对比
- 如何利用计算机计算天数,如何应用Win10系统电脑中的计算器计算两个日期之间的天数?...
- 二元logistic模型案例_二元逻辑回归的简介与操作演示
- Win10 太火,骗子也来打劫了
- iOS 最新版 CocoaPods 的安装流程
- VC++ 判断文件或文件夹是否存在的快捷方法 _access
- mysql数据库,删除root用户后恢复