ACC-UNet:面向2020年代的完全卷积UNet模型

论文题目:ACC-UNet: A Completely Convolutional UNet
model for the 2020s
论文地址:https://arxiv.org/pdf/2308.13680

1. 背景介绍

在这里插入图片描述

语义分割任务的目标是对图像中的每个像素进行分类,这在医学图像分析、自动驾驶和卫星影像处理等领域有着重要的应用。传统的 UNet 模型利用对称的编码器-解码器结构和跳跃连接(skip connections)在这一任务上取得了很好的效果。随着 Transformer 模型的出现,研究者开始探索如何结合 CNN 和 Transformer 的优势,以提升模型的表现能力。

2. 为什么需要改进?

虽然 UNet 和基于 Transformer 的模型(如 Swin-Unet)各有优点,但它们在以下几个方面存在改进空间:

  • 卷积网络的局部感受野限制:CNN 依赖固定大小的卷积核进行特征提取,可能会遗漏更大范围的上下文信息。
  • 语义差距问题:传统 UNet 的跳跃连接直接将编码器特征传递到解码器,可能导致高层语义信息和低层特征之间的差距,影响分割精度。
  • 参数效率和计算效率:基于 Transformer 的模型虽然表现强大,但通常需要大量计算资源和数据才能充分训练。

3. ACC-UNet 的核心创新

为了克服这些问题,ACC-UNet 提出了几项关键创新,试图在保持高效性的同时提升模型性能。
在这里插入图片描述

3.1 倒置瓶颈(Inverted Bottleneck)

x 1 = DConv 3 × 3 ( PConv c in → c inv ( x in ) ) x_1 = \text{DConv}_{3 \times 3} \left( \text{PConv}_{c_{\text{in}} \rightarrow c_{\text{inv}}} (x_{\text{in}}) \right) x1=DConv3×3(PConvcincinv(xin))

  • x in x_{\text{in}} xin 是输入特征图。
  • PConv c in → c inv \text{PConv}_{c_{\text{in}} \rightarrow c_{\text{inv}}} PConvcincinv 表示将输入特征图的通道数从 c in c_{\text{in}} cin 通过逐点卷积(pointwise convolution)扩展到 c inv c_{\text{inv}} cinv
  • DConv 3 × 3 \text{DConv}_{3 \times 3} DConv3×3 表示在扩展后的特征图上应用 3 × 3 3 \times 3 3×3 的深度卷积(depthwise convolution)。

什么是倒置瓶颈?

倒置瓶颈 是一种在深度学习中常用的结构,特别是在移动端模型(如 MobileNetV2)中使用。倒置瓶颈的设计理念是:

  • 先扩展,后压缩:输入特征图的通道数 c i n c_{in} cin先通过一个逐点卷积(1x1 卷积)扩展到一个较高的维度 c i n v = c i n c_{inv} = c_{in} cinv=cin*inv_fctr
  • 深度卷积(Depthwise Convolution):使用 3x3 的深度卷积对扩展后的特征图进行空间维度上的卷积操作,这样操作的计算复杂度较低,因为它没有增加参数量,只是增加了特征图的通道数。
  • 再压缩回原始维度:最后,通过另一个逐点卷积将扩展后的特征图的通道数再压缩回到 c i n c_{in} cin c o u t c_{out} cout

如果 c i n = 32 c_{in}=32 cin=32,inv_fctr=3,那么 c i n v = 32 × 3 = 96 c_{inv}=32\times 3=96 cinv=32×3=96,输入特征图的通道数从32扩展到96。

3.2 HANC 块(Hierarchical Aggregation of Neighborhood Context)

什么是 HANC 块?

自注意力的简化版本:

  • 自注意力会将每个像素与所有其他像素进行比较,这计算量非常大。
  • 为了简化这个过程,我们可以通过比较一个像素与其邻域的均值和最大值来近似这种操作。

