Swin Transformer v2

paper:https://arxiv.org/pdf/2111.09883.pdf

Swin Transformer V2: Scaling Up Capacity and Resolution扩展容量和分辨率

Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。

本文介绍这篇文章是 Swin Transformer 系列的升级版 Swin Transformer v2。Swin Transformer 是屠榜各大CV任务的通用视觉Transformer模型,它在图像分类、目标检测、分割上全面超越 SOTA,在语义分割任务中在 ADE20K 上刷到 53.5 mIoU,超过之前 SOTA 大概 4.5 mIoU!可能是CNN的完美替代方案。除此之外,本文一并介绍 Swin MLP 的代码实现,Swin Transformer 作者们在已有模型的基础上实现了 Swin MLP 模型,证明了 Window-based attention 对于 MLP 模型的有效性。

Swin Transformer Block 有两种,大致结构和 Transformer Block 一致,只是内部 attention 模块分别是 Window-based MSA 和 Shifted Window-based MSA。Window-based MSA 不同于普通的 MSA,它在一个个 window 里面去计算 self-attention,计算量与序列长度 N=hw 成线性关系。Window-based MSA 虽然大幅节约了计算量,但是牺牲了 windows 之间关系的建模,不重合的 Window 之间缺乏信息交流影响了模型的表征能力。Shifted Window-based MSA 就是为了解决这个问题。将下一层 Swin Transformer Block 的 Window 位置进行移动,得到不重合的 patch。

在 Swin Transformer 的基础上,研究人员进一步开发出了用于底层复原任务的 SwinIR

Swin Transformer v2 原理分析:

Swin Transformer 提出了一种针对视觉任务的通用的 Transformer 架构,MSRA 进一步打造了一个包含3 billion 个参数,且允许输入分辨率达到1560×1560的大型 Swin Transformer,称之为 SwinV2。它在多个基准数据集 (包含 ImageNet 分类、COCO 检测、ADE20K 语义分割以及Kinetics-400 动作分类) 上取得新记录,分别是 ImageNet 图像分类84.0% Top-1 accuracy,COCO 目标检测63.1/54.4 box / mask mAP,ADE20K 语义分割59.9mIoU,Kinetics-400视频动作识别86.8% Top-1 accuracy。

Swin Transformer v2 的核心目的是把 Swin Transformer 模型做大,做成类似 BERT large 那样包含 340M 参数的预训练大模型。在 NLP 中,有的预训练的大模型,比如 Megatron-Turing-530B 或者 Switch-Transformer-1.6T,参数量分别达到了530 billion 或者1.6 trillion。

另一方面,视觉大模型的发展却滞后了。 Vision Transformer 的大模型目前也只是达到了1-2 billion 的参数量,且只支持图像识别任务。部分原因是因为在训练和部署方面存在以下困难:

  • 问题1:训练中的不稳定性问题。在大型模型中,跨层激活函数输出的幅值的差异变得更大。激活值是逐层累积的,因此深层的幅值明显大于浅层的幅值。如下图1所示是扩大模型容量时的不稳定问题。 当我们将原来的 Swin Transformer 模型从小模型放大到大模型时,深层的 activation 值急剧增加。最高和最低幅值之间的差异达到了104。当我们进一步扩展到一个巨大的规模 (658M 参数) 时,它不能完成训练,如图2所示。
图1:扩大模型容量时的不稳定问题
图2:使用 Pre-Norm,当进一步扩展到一个巨大的规模 (658M 参数) 时不能完成训练。
  • 问题2:许多下游视觉任务需要高分辨率的图像或窗口,预训练模型时是在低分辨率下进行的,而 fine-tuning 是在高分辨率下进行的。针对分辨率不同的问题传统的做法是把位置编码进行双线性插值 (bi-cubic interpolation),这种做法是次优的。如下图3所示是不同位置编码方式性能的比较,当我们直接在较大的图像分辨率和窗口大小测试预训练的 Imagenet-1k 模型 (分辨率256×256,window siez=8×8) 时,发现精度显着下降。
图3:不同位置编码方式性能的比较
  • 问题3:当图像分辨率较高时,GPU 内存消耗也是一个问题。

为了解决以上几点问题,作者提出了:

方法1:post normalization 技术:解决训练中的不稳定性问题

把 Layer Normalization 层放在 Attention 或者 MLP 的后面。这样每个残差块的输出变化不至于太大,因为主分支和残差分支都是 LN 层的输出,有 LN 归一化作用的限制。如上图1所示,这种做法使得每一层的输出值基本上相差不大。在最大的模型训练中,作者每经过6个 Transformer Block,就在主支路上增加了一层 LN,以进一步稳定训练和输出幅值。

图4:Swin v2 相对于 Swin Transformer 的改进 (红色部分)

方法2:scaled cosine attention 技术:解决训练中的不稳定性问题

原来的 self-attention 计算中,query 和 key 之间的相似性通过 dot-product 来衡量,作者发现这样学习到的 attention map 往往被少数像素对所支配。所以把 dot-product 改成了 cosine 函数,通过它来衡量 query 和 key 之间的相似性。

\[\operatorname{Sim}\left(\mathbf{q}i, \mathbf{k}_j\right)=\cos \left(\mathbf{q}_i, \mathbf{k}_j\right) / \tau+B{i j}\]
式中, \(B_{i j}\) 是下面讲得相对位置编码, \(\tau\) 是可学习参数。余弦函数是 naturally normalized,因 此可以有较温和的注意力值。

方法3:对数连续位置编码技术:解决分辨率变化导致的位置编码维度不一致问题。

  • 该方法可以 更平滑地传递在低分辨率下预先训练好的模型权值,以处理高分辨率的模型权值。
    我们首先复习下 Swin Transformer 的相对位置编码技术。
    \[\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(Q K^T / \sqrt{d}+B\right) V\]
    式中, \(B \in \mathbb{R}^{M^2 \times M^2}\) 是每个 head 的相对位置偏差项 (relative position bias),\(Q, K, V \in \mathbb{R}^{M^2 \times d}\) 是 window-based attention 的 query, key 和 value。 window 的大小。

作者引入对数空间连续位置偏差 (log-spaced continuous position bias),使相对位置偏差在不同的 window 分辨率之下可以较为平滑地过渡。

方法4:节省 GPU memory 的方法:

1 Zero-Redundancy Optimizer (ZeRO) 技术:

来自论文:Zero: Memory optimizations toward training trillion parameter models

传统的数据并行训练方法 (如 DDP) 会把模型 broadcast 到每个 GPU 里面,这对于大型模型来讲非常不友好,比如参数量为 3,000M=3B 的大模型来讲,若使用 AdamW optimizer,32为的浮点数,就会占用 48G 的 GPU memory。通过使用 ZeRO optimizer, 将模型参数和相应的优化状态划分并分布到多个 GPU 中,从而大大降低了内存消耗。训练时使用 DeepSpeed framework,ZeRO stage-1 option。

2 Activation check-pointing 技术:

来自论文:Training deep nets with sublinear memory cost

Transformer 层中的特征映射也消耗了大量的 GPU 内存,在 image 和 window 分辨率较高的情况下会成为一个瓶颈。这个优化最多可以减少30%的训练速度。

3 Sequential self-attention computation 技术:

在非常大的分辨率下训练大模型时,如分辨率为1535×1536,window size=32×32时,在使用了上述两种优化策略之后,对于常规的 GPU (40GB 的内存)来说,仍然是无法承受的。作者发现在这种情况下,self-attention 模块构成了瓶颈。为了解决这个问题,作者实现了一个 sequential 的 self-attention 计算,而不是使用以前的批处理计算方法。这种优化在前两个阶段应用于各层,并且对整体的训练速度有一定的提升。

在这项工作中,作者还一方面适度放大 ImageNet-22k 数据集5倍,达到7000万张带有噪声标签的图像。 还采用了一种自监督学习的方法来更好地利用这些数据。通过结合这两种策略,作者训练了一个30亿参数的强大的 Swin Transformer 模型刷新了多个基准数据集的指标,并能够将输入分辨率提升至1536×1536 (Nvidia A100-40G GPUs)。此外,作者还分享了一些 SwinV2 的关键实现细节,这些细节导致了 GPU 内存消耗的显着节省,从而使得使用常规 GPU 来训练大型视觉模型成为可能。 作者的目标是在视觉预训练大模型这个方向上激发更多的研究,从而最终缩小视觉模型和语言模型之间的容量差距。

不同 Swin V2 的模型配置:

  • SwinV2-T: C= 96, layer numbers ={2,2,6,2}
  • SwinV2-S: C= 96, layer numbers ={2,2,18,2}
  • SwinV2-B: C= 128, layer numbers ={2,2,18,2}
  • SwinV2-L: C= 192, layer numbers ={2,2,18,2}
  • SwinV2-H: C= 352, layer numbers ={2,2,18,2}
  • SwinV2-G: C= 512, layer numbers ={2,2,42,2}

对于 SwinV2-H 和 SwinV2-G 的模型训练,作者每经过6个 Transformer Block,就在主支路上增加了一层 LN,以进一步稳定训练和输出幅值。

Experiments

模型:SwinV2-G,3B parameters

Image classification

Dataset for Evaluation:ImageNet-1k,ImageNet-1k V2

Dataset for Pre-Training:ImageNet-22K-ext (70M images, 22k classes)

训练策略:分辨率使用192×192,为了节约参数量。2-step 的预训练策略。首先以自监督学习的方式在 ImageNet-22K-ext 数据集上训练 20 epochs,再以有监督学习的方式在这个数据集上训练 30 epochs,SwinV2-G 模型在 ImageNet-1k 上面达到了惊人的90.17%的 Top-1 Accuracy,在 ImageNet-1k V2 上面也达到了惊人的84.00%的 Top-1 Accuracy,超过了历史最佳的83.33%。

图5:Image classification 实验结果

同时,使用 Swin V2 的训练策略以后,Base 模型和 Large 模型的性能也可以进一步提升。比如 SwinV2-B 和 SwinV2-L 在 SwinV1-B 和 SwinV1-L 的基础上分别涨点0.8%和0.4%,原因来自更多的 labelled data (ImageNet-22k-ext, 70M images), 更强的 Regularization,或是自监督学习策略。

Object detection,Instance Segmentation

Dataset for Evaluation:COCO

Dataset for Pre-Training:Object 365 v2

如下图6所示 SwinV2-G 模型与之前在 COCO 目标检测和实例分割任务上取得最佳性能模型进行了比较。SwinV2-G 在 COCO test-dev 上实现了 63.1/54.4 box/max AP,相比于 SoftTeacher (61.3/53.0) 提高了 + 1.8/1.4。

图6:COCO 目标检测和实例分割任务

Semantic segmentation

Dataset for Evaluation:ADE20K

如下图7所示 SwinV2-G 模型与之前在 ADE20K 语义分割基准上的 SOTA 结果进行了比较。Swin-V2-G 在 ADE20K val 集上实现了 59.9 mIoU,相比于 BEiT 的 58.4 高了 1.5。

图7:ADE20k语义分割任务

Video action classification

Dataset for Evaluation:Kinetics-400 (K400)

如下图8所示 SwinV2-G 模型与之前在 Kinetics-400 动作分类基准上的 SOTA 结果进行了比较。可以看到,Video-SwinV2-G 实现了 86.8% 的 top-1 准确率,比之前的 TokenLearner 方法的 85.4% 高出 +1.4%。

图8:K400视频动作分类任务

对比实验:post-norm 和 scaled cosine attention 的作用

如下图9所示,这两种技术均能提高 Swin-T,Swin-S 和 Swin-B 的性能,总体提高分别为 0.2%,0.4% 和 0.5%。说明该技术对大模型更有利。更重要的是,它们能让训练更稳定。对于 Swin-H 和 Swin-G 模型而言,自监督预训练使用原来的 Swin V1 无法收敛,而 Swin V2 模型训练得很好。

图9:post-norm 和 scaled cosine attention 对比实验结果

PointRend –图像细颗粒分割

title
https://arxiv.org/abs/1912.08193

论文地址: https://arxiv.org/abs/1912.08193

gitlab: https://github.com/zsef123/PointRend-PyTorch

存在的问题

在目前的语义分割网络中存在的问题主要有过采样和现采样。

1.过采样( oversample ):对于图片中低频区域( 属于同一个物体 ),没必要使用 太多的采样点,却使用太多采样点造成过采样;

2.欠采样( undersample ) :对于图片中高频区域( 靠近物体边界 ),如果这些区域的采样过于稀疏,导致分割出的边界过于平滑,不大真实

