位置: IT常识 - 正文

深度学习论文精读[6]:UNet++

编辑:rootadmin
深度学习论文精读

推荐整理分享深度学习论文精读[6]:UNet++,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

UNet的编解码结构一经提出以来,大有统一深度学习图像分割之势,后续基于UNet的改进方案也经久不衰,一些研究者也在从网络结构本身来思考UNet的有效性。比如说编解码网络应该取几层,跳跃连接是否能够有更多的变化以及什么样的结构训练起来更加有效等问题。UNet本身是针对医学图像分割任务而提出来的网络结构,该任务不像自然图像分割,对分割精度要求并不是十分严格。但对于医学图像而言,器官和病灶的分割则要求极高的精确性,因为很多时候分割效果的好坏直接关系到对应的临床诊断决策。出于上述两个方面的动机,即设计更好的UNet结构和提升医学图像分割的精度,相关研究者提出了一种嵌套的UNet结构(Nested UNet),也叫UNet++,提出UNet++的论文为UNet++: A Nested U-Net Architecture for Medical Image Segmentation,发表于2018年的医学图像计算和计算机辅助干预(Medical Image Computing and Computer Assisted Intervention,MICCAI)会议上。

UNet++取名为嵌套的UNet,就在于其整体编解码网络结构中还嵌套了编解码的子网络(sub-networks),在此基础上重新设计UNet中间的跳跃连接,并补充了深监督机制加速网络训练收敛。完整的UNet++结构如下图所示。

图中黑色部分为原始的UNet结构,包括编码器下采样、解码器上采样和黑色虚线的跳跃连接三个部分;绿色部分即嵌套的UNet子网络,包括卷积和上采样两部分,而蓝色虚线部分就是UNet++重新设计后的跳跃连接,这部分跟DenseNet的密集连接类似,这里是为子网络提供跳跃连接;最上面红黑连线则是UNet++补充的深监督机制,目的是为了网络能够顺利得到训练。

下面我们从结构设计的角度来对UNet++进行解读。关于UNet结构,最首要的问题就是网络应该有几层,原始的UNet结构用了4层下采样和4层上采样,那么是不是4层就足以满足所有的分割任务需要?答案是否定的。通过本节之前的网络结构分析,我们已经知道,浅层网络能够提取图像粗粒度特征,获取图像基本形态;深层网络能够提取图像的抽象特征,获取图像语义信息,总之浅有浅的侧重,深有深的好处。同之前RefineNet的观点一样,UNet++的作者认为,不管是浅层、深层还是中层,所有层次的特征对于最后的分割都是重要的。有的数据分割任务简单,图像信息单一,可能浅层网络就足以达到很好的效果,而有的数据任务复杂,图像信息丰富,可能需要更深层的网络结构才能达到不错的效果,之前的UNet结构设计很难同时照顾到这种普适性。而UNet++通过设计不同深度的嵌套UNet子网络来实现这种普适性,所以UNet的深度到这里就解决了。

第二个问题则是加入不同深度的嵌套网络后,跳跃连接部分该如何调整。在UNet中,跳跃连接由同层编码器直连到编码器上采样对应层。但加入嵌套子网络后,UNet中原先的长连接就不复存在了,取而代之的是各子网络中的短连接。UNet++的作者们认为,长连接在UNet中是有必要的,能够将图像中前后信息联系起来,对于下采样造成的信息损失有很好的补充作用。所以,UNet++又参考DenseNet的密集连接设计,给嵌套网络补充了长连接,如下图5所示。

但是这样又带来了第三个问题:反向传播的时候中间部分可能会收不到由损失函数反传回来的梯度。所以见招拆招,UNet++又通过深监督的方法来强行加梯度,帮助网络正常进行训练。但深监督对于UNet++的好处绝不仅仅限于此,通过不同深监督损失函数,UNet++可以通过网络剪枝来实现可伸缩性。所以,总结来说UNet++相较于原始的UNet,有如下两个优势:

(1)通过嵌套子网络和长短连接来整合不同层次的图像特征,使得网络分割精度更高;

深度学习论文精读[6]:UNet++

(2)灵活的网络结构配合深监督机制,让参数量巨大的深度网络在可接受的精度范围内能够大幅度的缩减参数量。

