图像分割实战-系列教程10:U2NET显著性检测实战2

在这里插入图片描述

🍁🍁🍁图像分割实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

U2NET显著性检测实战1
U2NET显著性检测实战2

5、残差Unet模块

在这里插入图片描述

class RSU7(nn.Module):#UNet07DRES(nn.Module):

    def __init__(self, in_ch=3, mid_ch=12, out_ch=3):
        super(RSU7,self).__init__()

        self.rebnconvin = REBNCONV(in_ch,out_ch,dirate=1)

        self.rebnconv1 = REBNCONV(out_ch,mid_ch,dirate=1)
        self.pool1 = nn.MaxPool2d(2,stride=2,ceil_mode=True)

        self.rebnconv2 = REBNCONV(mid_ch,mid_ch,dirate=1)
        self.pool2 = nn.MaxPool2d(2,stride=2,ceil_mode=True)

        self.rebnconv3 = REBNCONV(mid_ch,mid_ch,dirate=1)
        self.pool3 = nn.MaxPool2d(2,stride=2,ceil_mode=True)

        self.rebnconv4 = REBNCONV(mid_ch,mid_ch,dirate=1)
        self.pool4 = nn.MaxPool2d(2,stride=2,ceil_mode=True)

        self.rebnconv5 = REBNCONV(mid_ch,mid_ch,dirate=1)
        self.pool5 = nn.MaxPool2d(2,stride=2,ceil_mode=True)

        self.rebnconv6 = REBNCONV(mid_ch,mid_ch,dirate=1)

        self.rebnconv7 = REBNCONV(mid_ch,mid_ch,dirate=2)

        self.rebnconv6d = REBNCONV(mid_ch*2,mid_ch,dirate=1)
        self.rebnconv5d = REBNCONV(mid_ch*2,mid_ch,dirate=1)
        self.rebnconv4d = REBNCONV(mid_ch*2,mid_ch,dirate=1)
        self.rebnconv3d = REBNCONV(mid_ch*2,mid_ch,dirate=1)
        self.rebnconv2d = REBNCONV(mid_ch*2,mid_ch,dirate=1)
        self.rebnconv1d = REBNCONV(mid_ch*2,out_ch,dirate=1)

    def forward(self,x):
        hx = x
        hxin = self.rebnconvin(hx)
        hx1 = self.rebnconv1(hxin)
        hx = self.pool1(hx1)

        hx2 = self.rebnconv2(hx)
        hx = self.pool2(hx2)

        hx3 = self.rebnconv3(hx)
        hx = self.pool3(hx3)

        hx4 = self.rebnconv4(hx)
        hx = self.pool4(hx4)

        hx5 = self.rebnconv5(hx)
        hx = self.pool5(hx5)

        hx6 = self.rebnconv6(hx)

        hx7 = self.rebnconv7(hx6)

        hx6d =  self.rebnconv6d(torch.cat((hx7,hx6),1))
        hx6dup = _upsample_like(hx6d,hx5)

        hx5d =  self.rebnconv5d(torch.cat((hx6dup,hx5),1))
        hx5dup = _upsample_like(hx5d,hx4)

        hx4d = self.rebnconv4d(torch.cat((hx5dup,hx4),1))
        hx4dup = _upsample_like(hx4d,hx3)
        hx3d = self.rebnconv3d(torch.cat((hx4dup,hx3),1))
        hx3dup = _upsample_like(hx3d,hx2)
        hx2d = self.rebnconv2d(torch.cat((hx3dup,hx2),1))
        hx2dup = _upsample_like(hx2d,hx1)

        hx1d = self.rebnconv1d(torch.cat((hx2dup,hx1),1))
        return hx1d + hxin

这里以RSU7举例,U2Net就是每一个backbone都是一个带残差连接的Unet,这些backbone再以Unet的形式进行连接,在连接的过程中有特征凭借和上采样下采样操作

  1. 首先这里的RSU7也是一个一个相同的小组件组成,每一个小组件都是一个REBNCONV
  2. 一个REBNCONV就是,一个卷积Conv、批归一化BatchNormalization、Relu激活函数的三连
  3. 在构造函数中,就是定义了1个REBNCONV+5个(REBNCONV+Maxpooling)+8个REBNCONV
  4. 其中第一个REBNCONV是为了进行残差连接,将输入的长、宽、通道数转化为和输出一直的维度,代表原始输入的x
  5. 在最后的输出会再加上这个x,表示残差连接操作
  6. 编码器就是5个(REBNCONV+Maxpooling)和最后一个没有Maxpooling的REBNCONV,即hx1到hx6
  7. hx7是中间结果
  8. 解码器就是5(对应位置进行拼接的REBNCONV+上采样)和最后一个没有上采样的REBNCONV,即hx6d到hx1d
  9. hx1d再加上前面提到的x就是最后的输出