文章要解决的问题是在实例分割任务中边缘不够精细的问题。以MaskRCNN举例,由于计算量和显存的原因,对于每一个ROIAlign之后的proposal我们一般只会upsample到28*28的分辨率输出mask。这对于绝大多数物体显然是不够的。如果想得到像素级别的精度,我们不得不付出更大的计算和存储代价。那有什么办法可以在低代价下仍然得到精细的分割结果呢?其实很重要的一点是往往这些不准确的部分是在物体的边缘,这些边缘其实只占了整个物体中非常小的一部分。所以基于这样的一个想法,作者提出可以每次在预测出来的mask中只选择Top N最不确定的位置进行细分预测。每个细分点的特征可以通过Bilinear插值得到,每个位置上的classifier通过一个简单的MLP来实现。这其实是等价于用一个1*1的conv来预测,但是对于中心很确定的点并不计算。整体的示意图如下:

PointRend 解决了什么问题?

这篇论文讲了一个很好听的故事,即:把语义分割以及实例分割问题(统称图像分割问题)当做一个渲染问题来解决。故事虽然这么讲,但本质上这篇论文其实是一个新型上采样方法,针对物体边缘的图像分割进行优化,使其在难以分割的物体边缘部分有更好的表现

作为一个小白,那么问题来了:

1、什么是渲染?

2、为什么要把图像分割问题当做渲染问题呢?

要想知道什么是渲染,可以参考:

计算机中所说的「渲染」是什么意思?

简单来说,渲染就是“绘制”,把3D的物体在2D平面上绘制出来。

为什么要把图像分割问题和渲染问题扯在一起呢?因为讲故事好听啊,论文好写嘛….咳咳…不不,是因为二者有类似的问题要解决:即物体边缘难以处理。

具体来说,在图像渲染中,对于多个3D物体,在边缘要判断对于镜头而言谁先谁后,而且还得抗锯齿;而对于图像分割问题,边缘恢复也一直是个麻烦事儿,因为在典型的语义分割网络中(如FCN、DeepLab),在CNN内部一般都会相对输入图像降采样16倍,然后再想办法上采样回去。更细致地说,对于 DeepLabV3+,模型最后直接是一个4倍的双线性插值上采样,这显然对物体边缘的预测十分不利。虽然 DeepLabV3+当时在2017年就达到了秒天秒地的 89%mIoU on VOC2012 test (使用了300M JFT 数据集预训练),至今无人超越(因为JFT 数据集 Google没有公开 \手动滑稽),但显然这个上采样过程仍然存在较大的提升空间。

参考链接:Uno Whoiam:DeepLab 语义分割模型 v1、v2、v3、v3+ 概要(附 Pytorch 实现)

而在实例分割网络中,Mask R-CNN 这货生成的 Mask 才 28×28,要是把这样的 mask 拉伸到 不说多了比如 256×256,还指望它可以很好地预测边缘?我只能说这是在想Peach。

事实上,在图像分割任务上边缘预测不理想这个情况其实在许多前人的工作中都有提及,比如 Not All Pixels Are Equal: Difficulty-Aware Semantic Segmentation via Deep Layer Cascade 中就详细统计了语义分割中,模型最容易误判的 pixel基本上都在物体边缘(如下图右上红色部分标记) 。

而关于上采样其实也有一些前人的工作,如 Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregation,在实现上有点像超分辨率网络 ESPCN 里使用的 sub-pixel convolutional layer 的操作,不过多加了一个二阶范数约束:

总的来说,图像分割边缘预测是一个未被很好解决的问题,而何恺明团队的 PointRend 是对此问题的一个新的思路和解法,接下来将介绍 PointRend 是如何 work 的。

文主要贡献

1.提出可嵌入主流网络的PointRend模块,提高了图像分割精度。

2.把图像分割问题看作渲染问题,本质上是一个新型上采样方法,为图像分割提供独特视角。

3.降低了训练所需的算力。输出224×224分辨率图像,PointRend只需0.9B FLOPs。

二、总体思路

PointRend 方法要点总结来说是一个迭代上采样的过程:

while 输出的分辨率 < 图片分辨率:

  1. 对输出结果进行2倍双线性插值上采样得到 coarse prediction_i。(粗分辨率预测)
  2. 挑选出 N 个“难点”,即结果很有可能和周围点不一样的点(例如物体边缘)。
  3. 对于每个难点,获取其“表征向量”,“表征向量”由两个部分组成,其一是低层特征(fine-grained features),通过使用点的坐标,在低层的特征图上进行双线性插值获得(类似 RoI Align),其二是高层特征(coarse prediction),由步骤 1 获得。
  4. 使用 MLP 对“表征向量”计算得到新的预测,更新 coarse prediction_i 得到 coarse prediction_i+1。这个 MLP 其实可以看做一个只对“难点”的“表征向量”进行运算的由多个 conv1x1 组成的小网络。

整个过程可以这么理解:

小明同学做题,现在有已知条件(coarse prediction_0,fine-grained features),想求解答案(coarse prediction_k),发现直接求(双线性插值or其它方法)不够准确,那就一步一步来吧(从coarse prediction_1,coarse prediction_2….求到coarse prediction_k)。好的,现在求coarse prediction_1,诶,发现有好多东西不知道,不能从 coarse prediction_0 直接得到怎么办?那就找出不知道的(“难点”),在 fine-grained features 里面找出对应的线索(ROIAlign-like 双线性插值),然后在结合 coarse prediction_0 得到整体线索(“特征向量”)求解(使用MLP计算),嗯,终于得到 coarse prediction_1了。再用同样的思路反复求解,直到 coarse prediction_k。

示意图如下:

对于一个coarse prediction(4×4大小),将其上采样两倍(8×8大小,这里可以理解为检测头的输出)后,取了一些难分割的点(大多是边缘部分),取这些点的特征向量输入到MLP网络中,进行point prediction,得到每一个点的新类别,最后结果输出(8×8大小,边缘更加精确的结果)。

另外,其PointRend 训练为了节省时间,没有使用上述的迭代过程,而是使用多种组合的采样方法,不赘述,详见paper。

  1. 从PointRend的应用思路中可以看到,这里包含了两个阶段的特征处理,分别是fine-grained features和coarse prediction部分,如果主干网络是ResNet,那么fine-grained features就是ResNet的stage2输出,也就是4倍下采样时的精细分割结果,而coarse prediction就是检测头的预测结果(还未上采样还原成原图的结果)。
  2. 从coarse prediction中挑选N个“难点”,也就是结果很有可能和周围点不一样的点(比如物体边缘的点)。对于每一个难点,获取他的“特征向量”,对于点特征向量(point features),主要由两部分组成,分别是fine-grained features的对应点和coarse prediction的对应点的特征向量,将这个两个特征向量拼接成一个向量。
  3. 接着,通过一个MLP网络对这个“特征向量”进行预测,更新coarse prediction。也就相当于对这个难点进行新的预测,对他进行分类。

看完这个,我们就可以这么理解,将预测难的点(边缘点)提取出来,再提取其特征向量,经过MLP网络,将这个点的归属进行分类,然后提升这些点的分类准确率。这就是PointRend的思想。

一个PointRend模块包括三部分

1.point selection strategy:用于inference和traing的点选择

对于点采样过程,需要对模型的Train过程和Inference过程做区分

该方法的核心思想是灵活自适应地选择图像平面上的点来预测分割标签。直观地说,这些点应该更密集地位于高频区域附近,例如物体边界,类似于射线追踪中的反混叠问题。我们产生了推理训练的想法。

  • inference推理

通过仅在与其邻域有显着不同的位置进行计算,该方法可用于有效地渲染高分辨率图像(例如,通过光线跟踪)。对于所有其他位置,通过对已经计算的输出值(从粗网格开始)进行插值来获得值。

对于每个区域,我们以粗到精的方式迭代地“渲染”输出蒙版。在规则网格上的点上进行最粗糙级别的预测(例如,通过使用标准的粗糙分段预测头)。在每次迭代中,PointRend使用双线性插值对其先前预测的分段进行上采样,然后在此较密集的网格上选择N个最不确定的点(例如,对于二进制掩码,概率最接近0.5的那些)。然后,PointRend为这N个点中的每一个点计算特征,并预测它们的标签。重复该过程,直到将分段上采样到所需的分辨率为止。

  • training

对于Train过程的点采样操作,同样可以遵循Inference中的操作。但是作者发现,这样子采样对于梯度的传播不太友好,于是只能被迫选择其他的点采样策略——干脆就用随机采样的方式来进行采样。

在训练过程中,PointRend还需要选择一些点,以在这些点上构建用于训练point head的逐点(point-wise)特征。原则上,点选择策略可以类似于推理inference中使用的细分策略。但是,细分引入了一系列步骤,这些步骤对于通过反向传播训练神经网络不太友好。取而代之的是,为了训练,我们使用基于随机采样的非迭代策略

采样策略在特征图上选择N个点进行训练。它旨在使用三个原理将选择偏向不确定区域,同时还保留一定程度的均匀覆盖。对于训练和推理选择,N的值可以不同。

(i)过度生成:我们通过从均匀分布中随机采样kN个点(k> 1)来过度生成候选点。(ii)重要抽样:通过对所有kN个点的粗略预测值进行插值并计算任务特定的不确定性估计,我们将重点放在具有粗略预测的点上。从kN个候选中选择最不确定的βN个点(β∈[0,1])。(iii)覆盖范围:从均匀分布中采样剩余的(1-β)N点。我们用不同的设置来说明此过程,并将其与常规的网格选择进行比较,如下图所示。

在训练时,预测和损失函数仅在N个采样点上计算(除粗略分割外),这比通过细分步骤进行反向传播更简单,更有效。这种设计类似于在Faster R-CNN系统中对RPN + Fast R-CNN的并行训练,其推理是顺序的。

2. Point-wise Representation:逐点表示

PointRend通过组合(例如,级联)两种特征类型(细粒度和粗略预测特征)在选定点上构造逐点特征,如下所述。

  • 细粒度特征

为了允许PointRend呈现精细的分割细节,我们从CNN特征图中提取每个采样点的特征向量。 因为一个点是“实值2D坐标”,所以我们按照标准做法对特征图执行双线性插值,以计算特征向量。 可以从单个特征图中提取特征(例如,ResNet中的res2);也可以按照Hypercolumn方法,从多个特征图(例如res2到res5)中提取并连接它们。

  • 粗预测特征

细粒度的特征可以解析细节,但在两个方面也有不足:

首先,它们不包含特定区域的信息,因此,两个实例的边界框重叠的相同点将具有相同的细粒度特征。但是,该点只能位于一个实例之中。 因此,对于实例分割的任务,其中不同的区域可能针对同一点预测不同的标签,因此需要其他区域特定的信息。

其次,取决于用于细粒度特征的特征图,这些特征可能只包含相对较低级别的信息(例如,我们将对res2使用DeepLabV3)。 因此,需要有更多具有上下文和语义信息的特征。

基于这两点考虑,第二种特征类型是来自网络的粗分割预测,例如表示k类预测的区域(box)中每个点的k维向量。通过设计,粗分辨率能够提了更加全局的上下文信息,而通道则传递语义类别。这些粗略的预测与现有架构的输出相似,并且在训练过程中以与现有模型相同的方式进行监督。例如,在mask R-CNN中,粗预测可以是一个轻量级的7×7分辨率Mask头的输出。

点特征向量(point features),主要由两部分组成,分别是fine-grained features的对应点和coarse prediction的对应点的特征向量,将这个两个特征向量拼接成一个向量

3. point head

给定每个选定点的逐点特征表示,PointRend使用简单的多层感知器(MLP)进行逐点分割预测。这个MLP在所有点(和所有区域)上共享权重,类似于图卷积或PointNet。由于MLP会预测每个点的分割标签,因此可以通过特定任务的分割loss进行训练。

三、效果如何?

实验结果

  • 网络设计

实验使用ResNet-50+ FPN 的Mask-Rcnn作backbone。 Mask-RCNN中的默认head是region-wise FCN,用“ 4×conv”表示,作为用来与本文网络进行比较的基准网络。