UNet++与UNet等网络分割效果对比如下图所示。

UNet++也进一步壮大了UNet家族网络,后续基于其的改进版本也有很多,比如Attention UNet++、UNet 3+等。下述代码给出了UNet++的一个实现参考。完整代码可参考:

https://github.com/4uiiurz1/pytorch-nested-unet/blob/master/archs.py

class NestedUNet(nn.Module):def __init__(self, num_classes, input_channels=3, deep_supervision=False, **kwargs):        super().__init__()        nb_filter = [32, 64, 128, 256, 512]        self.deep_supervision = deep_supervisionself.pool = nn.MaxPool2d(2, 2)self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)self.conv0_0 = VGGBlock(input_channels, nb_filter[0], nb_filter[0])self.conv1_0 = VGGBlock(nb_filter[0], nb_filter[1], nb_filter[1])self.conv2_0 = VGGBlock(nb_filter[1], nb_filter[2], nb_filter[2])self.conv3_0 = VGGBlock(nb_filter[2], nb_filter[3], nb_filter[3])self.conv4_0 = VGGBlock(nb_filter[3], nb_filter[4], nb_filter[4])self.conv0_1 = VGGBlock(nb_filter[0]+nb_filter[1], nb_filter[0], nb_filter[0])self.conv1_1 = VGGBlock(nb_filter[1]+nb_filter[2], nb_filter[1], nb_filter[1])self.conv2_1 = VGGBlock(nb_filter[2]+nb_filter[3], nb_filter[2], nb_filter[2])self.conv3_1 = VGGBlock(nb_filter[3]+nb_filter[4], nb_filter[3], nb_filter[3])self.conv0_2 = VGGBlock(nb_filter[0]*2+nb_filter[1], nb_filter[0], nb_filter[0])self.conv1_2 = VGGBlock(nb_filter[1]*2+nb_filter[2], nb_filter[1], nb_filter[1])self.conv2_2 = VGGBlock(nb_filter[2]*2+nb_filter[3], nb_filter[2], nb_filter[2])self.conv0_3 = VGGBlock(nb_filter[0]*3+nb_filter[1], nb_filter[0], nb_filter[0])        self.conv1_3 = VGGBlock(nb_filter[1]*3+nb_filter[2], nb_filter[1], nb_filter[1])self.conv0_4 = VGGBlock(nb_filter[0]*4+nb_filter[1], nb_filter[0], nb_filter[0])if self.deep_supervision:self.final1 = nn.Conv2d(nb_filter[0], num_classes, kernel_size=1)self.final2 = nn.Conv2d(nb_filter[0], num_classes, kernel_size=1)self.final3 = nn.Conv2d(nb_filter[0], num_classes, kernel_size=1)self.final4 = nn.Conv2d(nb_filter[0], num_classes, kernel_size=1)else:self.final = nn.Conv2d(nb_filter[0], num_classes, kernel_size=1)def forward(self, input):x0_0 = self.conv0_0(input)x1_0 = self.conv1_0(self.pool(x0_0))x0_1 = self.conv0_1(torch.cat([x0_0, self.up(x1_0)], 1))x2_0 = self.conv2_0(self.pool(x1_0))x1_1 = self.conv1_1(torch.cat([x1_0, self.up(x2_0)], 1))x0_2 = self.conv0_2(torch.cat([x0_0, x0_1, self.up(x1_1)], 1))x3_0 = self.conv3_0(self.pool(x2_0))x2_1 = self.conv2_1(torch.cat([x2_0, self.up(x3_0)], 1))x1_2 = self.conv1_2(torch.cat([x1_0, x1_1, self.up(x2_1)], 1))x0_3 = self.conv0_3(torch.cat([x0_0, x0_1, x0_2, self.up(x1_2)], 1))x4_0 = self.conv4_0(self.pool(x3_0))x3_1 = self.conv3_1(torch.cat([x3_0, self.up(x4_0)], 1))x2_2 = self.conv2_2(torch.cat([x2_0, x2_1, self.up(x3_1)], 1))x1_3 = self.conv1_3(torch.cat([x1_0, x1_1, x1_2, self.up(x2_2)], 1))x0_4 = self.conv0_4(torch.cat([x0_0, x0_1, x0_2, x0_3, self.up(x1_3)], 1))if self.deep_supervision:output1 = self.final1(x0_1)output2 = self.final2(x0_2)output3 = self.final3(x0_3)output4 = self.final4(x0_4)            return [output1, output2, output3, output4]else:output = self.final(x0_4)return output

