Introduction
传统的CNN中,convolution 和 pooling 的操作已被定死。只能在方正死板的区域内按部就班地映射操作:
这种设计显然对于现实场景中遇到ratio(比例)和rotation(旋转角度)多变的的非刚体object,是不够general的。那么怎么办呢?
传统的回避途径有以下两个:
- 根据先验 加数据:根据先验信息,增加training dataset的ratio和rotation多样性和丰富性;
- 使用“平移不变”的结构:主要为基于“滑窗”的检测结构。
但是依然无法一劳永逸,原因有二:
- 对object的 新 几何变换不general;
- 对object的 复杂 几何变换不general。
与其回避,不如直面。对于传统的一套fixed的module(普通convolution、普通RoI Pooling),MSRA的Dai Jifeng大佬对应提出了deformable的一套module:Deformable Convolution & Deformable RoI Pooling。
本质的解决思路就是,让传统的Convolution和RoI Pooling操作能够 “ 自动形变 ” :
通过“deformable”的逐层叠加,使得CNN能 更精准地 (不受ratio、rotation的影响) 读取object的语义:
Innovation
Deformable Convolution
普通的Convolution计算公式如下:
其中
R
R
R定义为:
Deformable Convolution在其后面简单地加上了一个 “ 2-D offset ” :
于是,新的Deformable Convolution计算公式如下:
Deformable RoI Pooling
普通的RoI Pooling计算公式如下:
同样的,Deformable RoI Pooling也是简单地在其后面加上了一个 “ 2-D offset ” :
得到新的Deformable RoI Pooling计算公式如下:
Deformable PS RoI Pooling
作者还顺带对自己在R-FCN中提出的PS RoI Pooling进行了一下“deformable”改进:
Result
通过实验,发现如果“Deformable conv3×3”逐层叠加三次,感受野可以比普通Convolution的叠加更加契合object的实际范围。这也意味着,可能会获得更精准的语义信息来帮助识别:
Detection领域和Segmentation领域的几大扛把子算法也出来为“Deformable套件”代言:“自从用了MSRA的Deformable,mAP越来越高。” (= ̄ω ̄=)
Note:
- 之所以只用在最后几层,是因为:后面细节信息丢失较多,才需要deform来将object更好地刻画。
最后,连COCO数据集都站出来,用满表全胜的数据为“Deformable套件”打call:“Deformable就是好,稳定涨点,谁用谁知道。。。” ( ̄▽ ̄)~*
Thinking
简单地说,deformable module就是在传统module的输出后面加上了一个 “2-D offset”。
在我看来,DCN的好处主要有四:
- 设计简单;
- 增加的参数量少;
- 支持training end-to-end;
- 对各复杂的视觉task都general。
当大家趋之若鹜压榨Feature/Image Pyramid、Head、Proposal、Speed/accuracy trade-off剩余价值的时候,DCN却另辟蹊径,洞察本质,对最基石的 Conv / RoI_Pooling 计算方式开刀。不得不说,insight很棒,简直拨云见雾,天马行空。