为了计算粗略预测,我们用重量更轻的设计替换4×conv Mask头,该设计类似于Mask R-CNN的box head产生7×7Mask预测。具体来说,对于每个边界框,我们使用双线性插值从FPN的P2层提取14×14特征图。这些特征是在边界框内的规则网格上计算的(此操作可以看作是RoIAlign的简单版本)。接下来,我们使用具有256个输出通道步幅为2的 2×2卷积层,后跟ReLU, 将空间大小减小到7×7。最后,类似于Mask R-CNN的box head,用两个带1024宽的隐藏层的MLP为K类分别产生7×7的Mask预测。ReLU用于MLP的隐藏层,并且Sigmoid激活函数应用于输出。

PointRend:在每个选定点上,使用双线性插值从粗预测头的输出中提取K维特征向量,PointRend还从FPN的P2级别插值256维特征向量,步长为4。这些粗预测和细粒度特征向量是串联在一起的,我们使用具有256个通道的3个隐藏层的MLP在选定点进行K类别预测。在MLP的每个层中,我们用K个粗预测特征补充到256个输出通道中,作为下一层输入向量。在MLP中使用ReLU,并将Sigmoid激活函数应用于输出。

不得不说这个针对物体边缘进行优化的上采样方法的确在感官上和数据上都有很不错的效果:

语义分割结果:

实例分割结果(基于MaskR-CNN):

PointRend的一些代码和实现

摘自: https://chowdera.com/2022/194/202207120607167479.html

代码详解: https://www.361shipin.com/blog/1536592971120508928

  • 作者提出可以在预测出来的mask中只选择Top N最不确定的位置进行细分预测。

具体为先根据粗糙预测出来的mask,将mask按类别预测分数排序,选出分数高的前2 类别的mask,计算出在2个类别mask上均有较高得分的Top K个像素点作为K 个不确定点【1个像素点只能对应1个类别,如果它对应2个类别的分数都很高,说明它很可能是边界点,也是不确定的】

def sampling_points(mask, N, k=3, beta=0.75, training=True):
    """
    主要思想:根据粗糙的预测结果,找出不确定的像素点
    :param mask: 粗糙的预测结果(out)   eg.[2, 19, 48, 48]
    :param N: 不确定点个数(train:N = 图片的尺寸/16, test: N = 8096)    eg. N=48
    :param k: 超参
    :param beta: 超参
    :param training:
    :return: 不确定点的位置坐标  eg.[2, 48, 2]
    """
    assert mask.dim() == 4, "Dim must be N(Batch)CHW"   #this mask is out(coarse)
    device = mask.device
    B, _, H, W = mask.shape   #first: mask[1, 19, 48, 48]
    mask, _ = mask.sort(1, descending=True) #_ : [1, 19, 48, 48],按照每一类的总体得分排序
    if not training:
        H_step, W_step = 1 / H, 1 / W
        N = min(H * W, N)
        uncertainty_map = -1 * (mask[:, 0] - mask[:, 1])
        #mask[:, 0]表示每个像素最有可能的分类,mask[:, 1]表示每个像素次有可能的分类,当一个像素
        #即是最有可能的又是次有可能的,则证明它不好预测,对应的uncertainty_map就相对较大
        _, idx = uncertainty_map.view(B, -1).topk(N, dim=1) #id选出最不好预测的N个点
        points = torch.zeros(B, N, 2, dtype=torch.float, device=device)
        points[:, :, 0] = W_step / 2.0 + (idx  % W).to(torch.float) * W_step    #点的横坐标
        points[:, :, 1] = H_step / 2.0 + (idx // W).to(torch.float) * H_step    #点的纵坐标
        return idx, points  #idx:48 || points:[1, 48, 2]
  • 得到不确定点的位置以后,可以通过Bilinear插值得到对应的特征,对每个不确定点的使用一个MLP来进行单独进行细分预测【训练与预测有所区别】。

具体为:通过刚刚得到的不确定点所在图片的相对位置坐标来找到对应的特征点,将此点对应的特征向量与此点的粗糙预测结果合并,然后通过一个MLP进行细分预测。

##训练阶段
def forward(self, x, res2, out):
        """
        主要思路:
        通过 out(粗糙预测)计算出top N 个不稳定的像素点,针对每个不稳定像素点得到在res2(fine)
        和out(coarse)中对应的特征,组合N个不稳定像素点对应的fine和coarse得到rend,
        再通过mlp得到更准确的预测
        :param x: 表示输入图片的特征     eg.[2, 3, 768, 768]
        :param res2: 表示xception的第一层特征输出     eg.[2, 256, 192, 192]
        :param out: 表示经过级联空洞卷积提取的特征的粗糙预测    eg.[2, 19, 48, 48]
        :return: rend:更准确的预测,points:不确定像素点的位置
        """
        """
        1. Fine-grained features are interpolated from res2 for DeeplabV3
        2. During training we sample as many points as there are on a stride 16 feature map of the input
        3. To measure prediction uncertainty
           we use the same strategy during training and inference: the difference between the most
           confident and second most confident class probabilities.
        """
        if not self.training:
            return self.inference(x, res2, out)
		#获得不确定点的坐标
        points = sampling_points(out, x.shape[-1] // 16, self.k, self.beta) #out:[2, 19, 48, 48] || x:[2, 3, 768, 768] || points:[2, 48, 2]
		#根据不确定点的坐标,得到对应的粗糙预测
        coarse = point_sample(out, points, align_corners=False) #[2, 19, 48]
        #根据不确定点的坐标,得到对应的特征向量
        fine = point_sample(res2, points, align_corners=False)  #[2, 256, 48]
		#将粗糙预测与对应的特征向量合并
        feature_representation = torch.cat([coarse, fine], dim=1)   #[2, 275, 48]
		#使用MLP进行细分预测
        rend = self.mlp(feature_representation) #[2, 19, 48]
        return {"rend": rend, "points": points}
##推理阶段
@torch.no_grad()
    def inference(self, x, res2, out):
        """
        输入:
        x:[1, 3, 768, 768],表示输入图片的特征
        res2:[1, 256, 192, 192],表示xception的第一层特征输出
        out:[1, 19, 48, 48],表示经过级联空洞卷积提取的特征的粗糙预测
        输出:
        out:[1,19,768,768],表示最终图片的预测
        主要思路:
        通过 out计算出top N = 8096 个不稳定的像素点,针对每个不稳定像素点得到在res2(fine)
        和out(coarse)中对应的特征,组合8096个不稳定像素点对应的fine和coarse得到rend,
        再通过mlp得到更准确的预测,迭代至rend的尺寸大小等于输入图片的尺寸大小
        """
        """
        During inference, subdivision uses N=8096
        (i.e., the number of points in the stride 16 map of a 1024×2048 image)
        """
        num_points = 8096
                while out.shape[-1] != x.shape[-1]: #out:[1, 19, 48, 48], x:[1, 3, 768, 768]
        	#每一次预测均会扩大2倍像素,直至与原图像素大小一致
            out = F.interpolate(out, scale_factor=2, mode="bilinear", align_corners=True)   #out[1, 19, 48, 48]
            points_idx, points = sampling_points(out, num_points, training=self.training)   #points_idx:8096 || points:[1, 8096, 2]
            coarse = point_sample(out, points, align_corners=False) #coarse:[1, 19, 8096]   表示8096个不稳定像素点根据高级特征得出的对应的类别
            fine = point_sample(res2, points, align_corners=False)  #fine:[1, 256, 8096]    表示8096个不稳定像素点根据低级特征得出的对应类别
            feature_representation = torch.cat([coarse, fine], dim=1)   #[1, 275, 8096] 表示8096个不稳定像素点合并fine和coarse的特征
            rend = self.mlp(feature_representation) #[1, 19, 8096]
            B, C, H, W = out.shape  #first:[1, 19, 128, 256]
            points_idx = points_idx.unsqueeze(1).expand(-1, C, -1)  #[1, 19, 8096]
            out = (out.reshape(B, C, -1)

A ConvNet for the 2020s

paper:https://arxiv.org/abs/2201.03545 CVPR 2022.Facebook AI Research

github:https://github.com/facebookresearch/ConvNeXt

作者提出了ConvNeXt,一个完全由标准 ConvNet 模块构建的纯 ConvNet 模型。ConvNeXt 准确、高效、可扩展且设计非常简单。

2020年以来,ViT一直是研究热点。ViT在图片分类上的性能超过卷积网络的性能,后续发展而来的各种变体将ViT发扬光大(如Swin-T,CSwin-T等),值得一提的是Swin-T中的滑窗操作类似于卷积操作,降低了运算复杂度,使得ViT可以被用做其他视觉任务的骨干网络,ViT变得更火了。本文探究卷积网络到底输在了哪里,卷积网络的极限在哪里。在本文中,作者逐渐向ResNet中增加结构(或使用trick)来提升卷积模型性能,最终将ImageNet top-1刷到了87.8%。作者认为本文所提出的网络结构是新一代(2020年代)的卷积网络(ConvNeXt),因此将文章命名为“2020年代的卷积网络”。

作者的出发点时Resnet-50模型。首先使用用于训练视觉变压器的类似训练技术训练它,与原始Resnet-50相比,获得了较大的改进效果。这将是我们的基线。然后,我们研究了一系列设计决策,总结为1)宏观设计,2)Resnext,3)inverted bottleneck,4)使用大的核,以及5)各种层的微型设计。

1、训练技巧:

作者认为,除了网络结构,训练技巧也会影响最终的效果,除了vision Transformers的结构 ,vision Transformers的一些训练技巧也给作者带来 一些启发。作者使用swin transformer的训练技巧,应用在基线模型中:

1、增加 epoch到300

2、使用AdamW优化器

3、数据增强技术(cutmix、mixup等等)

结果分类准确率由76.1%上升到78.8%。具体训练config如下:

2、宏观设计

作者借鉴了Swin-T的两个设计:

  1. 每阶段的计算量(调整每个阶段block数量)
  2. 对输入图片下采样方法

对于第一点类似Swin-T四个阶段1:1:9:1的计算量,作者将ResNet-50每个阶段block数调整为3,3,9,3(原来为3,4,6,3),增加第三阶段计算量,准确率由78.8%提升至79.4%。

这个每阶段计算量的设计:感觉很多模型都是在中间部分的计算量最多 ,两头的计算量最小,这种设计的效果最好。

对于第二点Swin-T融合压缩2×2的区域,作者则使用4×4步长为4的卷积对输入图片进行下采样,这样每次卷积操作的感受野不重叠,准确率由79.4%提升至79.5%。

3、类ResNeXt设计

depthwise conv中的逐channel卷积操作和self-attention中的加权求和很类似,因此作者采用depthwise conv替换普通卷积。参照ResNeXt,作者将通道数增加到96,准确率提升至80.5%,FLOPs相应增大到了5.3G。相比之下原始的ResNet-50 FLOPs为4G,运算量增大很多。

4、Inverted Bottleneck

在depthwise conv的基础上借鉴MobileNet的inverted bottleneck设计(维度先扩增4倍在缩减),将block由下图(a)变为(b)。因为depthwise不会使channel之间的信息交互,因此一般depthwise conv之后都会接1 × 1 × C的pointwise conv。这一顿操作下来准确率只涨了0.1%到80.6%。在后文说明的大模型上涨点多一点。

Moving up depthwise conv layer

首先,考虑到卷积核太大会导致计算复杂度上升,不方便作者去寻找大卷积核。因此作者借鉴transformer里面MSA block 放在了1*1卷积之前,把7*7的 depthwise conv layer 放在1*1卷积之前,这样, depthwise conv layer 的通道数下降,相应计算量也下降,但性能下降到了79.9%

增大卷积kernel

作者认为更大的感受野是ViT性能更好的可能原因之一,作者尝试增大卷积的kernel,使模型获得更大的感受野。首先在pointwise conv的使用上,作者为了获得更大的感受野,将depthwise conv提前到1 × 1 conv之前,之后用384个1 × 1 × 96的conv将模型宽度提升4倍,在用96个1 × 1 × 96的conv恢复模型宽度。反映在上图中就是由(b)变为(c)。由于3×3的conv数量减少,模型FLOPs由5.3G减少到4G,相应地性能暂时下降到79.9%。

然后作者尝试增大depthwise conv的卷积核大小,证明7×7大小的卷积核效果达到最佳

其他乱七八糟的尝试

借鉴最初的Transformer设计,作者将ReLU替换为GELU;ViT的K/Q/V计算中都没有用到激活函数和归一化层,于是作者也删除了大量的激活函数和归一化层,仅在1 × 1卷积之间使用激活函数,仅在7 × 7卷积和1 × 1 卷积之间使用归一化层,同时将BN升级为LN。最终block结构确定如下:

顺便复习一下各种归一化方法:

