【一步一步的积累】OverFeat
(arXiv 201312) OverFeat: Integrated Recognition, Localization and Detection usingConvolutional Networks
这是一篇2014.02的文章,作者是LeCun实验室的。这篇文章主要的贡献就是如标题所述的使用同一个卷积网络完成了多个任务。这个体现了CNN特征共享的优点。这样的思想很有用,有一些论文中用到类似的思想:比如说Synergistic face detection and pose estimation with energy-based models就使用了同一个网络做了face detection和pose estimation。再比如我在手势识别的项目中把classification和regression一起做了(思考:网络具备了这样的能力,但是是否要比分开任务的性能更好,就需要各种验证了)。
其实算法的思路很简单:输入一个raw的图像,通过同一个网络,同时完成classification,localization和detection的任务。关于这三者的定义和区别可以参见文中第2页末尾。
亮点1:多尺度-classification
通常的分类是给了一个东西,然后判定类别,但是给了一张图,不知道东西在哪该如何分类?所以一般的方法是“金字塔+sliding window”结构,然后对每一个window做一次分类。这样的算法是非常耗时的,作者认为,不需要sliding window的过程,我们可以在同一个网络里面完成。这里插一句:为什么不用直接输入图像就给出类别呢?那是因为像ImageNet这样的数据,主要的物体是在图像中央,并且大小是填充了图像相当大的部分的,所以就算是有一些variation,那也是CNN能handle的,但是如果在测试中物体只是一个很小尺寸,并且出现在图像的一个角落,那么这个variation对于训练数据来说是完全impossible的。所以直接CNN分类的效果会很差。除非训练数据覆盖了各种尺寸和位置,当然这是non-sense的。那么这篇文章是怎么实现的呢?在原图上滑窗是笨拙的,那么就在输出的feature map上滑。
我们从网络入手,红色标记的stride表示的就相当于对原图降采样,所以才会有作者说的:“However, thetotal subsampling ratio in the network described above is 2x3x2x3, or 36.”那么对于221*221的图像来说,通过了前面的conv+pooling就瞬间变成了6*6了。现在可以开心的在这个feature map上做滑动了。可以看到layer7(第一个fc层)的输入是5*5的,也就是说用这个5*5的窗口去6*6的上面滑,就可以得到2*2的窗口了,每一个窗口对应一个位置,将这4个5*5的作为输入,分别输入fc,这样就可以得到4个C向量,C代表要分的1000个类。炫酷吧。这样实现了一个coarse滑窗。
但是作者觉得不够,这样的不够精细,*36倍呢。所以想到了一个offset的方法(灵感来自Ref【9】),参考下面图
然后作者还是觉得不够,就在输入图像就做了手脚,又从Ref【15】里面得到灵感,【15】将图像做了crop,四个corner,加一个中间,总共变成了5个子图像,然后对图像进行翻转,这样就变成了10个图像。本文作者不知道为什么采用的是“We then extract 5 random crops(and their horizontal flips)”不过核心思想是一样的,这样sliding window又变多了。
作者最后还做了一个scale上的变换,这个就没什么好说的了,把图像放缩到6个尺度上,所以,最终,这个多尺度的滑窗思想就得到实现了。
得到了那么多的窗口,就有那么多的classification结果,平均一下概率值,就可以得到最终的classification结果了。其实有了那么多的结果也未必是好事,融合结果会导致有些尺度上的强响应会丢失。不过鲁棒性会变好。我们来看看分类的结果
从结果来看,整体是变好了的,主要应该还是因为sliding window和scale的功劳。至于那个offset的改进,从第3,4行来看,好像并没有什么大的提升,说明差这几个像素,对于不停做convolution的图像来说,真的没啥影响。另外最后看到多模型的融合,这还是王道啊。侧面也说明了,这样的模型的学习和样本的影响在深度学习中还是有很多问题的,不稳定。
亮点2:多任务
上面说完了classification,localization就简单多了,反正就是在刚才那个架构上去regression出四个参数,表达box的四个角。输出了再combine一下,总的来说就没有什么新意了。Detection就更没什么说的了,连作者都懒得说了。
同时做了多个任务,这个做法我有一些看法,就是多任务一起做到底是好还是坏?我没有定论,个人感觉是要看任务的相关性,比如说classification和localization,classification会帮助提取物体自身的feature,而打破了纯粹的localization中的combined context的影响,当然这个还是要看样本的选择。当然这个还需要今后进一步的去论证。
滑窗,利用feature map来避免大量的sliding window,个人感觉肯定只是在原始图像上做sliding window的一种折衷方案,毕竟太耗时了。不过方法还是有一定的启发的,不知道什么时候能出一个好的解决框架。
多模型,多尺度,没什么说的,踏踏实实的好东西
讨论
- “打破了纯粹的localization中的combined context的影响“?
—— 做localization实际项目时,一般物体都是处于图像的某个小区域,所以对全图做训练很容易把物体和经常出现的context combine在一起,这样一旦样本不够充分,就很容易学出combine在一起的context特征而不是单纯的object特征。 - 如果我是用原图做多scale的滑窗,和现在这个方法在feature map上做sliding window比,哪个性能好?
—— 这个没有具体的对比试验佐证,但是在最后输出的feature map上做sliding window,更像是选取了相应更好的特征区域,所以和在原图上做sliding window是不同的,从感觉上来说,对于classification这个任务来说应该是更好的,因为它打破了bounding box的约束,更好的“包含”了好的特征。另外,因为max pooling的非线性操作,所以不可能往回找到sliding window在原图上的位置 - 再插一句,如果最后出来的36个vector,直接全部fc,而不是做平均,估计效果会更好,只是怕参数量太大了。这样样本的需求也太大。不过如果这样直接连接FC层的话,才会更好的体现end-to-end的精神。
【一步一步的积累】OverFeat相关推荐
- netcore权限控制_记录这两年是如何一步一步转型到.net core+k8s
2017年12月份,我离开北京,回到了武汉,开始在现在这家公司担任架构师工作.经过2年的时间,逐步完成以.net core+k8s为核心的技术架构.文末有彩蛋. 以下整理这两年的主要时间节点: 201 ...
- 计划得一步一步实施,题库首先是第一步!
大家好,我是雄雄,好久没见了哈,欢迎关注公众号:雄雄的小课堂. 今天上午没有讲课,听写以及把假期作业整理了下,部分学生的假期作业偷工减料,也都让让让他们挨个补上了. 上午将对班级后期的整个计划大致的介 ...
- 装mysql最后一步没响应_每天14点遭遇惊魂时刻,如何一步一步揪出真凶?
" 笔者所在的公司有一款大 DAU(日活)的休闲游戏.这款游戏的后端架构很简单,可以简单理解为通讯-逻辑-存储三层结构.其中存储层大量使用了 Redis 和 MySQL. 图片来自 Pexe ...
- oracle如何查看某个时间段调用的函数的异常信息_每天14点遭遇惊魂时刻,如何一步一步揪出真凶?...
笔者所在的公司有一款大 DAU(日活)的休闲游戏.这款游戏的后端架构很简单,可以简单理解为通讯-逻辑-存储三层结构.其中存储层大量使用了 Redis 和 MySQL. 图片来自 Pexels 随着存量 ...
- 【学术素养】做学问,你必须脚踏实地,一步一步去寻找未知,没有捷径可走
近日,美国克瑞顿大学(Creighton University)开除了一位来自中国的研究生. 这位被开除研究生的导师袁劲梅教授,郑重地写下了长长的一封信,坦言:我就不该录取你! 这封信字字珠玑.发人深 ...
- 创业-《斯坦福大学创业成长课》书中的精髓:创业者如何从零到一,一步一步走向成功。
<斯坦福大学创业成长课>书中的精髓:创业者如何从零到一,一步一步走向成功. 在全民创业的时代,死守着一份工资,望着显而易见的职业晋升天花板,看着朋友们毅然决然地离开单位,一拳一脚地创业成功 ...
- 如何一步一步建立自己的技术影响力
很多朋友是不是有这样的经历,当我们还是一个菜鸟的时候,团队里总有1-2个技术大拿,每当有技术问题大家争论不休,团队成员讨论的面红耳赤,技术大牛实在看不下去,掐灭手中的烟头,喝掉面前方便面的最后一点热汤 ...
- 调试JDK源码-一步一步看HashMap怎么Hash和扩容
调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...
- 一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)
之前写过几篇关于Caffe源码在Windows764位上配置编译及使用过程,只是没有把整个工程放到网上,最近把整个工程整理清理了下,把它放到了GitHub上.下面对这个工程的使用作几点说明: 1. ...
- 一步一步实现扫雷游戏(C语言实现)(三)
使用WIN32API连接窗口 此项目相关博文链接 一步一步实现扫雷游戏(C语言实现)(一) 一步一步实现扫雷游戏(C语言实现)(二) 一步一步实现扫雷游戏(C语言实现)(三) 一步一步实现扫雷游戏(C ...
最新文章
- 光流 | OpenCV实现简单的optical flow(代码类)
- spring原始注解开发-01
- FreeSql (三十四)CodeFirst 迁移说明
- Android开发笔记(二十六)Java的容器类
- 近期将要学习的内容(flag)
- python3 datatime,python3处理时间和日期:datetime模块 – Python3教程
- 市场主流单片机的介绍和选择指南
- Android - Enable fullscreen mode
- 南京大学人工智能学院教授俞扬:我的牛年小结
- C/C++ 程序员的编程修养
- 小米2S进Recovery
- 第八课:ShuffleNet v1、ShuffleNet v2学习
- 除了《千与千寻》,宫崎骏漫画的花卉治愈了观众,而花艺学院治愈了你一片温情
- Raspberry Pi 3 -- Respeaker 4-mic的基本使用
- 密钥可以永久激活吗?
- 优秀Android开发源码合集(附解析)程序员进阶宝典
- 【Java】Java中空字符的写法
- idea 起项目乱七八糟报错
- 第一章、计算机网络与英特网(重点知识梳理)
- 解决苹果手机里面的网页返回不刷新页面的问题
热门文章
- Spectre V2 理论与实践
- 百旺税控盘清卡时候服务器返回为空,百旺税控盘会自动清卡吗
- 计算机科学第一讲——计算机早期历史
- dell进入u盘启动模式_调整戴尔电脑硬盘模式设置U盘第一启动
- 洛谷:海底高铁(P3406)C++
- halcon深度学习训练的时候报错:Training step failed.This might be caused by unsuitable hyperparameters(错误代码:7720)
- python如何调整图片大小_Python基础进阶 - 如何使用Python调整图像大小
- 整理的Unity 面试题(有些没答案都是师兄在脑海里记录下来的)(一)
- 快递单号导入有空格怎么删除并查询全部物流信息
- php mysql sum()_PHP MYSQL中的SUM和循环(SUM and Looping in PHP MYSQL)