6、上采样操作与REBNCONV

def _upsample_like(src,tar):

    src = F.upsample(src,size=tar.shape[2:],mode='bilinear')

    return src

使用双线性插值进行上采样操作

class REBNCONV(nn.Module):
    def __init__(self,in_ch=3,out_ch=3,dirate=1):
        super(REBNCONV,self).__init__()
        self.conv_s1 = nn.Conv2d(in_ch,out_ch,3,padding=1*dirate,dilation=1*dirate)
        self.bn_s1 = nn.BatchNorm2d(out_ch)
        self.relu_s1 = nn.ReLU(inplace=True)
    def forward(self,x):
        hx = x
        xout = self.relu_s1(self.bn_s1(self.conv_s1(hx)))
        return xout

定义二维卷积、二维池化、Relu,然后进行对应的前向传播

7、各个残差Unet比较

在 U²-Net 中,RSU7, RSU6, RSU5, RSU4, 和 RSU4F 是用于构造网络不同层级的模块。它们共同构成了 U²-Net 的多层次特征提取体系

  1. RSU7 (Residual U-Block 7):

    • RSU7 是最深层的模块,具有最大的感受野,用于网络的最初阶段,用于从输入图像中提取基础和全局特征。在 U2NET 架构中,RSU7 作为第一个阶段使用。
  2. RSU6, RSU5, RSU4:

    • 这些模块是 U²-Net 架构中的中间层。RSU6, RSU5, RSU4 的主要区别在于它们的深度和感受野的大小。每个模块都比前一个模块浅一点,感受野也稍小。这些层用于提取越来越具体的特征,随着网络的深入,这些特征越来越侧重于局部细节。
  3. RSU4F (Residual U-Block 4-Full):

    • RSU4F 是一种特殊的 RSU 模块,它不使用最大池化层来减少特征图的尺寸,而是使用不同膨胀率的卷积来增大感受野(即空洞卷积),RSU4F 用于网络的深层,用于捕捉更细粒度的特征。

在 U²-Net 的结构中,这些 RSU 模块按照从 RSU7RSU4F 的顺序排列。

在编码器阶段,随着层级的增加,模块逐渐变得更浅,专注于更细节的特征提取。

在解码器阶段,这些模块的输出与对应编码器阶段的输出进行融合,通过上采样逐步恢复图像的空间维度,同时保持了特征的丰富性。

总结来说,RSU7RSU4F 的不同主要在于它们的深度(层数)和膨胀率,这影响了它们的感受野大小和特征提取的具体性。

U2NET显著性检测实战1
U2NET显著性检测实战2

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

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

相关文章

04.MySQL的基本操作

MySQL的基本操作 一、连接和断开MySQL服务器1、通过系统服务器启动、停止MySQL服务器2、通过命令提示符(DOS)启动、停止MySQL服务器2.1 启动 MySQL 服务器:2.2 停止 MySQL 服务器:2.3 登录和退出mysql 二、创建和管理数据库2.1 创…

k8s---pod基础下

k8s的pod与docker重启策略的区别 k8s的重启策略 always deployment的yaml文件只能是always,pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。OnFailure:正常退出不重启,非正常退出会重启Never:正常退出和非正常退出…

奇技淫巧:如何给项目中的RabbitMQ添加总开关

本文主要分享了如何给项目中的RabbitMQ添加总开关,通过简单配置开/关RabbitMQ。 一、需求背景 SpringBoot项目里使用了RabbitMQ,但某些场景下,不希望项目启动时自动检查RabbitMQ连接 例如: 在开发不需要RabbitMQ的功能过程中&…

Prometheus插件安装(cadvisor)

简介 当docker服务数量到一定程度,为了保证系统的文档,我们就需要对docker进行监控。一般情况下我们可以通过docker status命令来做简单的监控,但是无法交给prometheus采集,因此谷歌的cadvisor诞生了。cadvisor不仅可以轻松收集到…

