理解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. centos U盘挂载问题

    查看u盘路径 fdisk -l Disk /dev/sda: 16.2 GB, 16236150784 bytes, 31711232 sectors Units = sectors of 1 * 5 ...

  2. 【keepalived】CentOS7.0下安装教程

    安装前所需环境 keepalived安装之前,需要环境:wget.gcc.pcre.openssl.zlib.popt-devel 1,wget:用于从外网上下载插件 wget安装命令:yum -y ...

  3. Python全栈(第一部分)day1

    计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,4G,8G,16G,32G,成本高,断电即消失. 硬盘:1T,固态硬盘,机械硬盘,储存数据,应该长久保持数据,重要文件,小电影等等. 操 ...

  4. k64 datasheet学习笔记12---System Integration Module (SIM)

    1.前言 Features of the SIM include: System clocking configuration(1)System clock divide values(2) Arch ...

  5. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  6. mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系【转】

    转自:https://blog.csdn.net/bmw7bmw7/article/details/45876487 我们先来看一个公式:Mipiclock = [ (width+hsync+hfp+ ...

  7. 递归求i^2的和

    题目描述: 用递归方法求f(n)=累加i^2,(i=1~n) #include<iostream> double fac(int n){ double s; if(n==1) s=1; e ...

  8. python3+selenium入门16-窗口截图

    有时候需要把一些浏览器当前窗口截图下来,比如操作抱错的时候.WebDriver类下.get_screenshot_as_file()方法可窗口截图,需要传入一个截图文件名的路径.window要用\\当 ...

  9. oracle 会话 解锁

    背景 这是当年第一次记录博客,当初记录的原因是感觉有些问题很少碰到,碰到有网上寻找一遍,文章很少是正好对症的,折腾半天终于解决了,但是没有记录过程,结果下次碰到又要从来一次.有的问题还极其不好找,or ...

  10. LabVIEW--为控件添加说明信息

    之前只知道为VI添加说明信息(在VI的属性里面添加,快捷键ctrl+I 打开),今天知道了控件也可以添加说明信息,这样就方便了许多,极大的提高了程序的可读性.