不得不说,这篇论文和DANet撞车了,而且撞的死死的,用的同样的核心内容,为什么会撞车,那是因为,两个篇文章都套用了同一篇文章的方法,同时想到了一起,你说巧不巧
不同于之前图像级的context的方法,这篇论文提出逐像素的object context,object context由像素P所对应的类别的物体组成。由于测试时不知道标签信息,所以用Self Attention方法通过学习逐像素的相似度图估计objects。在此基础上有进一步提出了Pyramid Object Context和Atrous Spatial Pyramid Object Context来捕获多尺度的上下文。在object context module基础上提出了OCNet,OCNet在Cityscapes和ADE20K数据集上取得了state-of-the-art的结果。
paper: https://arxiv.org/abs/1809.00916
code: https://github.com/PkuRainBow/OCNet
主要贡献:
- 提出了逐像素的object context,包含了与像素P相同类别的objects的信息。
- OCNet在Cityscapes和ADE20K数据集上取得了state-of-the-art的结果
OverView
OCNet以ResNet-101为backbone(后两个block为dilated convolution,dilation rate分别为2和4),其后是这篇文章提出的object context module去计算逐像素的object context,最后是1×1的卷积输出预测图。object context module是基于Self Attention Mechanism,作者一共提出了3种不同的object context module: base-OC, Pyramid-OC, ASP-OC。
Object Context
这里大致介绍了Object Context module中的变量和基本原理。
X为输入的特征图,P为位置特征图,W为由self-attention得到的逐像素的相似度图,第i行表示所有像素与第i个像素的相关性,C为Object Context module最后得到的逐像素的object context表达。用公式表示为:
其中W可由以下公式得到:
进一步又可以写成:
其中:
Object Context Module
这里介绍了3种不同的object context module: base-OC, Pyramid-OC, ASP-OC。每个object context module都含有3个阶段:(1)计算X;(2)计算C;(3)融合。
Base-OC
(1)计算X: 3×3的卷积减少channel从2048到512
(2)计算C: 用self-attention模块计算逐像素的attention map和object context
(3)融合: concatenate C 和 X
进一步用1×1的卷积减少channel维度为512
Pyramid-OC(受PSPNet的启发)
(1)计算X: 3×3的卷积减少channel从2048到512
(2)计算C: 在四个分支中分别用self-attention模块计算逐像素的attention map和object context。第一个分支把全部特征图作为输入,第二个分支把特征图分为2×2的子区域,每个子区域应用共享的transform,第三个和第四个分支把输入分为3×3和6×6的子区域,每个子区域的transform不共享。最后concatenate每个分支的结果并用1×1的卷积增加X的维度与object context的维度相等再进行concatenate
(3)融合: 进一步用1×1的卷积减少channel维度为512
ASP-OC(受DeepLAbV3的ASPP启发)
(1)计算X: 共有5个分支。分别为1×1的卷积,3×3的卷积,dilation rate为12的3×3卷积,dilation rate为24的3×3卷积,dilation rate为36的3×3卷积
(2)计算C: 对每个分支的结果分别用self-attention模块计算逐像素的attention map和object context。实验发现再2,3,4,5分支中使用self-attention模块会有害performance
(3)融合: concatenate C 和 X,进一步用1×1的卷积减少channel维度为512