论文
1 Abstract
文章提出,UNet主要有以下两大缺陷:
① 网络最优的深度未知,需要通过大量的实验以及集成不同深度的网络,效率低;
② skip connection引入了不必要的限制,即限制仅在相同的尺度进行特征融合。
对此,UNet++进行了以下的优化:
① 利用不同深度UNet的有效集成(这些UNet共享一个编码器),通过监督学习来搜索最优深度;
② 重新设计skip connection,使得解码器的子网络可以聚合不同尺度的特征,更加灵活;
③ 利用剪纸技术来提高UNet++的推理速度。

2 Introduction
传统的编码器解码器结构 + skip connection结构可以很好的应用于语义分割任务,原因是:其将编码器子网中的浅层细粒度信息与解码器子网中的深层粗粒度信息进行相结合。
文章的五个贡献:
① UNet++内嵌了不同深度的UNet,从而不再是固定的深度结构;
② 更加灵活的skip connection结构,不再是仅融合同一尺度的特征;
③ 设计了一个剪枝操作加快推理速度;
④ 同时训练内嵌的不同深度的UNet引发了UNet之间的协同训练,带来了更好的性能;
⑤ 展现了可扩展性。
3 Backbone
3.1 Motivation
实验发现,更深的UNet不一定更好,因此进行了多组的消融实验。

在UNete中,需要同时对X01,X02,X03和X04赋予损失函数,从而让内嵌的UNet可以回传梯度。在UNet+到UNet++的过程中,从短连接到长连接,更加有效地利用了多种特征。
3.2 Structure

3.3 Deep supervision

3.4 Model pruning

- 集成模式,其中收集所有分割分支的分割结果,然后取其平均值;
- 剪枝模式,分割分支,其选择决定了模型修剪的程度和速度增益,例如上图。
以下参考:研习U-Net - 知乎 (zhihu.com)



代码

# 基本的块网络,用于堆叠形成每一个卷积块
class VGGBlock(nn.Module):
def __init__(self, in_channels, middle_channels, out_channels):
super().__init__()
self.relu = nn.ReLU(inplace=True)
self.conv1 = nn.Conv2d(in_channels, middle_channels, 3, padding=1)
self.bn1 = nn.BatchNorm2d(middle_channels)
self.conv2 = nn.Conv2d(middle_channels, out_channels, 3, padding=1)
self.bn2 = nn.BatchNorm2d(out_channels)
def forward(self, x):
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
return out
# UNet++骨干网络
class NestedUNet(nn

UNet++针对原始UNet的深度未知和skipconnection限制进行了改进。通过集成不同深度的UNet并使用监督学习确定最佳深度,以及设计新的skipconnection实现多尺度特征融合,提高了模型性能。此外,通过剪枝技术加速了推理过程。此网络结构促进了内部UNet间的协同训练,并展示了良好的可扩展性。
&spm=1001.2101.3001.5002&articleId=123311170&d=1&t=3&u=ac760527d9f943d0bc10ccb8e868458f)
161

被折叠的 条评论
为什么被折叠?