最后仿照Swin-T,作者将下采样层单独分离出来,单独使用2 × 2卷积层进行下采样。为保证收敛,在下采样后加上Layer Norm归一化。最终加强版ResNet-50准确率82.0%(FLOPs 4.5G)。

总的来说ResNet-50、本文模型和Swin-T结构差别如下:

实验结果

作者在ResNet-50加强版的基础上又提出了多个变体(ConvNeXt-T/B/L/XL),从实验结果上看ResNet-50加强版性能收益较为突出,越是大模型性能收益越低。

在检测、分割下游任务中ConvNeXt也获得了与Swin-T相似或更好的结果。结果就不细说了。

消融实验

每一部分具体涨点效果如下:

总的来说本文实验做的比较充分,总结一下,卷积网络涨点可以尝试:

  1. 对输入下采样时尝试无重叠小一点的卷积层,例如4 × 4,stride=4的卷积;
  2. block中采用大卷积核,例如7 × 7;
  3. depthwise conv + inverted bottleneck + moving up depthwise layer的block结构;
  4. 减少激活/归一化层,ReLU换成GELU,BN换成LN;
  5. 使用2×2 conv + LN下采样。

Vision MLP –Pay Attention to MLPs

MLP-Mixer的增强版,带gating的MLP。有两个版本,分别是gMLP和aMLP。Pay-Attention-to-MLPs是gMLP版本,同时也提出了gMLP的增强版aMLP。

paper: https://arxiv.org/abs/2105.08050

github: https://github.com/antonyvigouret/Pay-Attention-to-MLPs

此文和最近刊出MLP文章相同,旨在探究self-attention对于Transformer来说是否至关重要。并在CV和NLP上的相关任务进行实验。

Transformer结构具有可并行化汇聚所有token间的空间信息的优点。众所周知self-attention是通过计算输入间的空间关系动态的引入归纳偏置,同时被静态参数化的MLP能表达任意的函数,所以self-attention对于Transformer在CV和NLP等领域的成功是否是至关重要的呢?

  • 此文提出了一个基于MLP的没有self-attention结构名为gMLP,仅仅存在静态参数化的通道映射(channel projections)和空间映射(spatial projections)。同时作者通过实验发现当对空间映射的线性结果进行门机制乘法得到的效果最好
  • 此文使用gMLP做图片分类并在ImageNet上取得了与DeiT、ViT等Transformer模型相当的效果。与先前的MLP模型MLP-Mixer相比,gMLP做到了参数更少(参数减少66%)效果更强(效果提升3%)。
  • 此文使用gMLP做masked language modeling,gMLP采用和Bert一样的设置最小化perplexity取得了和Transformer模型预训练一样好的效果。通过pretraining和finetuning实验发现随着模型容量的增加,gMLP比Transformer提升更大,表明模型相较于self-attention可能对于模型容量的大小更为敏感。
  • 对于需要跨句对齐的微调任务MNLI,gMLP与Transformer相比逊色一筹。对此作者发现加上一个128特征大小的单头注意力足以使得gMLP在任何NLP任务上取得比Transformer更好的效果。

gMLP由L个如下图所示的模块堆叠而成

设每个模块的输入 \(X \in \mathbb{R}^{n \times d}\), n为序列长度, d为特征维度。每个模块表达如下:
\(Z=\sigma(X U), \quad \tilde{Z}=s(Z), \quad Y=\tilde{Z} V\)
\(\sigma\) 是GELU等激活函数, U 和 V 和Transformer中的FFN类似都是线性映射。为了简洁表达上式中 省略了shortcuts, normalizations 和 biases。
上式中最重要的是能捕捉空间交互的 \(s(\cdot)\) 。如果上式去掉 \(s(\cdot)\) 那么将不再能进行空间交互和FFN 并无区别。文中作者选择名为 Spatial Gating Unit (SGU) 的模块作为 \(s(\cdot)\) 捕捉空间依赖。另外,gMLP在NLP、CV任务中遵循与BERT、ViT一样的输入输出规则。

Spatial Gating Unit:

为了能有跨token的交互, \(s(\cdot)\) 操作须在空间维度。可以简单的使用线性映射表示:
\(f_{W, b}(Z)=W Z+b\)
其中 \(W \in \mathbb{R}^{n \times n}\) 表示空间交互的映射参数。在self-attention中 W 是通过 Z 动态计算得到的。 此文对上式使用gating操作以便更好的训练,如下所示:
\(s(Z)=Z \odot f_{W, b}(Z)\)
为了训练更稳定,作者将 W 和 b 分别初始化为接近 0 与 1 来保证在开始训练时 \(f_{W, b} \approx 1\) 、 \(s(Z z) \approx Z\) 使得在开始阶段gMLP近似于FFN并在训练中逐渐学习到跨token的空间信息。
作者进一步发现将 Z 从通道维度分割成两部分 \(\left(Z_1, Z_2\right)\) 进行gating操作更有用,如下所示:
\(
s(Z)=Z_1 \odot f_{W, b}\left(Z_2\right)
\)
另外函数 \(f_{W, b}\)的输入通常需要normalizel以此提升模型的稳定性。

一些思考:这里的SpatialGatingUnit里面用到了一个通道split,然后再将分割后的两部分做乘法,让我想到了NAFnet中的simplegate,这个的作用一是减少计算量(相比于GELU)、另外引入门控机制,在通道维度进行通道交织,对于模型的效果表现很好。

作者进一步分析了SGU与现有的一些操作的相似之处:首先是Gated Linear Units (GLU) 与 SGU的区别在于SGU对spatial dimension而GLU对channel dimension; 其次SGU和
Squeeze-and-Excite (SE) 一样使用hadamard-product,只是SGU并没有跨通道的映射来保 证排列不变性;SGU的空间映射可以看作depthwise convolution不过SGU只学习跨通道只是, 并没有跨通道过滤器;SGU学习的是二阶空间交互 \(z_i z_j\) , self-attention学习的是三阶交互 \(q_i k_j v_k\) , SGU的复杂度为 \(n^2 e / 2\) 而self-attention的复杂度为 \(2 n^2 d_{\text {。 }}\)

实验:

1、Image Classification

此文首先将gMLP应用于图片分类,使用ImageNet数据集而且不使用额外数据。下表首先展示了gMLP用于图片分类的参数,gMLP和ViT/B16一样使用 16×16 个patch,同时采用和DeiT相似的正则化方法防止过拟合。

下表中gMLP与baselines在ImageNet上的结果表示gMLP取得了与视觉Transformer相当的结果,同时与其它MLP视觉模型相比,gMLP取得了准确率、速度权衡下最好的结果。

Masked Language Modeling with BERT:

此文同时将gMLP应用于masked language modeling(MLM)任务,对于预训练和微调任务,模型的输入输出规则都保持与BERT一致。

作者观察到在MLM任务最后学习到的空间映射矩阵总是Toeplitz-like matrics,如下图所示。所以作者认为gMLP是能从数据中学习到平移不变性的概念的,这使得gMLP实质起到了卷积核是整个序列长度的1-d卷积的作用。在接下来的MLM实验中,作者初始 W 为Toeplitz matrix。

Ablation: The Importance of Gating in gMLP for BERT’s Pretraining:下表展示了gMLP的各种变体与Transoformer模型、MLP-Mixer的比较,可以看到gMLP在与Transformer相同模型大小的情况下能达到与Transformer相当的效果。同时gating操作对于空间映射十分有用。同时下图还可视化了模型学习到的空间映射参数。

Case Study: The Behavior of gMLP as Model Size Increases:下表与下图展示了gMLP随着模型增大逐渐能有与Transformer相当的效果,可见Transformer的效果应该主要是依赖于模型尺寸而非self-attention。

  • Ablation: The Usefulness of Tiny Attention in BERT’s Finetuning:从上面的Case Study可以发现gMLP对于需要跨句子连接的finetuing任务可能不及Transformer,所以作者提出了gMLP的增强版aMLP。aMLP相较于gMLP仅增加了一个单头64的self-attention如下图所示:

从下图结果可以发现aMLP相较于gMLP极大提升了效果并在所有task超过了Transformer。

Vision MLP –ResMLP

Feedforward networks for image classification with data-efficient training

我们提出了ResMLP,一种完全基于多层感知机(MLP)进行图像分类的体系结构。 它是一个简单的残差网络,它交替(i)线性层,其中图像 patches在通道之间独立且相同地交互;以及(ii)两层前馈网络,其中通道中的每个 patch独立地相互作用。

CODE:

import torch
import numpy as np
from resmlp import ResMLP

img = torch.ones([1, 3, 224, 224])

model = ResMLP(in_channels=3, image_size=224, patch_size=16, num_classes=1000,
                 dim=384, depth=12, mlp_dim=384*4)

parameters = filter(lambda p: p.requires_grad, model.parameters())
parameters = sum([np.prod(p.size()) for p in parameters]) / 1_000_000
print('Trainable Parameters: %.3fM' % parameters)

out_img = model(img)

print("Shape of out :", out_img.shape)  # [B, in_channels, image_size, image_size]

本文作者提出了一种基于全连接层的图像分类网络。网络结构与MLP-Mixer相似,即先将输入图像拆分成若干patch,对每个patch通过全连接层转换为特征嵌入矩阵,该矩阵的两个维度分别表示channel维度(每个局部位置的特征维度)和patch维度(表示局部位置的维度)。首先将该矩阵转置后沿patch维度进行全连接层运算,实现不同patch之间的交互;再沿channel维度进行全连接运算,实现不同channel之间的交互。最后使用池化层和输出层获得分类结果。本文与MLP-Mixer的不同之处在于采用了更强的数据增强方法和蒸馏策略。

当采用现代的训练策略进行训练时,使用大量的数据增广和可选的蒸馏方法,可以在ImageNet上获得令人惊讶的良好精度/复杂度折衷。

Affine仿射变换:

函数名称:diag(x)
函数功能:构建一个n维的方阵,它的主对角线元素值取自向量x,其余元素都为0

Vision MLP系列–RepMLP

RepMLPNet: Hierarchical Vision MLP with Re-parameterized Locality (https://arxiv.org/abs/2112.11081)

CVPR 2022

RepMLP Block

Github source: https://github.com/DingXiaoH/RepMLP

最近公开了一系列视觉MLP论文,包括RepMLP、MLP-Mixer、ResMLP、gMLP等。在这个时间点出现关于MLP的一系列讨论是很合理的:

1) Transformer大火,很多研究者在拆解Transformer的过程中多多少少地对self-attention的必要性产生了疑问。去掉了self-attention,自然就剩MLP了。

2) 科学总是螺旋式上升的,“复兴”老方法(比如说另一篇“复兴”VGG的工作,RepVGG)总是喜闻乐见的。

这些论文引发了热烈的讨论,比如:

1) 这些模型到底是不是MLP?

2) 卷积和全连接(FC)的区别和联系是什么?FC是不是卷积,卷积是不是FC?

3) 真正的纯MLP为什么不行?

4) 所以MLP is all you need?

《RepMLP: Re-parameterizing Convolutions into Fully-connected Layers for Image Recognition》。这篇文章讲了一个全连接层找到一份陌生的工作(直接进行feature map的变换),为了与那些已经为这份工作所特化的同胞(卷积层)们竞争,开始“内卷”的故事。

关键贡献在于,RepMLP用卷积去增强FC,既利用其全局性又赋予其局部性,并通过结构重参数化,将卷积融合到FC中去,从而在推理时去除卷积。

论文:RepMLP: Re-parameterizing Convolutions into Fully-connected Layers for Image Recognition

代码:DingXiaoH/RepMLP

1. 为什么真正的纯MLP不太行?

我们一般认为多层感知机(MLP)是至少两层全连接层(FC)堆叠得到的模型,而且一般把同时含有卷积和MLP的模型(或模型中的一个模块)称为CNN。尽管目前大家对什么叫MLP的问题尚有争议(下图),我们不妨先定义一个任何人都会称之为MLP的100%纯MLP:

这个MLP在ImageNet上的输入是(3, 112, 112),第一层将其变为(32, 56, 56),第二层将其变为(64, 28, 28),然后global average pool,然后经过FC映射为1000类。这样总共只有三个FC,毫无疑问是MLP。这三层的参数为:

第一层:3x112x112x32x56x56 = 3.77G 参数

第二层:32x56x56x64x28x28 = 5.03G 参数

第三层:64×1000 = 64k 参数,忽略不计

