UNet网络

article/2025/8/23 16:37:31

UNet

本博客主要对UNet网络进行讲解,以下为文章目录:

  • UNet 原论文讲解
  • 网络结构
  • 数据集介绍
  • 评价指标
  • 损失计算
  • 代码

本文参考资料如下:

  • UNet原论文 https://arxiv.org/pdf/1505.04597.pdf
  • U-Net网络结构讲解(语义分割) https://www.bilibili.com/video/BV1Vq4y127fB/
  • 语义分割前言 https://www.bilibili.com/video/BV1ev411P7dR/
  • 转置卷积(transposed convolution) https://www.bilibili.com/video/BV1mh411J7U4
  • U-Net原理分析与代码解读 https://zhuanlan.zhihu.com/p/150579454?utm_medium=social&utm_oi=933364753825456128&utm_psn=1565058304753229824&utm_source=wechat_session
  • 使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割) https://www.bilibili.com/video/BV1rq4y1w7xM?p=1&vd_source=61b5ff132eca1d44ecddf022bf9b9def

UNet 原论文讲解

UNet原论文于2015年提出,主要影响领域是生物医学影像。

请添加图片描述

UNet网络结构

UNet网络是以Encoder-Decoder为主要形式,它的主要网络结构形式如下:

在这里插入图片描述

我们在这里展开讲解一下网络的实现形式,借助如下两个公式:

  1. 输入特征矩阵channel = 卷积核深度;输出特征矩阵channel = 卷积核个数
  2. 输出特征矩阵大小计算公式: N = ( W − F + 2 P ) / S + 1 N=(W-F+2P)/S+1 N=(WF+2P)/S+1。其中输入图片大小 W ∗ W W*W WW,卷积核大小 F ∗ F F*F FF,步长 S S S,补充(padding)像素数 P P P

conv 3x3, ReLU

在每一次下采样后都会给一个翻倍卷积核个数的卷积层,使得输出特征矩阵的channel翻倍;或者每次上采样后会给一个缩小卷积核个数的卷积层,使得输出特征矩阵的channel缩小为二分之一。

输出特征矩阵大小 = (W - 3 + 0)/1 + 1 = W -2 。 故输出特征矩阵的大小-2。(主流实现形式为(W - 3 + 2)/1 + 1 = W, 故特征矩阵大小不变,最终输出大小=最终输入大小)

可能会加上BN层。

copy and crop

