论文地址: https://arxiv.org/abs/1809.00916
pytorch实现地址: https://github.com/PkuRainBow/OCNet.pytorch
这篇论文主要创新了OCP object context pooling, 也就是把Self-attention 机制带来的attention得分加入到feature maps 里面, 提升效果也不错,做一下学习记录。
具体如下:
当前分割网络优化研究的2条baselines: 1. 提高feature map 的分辨率, 比如说空洞卷积。 2. context分析,提高图片labeling的鲁棒性。
其中提到了场景分割当前的两种提升feature map size的方法,分别是来自pspnet和deeplab v3:
金字塔池化模块pyramid pooling module(去除CNN固定大小的图像分类约束,减少不同区域之间的信息损失)
以及deeplab v3的
ASPP(atrous spatial pyramid pooling)(空洞卷积级联或不同采样率空洞卷积并行架构) 1个1×1 卷积和三个3×3的, 采样率为rates={6,12,18}的空洞卷积,滤波器数量为256,包含BN层
最重要的提到了attention机制在计算机视觉的应用:
attention简介:通常用于rnn序列模型,机器翻译,视频分类等。self-attention来计算在一个句子中,一个字母或单词的位置信息受整个语义中其他字母或单词的影响程度。 先来看一个翻译的例子“I arrived at the bank after crossing the river” 这里面的bank指的是银行还是河岸呢,这就需要我们联系上下文,当我们看到river之后就应该知道这里bank很大概率指的是河岸。 Self-Attention则利用了Attention机制,计算每个单词与其他所有单词之间的关联,在这句话里,当翻译bank一词时,river一词就有较高的Attention score。利用这些Attention score就可以得到一个加权的表示,然后再放到一个前馈神经网络中得到新的表示,这一表示很好的考虑到上下文的信息。
以及Attention在计算机视觉的应用在下面这张图解释的很清楚:
对于feature map X,上面两路是获取attention map, 下面一列是一个线性变换,最后相乘得到最终结果。 对于第一路 (C/dn, N),对f(x)进行转置后与g(x)(C/dn, N)进行矩阵乘法,得到A2(shape=[N, N]),然后对其每一行进行softmax,即可得到所有特征点对某一个特征点的权重,即attention map A中的每一行相加为1, 第i行的N个数分别代表在第i个点上其余所有点对其的贡献,这样通过每一行就能得到其他所有点对这个点的贡献值,而每一列则可以得到某一个点对其他所有点的贡献值。然后最后一行1x1卷积得到h(x)(shape=[C, N]), 与attention map A的转置相乘(A转置后每一列权重和为1)便得到最终的结果。
attention map中装的是每个像素对于某一个像素的评分,在做softmax之前 对f(x) 和 g(x)T做了矩阵相乘得到协方差矩阵
self Attention主要是对query和key vectors的点积做softmax映射,得到0-1的评分值,attention 在rnn的应用,以及self-attention可以看这个链接 https://jalammar.github.io/illustrated-transformer/
具体的就是attention在OCP中的应用了,有三种分别对pspnet和deeplab v3的修改,如下,介绍的很详细了:
OCP 的关键两部分是: object context estimation 和 object context aggregation object context estimation: 表示了在Wp中的一个像素点p,以及vector中存了其他像素对p像素相关度的程度。
最后得出的结果还是不错的,可以在检测,分类,分割中都尝试应用attention的机制:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Caffe学习记录(十三) OCNet分割网络学习 - Python技术站