看起来有点吓人,但这确实是一个处于A1位置的纯MLP应有的体量,虽然它只有两层,而且通道数只有32和64。除了减小通道数量,任何试图减小参数量的改动都将使其不再属于A1位置。比如说:

1) 先切块。把112×112的输入切成56×56的四块,每一块经过第一层变成28×28,再拼起来,这样第一层的参数量变成了3x56x56x32x28x28=236M,看起来好多了。但是,这破坏了全局性,因为分属于两块中的两点之间不再有联系了!换句话说,我们引入了一种局部性:一张图切成四块之后,每块中的任一像素只跟同块中的其他像素有联系。ViT,RepMLP和其他几篇MLP都用了这种操作或某种类似的操作。

2) 分组FC。正如卷积有分组卷积一样,FC也可以分组。由于torch里没有现成的算子,分组FC可以用分组1×1卷积实现。组数为g,参数量和计算量就会变成1/g。可惜,这也引入了局部性。RepMLP用了这种操作。

3) 把一个FC拆分成两次操作,第一次操作对channel维度线性重组,spatial共享参数(等价于1×1卷积);第二次操作对spatial维度线性重组,channel共享参数(等价于先转置后1×1卷积)。这思想可以类比于depthwise conv + 1×1 conv。MLP-Mixer使用这种操作,用两个各自都不具有全局性的操作实现了整体的全局性(而RepMLP使用另一种不同的机制,对不同的分块做pooling再连接,实现了这种全局性)。

所以,真正的100%纯MLP不太行,大家都在用各种花式操作做“伪MLP”的原因之一,就是体量太大。

这篇文章介绍的RepMLP属于B2的位置,不追求纯MLP。称其为“MLP”的原因是想强调卷积和FC的区别:RepMLP将卷积看成一种特殊的FC,显式地用卷积去强化FC(把FC变得具有局部性又不失全局性),指出了这样的FC强在哪里(如ResNet-50中,用一半通道数量的RepMLP替换3×3卷积就可以实现同等精度和55%加速),并用这种强化过的FC(及一些其他技巧)构造一种通用的CNN基本组件,提升多重任务性能。论文中说明了这里MLP的意思是推理时结构“不包含大于1×1的卷积”。

2. RepMLP:FC“内卷”,卷出性能

真正的100%纯MLP不太行的原因之二,是不具有局部先验。

在一张图片中,一个像素点跟它周围的像素点的关系往往比远在天边的另一个像素点更密切,这称为局部性。人类在识别图片的时候潜意识地利用这一点,称为局部先验。卷积网络符合局部先验,因为卷积核通过滑动窗口在图片上“一块一块地”寻找某种特征。

那么FC层呢?FC能自动学到这一点吗?在有限的数据量(ImageNet)和有限的计算资源前提(GPU)下,很难。

实验验证:下面我们假设FC层的输入是64x10x10的feature map直接 “展平”成的6400维向量。输出也是6400维向量,然后reshape成64x10x10的feature map。下图展示了FC学得的kernel中的一个切片的权值大小。简单地讲(详见论文),展示的这一部分表示在输出的第0个channel中随便找的一个采样点(6,6)(也就是图中黄框标出来的点)作用于第0个输入channel上的10×10个像素点的权值。颜色越深,表示权值越大。比如说,如果图中的(5,5)点颜色深,就表示这个FC层认为输出中的(0,6,6)点与输入中的(0,5,5)点关系紧密。

结果很明显,(6,6)周围的权值并没有颜色更深,也就是说FC并不认为这个点和周围点的联系更紧密。相反,似乎这个FC层认为(6,6)点与右上和右下部分关系更密切。实验也证明,不具有局部性的FC效果较差。

既然图像的局部性很强,FC把握不住,那怎么办呢?RepMLP提出,用卷积去增强FC(如下图所示,输入既被展平成向量并输入FC,又用不同大小的卷积核进行卷积,各自过BN后相加),并通过结构重参数化,将卷积融合到FC中去,从而在推理时去除卷积。

我们将卷积和FC之间建立联系,是因为卷积可以看成一个稀疏且存在重复参数的FC。如下图代码所示,给定输入X和卷积核conv_K,其卷积的结果等于X(直接展平成向量)和fc_K的矩阵乘,fc_K称为conv_K的等效FC核。尽管我们都相信这样的fc_K一定存在,但根据conv_K的值直接构造出fc_K的方法(下图中的convert_K函数)似乎不太简单。

本文提出了一种简洁优美的做法(见后文)。我们用这种方法构造出fc_K并打印出来,可以看出它是一个稀疏且有很多元素相同的矩阵(Toeplitz矩阵)。如下图的代码和结果所示。

RepMLP把卷积的输出和FC的输出相加,这样做的好处是:

1) 降低FLOPs,提高速度。用我们提出的方法把卷积全都转换为等效FC kernel后,由于矩阵乘法的可加性(AX + BX = (A+B)X),一个稀疏且共享参数的FC(Toeplitz矩阵)加一个不稀疏不共享参数的FC(全自由度的矩阵),可以等价转换为一个FC(其参数是这两个矩阵之和)。这样我们就可以将这些卷积等效地去掉。这一思路也属于结构重参数化(通过参数的等价转换实现结构的等价转换,如RepVGG)。

2) 在同等参数量的情况下,FC的FLOPs远低于卷积。

3) 相比于纯FC,这样做产生了局部性。注意这种局部性是我们“赋予”FC的,而不是让FC学到的。

4) 相比于卷积层,这样做使得相距遥远的两个点直接相连,具备了全局性。

这样做看起来像是让FC的“内部”含有卷积,所以也可以称为“内卷”。事实证明,跟人类相似,FC的“内卷”也可以提高性能。

只剩下一个问题了:我们相信存在一个FC kernel等价于卷积的卷积核,但是给定一个训练好的卷积核,怎么构造出FC kernel(Toeplitz矩阵)呢?

其实也很简单:FC kernel等于在单位矩阵reshape成的feature map上用卷积核做卷积的结果。这一做法是高效、可微、与具体的卷积算法和平台无关的。推导过程也很简洁(详见论文)。

现在,整个流程就很清晰了:

1) 训练时,既有FC又有卷积,输出相加。

2) 训练完成后,先把BN的参数“吸”到卷积核或FC中去(跟RepVGG一样),然后把每一个卷积转换成FC,把所有FC加到一起。从此以后,不再有卷积,只有FC。

3) 保存并部署转换后的模型。

现在我们再看一下用卷积增强后转换得到的FC kernel,可以看出采样点周围的权值变大了,现在(6,6)点更关注它旁边的输入点了。有趣的是,这里用到的最大卷积是7×7,但是7×7的范围(蓝色框)外还有一些值(红色框)比蓝框内的值大,这说明全局性也没有被局部性“淹没”。

一些其他设计

RepMLP中也用了一些其他设计,包括:

1) 用groupwise conv实现groupwise FC,减少参数和计算量。

2) 将输入分块(最近大家都会用的常见操作),进一步减少参数和计算量。如下图所示,H和W是feature map的分辨率,h和w是每一块的分辨率。

3) 用两个FC在不同分块之间建立联系,确保全局性。如下图所示。

实验结果

用RepMLP替换Res50中的部分结构,在ImageNet上有性能提升。将ImageNet pretrained模型迁移到语义分割和人脸上,也都有性能提升。

在ImageNet上的实验是在Res50中做的。考虑到Res50的主干通道较多(256、512、1024、2048),为了将RepMLP用到Res50中取得合理的trade-off,我们做了以下设计:

1)RepMLP Bottleneck Block:在RepMLP之前用1×1和3×3降维,RepMLP之后用3×3和1×1升维。这一结构类似于旷视在工程中探索并申请的专利GLFP(202010422194.X, Visual task processing method and device and electronic system,下图)。

2)RepMLP Light Block:在RepMLP之前用1×1大幅降维,之后用1×1大幅升维。降维/升维的幅度(8x)比Res50(4x)更大。

一些有趣的发现:

1) RepMLP中具有局部先验的成分(融合进FC的卷积),所以对于具有平移不变性的任务(ImageNet,Cityscapes语义分割)有效。

2) RepMLP中也具有不具有平移不变性的成分(大FC kernel),所以对于具有某种位置模式(例如人脸图像中,眼睛总是在鼻子上面)的任务也有效。

3) 由于FC和卷积的差别,RepMLP可以大幅增加参数而不降低速度(参数增加47%,ImageNet精度提升0.31%,速度仅降低2.2%)。

一些常见问题

RepMLP和ResMLP是什么关系?

相当于旺旺碎冰冰和王冰冰的关系。只是名字有点像。RepMLP中用卷积增强FC的思路也可以用在其他MLP架构中,应该也会有提升。另外,ResMLP、RepMLP和ResRep(去年做的一篇用重参数化做剪枝的论文)也没有关系。

把卷积融合进FC里,那FC不就是卷积了吗?

卷了,但不是完全卷,而且比卷积更强。上面可视化的图显示,转换后的kernel可以关注到卷积核的感受野以外的信息,因而表征能力更强。论文中报告的实验表明,这样的操作可以以一半的channel量达到与纯CNN相当的性能,速度更快,FLOPs更低。本文的关键也在于把卷积看成一种特殊的FC,然后考虑如何利用这种特殊性

所以MLP is all you need?

目前看来,还差得远。目前的方法多多少少都用到了切块等操作,都需要用某种方式降低参数量和引入局部性。真正的纯MLP(A1位置)依然还没有希望。真正纯MLP的一个大麻烦是总的参数量和输入分辨率耦合,因而改变输入分辨率会很困难。MLP-Mixer的一个缺点是不方便改变输入分辨率,所以它在ImageNet分类上的性能不容易迁移到其他任务上去。

PyTorch医学图像分割开源库

github: https://github.com/MontaEllis/Pytorch-Medical-Segmentation

基于PyTorch的专注于医学图像分割的开源库,其支持模型丰富,方便易用。其可算为torchio的一个实例,作者将其综合起来,包含众多经典算法,实用性比较强。

该库特点:

  1. 支持2D和3D医学图像分割,可以修改hparam.py文件来确定是2D分割还是3D分割以及是否可以进行多分类。
  2. 支持绝大数主流分割模型,几乎提供了所有的2D和3D分割的算法。
  3. 兼容几乎所有的医学数据格式(例如 nii.gz, nii, mhd, nrrd, …),修改hparam.py的fold\_arch即可。

作者提供了训练和测试推断的代码,简单配置后训练和推断都仅需要一行命令。

已包含的分割模型:

医学分割图像数据集汇总

