当前位置: 首页 > news >正文

U-net和U²-Net网络详解

目录

  • U-Net: Convolutional Networks for Biomedical Image Segmentation
    • 摘要
    • U-net网络结构
    • pixel-wise loss weight
  • U²-Net: Going Deeper with Nested U-Structure for Salient Object Detection
    • 摘要
    • 网络结构详解
      • 整体结构
      • RSU-n结构
      • RSU-4F结构
      • saliency map fusion module -- 显著特征融合模块
    • 损失计算
    • 评价准则
      • F-measure
      • MAE(mean absolute error)-- 平均绝对误差
    • 实验结果

U-Net: Convolutional Networks for Biomedical Image Segmentation

论文链接:U-Net: Convolutional Networks for Biomedical Image Segmentation(MICCAI 2015)

摘要

(1)本文提出了一种网络和训练策略,它依赖于大量使用数据增强来更有效地使用可用的带注释样本。

(2)网络架构由一条用于捕获上下文信息的路径(contracting path)和一条用于实现精确定位的路径(expanding path)组成。

(3)这种网络可以从很少的图像中进行端到端训练,并且在当时达到很好的效果。此外,该网络速度在当时分割 512x512 图像只需不到一秒钟。

U-net网络结构

U-net网络结构图如下

左侧为contracting path,主要作用是进行特征提取以及下采样,通常被视为encoder。

右侧则为expansive path,通常被视为decoder。

图中的条形矩阵代表特征层,箭头代表操作(如图中右下红框所示)。

image-20240710150032662

在U-net的卷积操作中stride = 1,padding = 0,因此卷积后图像宽和高都会变小。

当时BN层还没发展起来,所以还没使用BN模块。

执行流程:

contracting path:

首先,输入的是单通道的572 × 572图像。

下采样不改变通道数,但是每次下采样之后经过的第一个卷积层都会使通道数翻倍。

expansive path:

上采样使用的是转置卷积,宽和高都放大两倍,同时通道数减半。

灰色箭头(copy and crop)主要执行的是concat操作,但是由于宽高不同,因此会对左侧的特征图进行中心裁剪再执行concat操作

右侧通道数减半的操作在上采样和上采样后的第一个卷积层中都会执行,因为在上采样减半后concat会恢复原来的维度,然后再通过卷积层降维。

最后输出部分,墨绿色的1 × 1卷积层的卷积核个数和分类的类别个数一样,并且没有经过relu层。因为论文中只有前景和背景两个类别,因此最后的特征图是388 × 388 × 2。

注意:

论文中输入为572 × 572,但是输出为388 × 388,因此只是得到原图中间部分的分割结果。

实际实现通常在左侧的卷积层中加入padding,不会改变宽和高,这样在concat的时候就不用使用中心裁剪,并且最终结果特征图宽高和输入是一致的。同时,现在实现还会在conv 3 × 3 和Relu中间加入 BN层。

pixel-wise loss weight

图中c是当作ground truth用来计算损失,而实际做细胞分割的过程,对于细胞和细胞间的间隙(图中相邻白色区域的黑色间隙)进行分割是很困难的,而图c中大面积黑色区域则是很容易区分的,因此提出了pixel-wise loss weight方案。

对于细胞的间隙在计算损失的时候给予更大的权重,而大片的背景区域施加比较小的权重,图中d热力图所示就是权重分布,蓝色(0)到红色(10)权重逐渐增大,但是该方法在论文中并没有进行消融实验,而只是提到了对模型训练会有帮助。

image-20240710150928124


U²-Net: Going Deeper with Nested U-Structure for Salient Object Detection

论文链接:U²-Net: Going Deeper with Nested U-Structure for Salient Object Detection(CVPR 2020)

U²-Net是针对Salient Object Detetion(SOD)即显著性目标检测任务提出的。该任务虽然是检测任务,但是和语义分割十分类似,它的任务是将图片中最吸引人的目标或区域分割出来,故只有前景和背景两个类别。

摘要

(1)本文设计了一个简单但功能强大的深度网络架构U²-Net,用于显著物体检测(SOD)。

