【图像分割】理论篇(2)经典图像分割网络基于vgg16的Unet

UNet 是一种用于图像分割任务的深度学习架构,最早由 Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 在2015年的论文 "U-Net: Convolutional Networks for Biomedical Image Segmentation" 中提出。UNet 在医学图像分割等领域取得了显著的成功,但也可以用于其他图像分割任务。

UNet 的核心思想是将编码器和解码器结合在一起,形成一个 U 字形的网络结构。编码器部分用于逐渐减少空间分辨率和提取高级特征,而解码器部分则逐渐恢复分辨率并生成与输入图像相同大小的分割结果。UNet 的设计使得它能够在较小的数据集上有效地训练,并且在医学图像等领域中表现优异。

一、整体网络构架 

二、网络实现细节

 

三、代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.models import vgg16


class unetUp(nn.Module):
    def __init__(self, in_size, out_size):
        super(unetUp, self).__init__()
        self.conv1 = nn.Conv2d(in_size, out_size, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(out_size, out_size, kernel_size=3, padding=1)
        self.up = nn.UpsamplingBilinear2d(scale_factor=2)

    def forward(self, inputs1, inputs2):
        outputs = torch.cat([inputs1, self.up(inputs2)], 1)
        outputs = self.conv1(outputs)
        outputs = self.conv2(outputs)
        return outputs


class Unet(nn.Module):
    def __init__(self, num_classes=2, in_channels=3, pretrained=False):
        super(Unet, self).__init__()
        self.vgg = vgg16(pretrained=pretrained)
        # self.vgg=self.vgg.features

        in_filters = [192, 384, 768, 1024]
        out_filters = [64, 128, 256, 512]
        # upsampling
        self.up_concat4 = unetUp(in_filters[3], out_filters[3])
        self.up_concat3 = unetUp(in_filters[2], out_filters[2])
        self.up_concat2 = unetUp(in_filters[1], out_filters[1])
        self.up_concat1 = unetUp(in_filters[0], out_filters[0])

        # final conv (without any concat)
        self.final = nn.Conv2d(out_filters[0], num_classes, 1)

    def forward(self, inputs):
        feat1 = self.vgg.features[:4](inputs)
        feat2 = self.vgg.features[4:9](feat1)
        feat3 = self.vgg.features[9:16](feat2)
        feat4 = self.vgg.features[16:23](feat3)
        feat5 = self.vgg.features[23:-1](feat4)

        up4 = self.up_concat4(feat4, feat5)
        up3 = self.up_concat3(feat3, up4)
        up2 = self.up_concat2(feat2, up3)
        up1 = self.up_concat1(feat1, up2)

        final = self.final(up1)

        return final

    def _initialize_weights(self, *stages):
        for modules in stages:
            for module in modules.modules():
                if isinstance(module, nn.Conv2d):
                    nn.init.kaiming_normal_(module.weight)
                    if module.bias is not None:
                        module.bias.data.zero_()
                elif isinstance(module, nn.BatchNorm2d):
                    module.weight.data.fill_(1)
                    module.bias.data.zero_()

if __name__=="__main__":
    model=Unet()
    # model=model.cuda()
    image=torch.randn((1,3,512,512))
    # image=image.cuda()
    print(model(image))
    output=model(image)

    print(output.size())
    print(model)

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
VGG16是一种经典的深度卷积神经网络,用于图像分类任务。然而,在应用于CT图像分割任务时,VGG16可能存在一些缺点,需要进行改进。 首先,CT图像的分辨率较高,通常包含了大量的细节信息。然而,VGG16的卷积层较浅,可能无法捕捉到这些细节信息。因此,我们可以通过增加卷积层的深度,增加网络对细节信息的提取能力。例如,可以参考ResNet等更深的网络结构进行改进。 其次,VGG16的卷积核大小固定为3x3,而CT图像中的结构大小可能会有很大差异。为了更好地适应不同大小的结构,可以引入多尺度处理机制。例如,可以在网络中添加多个并行的分支,每个分支采用不同大小的卷积核进行特征提取,然后将这些特征融合起来进行下一步的分割任务。 另外,VGG16的全连接层会引入大量的参数,导致模型容易过拟合。为了避免过拟合,可以使用正则化方法,如Dropout或L2正则化。 此外,由于CT图像中的结构具有较大的形变和多样性,仅仅使用VGG16的浅层特征可能不足以准确分割出结构。因此,我们可以将VGG16也视为一个特征提取器,然后将这些特征输入到更高级的模型中,例如FCN、UNet等进行深层次的特征提取和分割。 总之,VGG16在进行CT图像分割任务时可以通过增加深度、多尺度处理、正则化等方式进行改进,以提高模型的性能和准确度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMasterPlus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值