理解DeepBox算法

基本情况

论文发表在ICCV2015,作者是Berkeley的博士生Weicheng Kuo:

@inproceedings{KuoICCV15DeepBox,
Author = {Weicheng Kuo, Bharath Hariharan, Jitendra Malik},
Title = {DeepBox:Learning Objectness with Convolutional Networks},
Booktitle = {International Conference on Computer Vision ({ICCV})},
Year = {2015}
}

代码开源在github上:https://github.com/weichengkuo/DeepBox

论文主要干了一件事:用一个卷积网,对于bottom-up方法(主要是EdgeBox)产生的proposal重新打分(re-rank)。也就是用EdgeBox等方法产生的proposal区域进行重新排序,把准确的区域赋予更高的objectness score。

更直白一点:EdgeBox产生的每个propsal都有得分,得分有高有低,但有时候最准的box得分并不高,得分高的box并不准,用一个卷积网将这个score进行纠正。

提出的方法

首先要用EdgeBox等传统的bottom-up方法来提取proposal区域,然后再送入一个小的网络做training/inference。

所以论文中claim的,相比于EdgeBox在精度上有提升,这个好理解,毕竟踩在前人的肩膀上;也正是因为踩在前人肩上所以时间开销应该是EdgeBox的单图0.25s+卷积网的inference时间,原文仅仅是claim了网络上的时间开销,反正怎样都是比EdgeBox慢了。

使用的网络,作者说也尝试了VGG16, AlexNet,然而其实用一个更小的4层网络就可以差不多了,这样下来速度快,精度几乎一样,那就果断小网络。

网络的训练方法:原文提到,DeepBox的4层小网络需要两个stage的训练。第一个stage,样本是sliding window产生的,是easy samples,并且网络其实前两层还是需要从AlexNet初始化的;第二个stage则是基于前一个stage的结果做finetune,样本换成用EdgeBox产生的proposal区域,依然是和bbgt计算IoU来区分为正/负样本,只不过和第一个stage相比,IoU的阈值从0.5换成了0.3/0.7。

至于提到的Fast Dbox,从现在看来很正常了,因为SPPnet和Fast RCNN都采取了这样的节省计算的方式:整图送入卷积网而不是每个区域分别作为网络输入,俗称特征共享,其实说到底还是region proposal太多了,整体的overlap也多。

在论文后面也提到其实仅仅一个stage的训练其实就可以了(仅第二个stage)。看了代码也的确是这样,是从CaffeNet.v2.caffemodel做网络前两层的初始化。这个CaffeNet.v2.caffemodel其实是来自RBG大神的Fast R-CNN开源代码提供的imagenet_models.tgz里提供的(而py-faster-rcnn并未提供此文件就是另一回事了)。

开箱使用

好吧,其实我只是想看看代码跑起来什么样子。提供的代码默认是运行fast dbox的,而且原文说了,这个fast版本的只提供MSCOCO数据集的训练和测试结果。EdgeBox预处理的数据需要从Berkeley的校网上下载,国内网络下载它异常艰辛,开了迅雷下不动而关掉会员反而就可以了。

代码可以说是fork自Fast R-CNN而加入和修改了一些东西。一些准备的数据是放在.mat文件中的,发现matlab中存储数据时指定-v7这样的版本就能用HDF接口进行读取了,因此python中使用h5py包来读取的。因为python语言自身的问题,加载数据后不肯归还内存给操作系统,整个MSCOCO 2014的数据集在DeepBox代码上训练起来,需要消耗大概24~30G的内存,简直可怕,个人电脑哪有那么大内存,又没有找到合适的服务器来用,还好可以在ubuntu上通过制作swap文件并挂载的方式,手动增加交换分区的容量,这样就能跑起来了。

回过神来

其实Fast R-CNN的论文中虽然没提,但开源的代码中是有说到用EdgeBox作为proposal generator的;而Fast R-CNN的简单理解,就是Proposal Generator+AlexNet+一些其他各种黑魔法,这里AlexNet一定程度上充当了分类器。这样看来DeepBox是做proposal region的re-rank,但怎么看都有点Fast R-CNN把多分类网络换成object or not的二分类网络,产出的结果是“更好地region proposal”,然后可以再“送给Fast R-CNN”做进一步分类等,是把分类的网络做了个简单的级联,只不过第一级是一个粗糙分类也就是Objectness打分,第二级才是精细打分。这样看来,insight可能就在于,看穿了EdgeBox等一众手工设计打分机制的算法。其实手工设计出EdgeBox这种打分方式的作者都是专家大牛了。既然手工设计的score并不足够准确,那么根据边缘(Edge)来决定一个区域是否为object region,也就显得有点武断。所以,DeepMask/SharpMask/FastMask系列方法应运而生,只不过大牛们考虑的已经是细致的Mask Proposal而不是粗糙的Bounding Box Proposal了。