(2)网络架构由两级嵌套的U型结构组成,其设计具有以下优点:

  • ReSidual Block(RSU)中具有不同大小的感受野,它能够从不同尺度捕获更多上下文信息;
  • RSU块中使用了池化操作,增加了整个架构的深度,但却不会显著增加计算成本;
  • 这种架构能够从头开始训练深度网络,而无需使用来自图像分类任务的主干。

网络结构详解

整体结构

下图展示U²-Net的整体结构。主体是一个类似U-Net的结构,而网络中的每个block(无论是Encoder还是Decoder模块)内部也是类似U-Net结构,因此该网络也取名为U²-Net。

总体介绍:

在encoder中每经过一个block后都要进行下采样,下采样2×通过maxpool实现。

在decoder中每经过一个block前都要进行上采样,通过双线性插值(bilinear)实现。

每个阶段的预测输出进行融合,得到融合之后的预测概率图。

image-20240710161413800

通过上图可以看出,En_1、En_2、En_3、En_4、De_1、De_2、De_3、De_4采用的是同一种Block,只不过深度不同。该Block就是论文中提出的ReSidual U-block简称RSU。

RSU-n结构

下图是RSU-7结构,其中7代表深度,注意最下面的3 x 3卷积采用的是膨胀卷积,膨胀因子为2。

image-20240710162007010

image-20240710162134034

其中En_1和De_1采用的是RSU-7,En_2和De_2采用的是RSU-6,En_3和De_3采用的是RSU-5,En_4和De_4采用的是RSU-4,区别就是下采样的倍率不同,RSU-7最多下采样32×,RSU-6最多下采样16×,以此类推。

而En_5、En_6和De_5三个模块采用的是RSU-4F,RSU-4F和RSU-4两者结构并不相同

RSU-4F结构

下图是RSU-4F的结构图,在RSU-4F中并没有进行下采样或上采样,而是将采样层全部替换成了膨胀卷积,下图中带参数d的卷积层全部是膨胀卷积,d为膨胀系数。

image-20240710163106123

注意:在En_5、En_6和De_5三个block内部的操作中,通过控制膨胀系数d,特征图的宽和高是没有发生变化的。

为什么在在En_5、En_6和De_5中不进行采样?

通过Encoder_4这个block之后特征图的尺寸就已经比较小了,如果再进行下采样会丢失很多上下文信息,所以在En_5、En_6和De_5这三个block中就不再进行下采样了,而是将采样层(上采样和下采样)全部替换成了膨胀卷积。

saliency map fusion module – 显著特征融合模块

通过该模块将不同阶段得到的不同尺度的saliency map进行融合并得到最终预测概率图。

执行流程:

  1. 首先收集De_1、De_2、De_3、De_4、De_5以及En_6的输出,然后分别通过一个3 x 3的卷积层(图中白色箭头),这些卷积层的卷积核个数都为1,因此得到的特征图channel都为1;
  2. 然后通过双线性插值进行缩放,把feature map的大小还原成输入图片大小,得到Sup1、Sup2、Sup3、Sup4、Sup5和Sup6;
  3. 接着将这6个特征图进行Concat拼接,得到channel = 6的特征图;
  4. 最后经过一个1 x 1的卷积层以及Sigmiod激活函数得到最终的预测概率图。

image-20240710164211462

损失计算

下面是原论文中给出的损失函数,l代表二值交叉熵损失,w代表每个损失的权重。

image-20240710164713343

该损失函数可以看成两部分,红色框中通过上面提到的Sup1、Sup2、Sup3、Sup4、Sup5和Sup6计算。首先要将Sup1、Sup2、Sup3、Sup4、Sup5和Sup6通过Sigmoid激活函数得到对应的预测概率图,然后与手工标注的ground truth计算lM=6即Sup1至Sup6。。

蓝色框表示最终融合得到的预测概率图S_fuse与ground truth之间的损失,在源码中红色框中的六个w以及蓝色框中的w全部都等于1。

评价准则

F-measure

F-measure是结合了Precision和Recall的综合指标,计算公式如下

image-20240710165740094

最终结果在0-1之间,其中F_β越大,表示网络的分割效果越好。

