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