郭震 AI公众号:郭震AI

11 U-Net之结构解析

发布日期:

最近更新:

分类: 30个神经网络

预计阅读: 3 分钟

阅读次数: 0

系列进度

AI 30 个神经网络 · 第 11 / 62

预计阅读3 分钟
结构重点5 个
图文要点6 张
正文规模1.3k 字
UNet之结构解析结构图查看大图
UNet之结构解析结构图

U-Net 的价值在于一边压缩语义,一边把浅层细节接回解码器。做分割任务时,这条跳连通常决定边界是否干净。这篇重点看结构。先把数据流、关键模块和输出层画清楚,再回头看公式或代码。

UNet之结构解析实操核对图查看大图
UNet之结构解析实操核对图

我会检查输入图、标签 mask、输出尺寸和损失函数是否一一对应。分割任务最怕图和 mask 对不齐。

在上一篇文章中,我们对 VGG 的模型评估进行了深度剖析,了解了其在图像分类任务中的表现和优缺点。接下来,我们将聚焦于 U-Net 这一深度学习架构,解析其独特的结构和设计理念。U-Net 主要用于图像分割任务,特别是在医学图像分析中的应用表现尤为突出。

U-Net 结构概述

U-Net 是由 Olaf Ronneberger 等人在 2015 年提出的,旨在解决生物医学图像分割问题。其名称源于网络的形状——一个 "U" 形结构。U-Net 主要由以下两个部分构成:

UNet结构解析判断卡查看大图
UNet结构解析判断卡

理解 U-Net 结构时,先看下采样如何提取语义,上采样如何恢复分辨率,跳跃连接如何补回边界细节。

  1. 收缩路径(编码器)
  2. 扩展路径(解码器)

1. 收缩路径(Encoding Path)

收缩路径又称为编码器,由一系列的卷积层和 max pooling 层组成。每个卷积块通常包括两个卷积操作,后接一个 ReLU 激活函数和一个 max pooling 层。每一次的 max pooling 操作都会降低特征图的空间尺寸,同时增加特征的深度。这样不仅能提取更高层次的特征,还能使网络更加鲁棒。

  • 卷积层:利用 3×33 \times 3 的卷积核进行特征提取。
  • 池化层:使用 2×22 \times 2 的最大池化层降低特征图大小。

2. 扩展路径(Decoding Path)

扩展路径或解码器的作用是通过上采样逐步恢复空间分辨率。为了更好地实现这一点,U-Net 引入了 跳跃连接(skip connections),使得编码器的特征图能够与解码器相应层的特征图进行拼接。这种机制在一定程度上解决了在上采样过程中可能出现的特征信息丢失问题。

  • 上采样层:使用 conv_transpose 或者双线性插值进行上采样。
  • 拼接操作:通过连接编码器和解码器中相应层的特征图,确保高分辨率信息能够有效传递。

U-Net 结构实例

以下是一个简单的 U-Net 模型结构示例:

import tensorflow as tf
from tensorflow.keras import layers, Model

def unet_model(input_size=(256, 256, 1)):
    inputs = layers.Input(input_size)
    
    # Encoding path
    c1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    c1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c1)
    p1 = layers.MaxPooling2D((2, 2))(c1)

    c2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(p1)
    c2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(c2)
    p2 = layers.MaxPooling2D((2, 2))(c2)

    c3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(p2)
    c3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(c3)
    p3 = layers.MaxPooling2D((2, 2))(c3)

    # Bottleneck
    c4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(p3)
    c4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(c4)

    # Decoding path
    u5 = layers.Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(c4)
    u5 = layers.concatenate([u5, c3])
    c5 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(u5)
    c5 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(c5)

    u6 = layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)
    u6 = layers.concatenate([u6, c2])
    c6 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(u6)
    c6 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(c6)

    u7 = layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)
    u7 = layers.concatenate([u7, c1])
    c7 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(u7)
    c7 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c7)

    outputs = layers.Conv2D(1, (1, 1), activation='sigmoid')(c7)

    model = Model(inputs=inputs, outputs=outputs)
    return model

model = unet_model()
model.summary()
UNet之结构解析应用复盘卡查看大图
UNet之结构解析应用复盘卡

如果《UNet之结构解析》还没完全消化,可以从这张卡片的四个动作重新走一遍。

UNet之结构解析应用检查卡查看大图
UNet之结构解析应用检查卡

回看《UNet之结构解析》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

总结

对于 U-Net,通过结合编码路径的多层次特征和解码路径的逐步恢复,我们获得了在图像分割任务中特别有效的网络结构。U-Net 在医学影像分析中有着广泛的应用,因此可以说它是图像分割领域的基石之一。

神经网络阅读地图卡查看大图
神经网络阅读地图卡

《U-Net之结构解析》这类内容容易被细节带偏。先看图里的主线,再回到正文核对环境、输入、输出和判断标准。

在下一篇文章中,我们将深入探讨 U-Net 在实际案例中的应用分析,包括如何在具体数据集上进行训练和评估,敬请期待。

相关教程

相关入口

AI 教程总索引

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

相关内容

相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...