用均值和最大值来替代自注意力:

  • 均值(mean):计算一个像素周围(邻域)所有像素的平均值。这给出了一个“平均邻域”的概念。
  • 最大值(max):计算一个像素周围所有像素的最大值。这给出了一个“最强邻域”的概念。

层次化(Hierarchical)上下文聚合:

  • 考虑图像中的信息通常有层次结构的特点,作者建议不要在一个大的窗口中计算均值和最大值,而是在不同大小的窗口中进行分层计算。
  • 比如,我们可以先计算 2x2的窗口,然后是4x4( 2 2 × 2 2 2^2 \times 2^2 22×22),接着是 8x8 ( 2 3 × 2 3 2^3 \times 2^3 23×23)等等。
  • 通过这样逐层增加窗口大小,可以逐渐捕捉到更大的上下文信息,而不需要使用计算复杂度高的大的卷积核。

特征拼接(Concatenation):

  • 为了丰富特征表示,将这些不同尺度下计算得到的均值和最大值与原始特征图进行拼接。
  • 拼接操作是沿着通道维度(即深度方向)进行的,这样原始的每个特征图都会增加额外的上下文信息。

公式说明

x 2 = ( x 1   ∣ ∣   mean 2 × 2 ( x 1 )   ∣ ∣   mean 2 2 × 2 2 ( x 1 )   ∣ ∣   ⋯   ∣ ∣   mean 2 k − 1 × 2 k − 1 ( x 1 )   ∣ ∣   max 2 × 2 ( x 1 )   ∣ ∣   max 2 2 × 2 2 ( x 1 )   ∣ ∣   ⋯   ∣ ∣   max 2 k − 1 × 2 k − 1 ( x 1 ) ) x_2 = \left( x_1 \,||\, \text{mean}_{2 \times 2}(x_1) \,||\, \text{mean}_{2^2 \times 2^2}(x_1) \,||\, \cdots \,||\, \text{mean}_{2^{k-1} \times 2^{k-1}}(x_1) \,||\, \text{max}_{2 \times 2}(x_1) \,||\, \text{max}_{2^2 \times 2^2}(x_1) \,||\, \cdots \,||\, \text{max}_{2^{k-1} \times 2^{k-1}}(x_1) \right) x2=(x1∣∣mean2×2(x1)∣∣mean22×22(x1)∣∣∣∣mean2k1×2k1(x1)∣∣max2×2(x1)∣∣max22×22(x1)∣∣∣∣max2k1×2k1(x1))

  • x 1 x_1 x1:原始特征图。
  • mean 2 × 2 ( x 1 ) \text{mean}_{2 \times 2}(x_1) mean2×2(x1):计算每个像素在 2 × 2 2 \times 2 2×2 邻域内的均值。
  • max 2 × 2 ( x 1 ) \text{max}_{2 \times 2}(x_1) max2×2(x1):计算每个像素在 2 × 2 2 \times 2 2×2 邻域内的最大值
  • 通过这种方式,我们得到了一系列不同尺度的均值和最大值特征图。
  • ∣ ∣ || ∣∣:表示将这些特征图在通道维度上拼接起来。

