而今再看unet

从最开始听到人用Unet左inpainting,再到自己使用Unet做图像去噪任务,虽然没有用Unet做过分割,但Unet也可以称得上是老朋友了。现在回头再看Unet,温故知新,一些魔鬼真就藏在一些细节之中。

structure

结构由forward函数定义:

def forward(self,x0):

    x1=self.model.head(x0)
    x2=self.model.down1(x1)
    x3=self.model.down2(x2)
    x4=self.model.down3(x3)

    x=self.model.body(x4)

    x=self.model.up3(x)
    x=self.model.up2(x)
    x=self.model.up1(x)
    x=self.model.tail(x)
    return x

head,tail是没有分辨率上的变化的。并且在down和up内部,第一步是采样带来的尺寸变化,第二部分也还是有一些正常的卷积操作。

skip connect

在Unet的解码部分,除了对低分辨率的上采样,还会融合Unet左边同分辨率的featuremap,称为Skip connection。这样能达到更精确的分割。

根据融合的方式不同,有直接相加的,也有在通道维度concatenate的。后者计算量更大,但是不会造成信息丢失。FCN使用的就是直接相加。

def forward(self,x0):

    x1=self.model.head(x0)
    x2=self.model.down1(x1)
    x3=self.model.down2(x2)
    x4=self.model.down3(x3)

    x=self.model.body(x4)

    x=self.model.up3(x+x4)
    x=self.model.up2(x+x3)
    x=self.model.up1(x+x2)
    x=self.model.tail(x+x1)
    return x
def forward(self,x0):

    x1=self.model.head(x0)
    x2=self.model.down1(x1)
    x3=self.model.down2(x2)
    x4=self.model.down3(x3)

    x=self.model.body(x4)

    x=self.model.up3(torch.cat[x,x4],dim=1)
    x=self.model.up2(torch.cat[x,x3],dim=1)
    x=self.model.up1(torch.cat[x,x2],dim=1)
    x=self.model.tail(torch.cat[x,x1],dim=1) #dum=1表示在维度1上进行cancate,这里是在通道维度
    return x

downsample

从分辨率看,左右两部分分别是下降和升高,但从通道维度看,左右两边分别是升高和下降。所以Unet是先将信息转换为通道层面,然后由此再进行重构。

在上面的Unet结构图中,虽然下采样是由最大池化实现的,但在实际应用中,正常的卷积就可以达到下采样的目的,只不过为了分辨率下降为一半,卷积的参数要经过设计。