理解DeepBox算法的更多相关文章

  1. 深入理解KMP算法

    前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...

  2. KMP算法详解 --- 彻头彻尾理解KMP算法

    前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k. 但是问题在于如何求出这个最大前后缀长度呢? 我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破, 后来翻看 ...

  3. 一步一步理解Paxos算法

    一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS ...

  4. 简单的理解deflate算法

    简单的理解deflate算法 最近做压缩算法. 用到了deflate压缩算法,  找了很多资料,  这篇文章算是讲的比较易懂的, 这篇文章不长,但却浅显易懂, 基本上涵盖了我想要知道的所有要点. 翻译 ...

  5. 理解 KMP 算法

    KMP(The Knuth-Morris-Pratt Algorithm)算法用于字符串匹配,从字符串中找出给定的子字符串.但它并不是很好理解和掌握.而理解它概念中的部分匹配表,是理解 KMP 算法的 ...

  6. 如何感性地理解EM算法?

    https://www.jianshu.com/p/1121509ac1dc 如果使用基于最大似然估计的模型,模型中存在隐变量,就要用EM算法做参数估计.个人认为,理解EM算法背后的idea,远比看懂 ...

  7. uva11383 Golden Tiger Claw 深入理解km算法

    /** 题目: uva11383 Golden Tiger Claw 深入理解km算法 链接:https://vjudge.net/problem/UVA-11383 题意:lv 思路:lrj训练指南 ...

  8. 怎么理解RSA算法

    原文地址:http://www.ittenyear.com/414/rsa/ 怎么理解RSA算法 能够把非对称加密算法里的公钥想象成一个带锁的箱子,把私钥想象成一把钥匙 能够把对称加密算法里的密钥想象 ...

  9. 如何更好理解Peterson算法?

    如何更好理解Peterson算法? 1 Peterson算法提出的背景 在我们讲述Peterson算法之间,我们先了解一下Peterson算法提出前的背景(即:在这个算法提出之前,前人们都做了哪些工作 ...

随机推荐

  1. Listary的使用

    前几天研究米老师语录之后,开始对工具的使用着迷.现在的慢是为了以后的快,所以现在研究的一些东西,是为了以后在工作中可以更加快速的提高效率. 最近找到了一款很不错的软件,Listary.想给小伙伴们介绍 ...

  2. sorter函数参数设置

    python内置sorted函数排完序生成一个新列表,而列表list.sorted则是直接在原列表上修改 sorted默认排序是正序,即从小到大. 若想倒着排序,则reverse=True 当需要排序 ...

  3. faster-rcnn自己的理解总结(包括它的前世今身R-CNN和fast R-CNN)

    1.grandfather:  R-CNN网络 结构如下: 工作流程: Input(an image)   Proposals(~2K个,在使用CNN提取特征之前还要先resize)  feature ...

  4. nginx反向代理解决跨域

    nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上.通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问.对于浏览器来说,访问的就是同源服务器上的一个 ...

  5. requests库入门03-get请求

    先看一个没有请求参数的get请求,访问百度首页 import requests r = requests.get('https://www.baidu.com') print(r.status_cod ...

  6. Unity-Rigidbody碰撞穿透

    首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色.2.collider,碰撞器,一般用于受力物体上,比如障碍块. 发生概率即触发方式: 1.刚体速度足够快,被撞 ...

  7. tomcat和springboot访问日志及分析

    1.Tomcat设置访问日志 <Host name="localhost" appBase="webapps" unpackWARs="true ...

  8. 【算法】狄克斯特拉算法(Dijkstra’s algorithm)

    狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...

  9. layui框架中关于table方法级渲染和自动化渲染之间的区别简单介绍

    方法级渲染: <table class="layui-hide" id="LAY_table_user" lay-filter="user&qu ...

  10. 使用SimHash进行海量文本去重[转]

    阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...