x 3 = P ⋅ Conv c inv ⋅ ( 2 k − 1 ) → c in ( x 2 ) + x in x_3 = P \cdot \text{Conv}_{c_{\text{inv}} \cdot (2^{k-1}) \rightarrow c_{\text{in}}}(x_2) + x_{\text{in}} x3=PConvcinv(2k1)cin(x2)+xin

  • x 2 x_2 x2:这是经过多级特征聚合(包括计算均值和最大值)后的特征图,具有更丰富的上下文信息和更多的通道数。此时, x 2 x_2 x2 的通道数是 c inv ⋅ ( 2 k − 1 ) c_{\text{inv}} \cdot (2^{k-1}) cinv(2k1),因为它包含了多级( 2 k − 1 2^{k-1} 2k1)聚合的特征。

  • PConv c inv ⋅ ( 2 k − 1 ) → c in \text{PConv}{c{\text{inv}} \cdot (2^{k-1}) \rightarrow c_{\text{in}}} PConvcinv(2k1)cin:这是一个逐点卷积(Pointwise Convolution)操作,用来改变特征图的通道数。逐点卷积的输入通道数是 c inv ⋅ ( 2 k − 1 ) c_{\text{inv}} \cdot (2^{k-1}) cinv(2k1),输出通道数是 c in c_{\text{in}} cin。这一步的目的是将扩展后的特征图 x 2 x_2 x2 的通道数重新压缩到与原始输入特征图 x in x_{\text{in}} xin 一致。

  • x in x_{\text{in}} xin:这是原始输入特征图,它的通道数是 c in c_{\text{in}} cin

  • x 3 x_3 x3:这是最终的输出特征图。它是通过将逐点卷积操作的输出与原始输入特征图 x in x_{\text{in}} xin 相加得到的。
    x out = P ⋅ Conv cin → cout ( x 3 ) x_{\text{out}} = P \cdot \text{Conv}_{\text{cin} \rightarrow \text{cout}}(x_3) xout=PConvcincout(x3)
    将特征图 x 3 x_3 x3的通道数从 c i n c_in cin转换为 c o u t c_{out} cout c o u t c_{out} cout为希望得到的特征图的通道数。

举例说明

假设我们有一个输入特征图 x 1 x_1 x1,其大小为 3 × 3 3 \times 3 3×3,并且它只有一个通道。我们将从简单的 2 × 2 2 \times 2 2×2 窗口开始计算均值和最大值。这个例子将帮助我们理解计算过程及其用途。

1. 输入特征图 x 1 x_1 x1

假设特征图 x 1 x_1 x1 为:

x 1 = [ 1 2 3 4 5 6 7 8 9 ] x_1 = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{bmatrix} x1= 147258369

2. 计算 2 × 2 2 \times 2 2×2 邻域的均值和最大值

首先,我们将计算每个 2 × 2 2 \times 2 2×2 邻域的均值和最大值。

均值计算:

左上角 2 × 2 2 \times 2 2×2 窗口:
[ 1 2 4 5 ] \begin{bmatrix} 1 & 2 \\ 4 & 5 \\ \end{bmatrix} [1425]

mean 2 × 2 = 1 + 2 + 4 + 5 4 = 3 \text{mean}_{2 \times 2} = \frac{1+2+4+5}{4} = 3 mean2×2=41+2+4+5=3

右上角 2 × 2 2 \times 2 2×2 窗口:
[ 2 3 5 6 ] \begin{bmatrix} 2 & 3 \\ 5 & 6 \\ \end{bmatrix} [2536]

mean 2 × 2 = 2 + 3 + 5 + 6 4 = 4 \text{mean}_{2 \times 2} = \frac{2+3+5+6}{4} = 4 mean2×2=42+3+5+6=4

左下角 2 × 2 2 \times 2 2×2 窗口:
[ 4 5 7 8 ] \begin{bmatrix} 4 & 5 \\ 7 & 8 \\ \end{bmatrix} [4758]

mean 2 × 2 = 4 + 5 + 7 + 8 4 = 6 \text{mean}_{2 \times 2} = \frac{4+5+7+8}{4} = 6 mean2×2=44+5+7+8=6

右下角 2 × 2 2 \times 2 2×2 窗口:
[ 5 6 8 9 ] \begin{bmatrix} 5 & 6 \\ 8 & 9 \\ \end{bmatrix} [5869]

mean 2 × 2 = 5 + 6 + 8 + 9 4 = 7 \text{mean}_{2 \times 2} = \frac{5+6+8+9}{4} = 7 mean2×2=45+6+8+9=7

最大值计算:

左上角 2 × 2 2 \times 2 2×2 窗口:
[ 1 2 4 5 ] \begin{bmatrix} 1 & 2 \\ 4 & 5 \\ \end{bmatrix} [1425]

max 2 × 2 = max ⁡ ( 1 , 2 , 4 , 5 ) = 5 \text{max}_{2 \times 2} = \max(1, 2, 4, 5) = 5 max2×2=max(1,2,4,5)=5