卷积层输出尺寸: o = ⌊(i + 2p - k) / s⌋ + 1 ,padding设置为1时,输出尺寸可以完全由stride控制。stride=2时,分辨率下降为一半;当stride=1,分辨率不变化(在Unet右边部分的水平部分,分辨率不需要变化,只是特征提取,就属于这种情况。

upsample

至于上采样操作,现在普遍使用的是nn.ConvTranspose2d。转置卷积就是基于卷积的实现,通过转置的方法实现分辨率的提升。为了达到采样倍率为2的目的,也需要根据公式确定转置卷积的参数。也是(3,2,1)的组合,不过额外有一个output_padding 的参数。

为了增强网络的表达能力,一方面是可以加大Unet的层数,另外就是加深每一层的深度。比如参考ESRGAN使用RRDB。

RDB,在densenet的基础上增加了残差。dense指每个卷积的输入不仅有上一个卷积的输出,还要和前面所有卷积的输出cancat在一起。最终卷积的输出表示残差,残差因子默认为0.2,和最初的输入相加得到最终的输出:

RRDB和RDB相比多了一个R,事实上也是如此,RRDB就是3个RDB串联,输出作为残差:

在构建多个卷积层时,可以使用self.add_module(f'conv{i}',nn.Conv2d(in,out,3,1,1))简化代码,使用时直接使用self.conv1,self.cov2...

reference:

深度学习系列(四)分割网络模型(FCN、Unet、Unet++、SegNet、RefineNet)-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】:工厂模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 简单工厂模什么是简单工厂模式?如何实现简单工厂模式? 工厂方法抽象工厂模式总结简单工厂模式工厂方法抽象工厂「Abstract Factory」 简单工厂模 什么是简单工厂模式&#xf…

【计算机网络】详解数据链路层数据帧Mac地址ARP协议

一、以太网帧 "以太网" 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容 。例如:规定了网络拓扑结构,访问控制方式,传输速率等;例如以太网中…

【智能算法应用】引力搜索算法求解二维路径规划问题

摘要 引力搜索算法(GSA)是一种基于引力学说的启发式算法,用于解决复杂的优化问题。本文应用 GSA 于二维路径规划问题,通过优化路径来避开障碍物并达到目标点。实验结果表明,GSA 在路径规划中具有良好的表现&#xff0…

课程作业管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法…

基于Docker安装Grafana及其基本功能

Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。 拉取Grafana镜像 docker pull grafana/grafana 运行镜像 docker run -d -p 3000:3000 --namegrafana grafana/grafana 打开浏览器,访问 http://l…

|动漫爬取|001_djangodjango基于Spark的国漫推荐系统的设计与实现2024_tpd6q1o4

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

to_sql报错not all arguments converted during string formatting

报错: DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下: import pymysql import pandas as pd con pymysql.connect(…

【小技能】一、windows的远程桌面连接

一、简介 windows系列都带有远程桌面连接的程序;学会配置并使用此程序,可以避免让我们每次连接一台新的电脑时去安装远程软件。所以特地前来写下这篇文章,让自己以后忘记了可以来瞧瞧。 二、配置被远程电脑 步骤一:开启远程桌…

诺贝尔物理学奖:机器学习与神经网络的时代

前言 2024年,诺贝尔物理学奖首次颁发给机器学习与神经网络领域的研究者,标志着科学评奖标准的历史性转变。这一决定引发了学术界的广泛关注,也促使人们深入思考科学研究及其应用的未来。 机器学习与物理学的交融 传统上,诺贝尔物…

前端开发设计模式——命令模式

目录 一、命令模式的定义和特点 1.定义: 2. 特点: 二、命令模式的结构与原理 1.结构: 2.原理: 三、命令模式的实现方式 1.定义接口命令: 2.创建具体的命令类: 3.定义接收者&…

【MySQL 保姆级教学】数据库的操作(3)

数据库的操作 1. 创建数据库2. 创建数据库的案例3. 字符集和校验规则3.1 查看系统默认字符集以及校验规则3.2 查看数据库支持的字符集3.3 查看数据库支持的字符集校验规则3.4 校验规则对数据库的影响 4. 操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 删除数据库…

OpenCV打开摄像头或视频

文章目录 1. 视频读取流程创建视频对象设置摄像头参数循环检查是否初始化成功并读取读取视频释放摄像头删除建立的全部窗口cv2.CAP_DSHOW设置后帧率变慢的问题 2.所有python实现代码参考文献 1. 视频读取流程 创建视频对象 cap cv2.VideoCapture(videoPath) #加载视频 cap …

【风控安全产品系统架构设计的一些思考】

随着互联网的不断发展和普及,信息安全和风险控制成为了各行各业关注的焦点之一。在这样的背景下,风控安全产品成为了保障企业信息资产安全的重要手段之一。本文将探讨风控安全产品系统架构设计的一些关键思考和实践经验。 1. 深度了解业务需求 在设计…

FFmpeg的简单使用【Windows】

目录 一、视频生成图片 静态图片 转码过程 动态图片gif 二、图片生成视频 三、FFmpeg常用参数命令 3.1 主要参数 3.1.1、-i 3.1.2、-f 3.1.3、-ss 3.1.4、-t 3.2 音频参数 3.2.1、-aframes 3.2.2、 -b:a 3.2.3、-ar 3.2.4、-ac 3.2.5、-acodec 3.2.6、-an 3…

未来汽车究竟该是什么样子?

24年10月14日,在中国(深圳)机器视觉展暨机器视觉技术及工业应用研讨会上,同行者分享了未来智能座舱应该长什么样子。 受此启发,个人觉得当前大多数新能源车都极力想做出电动感,但是布局传统没跳出来&#…

【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用

在 Go 语言中,time 包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握 time 包能够帮助我们轻松处理时间相关的操作,尤其是定…

【大模型理论篇】大模型中的强化学习RLHF(PPO)、DPO(Direct Preference Optimization)等概念的理解与解析

1. “人类对齐(Human Alignment)”背景介绍 本文主要针对大模型训练过程中的PPO(Proximal Policy Optimization)、DPO(Direct Preference Optimization)等概念进行解释和分析,更确切的说是在“人类对齐(Human Alignment&#xff0…

aosp14分屏分割线区域部分深入剖析-framework实战干货

背景: 原来在学习分屏课程期间,当时没有对分屏分割线的区域部分进行详细介绍。 本篇文章就针对这个块的知识进行详细的补充讲解,首先可以通过下图所示分割线情况,这样有一个初步的认识 简单说分屏情况下分割线是可以拖拉到不同…

社交媒体对人际关系的影响:Facebook的案例分析

随着社交媒体的快速发展,人们的沟通方式和人际关系发生了深刻变化。作为全球最大的社交网络之一,Facebook在这一进程中扮演了重要角色。本文将分析Facebook如何影响人际关系,包括沟通方式的转变、情感连接的变化以及社交互动的质量。 1. 沟通…

无极低码课程【redis windows下服务注册密码修改】

下载Windows版本的Redis linux环境 (自行下载) 1.打开官网https://redis.io/downloads/ windows环境 1.打开github https://github.com/microsoftarchive/redis/releases 然后选择你喜欢的版本zip或msi下载 2.这里下载zip版,解压后后,打开安装目录 3.双击redis-server…