论文:https://arxiv.org/abs/1812.04103
tensorflow代码:https://github.com/divelab/Non-local-U-Nets
pytorch代码:https://github.com/Whu-wxy/Non-local-U-Nets
存在的不足
作者首先分析了U-Net存在的不足。
- U-Net的encoder部分由若干卷积层和池化层组成,由于他们都是local的运算,只能看到局部的信息,因此需要通过堆叠多层来提取长距离信息,这种方式较为低效,参数量大,计算量也大。过多的下采样导致更多空间信息的损失(U-Net下采样16倍),图像分割要求对每个像素进行准确地预测,空间信息的损失会导致分割图不准确。
- decoder的形式与encoder部分正好相反,包括若干个上采样运算,使用反卷积或插值方法,他们也都是local的方法。
创新点
- 为了解决以上问题,作者基于 self-attention 提出了一个 Non-local 的结构,global aggregation block 用于在上/下采样时可以看到全图的信息,这样会使得到更精准的分割图。
- 简化U-Net,减少参数量,提高推理速度,上采样和下采样使用global aggregation block,使分割更准确。
实际上这个global aggregation block 完完全全就是将 NLP 中的 self-attention ,用到了图像中。不知道 self-attention 的可以看( ),我认为经典的 non-local block 就是把 self-attention 思想简化后应用到图像的结构,不知道 non-local block 的可以看(),
整体网络

一开始输入维度为2 是因为作者的使用的数据集是 脑部 MRI ,每个数据都有2张图,分别是 T1, T2。
整体架构很清晰,我们来看一下每个 Block 具体都是什么。
Input Block
Input Block ,由一个 3 * 3 * 3 ,stride=1的卷积后接一个标准残差块构成。

Down-sampling Block
由下图组成

Bottom Block
底部模块,使用 Global Aggregation Block

Global Aggregation Block

x,y:输入输出
Conv_1N:输出通道为N的点卷积
Unfold(·):将D × H × W × C展开为(D ×H ×W)×C张量
QueryTransformCK (·): 生成CK feature maps的任何操作, 在 Bottom Block QueryTransformCK (·)是111的卷积。
CK, CV:是表示键和值的维度的超参数
K,V: 假设X的尺寸为D×H×W×C,则K和V的尺寸分别为(D×H×W)×CK和(D×H×W)×CV
第一步,生成query (Q), key (K) and value (V ) 矩阵。Unfold之前有Multi-Head操作,Multi-Head将通道拆分,Q的维度为(DQ × HQ × WQ) × CK

第二步,自注意机制。A为注意力矩阵,用Q点乘K的转置,除以根号CK,再使用softmax,A的维度为(DQ × HQ × WQ) × (D × H × W)。O的维度为(DQ × HQ × WQ) × CV。

第三步,还原为原维度大小。

Up-sampling Block
倒数第一层 Up-sampling Block 由 up-sampling residual block 后接 标准残差模块 构成。
此处的 Up-sampling Global Aggregation Block ,和普通的 Global Aggregation Block一样,只是将 QueryTransformCK (·) 的 111的卷积 变为 反卷积,3 * 3 * 3
kernel_size = 2。

倒数第二次 Up-sampling Block, 由反卷积和一个标准残差块组成。
Output Block
经过一个dropout层,1 * 1 * 1 后输出分割结果。
参考链接:
[AAAI 2020] 医学图像分割的Non-local U-Nets
【论文篇】【1】详解Non-local U-Nets
网友评论