UNET详解和UNET++介绍(零基础)

article/2025/8/24 8:02:36

一·背景介绍

  1. 背景介绍:
    自2015年以来,在生物医学图像分割领域,U-Net得到了广泛的应用,目前已达到四千多次引用。至今,U-Net已经有了很多变体。目前已有许多新的卷积神经网络设计方式,但很多仍延续了U-Net的核心思想,加入了新的模块或者融入其他设计理念。

    编码和解码,早在2006年就发表在了nature上.当时这个结构提出的主要作用并不是分割,而是压缩图像和去噪声.后来把这个思路被用在了图像分割的问题上,也就是现在我们看到的FCN或者U-Net结构,在它被提出的三年中,有很多很多的论文去讲如何改进U-Net或者FCN,不过这个分割网络的本质的结构是没有改动的, 即下采样、上采样和跳跃连接。

  2. 医学图像特点:
    (1)图像语义较为简单、结构较为固定。我们做脑的,就用脑CT和脑MRI,做胸片的只用胸片CT,做眼底的只用眼底OCT,都是一个固定的器官的成像,而不是全身的。由于器官本身结构固定和语义信息没有特别丰富,所以高级语义信息和低级特征都显得很重要。

    (2)数据量少。医学影像的数据获取相对难一些,很多比赛只提供不到100例数据。所以我们设计的模型不宜多大,参数过多,很容易导致过拟合。
    (原始UNet的参数量在28M左右(上采样带转置卷积的UNet参数量在31M左右),而如果把channel数成倍缩小,模型可以更小。缩小两倍后,UNet参数量在7.75M。缩小四倍,可以把模型参数量缩小至2M以内)非常轻量。个人尝试过使用Deeplab v3+和DRN等自然图像语义分割的SOTA网络在自己的项目上,发现效果和UNet差不多,但是参数量会大很多。

    (3)多模态。相比自然影像,医疗影像是具有多种模态的。以ISLES脑梗竞赛为例,其官方提供了CBF,MTT,CBV,TMAX,CTP等多种模态的数据。比如CBF是脑血流量,CBV用于检测巨细胞病毒的。
    在这里插入图片描述
    (4)可解释性重要。由于医疗影像最终是辅助医生的临床诊断,所以网络告诉医生一个3D的CT有没有病是远远不够的,医生还要进一步的想知道,病在哪一层,在哪一层的哪个位置,分割出来了吗,能不能求体积。

  3. 图像分割是什么?
    简单的来讲就是给一张图像,图像分割出一个物体的准确轮廓。也这样考虑,给出一张图像 I,这个问题就是求一个函数,从I映射到Mask。求这个函数有很多方法,但是第一次将深度学习结合起来的是全卷积网络(FCN),利用深度学习求这个函数。
    在这里插入图片描述

二·全卷积网络(FCN)

