CV04-UNet笔记

news/2024/7/5 4:24:24

目录

一、UNet模型

二、Encoder & Decoder

2.1 Encoder

2.2 Decoder

2.3 classifier


学习U-Net: Convolutional Networks for Biomedical Image Segmentation,记录一些自己认为重要的要点,以免日后遗忘。

代码:https://github.com/Ascetics/LaneSegmentation/blob/master/nets/unet.py

参考pytorch官方实现和文档做出自己的实现https://github.com/Ascetics/LaneSegmentation/blob/master/nets/unet.py

一、UNet模型

医学图像分类处理往往细化到像素级别。不仅仅是医学领域,语义分割都是像素级别的分类。于是U-Net诞生了,论文题目《U-Net:用于生物医学图像分割的卷积网络》,但是U-Net不仅仅是用于医学图像处理。

FCN的思想是特征提取阶段进行卷积、池化,图像分辨率减小,特征提取后面接上几层上采样(转置卷积)来提高分辨率。为提高分割精确度,将特征提取阶段的输出和上采样阶段输出做特征融合,这样网络就能学习到更精确的输出。

U-Net在FCN的基础上改造,需要的训练集更小,分割精确度更高。改造的部分是:上采样中仍保持特征的channel很大,特征融合直接使用特征提取阶段的输出,特征提取的输出直接concatenate到上采样输出的后面,保证更多的信息传递到分类阶段。于是形成了如论文图片中这样的U型结构。

U-Net左边是encoder阶段,由5个相似结构encode block构成。第一个encode block,2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数;第二个到第五个encode block,先maxpool下采样,分辨率减小一倍通道增大一倍,再接2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数。这5个encode block,除了最后一个之外,输出都要保留,再decoder里作为shortcut使用。

U-Net右边是decoder阶段,由相似结构decode block构成。每个结构里面先是转置卷积上采样2倍(kernel_size=2, stride=2),然后在后面拼接经过剪裁的对应encode block的输出(shortcut),然后是2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数。每个decode block结构将通道减少一倍。

最后一个1×1卷积,将channel调整到n_class分类。

注意:图中对encoder阶段的剪裁是必要的,由于不加padding的卷积操作、池化等造成了边界像素的损失,必须经过剪裁才能让两个张量spatial大小一致,才能拼接。

二、Encoder & Decoder

Encoder & Decoder 实际上就是下采样、上采样的一种方式。U-Net提出的Encoder & Decoder并不是一定之规,encoder和decoder都可以根据需要用其他模型作为backbone进行替换,比如可以用ResNet作为backbone。记录一下Encoder & Decoder的细节,以及扩展应用方式。

2.1 Encoder

U-Net论文里面encoder的卷积操作不加padding,实际工程中可以改成加padding变成same卷积。

U-Net使用预训练的模型。U-Net更像一个框架,而不是一个模型。论文里面下采样每个结构都是两个卷积,也可以把这个结构替换成ResNet、ResNeXt、MobileNet等已经训练好的模型。Encoder中encode block的数量也不一定是5个,可以根据自己的需要加深。

以ResNet为例。

  • 第1个encode block和input一致,所以直接用输入作为输出,pytorch中用空的nn.Sequencial作为encode block。输出shortcut0。
  • 第2个encode block下采样2倍,所以用ResNet的Conv1、BN、ReLU作为encode block。输出shortcut1。
  • 第3个encode block下采样2倍,所以用ResNet的maxpool、layer1(论文Conv2_x不做下采样)作为encode block。输出shortcut2。
  • 第4个encode block下采样2倍,所以用ResNet的layer2(论文Conv3_x)作为encode block。输出shortcut3。
  • 第5个encode block下采样2倍,所以用ResNet的layer3(论文Conv4_x)作为encode block。输出shortcut4。
  • 第6个encode block下采样2倍,所以用ResNet的layer4(论文Conv5_x)作为encode block。输出不作为shortcut。

2.2 Decoder

U-Net的decoder是和encoder对称的逐层上采样,每个上采样后面跟了相似的结构,都是2个3×3卷积作为decode block,这就增加了decode的深度。

U-Net的上采样可以使用Transposed Convolution转置卷积,也可以使用Bilinear Interpolation双线性差值。对于不同的数据集可能要采取不同的上采样策略。

U-Net的特征融合,使用的是拼接concatenate,这与FCN的直接相加是不同的。

以ResNet为例。

  • 第1个decode block。用第6个encode block输出上采样2倍,和shortcut4做cat,然后2个3x3卷积。最终输出的channels应该是第6个encode block输出channels的一半。
  • 第2个decode block。用第1个decode block输出上采样2倍,和shortcut3做cat,然后2个3x3卷积。最终输出的channels应该是第1个decode block输出channels的一半。
  • 第3个decode block。用第2个decode block输出上采样2倍,和shortcut2做cat,然后2个3x3卷积。最终输出的channels应该是第2个decode block输出channels的一半。
  • 第4个decode block。用第3个decode block输出上采样2倍,和shortcut1做cat,然后2个3x3卷积。最终输出的channels应该是第3个decode block输出channels的一半。
  • 第5个decode block。用第4个decode block输出上采样2倍,和shortcut0做cat,然后2个3x3卷积。最终输出的channels应该是第4个decode block输出channels的一半。

2.3 classifier

最后一个decode block还需要经过1个1x1卷积,将输出channels调整到n_class个分类。

 


http://lihuaxi.xjx100.cn/news/236023.html

相关文章

Git安装配置(Linux)

使用yum安装Git   yum install git -y 编译安装 # 安装依赖关系 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel # 编译安装 tar -zxf git-2.0.0.tar.gz cd git-2.0.0 make configure ./configure --prefix/usr make make install 配置Git…

[Python_7] Python Socket 编程

0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"""TCP 协议的 Socket 编程,Server 端Server 端绑定到指定地址,监听特定的端口,接受发来的连接请求 "&q…

CV05-ResNet笔记

目录 一、为什么是ResNet 二、Residual Learning细节 2.1 shortcut计算 2.2 11卷积调整channel维度大小 2.3 ResNet层数 2.4 ResNet里的Basic Block 和 Bottleneck Block 2.5 Global Average Pooling 全局平均池化 2.6 Batch Normalization 学习ResNet,记录…

一点感悟和自勉

来学习linux,其实目的很简单,也很现实,就是为了学成之后找一份好的工作,能够养家糊口。 接触了几天,感觉挺难的,可能是因为我没有基础的原因吧,以前电脑只是用来打游戏和看电影,第一…

复杂度归纳--小结

一、复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度&#xff…

CV06-Xception笔记

目录 一、为啥是Xception 二、Xception结构 2.1 Xception结构基本描述 2.2 实现细节 2.3 DeepLabV3改进 三、记录pytorch采坑relu激活函数inplaceTrue Xception笔记,记录一些自己认为重要的要点,以免日后遗忘。 复现Xception论文、DeepLabV改进的…

聊聊flink的HistoryServer

为什么80%的码农都做不了架构师?>>> 序 本文主要研究一下flink的HistoryServer HistoryServer flink-1.7.2/flink-runtime-web/src/main/java/org/apache/flink/runtime/webmonitor/history/HistoryServer.java public class HistoryServer {private st…

WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口

原文:WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/powertoolsteam/article/details/6109036 目录 WPF的消息机制(一)-让…