深度学习语义分割网络学习记录Unet、PSPNet、SegNet、DLinkNet

不断学习原理的菜狗冯,看了一些基础的网络,个人理解,仅供参考

下期会总结一些修改的网络,学习一下修改网络的思路,或者会学习一下最新的网络结构和相关的修改网络。

一、Unet(2015)

Unet 网络具有五层,网络中含有卷积层、池化层、反卷积层以及 ReLU 激活函数。编码时由4个block组成,每个block使用了两次3*3卷积和ReLU(激活函数之一)和1个Max Pooling(最大值池化)进行下采样,降低维度,减少计算量,通道数乘2。解码器阶段的跳跃连接不再使用相加,而是进行特征图拼接,然后再使用卷积将特征图的通道数减半。

二、PSPNet(2017)

总结:操作步骤及目的:CNN(提取全局特征图)、池化(得到不同尺寸的特征图)、卷积(降维,减少计算量)、上采样(保证与输入特征尺寸相同)、拼接(融合全局特征和细节特征)、卷积(输出尺寸)

 (a)使用带有扩展网络策略(空洞卷积)且预训练过的ResNet模型来提取特征图,空洞卷积的作用主要是增大感受野,最终特征图尺寸为输入图像的1/8(stride=8)。ResNet 的短路连接结构可以保证其网络不会随深度加深产生梯度爆炸现象,稳固了网络的学习性能。

(b)用1×1,2×2,3×3,6×6 的卷积核对特征图进行全局池化得到不同尺寸的特征图,然后结合 1×1 卷积进行降维。

上采样到与输入特征相同尺寸,然后和输入特征拼接,达到融合目标的细节特征(浅层特征)和全局特征(深层特征,也就是上下文信息)的目的,弥补传统卷积神经网络的感受野对于输入影像尺寸的限制,通过拼接四种不同金字塔尺度下的特征来减少网络对于输入影像的全局信息的损失。

三、SegNet(2017)

卷积层+批标准化(BN)+ReLU。卷积操作提取特征,批标准化(BN)解决网络过拟合问题,ReLU为激活函数,能提高网络的容错率以及对于非线性问题的处理能力。

池化。增大网络的感受野。

在编码器阶段不再使用步长为 2 的卷积进行下采样,而是使用带有位置编码的最大值池化进行下采样。在每一个最大池化过程中保留其池化索引,对图像尺寸进行压缩,映射到像素级别的预测,在卷积操作中,SegNet 采用 same 卷积保证运算前后的图像大小不变,在解码过程中利用反卷积重现图像分类后的特征,用编码网络中得到的池化索引进行上采样, 使图像尺寸还原到原始尺寸,在最后使用 Softmax 分类器对每个像素的高维特征进行分类和识别,输出不同分类的最大值,得到最终的分割结果,实现图像语义分割。

扩充知识,与网络无关。具体参考论文基于改进U-Net模型的无人机影像建筑物提取研究.ashx (wanfangdata.com.cn):(1)BN 层之后使用 Dropout 能够显著避免方差偏移。(2)当输入值大于 0 时,ReLU 函数的导数值恒为 1,不影响感受野且不存在梯度消失的问 题,且由于函数为线性,前向传播和反向传播都较为迅速,当输入值小于 0 时,ReLU 函数可以截断该输入值,导数和输出结果均为零,网络稀疏性得以增加,但此时函数梯度为 0,导致神经元失活,参数停止更新,可能导致梯度消失现象产生。ReLU 函数产生了一些变体函数,如 PReLU 函数和 Leaky ReLU 函数,PReLU 可以使负数输入值的输出结果非 0,解决了神经元失活的问题,Leaky ReLU 可以为所有负数输入值赋予一个非 0 斜率,也能解决神经元不响应的问题。)

四、DLinkNet(2018)

 编码(左边):7×7 的卷积用于将原始的特征图的通道数从3升到 64,提取语义特征。然后经过一个最大池化下采样层,编码器阶段有分别经过 3、4、6、3 个 ResNet 结构,提取到语义信息。