(更多数据集请看医学影像数据集集锦:https://github.com/linhandev/dataset

数据集数据集大小 说明 链接
Kvasir-SEG1000 张(对)Kvasir-seg是 胃肠道息肉图像和相应分割面罩的开放式数据集,由医生手动注释,然后由经验丰富的胃肠病学家进行验证。Kvasir-SEG 数据集(大小 46.2 MB)包含来自 Kvasir Dataset v2 的 1000 个息肉图像及其对应的地面实况。Kvasir-SEG 中包含的图像的分辨率从 332×487 到 1920×1072 像素不等。https://datasets.s
imula.no/kvasir-seg/
CVC-ClinicDB600张CVC-ClinicDB 是从结肠镜检查视频中提取的帧数据库。CVC-ClinicDB 数据库由两种不同类型的图像组成:原始图像和息肉掩膜  https://polyp.grand-cha
llenge.org/CVCClinicDB/
CVC-ColonDB300张结肠镜检查视频的注释视频序列。它包含 15 个简短的结肠镜检查序列,来自 15 项不同的研究。在每个序列中显示一个息肉。 
Synapse multi-organ CT50从正在进行的结直肠癌化疗试验和回顾性腹疝研究的组合中随机选择了 50 份腹部 CT 扫描。50 次扫描是在门静脉造影阶段捕获的,具有可变的体积大小 (512 x 512 x 85 – 512 x 512 x 198) 和视场(约 280 x 280 x 280 mm 3 – 500 x 500 x 650 mm 3) . 平面内分辨率从 0.54 x 0.54 mm 2到 0.98 x 0.98 mm 2不等,而切片厚度范围从 2.5 mm 到 5.0 mm。标准注册数据由NiftyReg生成。https://www.syn
apse.org/#!Synapse:syn3193805/wiki/217789
MoNuSeg22,000张数据集是通过仔细注释几名患有不同器官肿瘤并在多家医院被诊断出的患者的组织图像获得的。该数据集是通过从TCGA存档下载以 40 倍放大倍率捕获的 H&E 染色组织图像创建的。H&E 染色是增强组织切片对比度的常规方案,通常用于肿瘤评估(分级、分期等)。考虑到多个器官和患者的细胞核外观的多样性,以及多家医院采用的丰富染色方案,训练数据集将能够开发出强大且可推广的细胞核分割技术,开箱即用。https://monuseg.gr
and-challenge.org/Data/
胰腺分割数据集 美国国立卫生研究院临床中心对 53 名男性和 27 名女性受试者进行了 82 次腹部对比增强 3D CT 扫描(门静脉静脉注射对比剂后约 70 秒)。17 名受试者是在肾切除术前扫描的健康肾脏捐赠者。其余 65 名患者由放射科医师从既无重大腹部病变也无胰腺癌病变的患者中选出。受试者的年龄范围为 18 至 76 岁,平均年龄为 46.8 ± 16.7。CT 扫描具有 512×512 像素的分辨率,具有不同的像素大小和 1.5 – 2.5 mm 之间的切片厚度,在 Philips 和 Siemens MDCT 扫描仪(120 kVp 管电压)上获得。 http://academictorre
nts.com/details/80ecfefc
abede760cdbdf63e38986501f7becd49
MICCAI胰腺分割数据集282目标:肝脏和肿瘤 模式:门静脉期 CT 大小: 420 3D 卷(282 培训 +139 测试) 来源:纪念斯隆凯特琳癌症中心 挑战:标签不平衡与大(背景)、中(胰腺)和小(肿瘤)结构https://drive.google.com
/drive/folders/1HqEgzS8BV2
c7xYNrZdEAnrHk7osJJ–2
LiTS肝脏分割数据集131+70LiTS数据集包含131组训练扫描和70组测试扫描,其中70组测试数据标签不公开。LiTS训练集中包含3DIRCADB中的所有数据,所以不要合并这两个数据集。Medical Segmentation Decathlon中肝脏分割的数据集就是LiTS。https://sliver07.gran
d-challenge.org/
covid19-ct-scans20数据来自Ieee8023,对20组扫描进行了左右肺和感染区的标注。https://www.kaggle.co
m/andrewmvd/covid19-ct-scans
Medical Segmentation Decathlon2,633医学分割十项全能是医学图像分割数据集的集合。它总共包含 2,633 张三维图像,这些图像是从多个感兴趣的解剖结构、多种模式和多个来源收集的。具体来说,它包含以下身体器官或部位的数据:大脑、心脏、肝脏、海马体、前列腺、肺、胰腺、肝血管、脾脏和结肠。http://medicald
ecathlon.com/
GlaS165GlaS 

结肠组织学图像挑战中的腺体分割
本次挑战中使用的数据集包含 165 张图像,这些图像来自 T3 或 T42 期结直肠腺癌的 16 个 H&E 染色组织切片。
每个切片属于不同的患者,切片是在实验室的不同场合处理的。
因此,该数据集在染色分布和组织结构方面表现出很高的受试者间变异性。
使用像素分辨率为 0.465µm 的 Zeiss MIRAX MIDI 幻灯片扫描仪将这些组织切片数字化为全幻灯片图像 (WSI)。
https://warwick.ac.uk/fac/cross_fac/tia/data/glascontest/
2018 Data Science Bowl该数据集包含大量分割的核图像。
这些图像是在各种条件下获得的,并且在细胞类型、放大倍率和成像方式(明场与荧光)方面有所不同。
该数据集旨在挑战算法泛化这些变化的能力。
出自UNet++: A Nested U-Net Architecture for Medical Image Segmentation
https://www.kaggle.com/c/data-science-bowl-2018/overview
ACDC150该数据集由 150 个检查(全部来自不同的患者)组成,分为 5 个均匀分布的亚组(4 个病理组和 1 个健康受试者组),如下所述。
此外,每位患者都附带以下附加信息:体重、身高以及舒张期和收缩期瞬间。
https://acdc.creatis.insa-lyon.fr/description/databases.html

参考:Medical Image Segmentation: https://paperswithcode.com/task/medical-image-segmentation

医学图像分割综述 Medical Image Segmentation Using Deep Learning:A Survey

摘自:MFEI

Abstract

  • 深度学习已经广泛的应用于医疗影像分割领域,大量的论文记录了深度学习在该领域的成功
  • 本文中提出了关于深度学习医疗影像分割的综合专题调查
  • 本文主要有两项贡献
    • 与传统文献做对比
    • 本文关注的是监督和弱监督学习方法,不包括无监督方法。对于监督学习方法,我们从三个方面分析了文献:骨干网络的选择、网络块的设计和损失函数的改进。对于弱监督学习方法,我们分别根据数据增强、迁移学习和交互式分割来研究文献。

1 INTRODUCTION

图1 An overview of deep learning methods on medical image segmentation

  • 早期的医学图像分割方法往往依赖于边缘检测、模板匹配技术、统计形状模型、主动轮廓和机器学习等,虽然有大量的方法被报道并在某些情况下取得了成功,但由于特征表示和困难,图像分割仍然是计算机视觉领域中最具挑战性的课题之一,特别是从医学图像中提取鉴别特征比正常RGB图像更困难,因为普通RGB图像往往存在模糊、噪声、低对比度等问题。
  • 由于深度学习的快速发展,医学图像分割不再需要手工制作的特征,卷积神经网络成功的实现了图像的分层和特征表示,从而成为图像处理和计算机视觉中最热门的研究课题。由于用于特征学习的cnn对图像噪声、模糊、对比度等不敏感,它们为医学图像提供了良好的分割结果。
  • 目前图像分割任务有两类,语义分割和实例分割。语义分割是一种像素级分类,它为图像中的每个像素分配一个相应的类别。与语义分割相比,实例分割不仅需要实现像素级的分类,还需要根据特定的类别来区分实例。
  • 很少有应用于医疗影像分割的实力分割,因为每个器官和组织是很不同的。本文综述了深度学习技术在医疗图像分割方面的研究进展。
  • 监督学习的优点是可以基于精心标记的数据来训练模型,但很难获得大量的医学图像标记数据。无监督学习不需要标记数据,但学习的难度增加了。弱监督学习是在监督学习和无监督学习之间,因为它只需要一小部分标记的数据,大多数数据是未标记的。
  • 通过对以上调查的研究,研究者可以学习医学图像分割的最新技术,然后为计算机辅助诊断和智能医疗做出更重要的贡献。然而这些调查存在两个问题。
    • 1)大多按时间顺序总结了医学图像分割的发展,因此忽略了医学图像分割深度学习的技术分支。
    • 2)这些调查只介绍了相关的技术发展,而没有关注医学图像分割的任务特征,如少镜头学习、不平衡学习等,这限制了基于任务驱动的医学图像分割的改进。

为了解决这两个问题我们提出了一个新的Survey,在这项工作中我们的主要贡献如下:

  • 深度学习医疗影像分割技术从粗到细的分支,如图1所示
  • 对于监督学习的方法,我们从三个方面分析了文献:
    • 骨干网络的选择
    • 网络块的设计
    • 损失函数的改进

回顾了来自处理少镜头数据或类不平衡数据的三个方面的文献:数据增强、迁移学习和交互分割。

  • 收集了目前常见的公共医学图像分割数据集,最后我们讨论了这一领域的未来研究趋势和发展方向

2 SUPERVISED LEARNING

2 An overview of network architectures based on supervised learning.

A. Backbone Networks

研究人员提出了编码器-解码器架构,这是最流行的端到端体系结构之一,如FCN,U-Net,Deeplab等。这些结构中编码器通常用于提取图像特征,而解码器通常用于将提取的特征恢复到原始图像大小,并输出最终的分割结果。虽然端到端结构对于医学图像分割是实用的,但它降低了模型的可解释性。

  • U-Net


图3 U-Net architecture
U-Net解决了一般的CNN网络用于医学影响分割的问题,因为它采用了完美的对称结构和跳过连接。与普通的图像分割不同,医学图像通常包含噪声,边界模糊。因此仅依靠图像的低级特征,很难检测到医学图像中的物体或识别物体。同时,由于缺乏图像的细节信息,仅依靠图像的语义特征也不可能获得准确的边界。而U-Net通过跳跃连接结合低分辨率和高分辨率的特征图,有效地融合了低层次和高级层次的图像特征,是医学图像分割任务的完美解决方案。

  • 3D Net


图4 V-Net architecture
在实践中,由于CT和MRI图像等大多数医学数据都以三维体积数据的形式存在,因此使用三维卷积核可以更好地挖掘数据的高维空间相关性。基于这一想法,C¸ ic¸ek等人[34]将U-Net架构扩展到3D数据的应用中,并提出了直接处理3D医疗数据的3DU-Net。由于计算资源的限制,三维U-Net只包含3个下采样,不能有效地提取深层图像特征,导致对医学图像的分割精度有限。
此外,米列塔利等人提出了类似的结构,V-Net,如图4所示。众所周知,残差连接可以避免梯度的消失,加速网络的收敛速度,很容易设计出更深层次的网络结构,可以提供更好的特征表示。与3DU-Net相比,V-Net采用残差连接设计跟深层次的网络(4次下采样)从而获得更好的性能。
然而,由于大量的参数,这些3D网络也遇到了高计算成本和GPU内存使用的问题。

  • Recurrent Neural Network (RNN)


图5 Recurrent residual convolution unit
RNN最初被设计用于处理序列问题。长短期记忆(LSTM)网络[39]是最流行的rnn之一。通过引入自循环,它可以长时间保持梯度流动。在医学图像分割中,RNN已经被用来建模图像序列的时间依赖性。Alom等人[40]提出了一种结合ResUNet与RNN的医学图像分割方法。该方法实现了递归残差卷积层的特征积累,改进了图像分割任务的特征表示。图5为递归残差卷积单元。
显然,RNN可以通过考虑上下文信息关系来捕获图像的局部和全局空间特征。然而,在医学图像分割中,获取完整和有效的时间信息需要良好的医学图像质量(例如,较小的切片厚度和像素间距)。因此,RNN的设计对于提高医学图像分割的性能并不常见。

  • Skip Connection
    虽然skip connection可以融合低分辨率和高分辨率的信息,从而提高特征表示能力,但由于低分辨率和高分辨率特征之间的语义差距较大,导致特征映射模糊。为了改进skip connection,Ibtehaz等人[43]提出了包含Residual Path(ResPath)的MultiResUNet,这使得编码器特征在与解码器中的相应特征融合之前执行一些额外的卷积操作。Seo等人[44]提出mUNet,Chen等[45]提出FED-Net。mU-Net和FED-Net都在跳跃连接中添加了卷积操作,以提高医学图像分割的性能。
  • Cascade of 2D and 3D
    对于图像分割任务,级联模型通常训练两个或两个以上的模型来提高分割精度。该方法在医学图像分割中尤为流行。级联模型大致可分为三种框架类型
    • 粗-细分割
      • 它使用两个二维网络的级联进行分割,其中第一个网络进行粗分割,然后使用另一个网络模型基于之前的粗分割结果实现精细分割。
  • 检测分割
    • 首先使用R-CNN或者YOLO等网络模型进行目标位置识别,然后使用另一个网络基于之前的粗糙分割结果进行进一步的分割
  • 混合分割
    • 由于大多数医学图像是三维数据,二维卷积神经网络不能学习三维时间信息,而三维卷积神经网络往往需要较高的计算成本。所以一些伪三维的分割方法被提出。Oda等[58]提出了一种三平面的方法,从医学CT体积中有效地分割腹动脉区域。Vu等人[59]将相邻切片的叠加作为中心切片预测的输入,然后将得到的二维特征图输入标准的二维网络进行模型训练。虽然这些伪三维方法可以从三维体数据中分割对象,但由于利用了局部时间信息,它们只能获得有限的精度提高。
    • 与伪三维网络相比,混合级联二维三维网络更受欢迎。Li等人[60]提出了一种混合密集连接的U-Net(H-DenseUNet)用于肝脏和肝肿瘤的分割。该方法首先采用一个简单的Resnet获得一个粗糙的肝脏分割结果,利用二维DenseUNet有效地提取二维图像特征,然后利用三维数据集提取三维图像特征,最后设计一个混合特征融合层,共同优化二维和三维特征。
  • Others
    • GAN已经广泛应用于计算机视觉的多个领域。生成对抗的思想也被用于图像分割。但由于医学图像通常显示低对比度,不同组织之间或组织之间的边界和病变模糊,医学图像数据标签稀疏。Luc等[65]首先将生成对抗网络应用于图像分割,将生成网络用于分割模型,将对抗网络训练为分类器。
    • 结合有关器官形状和位置的先验知识可能对提高医学图像分割效果至关重要,在医学图像分割效果中,由于成像技术的限制,图像被损坏,因此包含了伪影。然而,关于如何将先验知识整合到CNN模型中的工作很少。Oktay等人[68]提出了一种新的通用方法,将形状和标签结构的先验知识结合到解剖约束神经网络(ACNN)中,用于医学图像分析任务。通过这种方式,神经网络的训练过程可以被约束和引导,以做出更解剖学和有意义的预测,特别是在输入图像数据信息不足或足够一致的情况下(例如,缺少对象边界)。上述研究表明由于在神经网络的训练过程中采用了先验知识约束,改进后的模型具有更高的分割精度,且具有更强的鲁棒性。

