rcnn spp_net
在http://www.cnblogs.com/jianyingzhou/p/4086578.html中
提到
rcnn开创性工作,但是计算时间太长,重复计算太大。
spp_net将重复计算避免了
我自己测试发现rcnn的确非常慢,因为窗口重叠,重复计算普遍
一下转自 http://zhangliliang.com/2014/09/13/paper-note-sppnet/
对应的论文是:http://arxiv.org/pdf/1406.4729v2.pdf
对应的slide:http://research.microsoft.com/en-us/um/people/kahe/eccv14sppnet/sppnet_ilsvrc2014.pdf
作者Kaiming He的主页:http://research.microsoft.com/en-us/um/people/kahe/
思路概述
如下图所示,由于传统的CNN限制了输入必须固定大小(比如AlexNet是224x224),所以在实际使用中往往需要对原图片进行crop或者warp的操作
- crop:截取原图片的一个固定大小的patch
- warp:将原图片的ROI缩放到一个固定大小的patch
无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。
- crop:物体可能会产生截断,尤其是长宽比大的图片。
- warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片
Sptial Pyramid Pooling,以下简称SPP,为的就是解决上述的问题,做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络。
思路很直观,首先发现了,CNN的卷积层是可以处理任意尺度的输入的,只是在全连接层处有限制尺度——换句话说,如果找到一个方法,在全连接层之前将其输入限制到等长,那么就解决了这个问题。
然后解决问题的方法就是SPP了。
从BoW到SPM
SPP的思想来源于SPM,然后SPM的思想来源自BoW。
关于BoW和SPM,找到了两篇相关的博文,就不在这里展开了。
最后做到的效果如下图:
如果原图输入是224x224,对于conv5出来后的输出,是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的reponse map。
如果像上图那样将reponse map分成4x4 2x2 1x1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)x256那么多的维度了。
如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256
直觉地说,可以理解成将原来固定大小为(3x3)窗口的pool5改成了自适应窗口大小,窗口的大小和reponse map成比例,保证了经过pooling后出来的feature的长度是一致的
如何训练网络
理论上说,SPP-net支持直接以多尺度的原始图片作为输入后直接BP即可。实际上,caffe等实现中,为了计算的方便,输入是固定了尺度了的。
所以为了使得在固定输出尺度的情况下也能够做到SPP-net的效果,就需要定义一个新的SSP-layer
作者以输入224x224举例,这时候conv5出来的reponse map为13x13,计算出来的步长如下图所示。
具体的计算方法,看一眼2.3的Single-size training部分就明白了。
如果输入改成180x180,这时候conv5出来的reponse map为10x10,类似的方法,能够得到新的pooling参数。
两种尺度下,在SSP后,输出的特征维度都是(9+4+1)x256,之后接全连接层即可。
训练的时候,224x224的图片通过随机crop得到,180x180的图片通过缩放224x224的图片得到。之后,迭代训练,即用224的图片训练一个epoch,之后180的图片训练一个epoth,交替地进行。
如何测试网络
作者说了一句话:Note that the above single/multi-size solutions are for training only. At the testing stage, it is straightforward to apply SPP-net on images of any sizes.
笔者觉得没有那么简单吧,毕竟caffe对于test网络也是有固定尺度的要求的。
实验
之后是大量的实验。
分类实验
如下图,一句话概括就是,都有提高。
一些细节:
- 为了保证公平,test时候的做法是将图片缩放到短边为256,然后取10crop。这里的金字塔为{6x6 3x3 2x2 1x1}(笔者注意到,这里算是增加了特征,因为常规pool5后来说,只有6x6;这里另外多了9+4+1个特征)
- 作者将金字塔减少为{4x4 3x3 2x2 1x1},这样子,每个filter的feature从原来的36减少为30,但依然有提高。(笔者认为这个还是保留意见比较好)
- 其实这部分的实验比较多,详见论文,不在这里写了。
- 在ILSVRC14上的cls track,作者是第三名
定位实验
这里详细说说笔者较为关心的voc07上面的定位实验
用来对比的对象是RCNN。
方法简述:
- 提取region proposal部分依然用的是selective search
- CNN部分,结构用的是ZF-5(单尺度训练),金字塔用了{6x6 3x3 2x2 1x1},共50个bin
- 分类器也是用了SVM,后处理也是用了cls-specific regression
所以主要差别是在第二步,做出的主要改进在于SPP-net能够一次得到整个feature map,大大减少了计算proposal的特征时候的运算开销。
具体做法,将图片缩放到s∈{480,576,688,864,1200}的大小,于是得到了6个feature map。尽量让region在s集合中对应的尺度接近224x224,然后选择对应的feature map进行提取。(具体如何提取?后面的附录会说)
最后效果如图:
准确率从58.5提高到了59.2,而且速度快了24x
如果用两个模型综合,又提高了一点,到60.9
附录
如何将图像的ROI映射到feature map?
说实话,笔者还是没有完全弄懂这里的操作。先记录目前能够理解的部分。
总体的映射思路为:In our implementation, we project the corner point of a window onto a pixel in the feature maps, such that this corner point (in the image
domain) is closest to the center of the receptive field of that pixel.
略绕,我的理解是:
- 映射的是ROI的两个角点,左上角和右下角,这两个角点就可以唯一确定ROI的位置了。
- 将feature map的pixel映射回来图片空间
- 从映射回来的pixel中选择一个距离角点最近的pixel,作为映射。
如果以ZF-5为例子,具体的计算公式为:
这里有几个变量
- 139代表的是感受野的直径,计算这个也需要一点技巧了:如果一个filter的kernelsize=x,stride=y,而输出的reponse map的长度是n,那么其对应的感受野的长度为:n+(n-1)*(stride-1)+2*((kernelsize-1)/2)
- 16是effective stride,这里笔者理解为,将conv5的pixel映射到图片空间后,两个pixel之间的stride。(计算方法,所有stride连乘,对于ZF-5为2x2x2x2=16)
- 63和75怎么计算,还没有推出来。。。。囧
写的非常好,忍不住就转了
rcnn spp_net的更多相关文章
- rcnn spp_net hcp
rcnn开创性工作,但是计算时间太长,重复计算太大. spp_net将重复计算避免了. hcp是yan shuicheng那边的,是用bing生成regions,然后用normalized cut将这 ...
- r-cnn学习(九):学习总结
首先看下代码文件夹的说明(这部分转自:http://blog.csdn.net/bailufeiyan/article/details/50749694) tools 在tools文件夹中,是我们直接 ...
- Fast RCNN 训练自己的数据集(3训练和检测)
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ https://github.com/YihangLou/fas ...
- Fast RCNN 训练自己数据集 (2修改数据读取接口)
Fast RCNN训练自己的数据集 (2修改读写接口) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ http ...
- r-cnn学习(八):minibatch
这段代码包括由输入图片随机生成相应的RoIs,并生成相应的blobs,由roidb得到相应的 minibatch.其代码如下. # ---------------------------------- ...
- rcnn学习(六):imdb.py学习
# -------------------------------------------------------- # Fast R-CNN # Copyright (c) 2015 Microso ...
- r-cnn学习(六):RPN及AnchorTargetLayer学习
RPN网络是faster与fast的主要区别,输入特征图,输出region proposals以及相应的分数. # ------------------------------------------ ...
- r-cnn学习(五):SmoothL1LossLayer论文与代码的结合理解
A Loss Function for Learning Region Proposals 训练RPN时,只对两种anchor给予正标签:和gt_box有着最高的IoU && IoU超 ...
- r-cnn学习(四):train_faster_rcnn_alt_opt.py源码学习
论文看的云里雾里,希望通过阅读其代码来进一步了解. 参考:http://blog.csdn.net/sloanqin/article/details/51525692 首先是./tools/train ...
随机推荐
- Android手机上抓包神器
Packet Capture 一款依托安卓系统自身VPN来达到免Root抓取数据包的应用程序.Packet Capture一个使用SSL网络解密的 捕获数据包/网络嗅探 工具,虽然它的功能并不丰富,但 ...
- Oracle中的一些查询语句及其执行顺序
查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...
- kindeditor简单使用
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- js实现图片点击弹出放大效果
点击图片,显示蒙板,放大图片的简单案例 HTML代码: <div> <img height=" src="https://img-blog.csdn.net/20 ...
- QT基于model/view数据库编程2
Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 基于model/view数据库编程: qt提供model类: Q ...
- Maven 运行启动时****找不到符号*com.xxx.user.java
Maven 运行启动时****找不到符号*com.xxx.user.java maven项目更改后没有安装 (install) 重新安装解决问题!
- 导入项目后,js文件报错解决方法
导入项目后,发现 js文件报错,但是js文件是从官网下载的.解决办法: 选中报错的js文件, 右键选择 MyEclipse-->Exclude From Validation : 然后继续右键执 ...
- python运算符及优先级顺序
python语言是一门脚本语言,支持面向对象.面向过程编程,兼具编译性和解释性的动态语言,整理出学习过程中一些基本Python运算符和运算符的优先级顺序. 一.算术运算符 运算符 描述 + 加 - 两 ...
- [异常笔记]poi读取Excel异常
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The sup ...
- Win7下如何安装python pygame的whl包
看了小甲鱼的python教程,对那个python版本的打飞机游戏很感兴趣,尝试运行,居然报错了,提示缺少pygame包: 仔细一看需要安装一个pygame的包,默认安装好python是不包括这个包的, ...