理解DeepBox算法

理解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了。

原文地址:https://www.cnblogs.com/zjutzz/p/8232740.html

时间: 2024-10-09 22:05:11

理解DeepBox算法的相关文章

一步一步理解Paxos算法

一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS上.即便如此paxos算法还是没有得到重视,2001年Lamport用可读性比较强的叙述性语言给出算法描述.可见Lamport对 paxos算法情有独钟.近几年paxos算法的普遍使用也证明它在分布式一致性算法中的重要地位.06年google的三篇论文初现“云”的端倪,其中的chubby锁服务使用p

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

[经典算法]——KMP,深入讲解next数组的求解 前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲.今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给我留言. 1.kmp算法的原理: 本部分内容转自:http://w

最短路径:我的理解--SPFA算法

最短路径:我的理解--SPFA算法 SPFA算法 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. 最短路径快速算法-SPFA算法是西南交通大学段凡丁于1994年发表的. 适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一定存在.当然,我们可以在执行该算法前做一次拓扑排序,以判断是否存在负权回路,但

从零实现来理解机器学习算法:书籍推荐及障碍的克服

前部为英文原文,原文链接:http://machinelearningmastery.com/understand-machine-learning-algorithms-by-implementing-them-from-scratch/ 后部为中文翻译,本文中文部分转自:http://www.csdn.net/article/2015-09-08/2825646 Understand Machine Learning Algorithms By Implementing Them From

深入理解快速排序算法的稳定性

在初次接触排序算法稳定性这个概念时,我一直认为复杂度为O(n2)的算法是稳定的,复杂度为O(nlogn)的算法是不稳定的.当时是这样理解的,复杂度为O(n2)的算法不可能再坏,而复杂度为O(nlogn)的算法在极端情况下可能会退化为O(n2),例如快速排序.但其实这是错误的,稳定性的概念远没有这么复杂,它只表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是稳定的,否则是不稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 之前对稳

再理解RankNet算法

再理解RankNet算法 前面的一篇博文介绍了学习排序算法(Learning to Rank)中的RankNet算法.如下: http://blog.csdn.net/puqutogether/article/details/42124491 那次的入门对其中的算法流程和基本原理没有深入了解,这次看自动摘要提取算法的时候,里面有一个排序单元,使用到的就是学习排序算法中的RankNet,这个时候才理解了.这就说明,有的时候回过头来看某些算法,你的认识会加深的. 好了,这次主要说一下RankNet这

理解机器学习算法的一点心得

从Andrew ng的公开课开始,机器学习的算法我接触到的也越来越多,我觉得机器学习算法和传统算法的最大不同就是:不会要求一个问题被100%求解,也就意味着不会有完美的解法,这也是著名的"Essentially, all models are wrong, but some are useful."所表达的意思.正因为如此,机器学习算法往往不会有一个固定的算法流程,取而代之的把问题转化为最优化的问题,无论是ML(maximum likelihood),MAP(Maximum a Pos

递归方法理解快速排序算法

快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.最坏情况的时间复杂度为O(n2),最好 情况时间复杂度为O(nlog2n). 另外 java没指针概念 可以认为是句柄 假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所

“深入理解”—插入排序算法

总结下自己对插入排序的理解. 插入排序算法思想:每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素. 插入排序包括:直接插入排序.二分插入排序以及希尔排序. 1.直接插入排序: public void insert(int[] a) { for(int i=1;i<a.length;i++) //n-1此扫描,依次向前插入n-1个元素 { int temp=a[i]; //每趟将a[i]插入到前面的排序子序列中 int j; for(j=i-1;j>=