B. Network Function Block

  • Dense Connection


图6 Dense connection architecture
密集连接通常用于构造一种特殊的卷积神经网络。对于密集连接网络,每一层的输入来自前向传播过程中所有层的输出。受密集连接的启发,Guan等[70]提出了一种改进的U-Net,将它的每个子块替换为密集连接形式,如图6所示。虽然密集的连接有助于获得更丰富的图像特征,但它往往在一定程度上降低了特征表示的鲁棒性,增加了参数的数量。


图7 UNet++
Zhou等人[71]将所有U-Net层(从1层到4层)连接在一起,如图7所示。这种结构的优点是,它允许网络自动学习不同层的特征的重要性。并且对跳跃连接进行了重新设计,可以将具有不同语义尺度的特征聚合在解码器中,从而形成了一个高度灵活的特征融合方案。缺点是由于密集连接的使用,参数的数量增加了。因此,将一种剪枝方法集成到模型优化中,以减少参数的数量。

  • Inception


图8 Inception architecture
对于CNNs来说,深层网络往往比浅层网络具有更好的性能,但也会有梯度消失、难收敛、内存使用要求大等问题。Inception结构克服了这些问题,它在不增加网络深度的情况下并行合并卷积核,具有更好的性能。该结构能够利用多尺度卷积核提取更丰富的图像特征,并进行特征融合以获得更好的特征表示。
图8显示了inception的架构,它包含四个级联分支,随着无卷积次数的逐渐增加,从1到1、3和5,每个分支的接受域分别为3、7、9和19。因此,该网络可以从不同的尺度中提取特征。由于该架构比较复杂,导致模型修改困难

  • Depth Separability
    为了提高网络模型的泛化能力,减少对内存使用的需求,许多研究者将重点研究了复杂医学三维体数据的轻量级网络。
    Howard et.al[76]提出了移动网络将普通卷积分解为深度可分卷积和点态卷积。普通卷积运算的数量通常为DK×DK×M×N,其中M为输入特征映射的维数,N为输出特征映射的维数,DK为卷积核的大小。然而,信道卷积操作的次数为DK×DK×1×M,点卷积为1×1×M×N。与普通卷积相比,深度可分离卷积的计算代价是普通卷积的计算代价(1/N+1/D2K)倍。
    深度可分卷积是减少模型参数数量的一种有效方法,但它可能会导致医学图像分割精度的损失,因此需要采用其他方法(如深度监督)[78]来提高分割精度。
  • Attention Mechanism
    对于神经网络,attention block可以根据不同的重要性选择性地改变输入或给输入变量分配不同的权值。近年来,大多数结合深度学习和视觉注意机制的研究都集中在利用mask形成注意机制上。mask的原理是设计一个新的层,通过训练和学习从图像中识别出关键特征,然后让网络只关注图像中的有趣区域。
    • Local Spatial Attention


图9 The attention block in the attention U-Net
普通的pooling相当于信息合并,这很容易导致关键信息丢失。针对这个问题,设计了一个称为spatial transformer的块,通过执行空间变换来提取图像的关键信息。受此启发,Oktay等人[83]提出了attention U-Net。改进后的U-Net在融合来自编码器和相应的解码器的特征之前,使用一个注意块来改变编码器的输出。注意块输出门控信号来控制不同空间位置的像素的特征重要性。图9显示了该体系结构。这个块通过1×1卷积结合Relu和sigmoid函数,生成一个权重映射,通过与编码器的特征相乘来进行修正。

  • Channel Attention


图10 The channel attention in the SE-Net
通道注意力模块可以实现特征重新校准,利用学习到的全局信息,选择性地强调有用特征,抑制无用特征。
Hu等人[84]提出了SE-Net,将通道关注引入了图像分析领域,该方法通过三个步骤实现了对信道的注意力加权;图10显示了该体系结构。首先是压缩操作,对输入特征进行全局平均池化,得到1×1×通道特征图。第二种是激励操作,将信道特征相互作用以减少信道数,然后将减少后的信道特征重构回信道数。最后利用sigmoid函数生成[0,1]的特征权值映射,将尺度放回原始输入特征。

  • Mixture Attention
    空间注意机制和通道注意机制是改进特征表示的两种常用策略。然而,空间注意忽略了不同通道信息的差异,并平等地对待每个通道。相反,通道注意力直接汇集全局信息,而忽略每个通道中的局部信息,这是一个相对粗糙的操作。因此,结合两种注意机制的优势,研究者设计了许多基于mixed domain attention block的模型。
    Wang等人[86]在U-Net的收缩路径和扩展路径之间的中心瓶颈中嵌入了一个注意块,并提出了网格网。此外,他们还比较了通道注意、空间注意和两种注意的不同组合在医学图像分割中的表现。他们的结论是,以通道为中心的注意力是提高图像分割性能的最有效的方法。
    虽然上述的注意机制提高了最终的分割性能,但它们只执行局部卷积的操作。该操作侧重于相邻卷积核的区域,但忽略了全局信息。此外,降采样的操作会导致空间信息的丢失,这尤其不利于医学图像的分割。
  • Non-local Attention


图11 The global aggregation block in the Non-Local U-Net
最近,Wang等人[87]提出了一种Non-local U-Net来克服局部卷积的缺点。Non-local U-Net在上采样和下采样部分均采用自注意机制和全局聚合块提取全图像信息,提高最终分割精度,图11显示了global aggregation block 。Non-local block是一种通用块,可以很容易地嵌入到不同的卷积神经网络中,以提高其性能。
该注意机制对提高图像分割精度是有效的。事实上,空间注意寻找有趣的目标区域,而通道注意寻找有趣的特征。混合注意机制可以同时利用空间和渠道。然而,与非局部注意相比,传统的注意机制缺乏利用不同目标与特征之间关联的能力,因此基于非局部注意的cnn在图像分割任务中通常比正常的cnn具有更好的性能。

  • Multi-scale Information Fusion
    物体之间的大尺度范围是医学图像分割的挑战之一。例如,中晚期的肿瘤可能比早期的肿瘤要大得多。感知场的大小大致决定了我们可以使用多少上下文信息。一般的卷积或池化只使用单个内核,例如,一个3×3内核用于卷积,一个2×2内核用于池化。
    • Pyramid Pooling:多尺度池化的并行操作可以有效地改善网络的上下文信息,从而提取出更丰富的语义信息。He et al.[88]首先提出了spatial pyramid pooling(SPP)来实现多尺度特征提取。SPP将图像从细空间划分为粗空间,然后收集局部特征,提取多尺度特征。受SPP的启发,设计了一个多尺度信息提取块,并将其命名为multi-kernel pooling(RMP)[75],它使用四个不同大小的池内核对全局上下文信息进行编码。然而,RMP中的上采样操作不能由于池化而恢复细节信息的丢失,这通常会扩大接受域,但降低了图像的分辨率。
    • Atrous Spatial Pyramid Pooling:为了减少池化操作造成的详细信息损失,研究人员提出了atrous convolution而不是池化操作。与普通卷积相比,atrous convolution可以在不增加参数数量的情况下有效地扩大接受域。


图12 The gridding effect (the way of treating images as a chessboard causes the loss of information continuity).
然而,ASPP在图像分割方面存在两个严重的问题。第一个问题是局部信息的丢失,如图12所示,其中我们假设卷积核为3×3,三次迭代的膨胀率为2。第二个问题是,这些信息在很大的距离上可能是无关的。

  • Non-local and ASPP:


图13 The combination of ASPP and Non-local architecture
atrous convolution可以有效地扩大接受域,收集更丰富的语义信息,但由于网格效应,导致了细节信息的丢失。因此,有必要添加约束或建立像素关联来提高无效卷积性能。最近,Yang等人提出了[92]的ASPP和非局部组合块用于人体部位的分割,如图13所示。ASPP使用多个不同规模的并行无性卷积来捕获更丰富的信息,而非本地操作捕获了广泛的依赖关系。该组合具有ASPP和非局部化的优点,在医学图像分割方面具有良好的应用前景。


C. Loss Function

除了通过设计网络主干和函数块来提高分割速度和精度外,设计新的损失函数也可以改进分割精度

  • Cross Entropy Loss
    对于图像分割任务,交叉熵是最流行的损失函数之一。该函数将预测的类别向量和实际的分割结果向量进行像素级的比较。
  • Weighted Cross Entropy Loss
    交叉熵损失对图像平均处理每个像素,输出一个平均值,忽略类不平衡,导致损失函数依赖于包含最大像素数的类的问题。因此,交叉熵损失在小目标分割中的性能往往较低。为了解决类的不平衡的问题,Long等人[32]提出了加权交叉熵损失(WCE)来抵消类的不平衡。对于二值分割的情况,将加权交叉熵损失定义为


其中,β用于调整正样本和负样本的比例,它是一个经验值。如果是β>1,则假阴性的数量将会减少;事实上,交叉熵是加权交叉熵的一个特例,当β=1时,假阳性的数量就会减少。当β=1时。为了同时调整阳性和阴性样本的权重 的权重,我们可以使用平衡交叉熵 (BCE)损失函数,其定义为

  • Dice Loss
    Dice是一个流行的医学影像分割性能评价指标。这个指标本质上是分割结果与相应的真实值之间重叠的度量。Dice的值为0-1之间,计算公式为


其中A为预测分割结果,B为真实分割结果。

  • Tversky Loss
    Dice loss的正则化版本,以控制假阳性和假阴性对损失函数的贡献,TL被定义为


其中,p∈0, 1和0≤pˆ≤1。p和pˆ分别为地面真实值和预测分割。如果β=为0.5,则TL相当于Dice

  • Generalized Dice Loss
    Dice loss虽然一定程度上解决了分类失衡的问题,但却不利于严重的分类不平衡。例如小目标存在一些像素的预测误差,这很容易导致Dice的值发生很大的变化。Sudre等人提出了Generalized Dice Loss (GDL)


GDL优于Dice损失,因为不同的区域对损失有相似的贡献,并且GDL在训练过程中更稳定和鲁棒。

  • Boundary Loss
    为了解决类别不平衡的问题,Kervadec等人[95]提出了一种新的用于脑损伤分割的边界损失。该损失函数旨在最小化分割边界和标记边界之间的距离。作者在两个没有标签的不平衡数据集上进行了实验。结果表明,Dice los和Boundary los的组合优于单一组合。复合损失的定义为


其中第一部分是一个标准的Dice los,它被定义为


第二部分是Boundary los,它被定义为

  • Exponential Logarithmic Loss
    在(9)中,加权Dice los实际上是得到的Dice值除以每个标签的和,对不同尺度的对象达到平衡。因此,Wong等人结合focal loss [96] 和dice loss,提出了用于脑分割的指数对数损失(EXP损失),以解决严重的类不平衡问题。通过引入指数形式,可以进一步控制损失函数的非线性,以提高分割精度。EXP损失函数的定义为


其中,两个新的参数权重分别用ωdice和ωcross表示。Ldice是指数对数骰子损失,而交叉损失是交叉熵损失


其中x是像素位置,i是标签,l是位置x处的地面真值。pi(x)是从softmax输出的概率值。
在(17)中,fk是标签k出现的频率,该参数可以减少更频繁出现的标签的影响。γDice和γcross都用于增强损失函数的非线性。


3 WEAKLY SUPERVISED LEARNING

图14 The weakly supervised learning methods for medical image segmentation.

A. Data Augmentation