进行中心裁剪后使得特征矩阵大小相等后再拼接。(

max pool 2x2

MaxPooling下采样层,使得输出特征矩阵的大小变为原先的二分之一,channel不变。但在随后的conv 3x3中channel变为两倍。

up-conv 2x2

上采样,这里采用的是转置卷积,线性插值等。经过这一层操作会使得输出矩阵大小变为原来的两倍,channel变为原来的二分之一。

conv 1x1

最后的一层卷积层没有激活函数,特征矩阵大小不变,只改变channel。

UNet 分多批次训练

对于一个医学图像,他的图片大小往往是较大的,为了能够有一个较好的预测结果,我们往往将原图进行裁剪后分批次进行训练,如下图:

在这里插入图片描述

镜像得到边缘缺失

根据UNet原论文,我们最终要预测的输出图片(下图Fig.2. 黄色框区域)是小于输入图片(下图Fig.2. 蓝色框区域)的,故我们需要对输入图片的像素进行扩充才能使得最终输出图片的大小等于输入图片的大小。我们采用进行镜像方式对原输入图进行扩充,如下所示:

在这里插入图片描述

数据集展示

对于UNet数据集如下。其中图a指的是原图片,是一种灰度图片;图b是进行标注后的图片,不同颜色代表不同细胞;图c是UNet语义分割图片,前景和背景表示细胞和非细胞;但是细胞和细胞之间空隙较小,比较难分割,所以这里采用了图d的权重标注,使得细胞间的权重增加,使得更好地分割细胞。

在这里插入图片描述

网络结构

网络结构见下:

在这里插入图片描述

(array)原始图片为image shape=(height, width, 3) dtype=dtype('uint8')label torch.size=(height, width) dtype=dtype('float64')

(tensor)经过transforms后dataset中图片为image shape=torch.size([3, 480, 480]) dtype=torch.float32label torch.size=([480, 480]) dtype=torch.int64

(tensor)经过dataloader后最前面加上了一层batch数据。

(tensor)image经过网络后输出的output shape=torch.size([4, 2, 480, 480]) dtype=torch.float32

output为两个channel,是为了在计算dice loss时,一个用来计算前景,一个用来计算背景。

数据集介绍

我们使用Drive数据集,包含20张测试图,20张验证图,用于分离眼球中血管,属于二分类问题。其中测试集中每一组测试有1张image,1张mask,1张label,我们通过自定义的dataset将mask和label合并,最终得到输出label的Tensor信息为:1表示前景,0表示背景,255表示丢弃。

评价指标

评价指标以Global Accuracy,mean Accuracy,mean IoU为主。

损失计算

损失计算以cross entropy loss和dice loss为主。将两个loss分别计算后相加。

cross entropy

我们用output和target进行cross entropy的loss计算。

# x 		= 	output: 	[4, 2, 480, 480]
# target	=    label: 	   [4, 480, 480]
loss = nn.functional.cross_entropy(x, target, ignore_index=ignore_index, weight=loss_weight)

Dice Loss

dice loss全称Dice similarity coefficient,用于度量两个集合相似性,使用交并比进行计算,计算公式如下:

请添加图片描述

需要注意的是在使用训练集的训练图片进行训练时,我们计算方法如下,我们使用矩阵乘法将对应位置的元素相乘:

请添加图片描述

但是在使用训练集的验证图片进行验证,或者使用测试集时,我们则对输出X进行0,1离散分布,再将得到的值和Y相乘。

代码实现时,通过上面描述,我们意识到在计算Dice Loss前,我们需要先得到预测前景概率矩阵和前景GT标签矩阵,所以我们先要build label,在这里我们使用one-hot编码对label处理,分别生成前景和背景的label标签[N, H, W] -> [N, H, W, C],将label的元素转成float类型后再使用permute方法调整维度[N, H, W, C] -> [N, C, H, W]。于是我们的label变为了label shape=torch.size([4, 2, 480, 480]) dtype=torch.float32,再进行dice损失计算。

代码

代码托管在github上https://github.com/yingmuzhi/artificial_intelligence/tree/master/Unet,如果要将自己的数据放在该模型上跑,

  1. 先要将你的数据按照DRIVE中的文件进行排列
  2. 重写my_dataset.py代码,使得输入Image为三通道,label为一通道。其中label中255表示mask(丢弃),1表示前景,0表示背景。

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

相关文章

U-Net网络详解

U-Net: Convolutional Networks for Biomedical Image Segmentation 原文地址:https://zhuanlan.zhihu.com/p/43927696 前言 U-Net是比较早的使用全卷积网络进行语义分割的算法之一,论文中使用包含压缩路径和扩展路径的对称U形结构在当时非常具有创新…

U-Net网络

U-Net普遍应用在生物医学影像领域,其在架构设计和其他利用卷积神经网络基于像素的图像分割方面更成功,它甚至对有限数据集的图像更有效。U-Net的命名源自它的结构,它的网络结构可视化的结果很像一个字母U。 U-NET网络性能机制 U-Net 融合了 …

【Unet系列】Unet Unet++

文章目录 U-net概述细节部分1、结构的解析2、一些小点 result Unet概述细节部分resultsummary U-net U-Net是一篇基本结构非常好的论文,主要是针对生物医学图片的分割,而且,在今后的许多对医学图像的分割网络中,很大一部分会采取…

图像分割UNet系列------UNet详解

图像分割unet系列------UNet详解 1、UNet网络结构2、UNet网络结构高性能的原因分析3、医学图像使用UNet网络结构 UNet最早发表在2015的MICCAI上,到2020年中旬的引用量已经超过了9700多次,估计现在都过万了,从这方面看足以见得其影响力。当然&…

UNet、UNet++、UNet3+系列

一、unet 简介 继承FCN的思想,继续进行改进。但是相对于FCN,有几个改变的地方,U-Net是完全对称的,且对解码器(应该自Hinton提出编码器、解码器的概念来,即将图像->高语义feature map的过程看成编码器&…

unet网络详解

Unet 参考文献:U-Net: Convolutional Networks for Biomedical Image Segmentation作者:Olaf Ronneberger, Philipp Fischer, and Thomas Brox 什么是Unet模型 Unet是一个优秀的语义分割模型,其主要执行过程与其它语义分割模型类似。与CNN…

Unet相关介绍

老师的bloghttps://zhuanlan.zhihu.com/p/370931792。写的比我这个好,233 Unet是在Fcn基础上提出的一种应用于医学影响的分割网络。医学影像的特点是1、数据集小。2、单张图片大。 由于以上医疗影像的特点,我们无法直接用Fcn进行分割学习。一个德国团队…

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

一背景介绍 背景介绍: 自2015年以来,在生物医学图像分割领域,U-Net得到了广泛的应用,目前已达到四千多次引用。至今,U-Net已经有了很多变体。目前已有许多新的卷积神经网络设计方式,但很多仍延续了U-Net的核…

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 滚动条里面的小方块,能向上向下移动(或向左向右移动…