U-Net++(或称为嵌套 U-Net)是一种深度学习架构,于2019年在《UNet++: A Nested U-Net Architecture for Medical Image Segmentation》论文中被提出。在 U-Net中,编码器部分通过一系列卷积层和池化层从输入图像中捕获高级特征,而解码器部分则对这些特征进行上采样以生成密集的分割图。然而,编码器和解码器特征之间可能存在语义鸿沟,这意味着解码器在重建细粒度细节和生成准确分割时可能会面临挑战。
UNet++ 引入了嵌套跳跃路径的概念来弥合这一语义鸿沟。它在多个分辨率的编码器和解码器模块之间添加了额外的跳跃连接。这些连接允许解码器访问并整合来自编码器的低级和高级特征,从而提供对图像更详细、更全面的理解。该架构通过重新设计跳跃连接并引入深度监督的嵌套编码器-解码器网络,改进了传统的 U-Net 架构。在本文中,我们将深入探讨 U-Net++ 架构,并介绍如何使用 TensorFlow 库在 Python 中实现它。
U-Net++ 架构是一种基于 U-Net 的语义分割架构。它在传统 U-Net架构的基础上引入了两项主要创新:即嵌套密集跳跃连接和深度监督。在研究中,作者发现使用嵌套密集跳跃连接可以弥合编码器和解码器特征图之间的语义鸿沟,并改善梯度流动。他们还发现,使用深度监督通过在训练期间为网络提供正则化,从而增强模型性能。
上图展示了 U-Net++ 的架构设计。我们可以看到 U-Net++ 的嵌套编码器和解码器结构。值得注意的是,这里并没有使用传统的跳跃连接,而是将较低层的特征图与较高层的特征图进行卷积处理,然后将新的组合特征数据继续传递。UNet++ 背后的核心思想是在特征融合之前弥合编码器和解码器特征图之间的语义鸿沟。例如,(X0,0, X2,2) 之间的语义鸿沟是通过一个包含三个卷积层的密集卷积块来弥合的。
在图中,黑色虚线表示 U-Net 架构中原本存在的跳跃连接,而蓝色虚线表示新引入的嵌套跳跃连接。必须注意的是,在对较低层特征图进行卷积之前,会先对其进行上采样以匹配该层的通道数。图中还展示了如何对节点 X0,1、X0,2、X0,3 和 X0,4 的输出应用深度监督,以在训练期间改善模型的学习效果。深度监督是一种优化技术,你可以同时对模型的最终层和隐藏层(或节点)进行优化。这有助于模型更好地泛化问题。在 U-Net++ 架构中,他们通过基于每个这些节点的输出计算预期输出的组合损失,从而在 X0,1、X0,2、X0,3 和 X0,4 节点的输出上优化了模型。
!U-Net++ Detailed first skip pathways
上图详细分析了 UNet++ 的第一条跳跃路径。下图展示了如果模型在训练时使用了深度监督,在推理阶段是如何对 U-Net++ 模型进行剪枝的。U-Net++ L1、U-Net++ L2、U-Net++ L3 和 U-Net++ L4 的设计分别展示了深度为 1、2、3 和 4 的 U-Net++ 结构。这些模型用于通过比较其性能和推理时间相对于模型参数数量的关系,来识别模型的有效性。在他们的实验中发现,U-Net++ L3 在仅降低 0.6 个 IoU 点数的情况下,平均实现了 32.2% 的推理时间减少。
U-Net 与 U-Net++ 的对比:
U-Net++ 是针对 U-Net 架构提出的改进版本。其中一些改进如下所示:
- 嵌套跳跃连接: U-Net++ 架构使用嵌套的跳跃连接网络来聚合特征,这在传统的 U-Net 中是不存在的。