根据读者对于本系列的反馈,后续相关内容会逐步更新到深度学习语义分割与实战指南GitHub地址:

https://github.com/luwill/Semantic-Segmentation-Guide

往期精彩:

 深度学习论文精读[1]:FCN全卷积网络

 深度学习论文精读[2]:UNet网络

 深度学习论文精读[3]:SegNet

 深度学习论文精读[4]:RefineNet

 深度学习论文精读[5]:Attention UNet

 讲解视频来了!机器学习 公式推导与代码实现开录!

 完结!《机器学习 公式推导与代码实现》全书1-26章PPT下载

本文链接地址:https://www.jiuchutong.com/zhishi/299270.html 转载请保留说明!

上一篇:H5项目如何打包成APP(h5项目怎么打包成app)

下一篇:HTML入门零基础教程(三)(html零基础入门教程)

  • 抖音ip地址在哪里(抖音IP地址在哪里找)

    抖音ip地址在哪里(抖音IP地址在哪里找)

  • 红米k30pro出厂自带膜吗(红米k30pro出厂设置在哪)

    红米k30pro出厂自带膜吗(红米k30pro出厂设置在哪)

  • 苹果x和8plus区别(苹果x跟8plus的区别)

    苹果x和8plus区别(苹果x跟8plus的区别)

  • 手机信息字很大怎么调小(手机里信息字大怎么办)

    手机信息字很大怎么调小(手机里信息字大怎么办)

  • 操作系统作为接口连接的是(操作系统作为接口的特点)

    操作系统作为接口连接的是(操作系统作为接口的特点)

  • 微信注销要多久时间才生效(微信注销要多久15天)

    微信注销要多久时间才生效(微信注销要多久15天)

  • 手机号码异地可以补办吗(手机号码异地可以改套餐吗?)

    手机号码异地可以补办吗(手机号码异地可以改套餐吗?)

  • 抖音评论删除了别人还能看到里面的内容吗(抖音评论删除了别人有提示吗)

    抖音评论删除了别人还能看到里面的内容吗(抖音评论删除了别人有提示吗)

  • ios正在准备更新卡住了(ios正在准备更新怎么取消)

    ios正在准备更新卡住了(ios正在准备更新怎么取消)

  • 图片打了马赛克可以复原吗(图片打了马赛克怎样恢复原图)

    图片打了马赛克可以复原吗(图片打了马赛克怎样恢复原图)

  • 华为畅享10与10e有什么不同(华为畅享10与10e手机壳有什么不同)

    华为畅享10与10e有什么不同(华为畅享10与10e手机壳有什么不同)

  • 苹果序列号12位含义(苹果序列号12位什么意思)

    苹果序列号12位含义(苹果序列号12位什么意思)

  • 手机为什么会出现很多照片(手机为什么会出现安全模式)

    手机为什么会出现很多照片(手机为什么会出现安全模式)

  • 快狗打车能开发票吗(快狗打车开发票电话)

    快狗打车能开发票吗(快狗打车开发票电话)

  • iphone自带手机膜吗(苹果手机自带的膜是钢化膜吗)

    iphone自带手机膜吗(苹果手机自带的膜是钢化膜吗)

  • 滴滴如何跳过强制升级(滴滴绕过平台)

    滴滴如何跳过强制升级(滴滴绕过平台)

  • 淘宝推送短信怎么取消(淘宝短信推送怎么取消2021)

    淘宝推送短信怎么取消(淘宝短信推送怎么取消2021)

  • 大王卡怎么激活应用宝(腾讯大王卡怎么激活)

    大王卡怎么激活应用宝(腾讯大王卡怎么激活)

  • 淘宝助力值怎么涨(淘宝助力榜怎么快速加助力)

    淘宝助力值怎么涨(淘宝助力榜怎么快速加助力)

  • 苹果手机趣头条为什么没有任务(苹果手机趣头条怎么没有金币)

    苹果手机趣头条为什么没有任务(苹果手机趣头条怎么没有金币)

  • 苹果手机最近删除照片怎么设置(苹果手机最近删除相簿没有了)

    苹果手机最近删除照片怎么设置(苹果手机最近删除相簿没有了)

  • 苹果手机无线充电设置在哪里(苹果手机无线充电功能)

    苹果手机无线充电设置在哪里(苹果手机无线充电功能)

  • linux sed 多行处理详细总结(linux sed 行尾)

    linux sed 多行处理详细总结(linux sed 行尾)

  • fs20.exe是什么进程 有什么作用 fs20进程查询(电脑fs0是什么)

    fs20.exe是什么进程 有什么作用 fs20进程查询(电脑fs0是什么)

  • pandas遍历dataframe的方法有哪些(pandas遍历某一列将字符串转换为列表)

    pandas遍历dataframe的方法有哪些(pandas遍历某一列将字符串转换为列表)

  • 农机企业所得税税率
  • 离职补偿的扣税比例
  • 车船税规定怎么缴纳
  • 外地预缴所得税的会计分录
  • 企业所得税是含税价还是不含税价
  • 租房代收水电费税率
  • 作废的发票要拿出来吗
  • 软件使用权收入怎么计算
  • 公转私操作步骤
  • 预付货款后收到货怎么做账
  • 应交税费怎么做分录
  • 承租人转租是否要交税
  • 住宿费专票可以报销吗
  • 纳税申报表多缴了怎么办
  • 多计提的固定资产折旧
  • 单位住房没有房产证是否可以买卖
  • 相互调转总分公司的原料物资 是视同销售吗?
  • 企业计提的工资薪金支出可以在税前扣除
  • 工资薪金中的误餐补助,征收个人所得税
  • 合作建房分配的房屋
  • 商业土地厂房办公房过户需要交什么税?
  • 现金采购怎么算
  • 原始凭证与记账凭证的填制实验报告
  • configureandwatch
  • BIOS识别不了硬盘pe可以
  • 主营业务收入平均增长率计算例题
  • 受托加工物资的账务处理例题
  • 房地产企业纳税申报需要报哪些报表
  • 网上申报税务局怎么操作
  • 苹果电脑里的finder是什么
  • 公司多交的公积金能退吗
  • php两个多维数组合在一起
  • PHP:Memcached::incrementByKey()的用法_Memcached类
  • 哪些费用可以计入开办费
  • win11怎么桌面快捷方式
  • macos big sur值得升级吗
  • 蜻蜓翅膀特写怎么画
  • php去除空格和换行符
  • 公司支付保洁费可以付给个人吗
  • 闲置房的相关政策
  • maven视频教程
  • 职工食堂外包账务怎么做
  • 两套账目
  • web自动化测试平台
  • 小规模纳税人年收入超过500万必须转为一般纳税人吗
  • ps怎么用魔棒选区
  • 跨年坏账准备转回
  • 土地出让金的范围是什么
  • 进项税额转出如何做分录
  • 销货退回与折让的关系
  • 销售折让怎么核算成本
  • 奖金属于职工福利薪酬吗
  • 火车头 采集器
  • php 缓存
  • 年报中的利润表本月数需要填吗
  • mongodb安装教程win10
  • mysql错误日志在哪里
  • 收到加工费怎么做账务处理分录
  • 研究开发费用加计扣除最新政策
  • 预收款收入确认
  • 加计扣除所得税怎么算
  • 从农民个人手里取出钱
  • 记账凭证账务处理程序的特点是直接根据每张
  • 小微企业建账
  • sql如何学
  • Windows 8.1下MySQL5.7 忘记root 密码的解决方法
  • ubuntu搭建网站教程
  • 第三方win7系统哪个最好
  • win7文件夹怎么显示大小
  • Win10系统下怎么设置按Win+E进入计算机的图文教程
  • linuxmain函数
  • opengl环境配置
  • nodejs 回调
  • pygame如何加载图片
  • android遇到的难题,怎么解决的
  • 初识大学主题征文
  • android 标签页
  • 动态生成script
  • 晋税通注册
  • 发票代码如何查真伪
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设