UNet语义分割模型的使用-Pytorch

unet模型及代码解析 什么是unet 一个U型网络结构,2015年在图像分割领域大放异彩,unet被大量应用在分割领域。它是在FCN的基础上构建,它的U型结构解决了FCN无法上下文的信息和位置信息的弊端(下文细说) Unet网络结构 主干结构解析 左边为特征提取网络,右边为特征融合网络 特征提取网络 由两个3x3的卷积层(RELU)再加上一个2x2的maxpooling层组成一个下采样的模块,一共经过4次这样的操作 特征融合网络 由一层反卷积+特征拼接concat+两个3x3的卷积层(ReLU)反复构成,一共经过4次这样的操 阅读详情
AI摘要

本文介绍了作者在学习和实现UNet模型的过程,该模型常用于语义分割任务。作者详细解析了UNet的U形结构,包括编码和解码过程,以及关键组件如卷积块、最大池化和上采样。同时,文章提供了数据加载和模型构建的Pytorch代码,并展示了训练过程和部分训练结果。

1.概述

最近有时间,跑了一下UNet模型,因为自己的深度学习基础不扎实,导致用了一些时间。目前只停留在使用和理解别人模型的基础上,对于优化模型的相关方法还有待学习。
众所周知,UNent是进行语义分割的知名模型,它的U形结构很多人也都见过,但是如果自己没有亲自试过的话,也就只知道它的U形结构,其实里面还是有很多学问的,下面就把自己学习时候的一些理解写一下。
最后会拿个完整代码作为例子(实际上自己练习了两个比较成功的例子)

2.UNet模型理解

先放UNet模型的图,然后介绍再Pytorch相关实现的函数。
UNet模型
一般看到这个图,都会看到它从左边逐渐编码,到最底端,之后从底端不断解码,恢复为一张图像。但是很多人会忽略中间的从左往右的三条灰色的直线,这是它把一个图像处理为目标图像的一个关键。
从图中理解,Unet模型可以分为几个关键的部分
①ConvBlock():也就是U形结构左边在这里插入图片描述的这一部分,当然也包括下面和它很相似的三个,他们都是(卷积-激活-卷积-激活),这也就是图像从572×572变成568×568的原因,实际上就是卷积过程中边界设定的问题。
②MaxPool2d():然后紧接者就是红色箭头了在这里插入图片描述,它就是池化,把卷积后的特征筛选出来,这是图像尺寸急剧下降的原因。
接着①和②步骤重复了4次。得到了一个512维,32×32的图片。当然有的模型为了简化,这个步骤只进行了3次,实际上也能取得不错的效果。
最后它又进行了一次①,成功把图像变成1024维度,30×30,图像特征被压缩在了这样的一个信息里面了。
下面就是U形结构的右侧上升部分了,总之就是把刚才被压缩的信息展开,结合一步步压缩过程的中间图像(灰色箭头),把图像还原成想要的样子。
这里主要用到了下面的函数
③ConvBlock():和①一模一样,只不过,①是把维度逐渐变大也就是从3变成1024,而在经过4次③之后,1024变成了1
④在这里插入图片描述ConvTranspose2d():与池化对应,这个是上采样(不确定叫法是否得当)过程,它拓展了数据的尺寸,并减少了维度。
⑤copyAndCrop和cat,这个就是灰色箭头的实现过程,首先把两个输入数据(也就是原始数据及编码过程数据和上采样结果裁剪为一致的尺寸,之后进行连接)
在这里插入图片描述在最后一层,输出的维度为一,也就是灰度图像,不过也可以定义为其他维度,例如输出彩色,这跟自己实际的需求有关。

3.数据集加载

为了方便下面展示代码,先导入必要的模块

import numpy as np
import pandas as pd
import random
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.utils as vutils
from torchsummary import summary
from torch.optim.lr_scheduler import ReduceLROnPlateau, CosineAnnealingLR, StepLR, MultiStepLR, CyclicLR
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms as T, datasets as dset
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
from zipfile import ZipFile
from tqdm import tqdm
from glob import glob
from PIL import Image
import cv2
from torch.utils.tensorboard import SummaryWriter

