Advertisement

医学图像算法之基于Unet的胸部CT分割

阅读量:

第一步:准备数据

胸部CT分割数据比较少,但效果好,总共267张

91f80f4ff18445d6898d5df85c78be89.png

第二步:搭建模型

UNet在架构上做出了显著贡献,在采用U型结构后,该方法不仅能够实现使用较少训练样本的同时,在分割精度方面也不会逊色于现有技术。该网络架构遵循标准图示

f2a3879f9aad407cb4c92a01a229c481.png

(1)UNet采用了全卷积神经网络架构。
(2)左侧模块为特征提取模块:通过卷积层(conv)和池化层(pooling)构建。
(3)右侧模块作为特征融合模块:通过将上采样所得的特征图与左侧低分辨率的特征图进行合并操作实现信息整合。(值得注意的是,在图像分割任务中池化层会不可避免地带来图像分辨率的下降以及信息丢失;相比之下,在图像分类任务中其影响较小;因此设计上采样环节具有重要意义:通过上采样使低分辨率的高级抽象特征求精变为高分辨率表示,并在与左侧保留较高分辨率的第一层表征相结合以获取更加丰富的表征信息)
(4)随后经过两次连续的卷积操作生成最终的预测图;随后应用两个1×1尺寸的卷积核分别对第一类和第二类进行分类预测以获得对应的得分热图(heatmap)。第一张heatmap表示第一类目标的存在概率估计值;第二张则表示第二类目标存在的置信度评估结果;将这些热力图数据作为softmax函数输入并计算概率较高的类别输出值;最后通过定义损失函数并采用反向传播算法更新模型参数完成训练流程。

第三步:代码

1)损失函数为:交叉熵损失函数

2)网络代码:

复制代码
 class U_Net(nn.Module):

    
     def __init__(self,img_ch=3,output_ch=1):
    
     super(U_Net,self).__init__()
    
     
    
     self.Maxpool = nn.MaxPool2d(kernel_size=2,stride=2)
    
  
    
     self.Conv1 = conv_block(ch_in=img_ch,ch_out=64)
    
     self.Conv2 = conv_block(ch_in=64,ch_out=128)
    
     self.Conv3 = conv_block(ch_in=128,ch_out=256)
    
     self.Conv4 = conv_block(ch_in=256,ch_out=512)
    
     self.Conv5 = conv_block(ch_in=512,ch_out=1024)
    
  
    
     self.Up5 = up_conv(ch_in=1024,ch_out=512)
    
     self.Up_conv5 = conv_block(ch_in=1024, ch_out=512)
    
  
    
     self.Up4 = up_conv(ch_in=512,ch_out=256)
    
     self.Up_conv4 = conv_block(ch_in=512, ch_out=256)
    
     
    
     self.Up3 = up_conv(ch_in=256,ch_out=128)
    
     self.Up_conv3 = conv_block(ch_in=256, ch_out=128)
    
     
    
     self.Up2 = up_conv(ch_in=128,ch_out=64)
    
     self.Up_conv2 = conv_block(ch_in=128, ch_out=64)
    
  
    
     self.Conv_1x1 = nn.Conv2d(64,output_ch,kernel_size=1,stride=1,padding=0)
    
  
    
  
    
     def forward(self,x):
    
     # encoding path
    
     x1 = self.Conv1(x)
    
  
    
     x2 = self.Maxpool(x1)
    
     x2 = self.Conv2(x2)
    
     
    
     x3 = self.Maxpool(x2)
    
     x3 = self.Conv3(x3)
    
  
    
     x4 = self.Maxpool(x3)
    
     x4 = self.Conv4(x4)
    
  
    
     x5 = self.Maxpool(x4)
    
     x5 = self.Conv5(x5)
    
  
    
     # decoding + concat path
    
     d5 = self.Up5(x5)
    
     d5 = torch.cat((x4,d5),dim=1)
    
     
    
     d5 = self.Up_conv5(d5)
    
     
    
     d4 = self.Up4(d5)
    
     d4 = torch.cat((x3,d4),dim=1)
    
     d4 = self.Up_conv4(d4)
    
  
    
     d3 = self.Up3(d4)
    
     d3 = torch.cat((x2,d3),dim=1)
    
     d3 = self.Up_conv3(d3)
    
  
    
     d2 = self.Up2(d3)
    
     d2 = torch.cat((x1,d2),dim=1)
    
     d2 = self.Up_conv2(d2)
    
  
    
     d1 = self.Conv_1x1(d2)
    
  
    
     return d1

第四步:统计一些指标(训练过程中的loss和MIOU)

64a8cbe7695a40fdbeef3f7253f835da.png
28e78c1d95b943f1a0d7280ae9eb12fa.png

第五步:搭建GUI界面

b6397b7947bc405e89da558e96ff125c.png
9073734017bd44ea8aa57d97ee3c4dec.png

第六步:整个工程的内容

ba142f6ede524a3085978d1b74137e0d.png

源码下载

源码下载

源码下载

胸部CT分割

获取代码资源

整套项目源码内容包含

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

全部评论 (0)

还没有任何评论哟~