注意:对于不同的阈值,会得到不同的precision和recall,因此实际得到的F_β是一个数组,而最终报告的指标就是max(F_β),即取数组中的最大值作为评价指标,在源码中β² = 0.3。

MAE(mean absolute error)-- 平均绝对误差

MAE计算公式如下:

image-20240710165837335

最终结果在0-1之间,MAE越接近0表示网络性能越好。

其中P(r,c)代表网络预测的概率图,G(r,c)代表真实的GT,H和W分别代表图片的高和宽。对于输入图中的每个像素点,用网络预测的概率图和ground truth进行相减得到绝对值,然后求得全图像素的平均损失。

实验结果

下图展示了当年SOD任务中最先进的一些公开网络在ECSSD数据集上的max{F_β}性能指标。通过对比,U²-Net无论是在模型size上还是max{F_β}指标上都优于其他网络。

图中红色的五角星代表的是标准的U²-Net(176.3 MB),蓝色的五角星代表轻量级的U²-Net(4.7 MB),效果都十分显著。

image-20240710170559643

下图是具体结果对比。

  • 第一列为原图;
  • 第二列为人工标注的ground truth;
  • 第三列为U²-net标准版的预测结果;
  • 第四列为轻量级U²-net的预测结果;
  • 第五列及其之后的就是当年其他显著性目标检测网络的预测结果。

从图中可以明显看出U²-net的分割精细程度更高,效果很好。

image-20240710170500767

相关文章:

U-net和U²-Net网络详解

目录 U-Net: Convolutional Networks for Biomedical Image Segmentation摘要U-net网络结构pixel-wise loss weight U-Net: Going Deeper with Nested U-Structure for Salient Object Detection摘要网络结构详解整体结构RSU-n结构RSU-4F结构saliency map fusion module -- 显著…...

Vue3 引入腾讯地图 包含标注简易操作

1. 引入腾讯地图API JavaScript API | 腾讯位置服务 (qq.com) 首先在官网注册账号 并正确获取并配置key后 找到合适的引入方式 本文不涉及版本操作和附加库 据体引入参数参考如下图 具体以链接中官方参数为准标题 在项目根目录 index.html 中 写入如下代码 <!-- 引入腾…...

迅狐抖音机构号授权矩阵系统源码

在数字化营销的浪潮中&#xff0c;抖音以其独特的短视频形式迅速崛起&#xff0c;成为品牌传播和用户互动的重要平台。迅狐抖音机构号授权矩阵系统源码作为一项创新技术&#xff0c;为品牌在抖音上的深度运营提供了强大支持。 迅狐抖音机构号授权矩阵系统源码简介 迅狐抖音机…...

