图片分割--UNet

1.网络结构

结构可以分为两部分 左边部分是编码结构,进行特征提取 右边是解码结果,进行特征还原

2.数据集准备

import os.path
from torchvision import transforms
from torch.utils.data import Dataset
from utils import *#数据归一化
transform = transforms.Compose([transforms.ToTensor()
])class MyDataset(Dataset):def __init__(self,path):self.path = path#获取索引的名字 E:\Pcproject\LB-UNet-main\isic2018\trainself.name = os.listdir(os.path.join(path,'masks'))def __len__(self):return len(self.name)def __getitem__(self,index):segment_name = self.name[index]segment_path = os.path.join(self.path,'masks',segment_name)#原图地址image_path = os.path.join(self.path,'images',segment_name)#规范图片的大小尺寸segment_image = keep_image_size_open(segment_path)image = keep_image_size_open(image_path)return transform(image),transform(segment_image)if __name__=='__main__':data = MyDataset('E:/Pcproject/pythonProjectlw/UNet')print(data[0][0].shape)print(data[0][0].shape)

数据图片规范函数:

from PIL import Imagedef keep_image_size_open(path,size = (256,256)):#打开图像文件img = Image.open(path)#取最长边 获取图像尺寸 最长边temp = max(img.size)#创建空白图像mask = Image.new('RGB',(temp,temp),(0,0,0))#粘贴原始图像mask.paste(img,(0,0))#调整图像大小mask = mask.resize(size)#返回调整后的图像return mask

下面是数据的文件位置

数据集是皮肤病理分析的图片

根据unet网络结构可知有三个结构 一部分是conv卷积 一部分是上采样 一部分是下采样

3.定义板块

1.卷积模块