右上角 2 × 2 2 \times 2 2×2 窗口:
[ 2 3 5 6 ] \begin{bmatrix} 2 & 3 \\ 5 & 6 \\ \end{bmatrix} [2536]

max 2 × 2 = max ⁡ ( 2 , 3 , 5 , 6 ) = 6 \text{max}_{2 \times 2} = \max(2, 3, 5, 6) = 6 max2×2=max(2,3,5,6)=6

左下角 2 × 2 2 \times 2 2×2 窗口:
[ 4 5 7 8 ] \begin{bmatrix} 4 & 5 \\ 7 & 8 \\ \end{bmatrix} [4758]

max 2 × 2 = max ⁡ ( 4 , 5 , 7 , 8 ) = 8 \text{max}_{2 \times 2} = \max(4, 5, 7, 8) = 8 max2×2=max(4,5,7,8)=8

右下角 2 × 2 2 \times 2 2×2 窗口:
[ 5 6 8 9 ] \begin{bmatrix} 5 & 6 \\ 8 & 9 \\ \end{bmatrix} [5869]

max 2 × 2 = max ⁡ ( 5 , 6 , 8 , 9 ) = 9 \text{max}_{2 \times 2} = \max(5, 6, 8, 9) = 9 max2×2=max(5,6,8,9)=9

3. 生成均值和最大值特征图

均值特征图:

mean map = [ 3 4 6 7 ] \text{mean map} = \begin{bmatrix} 3 & 4 \\ 6 & 7 \\ \end{bmatrix} mean map=[3647]

最大值特征图:

max map = [ 5 6 8 9 ] \text{max map} = \begin{bmatrix} 5 & 6 \\ 8 & 9 \\ \end{bmatrix} max map=[5869]

4. 拼接结果

将原始特征图 x 1 x_1 x1、均值特征图和最大值特征图在通道维度上进行拼接。假设每个特征图表示一个新的通道,则拼接后的特征图 x 2 x_2 x2 将有三个通道:

x 2 = [ 1 2 3 4 5 6 7 8 9 ] ⊕ [ 3 4 6 7 ] ⊕ [ 5 6 8 9 ] x_2 = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{bmatrix} \oplus \begin{bmatrix} 3 & 4 \\ 6 & 7 \\ \end{bmatrix} \oplus \begin{bmatrix} 5 & 6 \\ 8 & 9 \\ \end{bmatrix} x2= 147258369 [3647][5869]

如何拼接:填充0
[ 3 4 6 7 ] [ 3 4 0 6 7 0 0 0 0 ] \begin{bmatrix} 3 & 4 \\ 6 & 7 \\ \end{bmatrix} \begin{bmatrix} 3 & 4&0 \\ 6 & 7 &0\\ 0&0&0&\\ \end{bmatrix} [3647] 360470000
[ 5 6 8 9 ] [ 5 6 0 8 9 0 0 0 0 ] \begin{bmatrix} 5 & 6 \\ 8 & 9 \\ \end{bmatrix} \begin{bmatrix} 5 & 6&0 \\ 8 & 9 &0\\ 0&0&0&\\ \end{bmatrix} [5869] 580690000
拼接结果
[ 1 2 3 3 4 0 5 6 0 4 5 6 6 7 0 8 9 0 7 8 90 0 0 0 0 0 0 ] \begin{bmatrix} 1 & 2 & 3 &3&4&0&5&6&0\\ 4 & 5 & 6&6 & 7 &0&8 & 9 &0 \\ 7 & 8 & 9 0&0&0&0&0&0&0\\ \end{bmatrix} 1472583690360470000580690000

这里的 ⊕ \oplus 表示在通道维度上拼接。

这种操作使得每个像素都可以“感知”更大范围内的信息,而不仅仅依赖于卷积核的局部感受野。

3.3 改进的跳跃连接和 MLFC 块

问题所在:

在传统的 UNet 中,跳跃连接直接将编码器层的特征传递给解码器层,这可能导致高层次的语义信息无法与低层次的特征充分融合,造成“语义差距”。