【Spring进阶系列丨第六篇】Spring的Bean管理(基于注解)

文章目录 一、说明二、用于创建对象的2.1、Component注解2.1.1、定义Bean2.1.2、主配置文件配置扫描注解2.1.3、测试2.1.4、Component注解总结 2.2、Controller注解2.3、Service注解2.4、Repository注解 三、用于注入数据的3.1、Autowired注解3.1.1、定义Bean3.1.2、主配置文件…

Selenium-java元素等待三种方式

第二种方式需要写在创建driver时的代码下面 第三种则是对每个定位元素进行配置

探索Commons Exec管理外部进程

第1章:引言 咱们在日常的Java开发中,经常会遇到需要调用外部进程或命令的场景。比如说,可能需要在Java程序中启动一个外部的脚本,或者执行一个系统命令。Java虽然提供了Runtime和ProcessBuilder类来处理这类需求,但说…

Docker Linux快速安装及Nginx部署

前言 最近正在部署一套新的Linux服务器环境,基于Docker来部署所有的应用,顺便整理了一套经过验证的操作手册,以便大家遇到类似需求时,可以直接拿来用。 本文会涉及以下知识点:Docker的Linux安装和卸载、Docker用户组…

【网络安全】Nessus部署自动更新和端口权限开放

文章目录 Nessus 自动更新配置Nessus服务端口开放Nessus profession 版本需要开放端口Sensor ProxyTenable Security Center (TSC)Tenable OT Security (TOT)Tenable OT Security Enterprise Manager (IEM)Tenable OT Security Industrial Core Platform (ICP)Tenable OT Secur…

基于卷积神经网络的回归分析

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络的回归分析 完整代码:卷积神经网络的回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/…

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译,想要什么语种直接进行指定和修改就行。 环境要求,电脑内存低于8G建议不要尝试了,有无GPU都可以运行,但是有…

秋招复习之栈与队列

前言 1 栈 「栈 stack」是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等)&#xff0c…

释放创造力:可视化页面渲染引擎在低代码开发平台的应用

本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 什么是页面渲染引擎? 页面渲染引擎是低代码开发平台的核心组件之一,它负责将开发者设计的页面布局和用户…

Docker 存储卷管理

一、存储卷简介 存储卷是一种方便、灵活、高效的Docker容器内数据存储方式。存储卷可以在容器内的不同进程间共享数据,并且可以在容器之间共享和重用。 二、存储卷的优点 可以在容器之间共享和重用,避免了在不同容器之间复制数据的繁琐。对数据卷的修…

Flume基础知识(七):Flume 事务与 Flume Agent 内部原理

1. Flume 事务详解 2. Flume Agent 内部原理 重要组件: 1)ChannelSelector ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型, 分别是 Replicating(复制)和 Multiplexing(多…

linux 的直接direct io

目录 什么是 Direct IO java 支持 使用场景 数据库 反思 在之前的文章零拷贝基础上,有一个针对那些不需要在操作系统的 page cache 里保存的情况,即绕过 page cache,对于 linux 提供了 direct io 的功能。 https://blog.csdn.net/zlpzl…

芯课堂 | LVG免费开源GUI图形库

概述 本文介绍目前LVGL的应用小知识,希望对采用MCU设计UI界面的用户有所启发,开发出界面更友好的消费品或者工业产品,造福大众。 01.LVGL系统架构 LVGL系统框架 应用程序创建GUI并处理特定任务的应用程序。 LVGL本身是一个图形库。我们的…

RFID技术在3C家电中的全方位应用

RFID技术在3C家电中的全方位应用 一、RFID技术简述 射频识别(RFID)技术是一种无线通信技术,已经在各行各业得到广泛应用。在3C家电领域,RFID技术的应用正在逐渐增加,为产品追溯、库存管理、防伪验证等方面提供了许多…

运维:电脑技巧:Win10常见的网络端口大全

目录 一、什么是网络端口? 二、网络传输协议 三、常见的 TCP 和 UDP 默认端口 一、什么是网络端口? 在计算机网络中,端口是通信端点。通常,端口标识分配给它们的特定网络服务。在操作系统中,端口号的主要用途协助是…

Python从入门到网络爬虫(内置函数详解)

前言 Python 内置了许多的函数和类型,比如print(),input()等,我们可以直接在程序中使用它们,非常方便,并且它们是Python解释器的底层实现的,所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…