语义分割——SegNet(四)

2023-11-12

简介
补充一下2015年发表的SegNet模型,它是由剑桥大学团队开发的图像分割的开源项目,该项目可以对图像中的物体所在区域进行分割。SegNet是在FCN的语义分割任务基础上,搭建encoder-decoder对称结构,实现端到端的像素级别图像分割。其新颖之处在于解码器对其较低分辨率的输入特征图进行上采样的方式。
SegNet论文地址:https://arxiv.org/abs/1511.00561

SegNet原理:
在这里插入图片描述
可以看出SegNet整体的网络结构与FCN相似,它也是最开始明确定义ecoder端和decoder端,它的ecoder端是使用Vgg16,总计使用了Vgg16的13个卷积层,其主要的特点是在decoder端将pooling indices技术应用在max pooling过程中来连接encoder的输出做一个非线性的上采样。
如下图所示,encoder在最大池化操作时记录了最大值所在位置(索引),用于之后在decoder中使用那些存储的索引来对相应特征图进行去池化操作,这样在上采样阶段就无需学习。这有助于保持高频信息的完整性,但当对低分辨率的特征图进行去池化时,它也会忽略邻近的信息。上采样后得到的是一个稀疏特征图,再通过普通的卷积得到稠密特征图,再重复上采样。最后再用激活函数得到onehot 分类结果。
SegNet 主要比较的是 FCN,FCN解码时用反卷积操作来获得特征图,再和对应 encoder 的特征图相加得到输出。SegNet 的优势就在于不用保存整个 encoder 部分的特征图,只需保存池化索引,节省内存空间;第二个是不用反卷积,上采样阶段无需学习。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
看下几个对比的效果:
在这里插入图片描述

Python代码:

from keras import Model,layers
from keras.layers import Input,Conv2D,BatchNormalization,Activation,Reshape

from Models.utils import MaxUnpooling2D,MaxPoolingWithArgmax2D