中间:Dblock空洞卷积结构,增大感受野。

解码(右边):使用跳跃相加的方式保持原始特征,从而减少了大量的训练时间,同理依次进行上采样-跳跃相加,最后使用 1 ×1 的卷积减小通道数到分类的数量。

扩充知识,与网络无关:ResNet、ResNeXt、ResNeSt(具体介绍参考论文P14基于深度学习的遥感影像云检测算法研究.ashx (wanfangdata.com.cn)

各个文章精度对比结果

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
医学视网膜分割是一项重要的医学图像分析任务,它可以帮助医生快速准确地诊断疾病。U-Net是一种经典的深度学习模型,被广泛应用于医学图像分割任务中。下面是一个基于Keras框架的U-Net模型训练示例: 1. 准备数据集 首先需要准备医学视网膜图像数据集。可以从公开数据集中获取或者自己收集。需要注意的是,医学图像数据量通常比较小,需要做好数据增强,如旋转、翻转、缩放等操作,以增加数据量和模型的泛化能力。 2. 构建U-Net模型 U-Net模型由编码器和解码器两部分组成。编码器用于提取图像特征,解码器则用于还原分割结果。下面是一个简单的U-Net模型: ```python from keras.layers import Input, Conv2D, MaxPooling2D, Dropout, UpSampling2D, concatenate from keras.models import Model def unet(input_size=(256, 256, 1)): inputs = Input(input_size) conv1 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs) conv1 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv1) pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) conv2 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool1) conv2 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv2) pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) conv3 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool2) conv3 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv3) pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) conv4 = Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool3) conv4 = Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv4) drop4 = Dropout(0.5)(conv4) pool4 = MaxPooling2D(pool_size=(2, 2))(drop4) conv5 = Conv2D(1024, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool4) conv5 = Conv2D(1024, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv5) drop5 = Dropout(0.5)(conv5) up6 = Conv2D(512, 2, activation='relu', padding='same', kernel_initializer='he_normal')( UpSampling2D(size=(2, 2))(drop5)) merge6 = concatenate([drop4, up6], axis=3) conv6 = Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge6) conv6 = Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv6) up7 = Conv2D(256, 2, activation='relu', padding='same', kernel_initializer='he_normal')( UpSampling2D(size=(2, 2))(conv6)) merge7 = concatenate([conv3, up7], axis=3) conv7 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge7) conv7 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv7) up8 = Conv2D(128, 2, activation='relu', padding='same', kernel_initializer='he_normal')( UpSampling2D(size=(2, 2))(conv7)) merge8 = concatenate([conv2, up8], axis=3) conv8 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge8) conv8 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv8) up9 = Conv2D(64, 2, activation='relu', padding='same', kernel_initializer='he_normal')( UpSampling2D(size=(2, 2))(conv8)) merge9 = concatenate([conv1, up9], axis=3) conv9 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge9) conv9 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv9) conv9 = Conv2D(2, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv9) outputs = Conv2D(1, 1, activation='sigmoid')(conv9) model = Model(inputs=inputs, outputs=outputs) return model ``` 3. 编译模型 在训练模型之前,需要编译模型并指定损失函数、优化器和评价指标: ```python from keras.optimizers import Adam model = unet() model.compile(optimizer=Adam(lr=1e-4), loss='binary_crossentropy', metrics=['accuracy']) ``` 4. 训练模型 将准备好的数据集分为训练集和验证集,然后使用Keras提供的fit方法训练模型: ```python model.fit(x_train, y_train, batch_size=16, epochs=50, validation_data=(x_val, y_val)) ``` 5. 评估模型 训练完成后,可以使用测试集来评估模型的性能: ```python score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 6. 使用模型进行预测 训练完成后,可以使用训练好的模型来对新的医学视网膜图像进行分割: ```python y_pred = model.predict(x_test) ``` 以上就是基于Keras框架的U-Net模型训练示例。当然,在实际应用中,还需要进行一些优化和调参,以达到更好的性能和精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值