Unet演化系列大整理

Unet演化系列大整理:

  • Unet是学习语义分割不可缺少的一个网络。它的对称美和简洁一直能够震撼人心。

主要摘要和前人工作:

  • 作者发现,要进行分割任务需要很多的标注好的图片,然而标注图片是一个费时费力的过程。他提出了一个strong use of data augmentation方法能够更好的利用现有的数据。这个网络更主要是用在医疗图像分割方面。
  • 作者说道了一个sliding-window模型。这个模型通过形成patch(其实就是通过不同大小的卷积核吧,当做滑动窗口)来对每一类像素进行预测。然而,这个方法会使得计算速度非常慢,而且由于不同的patch有重叠,就会出现很多冗余的计算。在定位精度和内容理解方面,大patch和小patch有冲突。大的patch需要经常使用maxpool,使得定位的精度降低。然而小的patch看到的内容比较少,虽然定位精度比较高。现在多尺度的卷积层能够进行融合,就像FCN一样。所以,网络层应该是有可能兼顾定位精度和内容理解的。
  • Unet是从FCN更改而来的。主要是通过正常的类似于VGG的收缩网络,让每个层的feature map变小,之后再不断通过上采样代替pooling操作(论文里面是这么说)Unet内容并不是很多,主要是要注意网络结构的改进以及接下来的创新点。

网络结构详解:

  • 最小的feature map大小是32 x 32.蓝色的表示不同通道数的feature map,通道数在上面,feature map大小在左侧标注出来。之后各种箭头代表不同的处理方法。这个网络并没有经过padding,feature map的大小是通过严格计算的。
  • 压feature map的被作者叫做encode,还原图像的上采样过程叫做decode过程。这个网络并没有全连接层,只有卷积层。在encode部分,作者遵循了之前卷积网络的结构,就是不断用两个3 x 3卷积核进行卷积,之后用ReLU和2 x 2的pooling层(stride = 2)来降低feature map的大小。每一次downsample都会让响应feature map的channel数增大一些。
  • 在decode部分,作者用2 x 2的反卷积之后马上降低feature map一半的channel数目。为了和之前encode的feature map拼接起来。拼接之后用1 x 1的卷积核对通道数进行处理就可以了。网络一共有23个卷积层。

网络训练:

  • 用了大图片,小batch进行训练。这样能够减少显存使用。
  • 损失函数主要用的是交叉熵损失,用的是softmax,pk(x)=exp⁡(ak(x))/(∑k′=1Kexp⁡(ak′(x)))p_{k}(\mathbf{x})=\exp \left(a_{k}(\mathbf{x})\right) /\left(\sum_{k^{\prime}=1}^{K} \exp \left(a_{k^{\prime}}(\mathbf{x})\right)\right)pk(x)=exp(ak(x))/(k=1Kexp(ak(x)))
  • 在进行损失函数的计算的时候,他们的公式是这样的。前景是细胞的区域,背景是边界的像素。一堆都是细胞的区域
  • E=∑x∈Ωw(x)log⁡(pℓ(x)(x))E=\sum_{\mathbf{x} \in \Omega} w(\mathbf{x}) \log \left(p_{\ell(\mathbf{x})}(\mathbf{x})\right)E=xΩw(x)log(p(x)(x)) 其中w(x)=wc(x)+w0⋅exp⁡(−(d1(x)+d2(x))22σ2)w(\mathbf{x})=w_{c}(\mathbf{x})+w_{0} \cdot \exp \left(-\frac{\left(d_{1}(\mathbf{x})+d_{2}(\mathbf{x})\right)^{2}}{2 \sigma^{2}}\right)w(x)=wc(x)+w0exp(2σ2(d1(x)+d2(x</
### 关于UNet实现及应用 #### UNet简介 UNet是一种常用于医学图像分割的卷积神经网络架构。其设计特点是具有编码器-解码器结构以及跳过连接,这使得模型能够有效地捕捉空间信息并恢复高分辨率细节[^1]。 #### 创建Python虚拟环境 为了确保开发环境中软件包的一致性和隔离性,在开始编写代码之前建议创建一个新的Conda虚拟环境: ```bash conda create -n unetpp python=3.8.5 conda activate unetpp ``` 此操作会建立名为`unetpp`的新环境,并设置Python版本为3.8.5[^2]。 #### 安装依赖库 激活上述创建好的环境之后,可以继续安装必要的机器学习框架和其他工具包,比如PyTorch、TensorFlow或者其他支持构建和训练深度学习模型所需的库。具体命令取决于所选平台和个人需求。 #### 编写UNet模型定义 以下是基于PyTorch的一个简单版UNet类定义的例子: ```python import torch.nn as nn import torch class DoubleConv(nn.Module): """(convolution => [BN] => ReLU) * 2""" def __init__(self, in_channels, out_channels): super().__init__() self.double_conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) class UNet(nn.Module): def __init__(self, n_channels, n_classes): super(UNet, self).__init__() bilinear = True factor = 2 if bilinear else 1 self.inc = DoubleConv(n_channels, 64) self.down1 = Down(64, 128) self.down2 = Down(128, 256) self.down3 = Down(256, 512 // factor) self.up1 = Up(512, 256 // factor, bilinear) self.up2 = Up(256, 128 // factor, bilinear) self.up3 = Up(128, 64, bilinear) self.outc = OutConv(64, n_classes) def forward(self, x): x1 = self.inc(x) x2 = self.down1(x1) x3 = self.down2(x2) x4 = self.down3(x3) x = self.up1(x4, x3) x = self.up2(x, x2) x = self.up3(x, x1) logits = self.outc(x) return logits ``` 这段代码实现了基本的UNet架构,其中包含了下采样路径(通过`Down`模块)、上采样路径(通过`Up`模块)以及跳跃连接机制来融合不同层次特征图的信息。 #### 训练过程概述 对于具体的训练流程而言,通常涉及以下几个方面的工作: - 设定损失函数与优化算法; - 调整超参数直至获得满意的结果; 由于这里讨论的是理论层面的内容而非实际执行指南,因此不会深入探讨这些话题的具体实施方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值