在路上@ILSVRC2014

ILSVRC2014结束了,我们队伍在cls+loc的track是第三名(SYSU_Vision,err=31.9%),跟第一名结果差6.6%(VGG, 25.3%)。

我们的工作

Solution 1

classification

  1. 基于Caffe进行来训练分类模型,模型的设计参考了Alex的工作Matthew的工作。我们训练出来的单个模型的top5err=18%(略菜啊。。竟然还调了1个月)
  2. 使用了Overfeat提供的两个模型,top5err分别是16%和17%
  3. 对上面三个模型的结果求平均,得到了classification最后的top5err=14.33%

localization

  1. 训练了单个的CNN模型,输出是直接回归bbox的结果(x1, y1, x2, y2)。这样子,准确率在65%左右。
  2. 使用上述的CNN模型,对于每个类别都finetuning出来一个单独的CNN,合计1k个模型,这样子准确率提高到71%左右
  3. 利用聚类的方法,将10个相近的类别聚在一个cluster里面,对于每个cluster里面的类别,通过share样本进行finetuning,这样子准确率提到到75%左右。

classification+localization

简单地将上面的模型串联起来:先做classification,得到类别的top5 predictions,然后对于每个predction,使用对应的localization模型得到bbox。
所以准确率可以简单地乘起来,最后在test的top5err为36.3%

Solution 2

classification

用的是与solution 1一样的分类模型,top5err=14.33%

localization

参考了R-CNN框架。具体来说:

  1. 对于每张图片,用selective search提取出约2k个proposal
  2. 对proposal训练一个CNN的分类模型,训练时候用的是上面的classfication中的CNN模型作为初始化。

classification+localization

也是串联起来:

  1. 先用classfication中的CNN选出top5的prediction
  2. 对于2k个proposal,用localization的CNN计算出每个proposal的分数并排序
  3. 对于每个top5的prediction,选择该类下分数最高的proposal作为定位结果

Solution 2的top5err为36.3%

更多细节

  • 为何要先分类再定位,而不直接用R-CNN框架直接做detection?
    因为cls+loc数据集跟det数据集不一样,gt bbox没有完全标记,所以无法得到确定的背景。因而很难训练出一个好的分类CNN,导致了直接用R-CNN框架时候,分类的准确率过低(top5准确率在70%左右)。
  • 训练localization中的CNN时候,overlap>0.8的proposal是正样本,overlap<0.3的proposal是负样本——也就是overlap在0.3~0.8之间的样本被忽略了。这是因为cls+loc只要求给每一类找到一个实例即可(而不像det里面需要找到所有实例),于是拉开正负样本距离能够提高模型对正样本的分辨能力,以及减少训练时间。
  • 为什么效果不够理想?
    因为时间不够了。。。当时做R-CNN时候,距离提交时间还有两周,走一遍流程时间就用完了,没有时间调参,个人认为经过调参后效果应该能够提高好几个点。
    另外,对比优胜队伍,我们的分类准确率也低了很多。。。这也是效果不好的一大原因。
  • 提高的思路?
    • 当然是,调参。
    • 在得到最高分的proposal后,不是直接当成识别出来的bbox,而是在proposal里面做一次回归来修正得到结果作为bbox。

Solution 3

直接对上述两种方法出来的bbox求平均,top5err下降到33.8%

Solution 4

在验证集的5w中图片中,分别用Solution 1和Solution 2跑出结果,并统计其中每一类的定位的准确率。
那么我们就知道了对于某些类来说,solution 1起到比较好的定位结果;而另外一些类比较适合用Solution 2(通常都是包含了小物体和多物体的类别,用selective search能够比直接回归表现好)
然后,测试阶段,对于识别出来的top5分类结果,选择较好的定位模型来进行定位。
这样做的话,top5err下降到了31.9%

得失

  • 差距是有的,但是我觉得没有想象中大。主要差在:
    1. 准备时间,从6月份开始备战,最后转到rcnn框架下距离比赛还有两周,基本没时间调参了,一些改进的想法也没有时间做了。
    2. 个人觉得主要差距是在分类模型上,err14.4%vserr7.4%,差了7个点,我换算过,如果我们的分类模型能够达到这个水平,cls+loc的错误率会降到26%附近。
  • 如果让我概括这次比赛的结果,我觉得是两点:
    • RCNN的selective search+CNN分类的框架被优胜队伍广泛使用
    • detection的提高是因为classification的提高,classification的提高是因为用了更大更深的网络
  • 个人需要改进的
    • 论文读太少,到后期才开始看Overfeat和RCNN,这些工作应该从一开始就要看的,在没有把握到正确方向之前就开始盲目实验导致了浪费了大量时间。
    • 讨论得太少,一周一次的组内的讨论应该算是充分了,主要是缺少到组外去抱大腿,应该要多看牛人们分享的信息。
    • 创新少,从上面可以看出我们的工作大部分是借用了现成的框架,代码,甚至模型,除了在Solution 1的聚类finetuning是自己想的方法,没有太多新的思路。
很久没有更新网站,发现多了不少评论和问题,无法一一回复,如果现在仍有问题请再次留言 :) 2016.03.29