def SegNet(nClasses, input_height, input_width):

    assert input_height % 32 == 0
    assert input_width % 32 == 0

    img_input = Input(shape=( input_height, input_width,3))

    # Block 1
    x = layers.Conv2D(64, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block1_conv1')(img_input)
    x = layers.Conv2D(64, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block1_conv2')(x)
    x, mask_1 = MaxPoolingWithArgmax2D(name='block1_pool')(x)

    # Block 2
    x = layers.Conv2D(128, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block2_conv1')(x)
    x = layers.Conv2D(128, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block2_conv2')(x)
    x , mask_2 = MaxPoolingWithArgmax2D(name='block2_pool')(x)

    # Block 3
    x = layers.Conv2D(256, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block3_conv1')(x)
    x = layers.Conv2D(256, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block3_conv2')(x)
    x = layers.Conv2D(256, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block3_conv3')(x)
    x, mask_3 = MaxPoolingWithArgmax2D(name='block3_pool')(x)

    # Block 4
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block4_conv1')(x)
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block4_conv2')(x)
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block4_conv3')(x)

    x, mask_4 = MaxPoolingWithArgmax2D(name='block4_pool')(x)

    # Block 5
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block5_conv1')(x)
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block5_conv2')(x)
    x = layers.Conv2D(512, (3, 3),
                      activation='relu',
                      padding='same',
                      name='block5_conv3')(x)
    x, mask_5 = MaxPoolingWithArgmax2D(name='block5_pool')(x)

    Vgg_streamlined=Model(inputs=img_input,outputs=x)

    # 加载vgg16的预训练权重
    Vgg_streamlined.load_weights(r"..\vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5")

    # 解码层
    unpool_1 = MaxUnpooling2D()([x, mask_5])
    y = Conv2D(512, (3,3), padding="same")(unpool_1)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_2 = MaxUnpooling2D()([y, mask_4])
    y = Conv2D(512, (3, 3), padding="same")(unpool_2)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(256, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_3 = MaxUnpooling2D()([y, mask_3])
    y = Conv2D(256, (3, 3), padding="same")(unpool_3)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(256, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(128, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_4 = MaxUnpooling2D()([y, mask_2])
    y = Conv2D(128, (3, 3), padding="same")(unpool_4)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(64, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_5 = MaxUnpooling2D()([y, mask_1])
    y = Conv2D(64, (3, 3), padding="same")(unpool_5)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    y = Conv2D(nClasses, (1, 1), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    y = Reshape((-1, nClasses))(y)
    y = Activation("softmax")(y)

    model=Model(inputs=img_input,outputs=y)
    return model



if __name__ == '__main__':
    m = SegNet(15,320, 320)
    # print(m.get_weights()[2]) # 看看权重改变没,加载vgg权重测试用
    from keras.utils import plot_model
    plot_model(m, show_shapes=True, to_file='model_segnet.png')
    print(len(m.layers))
    m.summary()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语义分割——SegNet(四) 的相关文章

随机推荐

  • Python爬虫之Jsonpath解析

    Jsonpath的安装方式 pip install jsonpath i https pypi douban com simple 利用国内源速度快一些 jsonpath的使用 针对json数据结构进行数据解析 本地文件 服务器文件需要先下
  • 2023年黑客零基础从入门到精通学习成长路线(超多图、非常详细),看完这一篇就够了。

    怎样规划学习路线 如果你是一个安全行业新人 我建议你先从网络安全或者Web安全 渗透测试这两个方向先学起 一是市场需求量高 二则是发展相对成熟入门比较容易 值得一提的是 学网络安全 是先网络后安全 学Web安全 也是先Web再有安全 安全不
  • mysql 存储过程参考 虽然不建议用存储过程,一个例子 用于自己参考

    BEGIN DECLARE done INT DECLARE v companyName VARCHAR 100 DECLARE v phone VARCHAR 30 DECLARE v contactName VARCHAR 30 DEC
  • 论文笔记:On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima

    2017 ICLR 0 摘要 这篇文章探究了深度学习中一个普遍存在的问题 使用大的batchsize训练网络会导致网络的泛化性能下降 Generalization Gap 大的batchsize训练使得目标函数倾向于收敛到sharp min
  • ubuntu18.04 安装OpenBLAS

    一 通过apt get安装 sudo apt get install libopenblas dev 二 源码安装 下载OpenBLAS并安装 git clone https github com xianyi OpenBLAS git c
  • [人工智能-深度学习-37]:卷积神经网络CNN - 重构神经网络的疑惑与思考?

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 人工智能 深度学习 37 卷积神经网络CNN 重构神经网络的疑惑与思考 文火冰糖 王文兵 的博客 CSDN博客 如果你看懂我的疑惑 如果你能
  • MYSQL的server层和存储引擎层分析

    转自 微点阅读 https www weidianyuedu com SQL的全称是Structured Query Language 翻译成中国话就是结构化查询语言 这是一种声明式的语法 何为声明式 对于设计数据库的人而言 语句怎么执行就
  • 海量数据找中位数

    腾讯一面问到了 用的算法导论中的Kth算法 期望时间复杂度为O n 后来想了想 万一数据多的来根本不能一次读入内存 这个时候该如何解决呢 题目如下 只有2G内存的pc机 在一个存有10G个整数的文件 从中找到中位数 写一个算法 http b
  • python第五天作业

    作业4 判断以下哪些不能作为标识符 B D F A a B a C 12 D a 12 E false F False 作业5 输入数 判断这个数是否是质数 要求使用函数 for循环 num int input 请输入一个数 def zhi
  • 关于STM32烧录时遇到No Algorithm found for: 08000000H - 08001E13H的解决办法

    在烧录STM32F103C8T6相关例程时遇到提示 检查相关文件 均正常 但发现其默认配置为 Erase Sectors 因此 解决办法为 1 进入option for trget 小锤子 界面 2 选择Utilities界面 点击sett
  • js正则搜索img标签并替换src值

    第一种用函数更灵活 const html img src image1 jpg img src image22 jpg p Some text with no image p img src i23mage3 jpg const regex
  • 动态代理原理和设计模式详解

    一 什么是代理模式代理模式是一种设计模式 提供了对目标对象额外的访问方式 即可以通过代理访问目标对象 这样可以在不修改原目标对象的前提下 提供额外的方式进行访问 扩展目标对象的功能 通俗的说 例如你想租房 房子就是你的目标访问对象 那在中间
  • LVGL7.5版本 触摸与键盘输入(API)对接(一)

    LVGL7 5版本 触摸与键盘输入 LVGL7 5版本 触摸与键盘输入 API 对接 一 前言 一 indev输入设备的种类介绍 二 移植Touchpad与Keypad Touchpad Keypad Keypad测试示例 本篇完 LVGL
  • 有哪些值得互联网人加入的国企?

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 5 5 分钟 今年的就业相比以往是难了一点 感受到的人 都懂 今天分享一些值得考虑的国企 毕竟优质的国企很稳定 不会像互联网一样担忧年纪大被裁员的情况发生 福利又好
  • 使用zabbix5.2监控mariadb--第七步

    困难点 zabbix5 2可用的userparameter mysql conf问题 一般不成功是因为监控脚本和数据库账号授权 01 前言 zabbix内置Mysql的监控模版 因为mariadb和Mysql两者的相关性 所以这个模版也能用
  • HFSS仿真导入到PCB

    一 从HFSS中导出DXF文件 以偶极子天线为例 先导出顶层 选择这个然后保存 然后同理 导出介质层和底层 二 导入PCB文件中 1 导入顶层 导入刚刚导出的顶层文件 然后将比例更改为mm pcb层改为Top Layer 导入之后选中 2
  • python 矩阵常用计算

    coding utf 8 import numpy as np aa np array 1 2 3 4 5 6 7 8 9 行列式 print np linalg det aa
  • mysql分割和合并字段数据

    1 以此表为例 2 分割字符串成多列展示 sql语句 select li substr li 1 2 as D盘 substr li 11 11 as jpg from sheet1 结果 3 分割完之后 可以得到想要的数据 根据数据有多少
  • 区块链医疗应用--智慧医疗系统

    区块链医疗应用 医疗现状 医疗行业利用区块链技解决个人健康数据的安全性与共享 医疗数据信息孤岛 产品溯源等 提供了更有效维护 全量备份 信息安全的分布式记账技术 为医疗数据共享带来更好思路 区块链的特性确保系统的稳定性 医疗行业的发展主要是
  • 语义分割——SegNet(四)

    简介 补充一下2015年发表的SegNet模型 它是由剑桥大学团队开发的图像分割的开源项目 该项目可以对图像中的物体所在区域进行分割 SegNet是在FCN的语义分割任务基础上 搭建encoder decoder对称结构 实现端到端的像素级