MLFC 块的引入:

为了解决这一问题,ACC-UNet 使用了 多级特征编译(Multi Level Feature Compilation, MLFC)块 来改进跳跃连接。MLFC 块将来自不同编码器层次的特征图进行重新调整大小(resize)和拼接,结合多个层次的特征信息,从而减少语义差距。

如何融合特征?

首先,所有编码器层的特征图被调整为相同尺寸,并在通道维度上拼接,然后通过逐点卷积操作减少通道数并融合特征。最终融合后的特征再与对应的解码器层特征图相结合,进一步通过卷积操作增强。

公式表示:

x comb , i = PConv c tot → c i ( resize i ( x 1 )   ∣ ∣   resize i ( x 2 )   ∣ ∣   resize i ( x 3 )   ∣ ∣   resize i ( x 4 ) ) x_{\text{comb},i} = \text{PConv}_{c_{\text{tot}} \rightarrow c_i} \left( \text{resize}_i(x_1) \,||\, \text{resize}_i(x_2) \,||\, \text{resize}_i(x_3) \,||\, \text{resize}_i(x_4) \right) xcomb,i=PConvctotci(resizei(x1)∣∣resizei(x2)∣∣resizei(x3)∣∣resizei(x4))
x i = PConv 2 c i → c i ( x comb , i   ∣ ∣   x i ) x_i = \text{PConv}_{2c_i \rightarrow c_i} \left( x_{\text{comb},i} \,||\, x_i \right) xi=PConv2cici(xcomb,i∣∣xi)

举例说明

假设我们有 4 个不同层次的编码器特征图 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,它们的尺寸分别是:

x 1 : 64 × 64 × 32 x_1: 64 \times 64 \times 32 x1:64×64×32 (低层次特征图,分辨率最高,通道数最少)

x 2 : 32 × 32 × 64 x_2: 32 \times 32 \times 64 x2:32×32×64

x 3 : 16 × 16 × 128 x_3: 16 \times 16 \times 128 x3:16×16×128

x 4 : 8 × 8 × 256 x_4: 8 \times 8 \times 256 x4:8×8×256 (高层次特征图,分辨率最低,通道数最多)

1. 调整大小和拼接特征图

为了将这些不同大小的特征图结合起来,我们首先需要调整它们的大小使其相同。例如,我们可以将所有特征图调整到 8 × 8 8 \times 8 8×8 的大小(与 x 4 x_4 x4 相同的大小)。

调整大小操作:

resize 4 ( x 1 ) : x 1 → 8 × 8 × 32 \text{resize}_4(x_1): x_1 \rightarrow 8 \times 8 \times 32 resize4(x1):x18×8×32

resize 4 ( x 2 ) : x 2 → 8 × 8 × 64 \text{resize}_4(x_2): x_2 \rightarrow 8 \times 8 \times 64 resize4(x2):x28×8×64

resize 4 ( x 3 ) : x 3 → 8 × 8 × 128 \text{resize}_4(x_3): x_3 \rightarrow 8 \times 8 \times 128 resize4(x3):x38×8×128

x 4 x_4 x4 本身已经是 8 × 8 × 256 8 \times 8 \times 256 8×8×256,不需要调整大小。

拼接操作:将这些调整大小后的特征图在通道维度上进行拼接:

concat ( resize 4 ( x 1 ) , resize 4 ( x 2 ) , resize 4 ( x 3 ) , x 4 ) \text{concat}(\text{resize}_4(x_1), \text{resize}_4(x_2), \text{resize}_4(x_3), x_4) concat(resize4(x1),resize4(x2),resize4(x3),x4)

拼接后的特征图大小为:

8 × 8 × ( 32 + 64 + 128 + 256 ) = 8 × 8 × 480 8 \times 8 \times (32 + 64 + 128 + 256) = 8 \times 8 \times 480 8×8×(32+64+128+256)=8×8×480

2. 逐点卷积总结特征表示