from torch import nn#卷积板块
class Conv_Block(nn.Module):def __init__(self,in_channel,out_channel):super(Conv_Block,self).__init__()self.layer = nn.Sequential(#第一个卷积#padding_mode='reflect':填充的是镜像数值 比如第一行第一个数是1 第二行第1列是2 那么在第一行上面填充的值就是以1为中心对称的数字2#可以将填充的数值也作为特征 加强特征提取的能力nn.Conv2d(in_channel,out_channel,3,1,1,padding_mode='reflect',bias=False),nn.BatchNorm2d(out_channel),nn.Dropout(0.3),nn.LeakyReLU(),#第二个卷积nn.Conv2d(out_channel, out_channel, 3, 1, 1, padding_mode='reflect', bias=False),nn.BatchNorm2d(out_channel),nn.Dropout(0.3),nn.LeakyReLU())def forward(self,x):return self.layer(x)

padding_mode='reflect':填充的是镜像数值 比如第一行第一个数是1 第二行第1列是2 那么在第一行上面填充的值就是以1为中心对称的数字2,可以将填充的数值也作为特征 加强特征提取的能力

2.下采样模块

图中的的max pool最大池化进行下采样 但是最大池化没有特征提取 丢特征丢的太多了

#下采样模块
class DownSample(nn.Module):def __init__(self,channel):super(DownSample,self).__init__()self.layer = nn.Sequential(nn.Conv2d(channel,channel,3,2,1,padding_mode='reflect',bias=False),nn.BatchNorm2d(channel),nn.LeakyReLU())def forward(self,x):return self.layer(x)

如果使用最大池化的化:

class DownSample(nn.Module):def __init__(self, channel):super(DownSample, self).__init__()self.layer = nn.Sequential(nn.MaxPool2d(2),  # 使用最大池化替换卷积操作nn.BatchNorm2d(channel),nn.LeakyReLU())def forward(self, x):return self.layer(x)

3.上采样模块

使用插值法:

from torch.nn import functional as F
class UpSample(nn.Module):def __init__(self,channel):super(UpSample,self).__init__()self.layer = nn.Conv2d(channel,channel//2,1,1)def forward(self,x,feature_map):up = F.interpolate(x,scale_factor=2,mode='nearest')out = self.layer(up)return torch.cat((out,feature_map),dim=1)

        super(UpSample, self).__init__() :
        创建一个卷积层self.layer,它将输入通道数从channel减少到channel//2(即通道数减半)。  
        使用1x1的卷积核和步长为1,这意味着卷积层不会改变输入特征图的空间维度(高度和宽度)。  
        但是,它会改变通道数,因为输出通道数被设置为channel//2。  
        self.layer = nn.Conv2d(channel, channel//2, 1, 1)  

       使用F.interpolate函数对输入特征图x进行上采样。  
        scale_factor=2表示将特征图的高度和宽度都放大两倍。  
        mode='nearest'表示使用最近邻插值方法。  
        up = F.interpolate(x, scale_factor=2, mode='nearest')  
        将上采样后的特征图通过之前定义的卷积层self.layer
       这将减少通道数(从原始通道数减半),同时保持(或可能稍微改变,取决于卷积层的权重初始化)空间维度。  
        

根据结构:上采样时需要对上一个特征进行拼接:

       使用torch.cat在通道维度(dim=1)上将输出特征图out和额外的特征图feature_map进行拼接。  
        这意味着输出特征图的通道数将是out的通道数加上feature_map的通道数。

4.定义Unet网络

class UNet(nn.Module):def __init__(self):super(UNet,self).__init__()#下卷积采样self.c1 = Conv_Block(3,64)self.d1 = DownSample(64)self.c2 = Conv_Block(64,128)self.d2 = DownSample(128)self.c3 = Conv_Block(128,256)self.d3 = DownSample(256)self.c4 = Conv_Block(256,512)self.d4 = DownSample(512)self.c5 = Conv_Block(512,1024)#上采样self.u1 = UpSample(1024)self.c6 = Conv_Block(1024,512)self.u2 = UpSample(512)self.c7 = Conv_Block(512,256)self.u3 = UpSample(256)self.c8 = Conv_Block(256,128)self.u4 = UpSample(128)self.c9 = Conv_Block(128,64)#输出self.out = nn.Conv2d(64,3,3,1,1)self.Th = nn.Sigmoid()def forward(self,x):R1 = self.c1(x)R2 = self.c2(self.d1(R1))R3 = self.c3(self.d2(R2))R4 = self.c4(self.d3(R3))R5 = self.c5(self.d4(R4))#拼接o1 = self.c6(self.u1(R5,R4))o2 = self.c7(self.u2(o1, R3))o3 = self.c8(self.u3(o2, R2))o4 = self.c9(self.u4(o3, R1))return self.Th(self.out(o4))if __name__ == '__main__':x = torch.randn(2,3,256,256)net = UNet()print(net(x).shape)

5.训练代码

import os.path
from torchvision import transforms
from torch.utils.data import Dataset
from utils import *#数据归一化
transform = transforms.Compose([transforms.ToTensor()
])class MyDataset(Dataset):def __init__(self,path):self.path = path#获取索引的名字 E:\Pcproject\LB-UNet-main\isic2018\trainself.name = os.listdir(os.path.join(path,'masks'))def __len__(self):return len(self.name)def __getitem__(self,index):segment_name = self.name[index]segment_path = os.path.join(self.path,'masks',segment_name)#原图地址image_path = os.path.join(self.path,'images',segment_name)#规范图片的大小尺寸segment_image = keep_image_size_open(segment_path)image = keep_image_size_open(image_path)return transform(image),transform(segment_image)if __name__=='__main__':data = MyDataset('E:/Pcproject/pythonProjectlw/UNet')print(data[0][0].shape)print(data[0][0].shape)

6.结果

如果是第一次运行 第一行结果会是加载失败

下面是文件夹中的内容:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shiro安全认证技术实践

为Java后端项目添加Shiro进行身份验证&#xff0c;授权操作&#xff1a; 步骤1.引入相关依赖&#xff1a; <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.9.1</vers…

【论文速读】| RED QUEEN: 保护大语言模型免受隐蔽多轮越狱攻击

基本信息 原文标题&#xff1a;RED QUEEN: Safeguarding Large Language Models against Concealed Multi-Turn Jailbreaking 原文作者&#xff1a;Yifan Jiang, Kriti Aggarwal, Tanmay Laud, Kashif Munir, Jay Pujara, Subhabrata Mukherjee 作者单位&#xff1a;Hippocr…

怎么做才能降低APP用户的卸载率?

常年困扰 App 开发者的始终是一个问题&#xff1a;怎么做才能降低用户卸载率呢&#xff1f; 不要慌&#xff0c;今天这篇文章里&#xff0c;你就会找到解决方案啦。首先请记住&#xff1a; 每个 App 都是有自己独立个性的&#xff0c;所以没有一个通用的公式能让大家套用。 还…

【Window】无法登录G**gle解决方案

以下是PowerShell命令解决方案&#xff0c;按顺序执行&#xff1a; # 1. 刷新DNS缓存 ipconfig /flushdns# 2. 设置Go**le DNS netsh interface ipv4 set dns name"以太网" static 8.8.8.8 netsh interface ipv4 add dns name"以太网" 8.8.4.4 index2# 3.…

Transformer模型——tokenize分词

tokenize的目标是输出的文本流&#xff0c;切分成一个个子串&#xff0c;每个子串相对有完整的语义&#xff0c;便于学习Embedding表达和后续模型的使用。 tokenize有三种粒度&#xff1a;word / subword / char word&#xff1a;词。对于英文等语言来说&#xff0c;存在着天然…

自动驾驶上市潮中,会诞生下一个“英伟达”吗?

站上科技创新潮头的企业总是备受资本青睐。20世纪开始&#xff0c;从IT到互联网&#xff0c;IBM、英特尔、微软、苹果等各大科技巨头&#xff0c;你方唱罢我登场。 近几年&#xff0c;人工智能成为资本市场新传奇故事的孕育之地。今年10月&#xff0c;英伟达市值首度突破3.5万…

【vue项目中添加告警音频提示音】

一、前提&#xff1a; 由于浏览器限制不能自动触发音频文件播放&#xff0c;所以实现此类功能时&#xff0c;需要添加触发事件&#xff0c;举例如下&#xff1a; 1、页面添加打开告警声音开关按钮 2、首次进入页面时添加交互弹窗提示&#xff1a;是否允许播放音频 以上两种方…

产品结构设计(六):结构设计全过程

参考引用 产品结构设计实例教程 1. ID 图及 PCB 堆叠分析 1.1 产品说明及相关资料 1、新产品开发指令单 2、ID 图 3、产品功能规格书 1.2 ID 图分析 ID&#xff08;Industrial Design&#xff0c;工业设计&#xff09;是以工业产品为主要对象&#xff0c;综合运用工学、…

文献阅读记录6-Toward computer-made artificial antibiotics

摘要 将合成生物学和计算生物学的概念结合起来&#xff0c;可能会产生比现有药物更不容易产生耐药性的抗生素&#xff0c;而且还能对抗耐药感染。事实上&#xff0c;计算机引导策略与大规模并行高通量实验方法相结合&#xff0c;代表了抗生素发现的新范式。耐多药微生物引起的…

Manus在虚拟现实仿真模拟中的应用案例分享

Manus虚拟现实手套作为一种高精度的人机交互设备&#xff0c;在仿真模拟领域展现出了巨大的应用潜力。通过提供实时、准确的手指动作捕捉数据&#xff0c;Manus手套为多个行业带来了前所未有的仿真体验&#xff0c;推动了技术发展和应用创新。 技术特点 1. 高精度手指跟踪 Ma…

Vim的简单使用

文章目录 Vim的使用日志前言梦的开始从说明书开始Take a bite!Learn to Read!配置文件vimtutor 一些比较实用的操作移动编辑删除、复制、粘贴与组合命令查找替换撤销重做光标跳转补全和命令浅尝一下 保存、丢弃和另存为 关于插件和其他后记关于参考资料 Vim的使用 日志 文章编…

繁星之下--

在一个宁静的小镇上&#xff0c;年轻的画家阿宁用她的画笔捕捉着四季的变换。这个小镇四季分明&#xff0c;春天的嫩芽、夏天的繁花、秋天的金黄和冬天的白雪&#xff0c;仿佛每一个季节都在向她诉说着自己的故事。阿宁常常在思考&#xff0c;如何将这些美丽的瞬间转化为永恒的…

Vue2——单页应用程序路由的使用

一.单页应用程序与多页应用程序之间的比较 二.单页的应用场景 系统类网站 / 内部网站 / 文档类网站 / 移动端网站 三.路由的介绍 1. 什么是路由 路由是一种映射关系 2. Vue中的路由是什么 路径和组件的映射关系 四.VueRouter的使用 5个基础步骤&#xff08;固定&#xff09; …

Windows 下实验视频降噪算法 MeshFlow 详细教程

MeshFlow视频降噪算法 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow&#xff0c;它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field)&#xff0c;其运动矢量 (motion vectors) 仅在网格顶点 (m…

大语言模型训练与推理模型构建源码解读(huggingface)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、llama训练模型构建源码解读1、模型构建代码(自己搭建)2、训练模型3、模型调用方法4、训练模型init方法(class LlamaForCausalLM(LlamaPreTrainedModel))5、训练模型forward方法(class Llam…

用Python脚本执行安卓打包任务

这个样例是基于windows系统写的python打包安卓的脚本&#xff1a; 一、配置AndroidStudio下的打包任务 1.在Android项目根目录下的build.gradle文件配置生成Release包的任务&#xff1a; task cleanAll(type: Delete) {delete rootProject.buildDirrootProject.subprojects.e…

专题十七_BFS_BFS解决 FloodFill 算法_BFS 解决最短路问题_多源 BFS_BFS 解决拓扑排序

目录 BFS 一、BFS解决 FloodFill 算法 1. 图像渲染&#xff08;medium&#xff09; 解析&#xff1a; 细节问题&#xff1a; 总结&#xff1a; 2. 岛屿数量&#xff08;medium&#xff09; 解析&#xff1a; DFS&#xff1a; BFS&#xff1a; 总结&#xff1a; 3. …

NVR小程序接入平台/设备EasyNVR多个NVR同时管理视频监控新选择

在数字化转型的浪潮中&#xff0c;视频监控作为安防领域的核心组成部分&#xff0c;正经历着前所未有的技术革新。随着技术的不断进步和应用场景的不断拓展&#xff0c;视频监控系统的兼容性、稳定性以及安全性成为了用户关注的焦点。NVR小程序接入平台/设备EasyNVR&#xff0c…

Vite学习之环境变量

环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量&#xff0c;这些变量在构建时会被静态地替换掉。这里有一些在所有情况下都可以使用的5个内建变量&#xff1a; import.meta.env.MODE: {string} 应用运行的模式。import.meta.env.BASE_URL: {string} 部署应用…

leetcode71:简化路径

给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下&#xff1a; 一个点 . 表示当前目录本身。此外&#xff0c;两个点 ..…