一句话概括,根节点+可变部分节点,在CNN出来之前,被认为是最好的detector
一句话概括,联合训练CNN和SVM。
Note of a MOOC course, and I try to take note by English. :)
一句话概括,用CNN作为特征提取器,然后连接上一个Guassian Kernel SVM作为强分类器。
ILSVRC2014结束了,我们队伍在cls+loc的track是第三名(SYSU_Vision,err=31.9%),跟第一名结果差6.6%(VGG, 25.3%)。
我们的工作
Solution 1
classification
- 基于Caffe进行来训练分类模型,模型的设计参考了Alex的工作和Matthew的工作。我们训练出来的单个模型的top5err=18%(略菜啊。。竟然还调了1个月)
- 使用了Overfeat提供的两个模型,top5err分别是16%和17%
- 对上面三个模型的结果求平均,得到了classification最后的top5err=14.33%
localization
- 训练了单个的CNN模型,输出是直接回归bbox的结果(x1, y1, x2, y2)。这样子,准确率在65%左右。
- 使用上述的CNN模型,对于每个类别都finetuning出来一个单独的CNN,合计1k个模型,这样子准确率提高到71%左右
- 利用聚类的方法,将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框架。具体来说:
- 对于每张图片,用selective search提取出约2k个proposal
- 对proposal训练一个CNN的分类模型,训练时候用的是上面的classfication中的CNN模型作为初始化。
classification+localization
也是串联起来:
- 先用classfication中的CNN选出top5的prediction
- 对于2k个proposal,用localization的CNN计算出每个proposal的分数并排序
- 对于每个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%
得失
- 差距是有的,但是我觉得没有想象中大。主要差在:
- 准备时间,从6月份开始备战,最后转到rcnn框架下距离比赛还有两周,基本没时间调参了,一些改进的想法也没有时间做了。
- 个人觉得主要差距是在分类模型上,err14.4%vserr7.4%,差了7个点,我换算过,如果我们的分类模型能够达到这个水平,cls+loc的错误率会降到26%附近。
- 如果让我概括这次比赛的结果,我觉得是两点:
- RCNN的selective search+CNN分类的框架被优胜队伍广泛使用
- detection的提高是因为classification的提高,classification的提高是因为用了更大更深的网络
- 个人需要改进的
- 论文读太少,到后期才开始看Overfeat和RCNN,这些工作应该从一开始就要看的,在没有把握到正确方向之前就开始盲目实验导致了浪费了大量时间。
- 讨论得太少,一周一次的组内的讨论应该算是充分了,主要是缺少到组外去抱大腿,应该要多看牛人们分享的信息。
- 创新少,从上面可以看出我们的工作大部分是借用了现成的框架,代码,甚至模型,除了在Solution 1的聚类finetuning是自己想的方法,没有太多新的思路。
一句话概括,由于我们具有擅长直觉处理且反应迅速的系统1(快思考),以及擅长计算但相当懒惰的系统2(慢思考),所以我们会有很多的系统性偏差和偏见。本书讨论的就是这些系统性的偏差带来的影响。
一句话概括,一些训练和测试CNN时候的trick,可以提高准确率
一句话概述,用BING+CNN做multi-cls问题