在缺乏大量标记数据集的情况下,数据增强是解决这一问题的有效解决方案,然而一般的数据扩展方法产生的图像与原始图像高度相关。与常用的数据增强方法相比,GAN是目前最流行的数据增强策略,因为GAN克服了对原始数据的依赖问题。

  • Traditional Methods
    一般的数据增强方法包括提高图像质量,如噪声抑制,亮度、饱和度、对比度等图像强度的变化,以及旋转、失真、缩放等图像布局的变化。传统数据增强中最常用的方法是参数变换(旋转、平移、剪切、位移、翻转等)。由于这种转换是虚拟的,没有计算成本,并且对医学图像的标注很困难,所以总是在每次训练之前进行。
  • Conditional Generative Adversarial Nets(cGAN)


图15 The cGAN architecture
原始GAN生成器可以学习数据的分布,但生成的图片是随机的,这意味着生成器的生成过程是一种非引导的状态。相比之下,cGAN在原始GAN中添加了一个条件,以指导G的生成过程。图15显示了cGAN的体系结构。
Guibas等人[107]提出了一个由GAN和cGAN组成的网络架构。将随机变量输入GAN,生成眼底血管标签的合成图像,然后将生成的标签图输入条件GAN,生成真实的视网膜眼底图像。最后,作者通过检查分类器是否能够区分合成图像和真实图像来验证合成图像的真实性
虽然cGAN生成的图像存在许多缺陷,如边界模糊和低分辨率,但cGAN为后来用于图像样式转换的CycleGAN和StarGAN提供了一个基本的思路。


B. Transfer Learning

通过利用模型的训练参数来初始化一个新的模型,迁移学习可以实现对有限标签数据的快速模型训练。一种方法是在ImageNet上微调预先训练好的模型,而另一种方法是对跨领域的数据进行迁移训练。

  • Pre-trained Model
    转移学习通常用于解决数据有限的问题在医学图像分析,一些研究人员发现,使用预先训练的网络自然图像如ImageNet编码器在U-Net-like网络,然后对医疗数据进行微调可以进一步提高医学图像的分割效果。
    在ImageNet上进行预训练的模型可以学习到医学图像和自然图像都需要的一些共同的基础特征,因此再训练过程是不必要的,而执行微调对训练模型是有用的。然而,当将预训练好的自然场景图像模型应用于医学图像分析任务时,领域自适应可能是一个问题。此外,由于预先训练好的模型往往依赖于二维图像数据集,因此流行的迁移学习方法很难适用于三维医学图像分析。如果带有注释的医疗数据集的数量足够大,那么就有可能这样做
  • Domain Adaptation


图16 The Cycle GAN architecture
如果训练目标域的标签不可用,而我们只能访问其他域的标签,那么流行的方法是将源域上训练好的分类器转移到没有标记数据的目标域。CycleGAN是一种循环结构,主要由两个生成器和两个鉴别器组成。图16为CycleGAN的体系结构。


C. Interactive Segmentation

手工绘制医学图像分割标签通常是繁琐而耗时的,特别是对于绘制三维体数据。交互式分割允许临床医生交互式地纠正由模型生成的初始分割图像,以获得更准确的分割。有效的交互式分割的关键是,临床医生可以使用交互式方法,如鼠标点击和轮廓框,来改进来自模型的初始分割结果。然后,该模型可以更新参数,生成新的分割图像,从临床医生那里获得新的反馈。

例:Wang等人[121]提出了利用两个神经网络级联的DeepIGeoS,对二维和三维医学图像进行交互分割。第一个CNN被称为P-Net,它输出一个粗糙的分割结果。在此基础上,用户提供交互点或短线来标记错误的分割区域,然后使用它们作为第二个CNNR-Net的输入,获得校正的结果。对二维胎儿MRI图像和三维脑肿瘤图像进行了实验,实验结果表明,与传统的图形切割、随机游走、ITK-Snap等交互式分割方法相比,DeepIGeoS大大减少了用户交互的需求,减少了用户时间。


D. Others Works

半监督学习可以使用一小部分已标记数据和任意数量的未标记数据来训练模型,它的损失函数通常由两个损失函数的和组成。第一个是仅与标记数据相关的监督损失函数。第二个是无监督损失函数或正则化项,与标记和未标记数据相关。

弱监督分割方法从边框或图像级标签或少量标注的图像数据中学习图像分割,而不是使用大量的像素级标注,以获得高质量的分割结果。事实上,少量的注释数据和大量的未注释数据更符合真实的临床情况。然而,在实践中,弱监督学习的性能很少能为医学图像分割任务提供可接受的结果,特别是对三维医学图像。因此,这是一个值得在未来探索的方向。


4 CURRENTLY POPULAR DIRECTION

A. Network Architecture Search

到目前为止,NAS[130]在提高图像分类精度方面取得了重大进展。NAS可以被认为是自动机器学习的一个子域,与超参数优化和元学习有很强的重叠。

大多数深度学习医疗影像分割依赖于U-Net网络,并根据不同的任务对网络结构进行一些改变,但在实际应用中,非网络结构因素可能对提高分割效果也有重要意义。

Isensee等人[136]认为,对网络结构进行过多的人工调整会导致对给定数据集的过拟合,因此提出了一种医学图像分割框架no-new-unet(nnU-Net),以适应任何新的数据集。nnUnet会根据给定数据集的属性自动调整所有超参数,而不需要手动干预。因此,nnU-Net只依赖于普通的2DUNet、3DUNet、UNet级联和一个鲁棒的训练方案。它侧重于预处理(重采样和归一化)、训练(损失、优化器设置、数据增强)、推理(基于补丁的策略、测试时间增强集成、模型集成等)的阶段,以及后处理(例如,增强的单通域)。在实际应用中,网络结构设计的改进通常依赖于没有足够的可解释性理论支持的经验,此外,更复杂的网络模型表明过拟合的风险更高。

为了对高分辨率的二维图像(如CT、MRI和组织病理学图像)进行实时图像分割,压缩神经网络模型的研究已成为医学图像分割的一个流行方向。NAS的应用可以有效地减少模型参数的数量,实现了较高的分割性能。尽管NAS的性能令人惊叹,但我们无法解释为什么特定架构的性能良好。因此,更好地理解对性能有重要影响的机制,以及探索这些特性是否可以推广到不同的任务,对于未来的研究也很重要。

B. Graph Convolutional Neural Network

GCN是研究非欧几里得域的强大工具之一。图是一种由节点和边组成的数据结构。早期的图神经网络(GNNs)主要处理严格的图形问题,如分子结构的分类。在实践中,欧几里得空间(如图像)或序列(如文本),以及许多常见的场景可以转换为图,可以使用GCN技术建模。

Gao等人设计了一种新的基于GCN的图池(gUnPool)和图解池(gUnpool)操作,并提出了一种编码-解码器模型,即graph U-Net。graph U-Net通过添加少量的参数,比流行的unet获得了更好的性能。与传统的深度卷积神经网络相比,当深度值超过4时,增加网络的深度并不能提高graph U-Net的性能。然而,当深度值小于或等于4时,图U-Net比流行的U-Net表现出更强的特征编码能力。

基于GCN的方法比传统的和最近的基于深度学习的方法提供了更好的性能和更强的鲁棒性。由于图结构具有较高的数据表示效率和较强的特征编码能力,因此其在医学图像分割中的结果很有前景。

C. Interpretable Shape Attentive Neural Network

目前,许多深度学习算法倾向于通过使用近似适合输入数据的“记忆”模型来做出判断。因此,这些算法不能被充分地解释,并为每个具体的预测提供令人信服的证据。因此,研究深度神经网络的可解释性是目前的一个热点。

Sun等人[142]提出了SAU-Net,重点关注模型的可解释性和鲁棒性。该架构试图通过使用二次形状流来解决医学图像中边缘分割精度较差的问题。特别是,形状流和规则的纹理流可以并行地捕获丰富的与形状相关的信息。此外,解码器还使用了空间注意机制和通道注意机制来解释模型在U-Net各分辨率下的学习能力。最后,通过提取学习到的形状和空间注意图,我们可以用15个方法来解释每个解码器块的高度激活区域。学习到的形状图可以用来推断由模型学习到的有趣类别的正确形状。SAU-Net能够通过门控形状流学习对象的鲁棒形状特征,并且通过使用注意力的内置显着性映射比以前的工作更容易解释。

Wickstrøm等人[143]探索了卷积神经网络中结直肠息肉语义分割的不确定性和可解释性,作者开发了用于解释网络梯度的引导反向传播[144]的中心思想。通过反向传播,得到输入中每个像素对应的梯度,使网络所考虑的特征能够可视化。在反向传播过程中,由于图像中梯度值大且正的像素需要得到高度的重视,而应抑制梯度值大且梯度值负的像素。如果这些负梯度包含在重要像素的可视化中,它们可能会导致描述性特征的噪声可视化。为了避免产生有噪声的可视化,引导反向传播过程改变了神经网络的反向传播,使每一层的负梯度设置为零,从而只允许正梯度向后流过网络并突出这些像素。

目前,医学图像分析的解释主要是采用注意力和类激活图(CAM)等可视化方法。因此,对医学图像分割深度学习可解释性的研究将是未来的热门方向。

D. Multi-modality Data Fusion

多模态数据融合可以提供更丰富的目标特征,有助于提高目标检测和分割结果,因此在医学图像分析中得到了广泛的应用。

虽然众所周知,多模态融合网络通常显示更好的性能比单模式网络分割任务,多模型融合导致一些新的问题,如如何设计多模式网络有效地结合不同的模式,如何利用不同模式之间的潜在关系,如何将多个信息集成到分割网络提高分割性能等。此外,将多模态数据融合集成到一个有效的单参数网络中,有助于简化部署,提高临床实践中模型的可用性。


5 DISCUSSION AND OUTLOOK

A. Medical Image Segmentation Datasets

B. Popular evaluation metrics

为了有效地衡量医学图像分割模型的性能,人们提出了大量的指标来评价分割的有效性。对图像分割性能的评价依赖于像素质量、区域质量和表面距离质量。

目前比较流行的指标有像素质量指标包括像素精度(PA)。区域质量指标包括Dice score、体积重叠误差(VOE)和相对体积差(RVD)。表面距离质量度量包括平均对称表面距离(ASD)和最大对称表面距离(MSD)。

  • PA
    像素精度只是找到正确分类的像素的比率,除以像素总数。对于K个+1类(K个前景类和背景),像素精度定义为:


其中,pij是第i类预测为属于第j类的像素数。

  • Dice score
    它是一种常用的图像分割度量方法(在医学图像分析中更常用),它可以定义为预测地图和地面真实地图重叠面积的两倍,除以两幅图像的像素总数。对Dice score的定义为:
  • VOE
    它是Jaccard index的补充,其定义为:
  • RVD
    它是一种非对称度量,定义为:
  • ASD
    表面距离度量是参考和预测病变的表面距离的相关度量。
    设S(A)表示a的表面体素集合。任意体素v到S(A)的最短距离定义为:


ASD is defined as:

  • MSD
    它也被称为对称豪斯多夫距离,与ASD相似,但取的最大距离而不是平均值:

本文所有图片公式均来自论文原文

TernausNet

论文地址:https://arxiv.org/abs/1801.05746

github地址:https://github.com/ternaus/TernausNet

数据集:Kaggle Carvana

像素级分割在计算机视觉中是一项艰巨的任务,经典的UNet网络结构在医学影像和卫星图像中非常流行。一般来说神经网权重由一些大型数据集如ImageNet进行初始化后会有更好的效果。在一些实际应用中,尤其是在医学和交通安全方面,模型的精确是至关重要的,本文演示如何使用预训练编码器来改善UNet网络结构。

  1. 经典的UNet网络权重采用随机初始化方式来完成,众所周知训练一个未过拟合的网络需要大量的数据来完成。因此采用经过Imagenet训练后的权重来进行初始化这一方法被广泛应用。通过这种方式来加速学习过程。
  2. 此网络编码器部分采用VGG11(VGG11包含7个3×3卷积层,每个层后加一个ReLU,同时进行5次最大池化操作,具体如下图)

为构造编码器,这里移除了全连接层替换其为一个512通道的单卷积层来分离编码器和解码器。为构造解码器这里采用转置卷积层放大特征图尺寸并且减少一半原通道数。同时将转置卷积的输出与解码器的相应部分的输出串联。特征图的结果通过卷积操作使得其通道数与对应编码器部分相同。这一上采样过程重复5次对应5次池化操作。传统全连接层可接受任意大小图片输入,但因为此处有5个池化层,每次图像缩小到原来一半,即缩小$2^5=32$倍,因此当前网络要求输入图像大小需要能被32整除。下图为本文网络结构图。