数据库系统原理练习 | 作业2-第2章关系数据库(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二、填空题 三、简答题 四、关系代数 1.课本p70页&…...

有向图的强连通分量——AcWing 367. 学校网络

有向图的强连通分量 定义 强连通分量(Strongly Connected Components, SCC) 是图论中的一个概念&#xff0c;在一个有向图中&#xff0c;如果存在一个子图&#xff0c;使得该子图中的任意两个顶点都相互可达&#xff08;即从任何一个顶点出发都可以到达该子图中的其他任何顶点…...

安全开发--多语言基础知识

注释&#xff1a;还是要特别说明一下&#xff0c;想成为专业开发者不要看本文&#xff0c;本文是自己从业安全以来的一些经验总结&#xff0c;所有知识点也只限于网络安全这点事儿&#xff0c;再多搞不明白了。 开发语言 笼统的按照是否编译成机器码分类开发语言&#xff0c;…...

如何使一个盒子水平垂直居中(常用的)

目录 1. 使用Flex布局 2. 使用Grid布局 3.绝对定位 负外边距 (必须知晓盒子的具体大小) 4.绝对定位外边距 auto 5.绝对定位 transform (无须知晓盒子的具体大小) 1. 使用Flex布局 如何实现&#xff1a; 在父元素上添加&#xff1a; display: flex; align-items: center…...

安全防御-用户认证综合实验

一、拓扑图 二、实验要求 1、DMZ区的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9:00-18:00&#xff09;可以访问&#xff0c;生产区设备全天都是可以访问的 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.20不允许访…...

uniapp安卓离线打包配置scheme url

uniapp安卓离线打包配置scheme url 打开 AndroidManifest.xml 搜索 scheme 填入 即可 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"uni.UNI979A394…...

C++ STL std::lexicographical_compare用法和实现

一&#xff1a;功能 按字典顺序比较两个序列&#xff0c;判断第一个序列是否小于(或大于)第二个序列 二&#xff1a;用法 #include <compare> #include <vector> #include <string> #include <algorithm> #include <iostream> #include <fo…...

ORM Bee,如何使用Oracle的TO_DATE函数?

ORM Bee,如何使用Oracle的TO_DATE函数? 在Bee V2.4.0,可以这样使用: LocaldatetimeTable selectBeannew LocaldatetimeTable();Condition conditionBF.getCondition();condition.op("localdatetime", Op.ge, new TO_DATE("2024-07-08", "YYYY-MM-DD&…...

HTML CSS 基础复习笔记 - 框架、装饰、弹性盒子

自己复习前端基础&#xff0c;仅用于记忆&#xff0c;初学者不太适合 示例代码 - HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…...

C++:创建线程

在C中创建线程&#xff0c;最直接的方式是使用C11标准引入的<thread>库。这个库提供了std::thread类&#xff0c;使得线程的创建和管理变得简单直接。 以下是一个简单的示例&#xff0c;展示了如何在C中使用std::thread来创建和启动线程&#xff1a; 示例1&#xff1a;…...

python如何查看类的函数

Python非常方便&#xff0c;它不需要用户查询文档&#xff0c;只需掌握如下两个帮助函数&#xff0c;即可查看Python中的所有函数&#xff08;方法&#xff09;以及它们的用法和功能&#xff1a; dir()&#xff1a;列出指定类或模块包含的全部内容&#xff08;包括函数、方法、…...

P6. 对局列表和排行榜功能

P6. 对局列表和排行榜功能 0 概述1 对局列表功能1.1 分页配置1.2 后端按页获取对局列表接口1.3 前端展示传回来的对局列表1.4 录像回放功能1.4.1 录像回放的流程1.4.2 录像回放的实现 1.5 前端分页展示 2 排行榜功能2.1 排行榜的实现 0 概述 本节主要介绍了如何实现对局列表和…...

uniapp easycom组件冲突

提示信息 ​easycom组件冲突&#xff1a;[/components/uni-icons/uni-icons.vue,/uni_modules/uni-icons/components/uni-icons/uni-icons.vue]​ 问题描述 老项目&#xff0c;在uniapp插件商城导入了一个新的uniapp官方开发的组件》uni-data-picker 数据驱动的picker选择器 …...

总结24个Python接单赚钱平台与详细教程,兼职月入5000+

如果说当下什么编程语言最靠谱或者比较适合搞副业&#xff1f; 答案肯定100%是&#xff1a;Python。 python是所有语法中最简单易上手的语言&#xff0c;不需要特别的的英语词汇量&#xff0c;逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据&#xf…...

macOS 的电源适配器设置

在 macOS 的电源适配器设置中&#xff0c;有四个选项&#xff0c;每个选项都有特定的功能&#xff1a; Prevent your Mac from automatically sleeping when the display is off&#xff08;当显示屏关闭时&#xff0c;防止你的 Mac 自动进入睡眠状态&#xff09;&#xff1a;…...

视觉SLAM与定位之一前端特征点及匹配

视觉SLAM中的特征点及匹配 参考文章或链接特征点性能的评估传统特征点和描述子&#xff08;仅特征点或者特征点描述子&#xff09;传统描述子 基于深度学习的特征点基于深度学习的描述子基于深度学习的特征点描述子特征匹配 参考文章或链接 Image Matching from Handcrafted t…...

开源项目的认识理解

目录 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 2.开源的经验分享&#xff08;向大佬请教与上网查询&#xff09; 3.开源项目的挑战 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 1. 持续增长与普及 - 开源项目将继续增长&#xff0c…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...