很多分割网络都是基于FCN做改进,我们先介绍FCN的内容。

  1. FCN介绍:
    FCN是深度学习在图像分割的开山之作。在此之前深度学习一般用在分类和检测问题上。由于用到CNN,所以最后提取的特征的尺度是变小的。和我们要求的函数不一样,我们要求的函数是输入多大,输出有多大。经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出),FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,最后在上采样的特征图上进行逐像素分类。解决了语义级别的图像分割问题。由于网络中只有卷积没有全连接,所以这个网络又叫全卷积网络。
    在这里插入图片描述
    在这里插入图片描述

  2. FCN框架:
    输入原图,得到五次池化后的特征图,然后将特征map上采样回去。再将预测结果和ground truth每个像素一一对应分类,做像素级别分类。也就是说将分割问题变成分类问题,而分类问题正好是深度学习的强项。如果只将特征map直接上采样或者反卷积,明显会丢失很多信息。FCN采取解决方法是将pool4、pool3、和特征map融合起来,由于pool3、pool4、特征图大小尺寸是不一样的,所以融合前应该上采样到同一尺寸。这里的融合对应元素相加。
    在这里插入图片描述

  3. 反卷积层:
    反卷积层也是卷积层。乍看一下好像反卷积和卷积的工作过程差不多,主要的区别在于反卷积输出图片的尺寸会大于输入图片的尺寸,通过增加padding来实现这一操作。
    在这里插入图片描述
    在这里插入图片描述

  4. 输入图片大小任意:
    首先,我们来看传统CNN为什么需要固定输入图片大小。
    对于CNN,一幅输入图片在经过卷积和pooling层时,这些层是不关心图片大小的。比如对于一个卷积层,,它并不关心inputsize多大,pooling层同理。但是在进入全连接层时,feature map(假设大小为n×n)要拉成一条向量,而向量中每个元素(共n×n个)作为一个结点都要与下一个层的所有结点(假设4096个)全连接,这里的权值个数是4096×n×n,而我们知道神经网络结构一旦确定,它的权值个数都是固定的,所以这个n不能变化,n是conv5的outputsize,所以层层向回看,每个outputsize都要固定,因此输入图片大小要固定。
    而全卷积是没有全连接层的,所以不要求输入图片大小固定。
    在这里插入图片描述

  5. 分割效果:
    FCN优点是实现端到端分割。输入是原始数据输出是最终结果,缺点是分割结果细节不够好,可以看到FCN8s是上面讲的pool4、pool3和特征图融合,FCN16s是pool4和特征map融合,FCN32s是只有特征map,得出结果都是细节不够好,具体可以看自行车。
    作者还尝试了结合pool2发现效果并没有提升。
    在这里插入图片描述

三·UNET

  1. 网络架构:
    Unet包括两部分,可以看右图,第一部分,特征提取,VGG类似。第二部分上采样部分。由于网络结构像U型,所以叫Unet网络。特征提取部分,每经过一个池化层就一个尺度,包括原图尺度一共有5个尺度。上采样部分,每上采样一次,就和特征提取部分对应的通道数相同尺度融合,但是融合之前要将其crop。这里的融合是拼接。可以看到,输入是572x572的,但是输出变成了388x388,这说明经过网络以后,输出的结果和原图不是完全对应的。
    蓝色箭头代表3x3的卷积操作,并且stride是1,padding策略是vaild,因此,每个该操作以后,featuremap的大小会减2。红色箭头代表2x2的maxpooling操作,需要注意的是,此时的padding策略也是vaild,这就会导致如果pooling之前featuremap的大小是奇数,会损失一些信息 。所以要选取合适的输入大小,因为2*2的max-pooling算子适用于偶数像素点的图像长宽。绿色箭头代表2x2的反卷积操作,这个只要理解了反卷积操作,就没什么问题,操作会将featuremap的大小乘2。灰色箭头表示复制和剪切操作,可以发现,在同一层左边的最后一层要比右边的第一层要大一些,这就导致了,想要利用浅层的feature,就要进行一些剪切。
    输出的最后一层,使用了1x1的卷积层做了分类。最后输出了两层是前景和背景
    在这里插入图片描述

  2. valid卷积:
    这三种不同模式是对卷积核移动范围的不同限制。full mode,橙色部分为image, 蓝色部分为filter。full模式的意思是,从filter和image刚相交开始做卷积,白色部分为填0。same mode,当filter的中心(K)与image的边角重合时,开始做卷积运算,可见filter的运动范围比full模式小了一圈。注意:这里的same还有一个意思,卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。same模式也是最常见的模式,因为这种模式可以在前向传播的过程中让特征图的大小保持不变,调参不需要精准计算其尺寸变化(因为尺寸根本就没变化)。
    valid mode,当filter全部在image里面的时候,进行卷积运算,可见filter的移动范围较same更小了。

    full mode:
    full mode same mode:
    same modevalid mode:
    valid mode

  3. overlap-tile策略:
    医学图像是一般相当大,分割时候不可能将原图直接输入网络,所以用一个滑动窗口把原图扫一遍,使用原图的切片进行训练或测试。可以看图,红框是要分割区域。但是在切图时要包含周围区域,overlap另一个重要原因是周围overlap部分可以为分割区域边缘部分提供纹理等信息。
    这样的策略会带来一个问题,图像边界的图像块没有周围像素,卷积会使图像边缘处的信息丢失。因此作者对周围像素采用了镜像扩充。下图中红框部分为原始图片,其周围扩充的像素点均由原图沿白线对称得到。这样,边界图像块也能得到准确的预测。
    另一个问题是,这样的操作会带来图像重叠问题,即第一块图像周围的部分会和第二块图像重叠。因此作者在卷积时只使用有效部分。我理解的是使用valid卷积和crop裁剪,最终传到下一层的只有中间原先图像块(黄色框内)的部分。
    在这里插入图片描述

  4. 弹性变换:
    由于深度神经网络具有非常强的学习能力,如果没有大量的训练数据,会造成过拟合,训练出的模型难以应用。因此对于一些没有足够样本数量的问题,可以通过已有的样本,对其进行变换,人工增加训练样本。常用的增加训练样本的方法主要有对图像进行旋转、位移等仿射变换,也可以使用镜像变换。,这里介绍弹性变换。该算法最开始应用在mnist手写体数字识别数据集中,发现对原图像进行弹性变换的操作扩充样本以后,对于手写体数字的识别效果有明显的提升。
    因为unet论文的数据集是细胞组织的图像,细胞组织的边界每时每刻都会发生不规则的畸变,所以采用弹性变形的增广是非常有效的。
    下面来详细介绍一下算法流程:
    弹性变化是对像素点各个维度产生(-1,1)区间的随机标准偏差,用高斯滤波对各维度的偏差矩阵进行滤波,最后用放大系数控制偏差范围。 因而由A(x,y)得到的A’(x+delta_x,y+delta_y)。A‘的值通过在原图像差值得到,A’的值充当原来A位置上的值。
    图显示的是在固定的n下不同高斯标准差的结果,第二个图的形变效果是最合适的。
    在这里插入图片描述

  5. 损失函数:
    损失函数首先是用了个pixel-wise softmax,就是每个像素对应的输出单独做softmax,也就是做了w*h个softmax。
    其中,x可以看作是某一个像素点, l(x)表示x这个点对应的类别label,pk​(x)表示在x这个点的输出在类别k的softmax的激活值,pl(x)​(x)代表什么呢?根据前面的说明就可以推断出来:点x在对应的label给出的那个类别的输出的激活值。
    正常的交叉熵定义如第一个公式,可以发现两个公式的意义其实是相同的,后面的公式在外面把非label对应的结果乘0了。
    在这里插入图片描述
    在这里插入图片描述