我们使用逐点卷积将拼接后的特征图通道数从 480 减少到与当前层(例如 x 4 x_4 x4 的层次)的通道数一致:

逐点卷积操作:

x comb , 4 = PConv 480 → 256 ( concat ) x_{\text{comb},4} = \text{PConv}_{480 \rightarrow 256}(\text{concat}) xcomb,4=PConv480256(concat)

结果是一个大小为 8 × 8 × 256 8 \times 8 \times 256 8×8×256 的特征图。

3. 融合和特征增强

将得到的组合特征图 x comb , 4 x_{\text{comb},4} xcomb,4 与原始的 x 4 x_4 x4 特征图拼接在一起:

concat ( x comb , 4 , x 4 ) \text{concat}(x_{\text{comb},4}, x_4) concat(xcomb,4,x4)

结果大小为:

8 × 8 × ( 256 + 256 ) = 8 × 8 × 512 8 \times 8 \times (256 + 256) = 8 \times 8 \times 512 8×8×(256+256)=8×8×512

逐点卷积减少通道数:使用另一个逐点卷积将拼接后的特征图的通道数从 512 减少回 256:

x 4 = PConv 512 → 256 ( concat ( x comb , 4 , x 4 ) ) x_4 = \text{PConv}_{512 \rightarrow 256}(\text{concat}(x_{\text{comb},4}, x_4)) x4=PConv512256(concat(xcomb,4,x4))

最终结果

通过这些步骤,我们得到了一个增强的特征图 x 4 x_4 x4,它不仅包含了当前层的特征,还结合了其他层次的信息。这种多级信息融合使得特征图具有更强的表示能力,能够更好地捕捉图像的全局和局部信息,从而提升图像分割或其他任务的效果。

4. 性能和评估

ACC-UNet 在五个不同的医学图像分割基准测试中进行了评估,结果显示其性能优于传统卷积网络、Transformer 和混合模型。
在 Dice 系数这一重要指标上,ACC-UNet 相较于 Swin-Unet 和 UCTransNet,分别提高了 2.64±2.54% 和 0.45±1.61%,且参数量仅为它们的 59.26% 和 24.24%。

5. 总结

ACC-UNet 结合了卷积神经网络的归纳偏置和 Transformer 的设计思路,通过 HANC 和 MLFC 块的创新设计,实现了高效的语义分割任务。该模型不仅表现出色,还保持了较低的计算成本,是 2020 年代语义分割领域的一次有力创新。

UNet模型通常用于图像分割任务,这里介绍一下如何对UNet模型的训练结果进行可视化。 首先,我们可以使用Keras内置的History类记录模型的训练过程,包括每个epoch的训练损失、验证损失和准确率等。我们可以通过以下代码来获取这些信息: ```python history = model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=50, batch_size=16) train_loss = history.history['loss'] val_loss = history.history['val_loss'] train_acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] ``` 其中,`train_loss`为训练集损失,`val_loss`为验证集损失,`train_acc`为训练集准确率,`val_acc`为验证集准确率。我们可以使用Matplotlib库将这些信息可视化成图表。 首先是损失曲线的绘制: ```python import matplotlib.pyplot as plt epochs = range(len(train_loss)) plt.plot(epochs, train_loss, 'b', label='Training loss') plt.plot(epochs, val_loss, 'r', label='Validation loss') plt.title('Training and validation loss') plt.legend() plt.show() ``` 这段代码将训练集和验证集的损失曲线绘制在同一张图中,可以直观地观察模型的训练效果。 接下来是准确率曲线的绘制: ```python plt.plot(epochs, train_acc, 'b', label='Training accuracy') plt.plot(epochs, val_acc, 'r', label='Validation accuracy') plt.title('Training and validation accuracy') plt.legend() plt.show() ``` 这段代码将训练集和验证集的准确率曲线绘制在同一张图中,同样可以直观地观察模型的训练效果。 需要注意的是,这些可视化结果只能作为参考,具体的模型表现还需要结合实际应用场景进行评估。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值