数据加载过程跟普通的卷积神经网络没什么区别,无非就是构建Dataset从文件夹读取数据,之后构建dataset_loader,用来为训练数据做准备。下面直接放一段代码。
不过还是要介绍一下原数据的目录结构,下载数据请点这里Carvana Image Masking Challenge.,下载下面这两个压缩包解压就可以
在这里插入图片描述
解压后这样就行:
在这里插入图片描述
在下面的代码中,数据被分为了两组,0.7的数据被作为训练组,0.3的数据被用来验证。
多说两句,这个数据集的构建继承了Dataset类,实现了__getitem__(self, index: int)和__len__(self)两个函数。

class MyDataset(Dataset):
    def __init__(self, root_dir: str, train=True, transforms=None):
        super(MyDataset, self).__init__()
        self.train = train
        self.transforms = transforms

        file_path = root_dir + 'imgs/*.jpg'
        file_mask_path = root_dir + 'masks/*.gif'

        self.images = sorted(glob(file_path))
        self.image_mask = sorted(glob(file_mask_path))

        # manually split the train/valid data
        split_ratio = int(len(self.images) * 0.7)
        if train:
            self.images = self.images[:split_ratio]
            self.image_mask = self.image_mask[:split_ratio]
        else:
            self.images = self.images[split_ratio:]
            self.image_mask = self.image_mask[split_ratio:]

    def __getitem__(self, index: int):
        image = Image.open(self.images[index]).convert('RGB')
        image_mask = Image.open(self.image_mask[index]).convert('L')

        if self.transforms:
            image = self.transforms(image)
            image_mask = self.transforms(image_mask)

        return {
   
   'img': image, 'mask': image_mask}

    def __len__(self):
        return len(self.images)

4.构建模型

下面模型的代码跟**2.**的介绍是对应的,建议对照看一下,就会有所理解

class ConvBlock(nn.Module):
    def __init__(self, in_channels: int, out_channels: int):
        super(ConvBlock, self).__init__()
        self.block = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),

            nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )

    def 
语义分割——Unet模型 语义分割的UNET网络结构 Unet是2015年诞生的模型,它几乎是当前segmentation项目中应用最广的模型。 Unet能从更少的训练图像中进行学习,当它在少于40张图的生物医学数据集上训练时,IOU值仍能达到92%。 Unet网络非常简单,前半部分作用是特征提取,后半部分是上采样。在一些文献中也把这样的结构叫做编码器-解码器结构。由于此网络整体结构类似于大写的英文字母U,故得名U-net。 这里的融合使用的是tf.concat(),FCN中使用的是tf.add()。 Unet实例,城 阅读详情

相关推荐

unet语义分割模型

Unet模型介绍 Unet可以分为三个部分,如下图所示: 第一部分是主干特征提取部分,我们可以利用主干部分获得一个又一个的特征层,Unet的主干特征提取部分与VGG相似,为卷积和最大池化的堆叠。利用主干特征提取部分我们可以获得五个初步有效特征层,在第二步中,我们会利用这五个有效特征层可以进行特征融合。 第二部分是加强特征提取部分,我们可以利用主干部分获取到的五个初步有效特征层进行上采样,并且进行特征融合(对上采样得到的结果进行通道的堆叠),获得一个最终的,融合了所有特征的有效特征层。 第三部分

qq_53640005的博客 9707

手把手教你用PyTorch和UNet实现语义分割:从数据标注到模型训练全流程

本文提供了一份使用PyTorch和UNet实现语义分割的完整实战指南。内容涵盖从数据标注、环境搭建、模型构建到训练调优和评估可视化的全流程,帮助开发者快速掌握这一核心计算机视觉技术,并应用于自动驾驶、医疗影像等实际场景。

jenkins8butler的博客 137

UNET++是一种基于PyTorch实现的深度学习模型,用于进行图像语义分割任务

UNET++是一种基于PyTorch实现的深度学习模型,用于进行图像语义分割任务。本文将介绍如何安装所需环境、解释代码,并结合Brats2018数据集进行脑肿瘤分割。

WunApplescript的博客 816

PyTorch多类别语义分割实战:UNet数据-模型-评估闭环指南