剩下的就是w(x)定义的式子。d1,d2分别是像素点最近和第二近的细胞的距离。这个权重可以调整图像中某个区域的重要程度。细胞组织图像的一大特点是,多个同类的细胞会紧紧贴合在一起,其中只有细胞壁或膜组织分割,因此,作者在计算损失的过程中,给两个细胞重合的边缘部分增加了损失的权重,以此让网络更加注重这类重合的边缘信息。实际情况中,是需要自己根据应用情况来设计或调整这个权重的。
在这里插入图片描述
图中的a是raw image,b是ground truth segmentation,c 是生成的分割掩码,白色是前景,黑色是背景。d是增加了像素级的loss权重后,让网络对边界像素进行了更好的学习的结果。
在这里插入图片描述

四·unet++

  1. 提出问题:
    第一个问题:既然输入和输出都是相同大小的图,为什么要折腾去降采样一下再上采样呢?
    降采样的理论意义是,它可以增加对输入图像的一些小扰动的鲁棒性,比如图像平移,旋转等,减少过拟合的风险,降低运算量,增加感受野的大小。上采样的最大的作用其实就是把抽象的特征再还原解码到原图的尺寸,最终得到分割结果。
    对于特征提取阶段,浅层结构可以抓取图像的一些简单的特征,比如边界,颜色,而深层结构因为感受野大了,而且经过的卷积操作多了,能抓取到图像的一些抽象特征。
    第二个问题:既然unet每一层抓取的特征都很重要,为什么非要降四次之后才开始上采样回去呢?

  2. 网络深度:
    提出疑问后, 为了验证多深才好,每加一个深度就训练一个网络,分别用了两个数据集:Electron Microscopy 和 Cell,然后测它们各自的分割表现,先不要看后两个UNet++,就看这个不同深度的U-Net的表现(黄色条形图),我们可以看出,不是越深越好,它背后的传达的信息就是,不同层次特征的重要性对于不同的数据集是不一样的,并不是说设计一个原论文给出的那个结构,就一定对所有数据集的分割问题都最优。
    不同数据集的最优的深度是不一样的, 但是总不能把所有不同深度的U-Net都训练一遍,太耗时间了,于是提出unet++
    在这里插入图片描述
    在这里插入图片描述

  3. 模型架构:
    这个综合长连接和短连接的架构就是UNet++。
    UNet++的优势是可以抓取不同层次的特征,将它们通过特征叠加的方式整合,加入更浅的U-Net结构,使得融合时的特征图尺度差异更小。
    UNet++同时也引进了很多参数,占用内存也变大。

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_41105449/article/details/106651278


http://chatgpt.dhexx.cn/article/Apnbtluq.shtml

相关文章

UNet - unet网络

目录 1. u-net介绍 2. u-net网络结构 3. u-net 网络搭建 3.1 DoubleConv 3.2 Down 下采样 3.3 Up 上采样 3.4 网络输出 3.5 UNet 网络 UNet 网络 forward 前向传播 3.6 网络的参数 4. 完整代码 1. u-net介绍 Unet网络是医学图像分割领域常用的分割网络&#xff0…

UNet 浅析

文章目录 1. UNet 简介2. UNet 详解3. 代码实例 - 医学图像分割 (ISBI数据集)【参考】 1. UNet 简介 UNet 属于 FCN 的一种变体,它可以说是最常用、最简单的一种分割模型,它简单、高效、易懂、容易构建,且可以从小数据集中训练。2015 年&…

unet 网络结构

unet 是15年提出的用于解决医学图像分割问题。unet有两部分组成。左边部分可以看出是特征提取网络,用于提取图像的抽象特征。右边可以看作是特征融合操作。与传统的FCN相比,unet使用是使用特征拼接实现特征的融合。unet 通过特征融合操作,实现了浅层的低分辨率(越底层的信息…

unet模型及代码解析

什么是unet 一个U型网络结构,2015年在图像分割领域大放异彩,unet被大量应用在分割领域。它是在FCN的基础上构建,它的U型结构解决了FCN无法上下文的信息和位置信息的弊端 Unet网络结构 主干结构解析 左边为特征提取网络(编码器&…

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

UNet的编解码结构一经提出以来,大有统一深度学习图像分割之势,后续基于UNet的改进方案也经久不衰,一些研究者也在从网络结构本身来思考UNet的有效性。比如说编解码网络应该取几层,跳跃连接是否能够有更多的变化以及什么样的结构训…

【Unet系列】(三)Unet++网络

一、UNet整体网络结构 Unet主要是探索encoder和decoder需要多大的问题,以此为基础,提出了融合不同尺寸Unet结构的网络。创新点就是把不同尺寸的Uent结构融入到了一个网络里。 二、结构的好处 (1)不管哪个深度的特征有效&#…

深度学习零基础学习之路——第四章 UNet-Family中Unet、Unet++和Unet3+的简介

Python深度学习入门 第一章 Python深度学习入门之环境软件配置 第二章 Python深度学习入门之数据处理Dataset的使用 第三章 数据可视化TensorBoard和TochVision的使用 第四章 UNet-Family中Unet、Unet和Unet3的简介 第五章 个人数据集的制作 Unet-Family的学习 Python深度学习…

憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台

憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台 注意事项学习前言什么是Unet模型代码下载Unet实现思路一、预测部分1、主干网络介绍2、加强特征提取结构3、利用特征获得预测结果 二、训练部分1、训练文件详解2、LOSS解析 训练自己的Unet模型一、数据集的准备二、…

UNet详解(附图文和代码实现)

卷积神经网络被大规模的应用在分类任务中,输出的结果是整个图像的类标签。但是UNet是像素级分类,输出的则是每个像素点的类别,且不同类别的像素会显示不同颜色,UNet常常用在生物医学图像上,而该任务中图片数据往往较少…

条纹进度条

最开始学习qml的时候,想实现一个条纹进度条,当时还不熟悉动画,做不出来,只做了个静止的。qml学习和使用了快1年之际,把这个遗憾弥补下。 先上效果图,颜色取自Bootflat。 以下是源码,先上Stripe…

数据批量插入与逐条插入分析

简述 今天抽空做了一下使用Jdbc对数据操作的实际性能。在平时开发过程中我们经常会使用Hibernate来操作数据库,所以我们很少会去使用批量插入数据。一般都是通过hibernate的insert、addSave等方法来一条条地插入数据。所以很少去考虑这个问题。下面是针对Jdbc进行的…

css滚动条

此部分针对webkit内核的浏览器,使用伪类来改变滚动条的默认样式,详情如下: 滚动条组成部分 1. ::-webkit-scrollbar 滚动条整体部分2. ::-webkit-scrollbar-thumb 滚动条里面的小方块,能向上向下移动(或向左向右移动…

计算机组成原理(五)-一条指令是怎么被执行的

什么是指令: 程序代码的本质就是一条一条的指令,我们需要通过编码的方式让CPU知道我们需要它干什么,最后由译码器翻译成一条条的机器指令。机器指令主要有两部分组成:操作码、地址码。地址码直接给出操作数和操作数的地址&#x…

CSS 斜条纹进度条动画

这是第一版进度条 ,用css写的.但是后续因为数据不同,要显示不同的颜色和数据,所以又改了一版,直接用的el-progress.自定义的样式.对于新手小白来说比较友好.先上这一版代码. <div class"state"><span>开机时间</span><!-- 进度条 --><div…

Acrobat DC 更改背景颜色会有一条条白色横纹

解决方法如下&#xff1a; 编辑->首选项->页面显示->取消 使用2D图形加速

turtle模块还能这样玩?(一条条金龙鱼、雨景)

文章目录 一条条金龙鱼雨景 Python的turtle模块不仅可以用来绘制一些基本的图形&#xff0c;还有与图片结合&#xff0c;做出一些特殊的效果&#xff0c;还可以用来做二维小游戏。本篇是介绍用turtle模块做出的一幅动态的鱼儿游过的画面和动态的雨景图 一条条金龙鱼 1、先看一…

2.Python # 代码注释

2. # 代码注释 文章目录 2. # 代码注释1. 什么是代码注释2. 注释语法3. 注释位置1. 注释在代码的上一行2. 注释在代码的末端 4. 课堂练习 1. 什么是代码注释 代码注释即对代码进行批注说明。 相当于给一个英文单词批注中文释义。 【温馨提示】注释是给程序员自己看的&#xf…

python:导入第三方库greenlet,gevent方法

greenlet&#xff0c;gevent greenlet&#xff0c;gevent是python支持的第三方库&#xff0c;它们可以帮助我们完成协程的使用&#xff0c;其中greenlet是手动调换方式&#xff08;switch方法&#xff09;&#xff0c;gevent是自动调换方式&#xff08;遇到IO操作&#xff09;…

python gevent使用

对大部分语言来说&#xff0c;经常用到并发来处理一些情况。比如必须要多次查询数据库&#xff0c;多次请求API&#xff0c;python内置的gevent就很简单好用。传参&#xff0c;获取返回值&#xff0c;捕获协程的错误都很方便。 直接上例子&#xff1a; import gevent as gevent…

指定Geany使用的Python版本

本文介绍&#xff1a; 在win7下配置Geany,使其使用 Python 3 因为电脑上安装了不同版本的Python&#xff0c;需要根据实际情况来进行版本切换。 第一步&#xff1a;首先点击"生成"按钮的三角箭头&#xff0c;再点击"设置生成命令" 第二步&#xff1a;在弹出…