语义分割是计算机视觉中将图像像素按语义类别逐一分配标签的基础任务,其核心在于建模像素级空间一致性与类别判别能力。多类别场景下,因类别尺度差异大、标注不均衡、边界模糊等挑战,传统单通道输出+交叉熵的简单方案极易失效。本文聚焦PyTorch框架下的工业级实践路径,深入解析标签编码规范、类别感知数据增强、Dice-CrossEntropy加权损失、像素级混淆矩阵评估等关键技术环节,特别强调UNet结构中上采样方式对边界精度的影响及BatchNorm初始化对梯度稳定性的作用。适用于室内场景、医疗影像、遥感解译等真实

weixin_29050513的博客 208

Java判断地图坐标(经度,纬度)是否在多边形区域或圆形区域内

​欢迎光临我的博客查看最新文章:在地图上,可以使用经纬度确定一个位置,如上海体育场(121.449391,31.188228),如果知道了2个地点的经纬度,我们就能在地图上找到其位置及2点的距离,百度地图或高德地图提供了相应的服务;如果将多个坐标点连成多边形区域,如何判断某个坐标点是否在多边形区域内,如下工具类。

river106的博客 3943

华为eNSP Pro实战:NE/CE设备SSH远程配置避坑指南

本文针对华为eNSP Pro用户在模拟多台NE路由器或CE交换机时遇到的浏览器卡顿问题,提供了详细的SSH远程配置避坑指南。通过对比浏览器与SSH客户端的资源占用和操作体验,文章详细阐述了为NE和CE设备配置SSH服务的关键步骤、命令差异及常见错误排查方法,旨在帮助用户提升实验效率,实现稳定高效的远程管理。

weixin_29196891的博客 222

保姆级教程:用STM32CubeMX HAL库搞定ESP8266连接,附串口printf调试全流程

本文提供了一份详细的STM32CubeMX HAL库教程,指导开发者如何实现ESP8266无线模块的连接与调试。从开发环境搭建、串口配置到AT指令通信解析,涵盖了物联网开发中的关键步骤和常见问题解决方案,帮助开发者快速掌握STM32与ESP8266的集成技术。

weixin_28273593的博客 504

你知道几种数字地与模拟地连接方式及优缺点?

频率选择性:磁珠的阻抗特性随频率变化,只对某个频点的噪声有显著抑制作用,对于频率不确定或无法预知的情况,可能不是最佳选择。在实际应用中,选择合适的连接方式需要根据具体的电路频率、信号类型、设计要求等因素综合考虑,以达到最佳的电磁兼容效果.高频信号干扰:在高频电路中,单点接地可能导致信号回流路径过长,增加地线电感,从而引入高频噪声。限制噪声电流:0欧姆电阻相当于一个非常窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。抑制高频信号:电感对高频信号有较大的阻碍作用,可以有效抑制高频噪声。

linkking27的博客 801

Python中的join函数的用法

从语法、实例、应用三方面详尽地介绍join函数

阿黎逸阳的博客 2万+

让 ABAP 内表真正释放内存:从 CLEAR、FREE 到打破 Table Sharing 的实战技巧

ABAP内表内存管理的关键在于理解其运行时结构:DELETE操作仅逻辑删除行而不会释放内存,CLEAR或FREE才能真正回收内存。常见的误区包括误判空表状态和忽视内表共享机制。实际应用中,大表筛选后应采用VALUE表达式或逐行插入方式重建表体以释放内存。典型案例显示,正确处理内表内存可显著降低SAP Gateway和批处理程序的内存消耗,提升系统稳定性。开发时需结合调试工具观察内存状态,避免因共享机制导致无效回收。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 324

基于Simscape的双PID比例调速阀与比例溢流阀液压控制系统建模与仿真

本文提出了一种基于Simscape的双PID液压控制系统建模方法,通过比例调速阀和比例溢流阀实现液压缸速度与压力的解耦控制。系统采用Simscape Fluids物理建模,精确模拟液压元件非线性特性。文章详细介绍了液压被控对象建模过程,包括动力单元、比例阀组合建模、执行机构及传感器配置。同时设计了双PID控制器架构,分别控制速度环和压力环,并给出参数整定建议。该方法通过物理网络直接模拟流体流动和压力动态,相比传统传递函数法具有更高精度,为液压系统仿真提供了有效解决方案。

AI的内部世界的博客 284

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: PyTorch深度学习图像分类--猫狗大战
Matrix_CS
博客等级 码龄7年 27粉丝 13原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matrix_CS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值