Unet 实战分割项目、多尺度训练、多类别分割

1. 介绍

之前写了篇二值图像分割的项目,支持多尺度训练,网络采用backbone为vgg的unet网络。缺点就是没法实现多类别的分割,具体可以参考:二值图像分割统一项目

本章只对增加的代码进行介绍,其余的参考上述链接博文

本章实现的unet网络的多类别分割,也就是分割可以是两个类别,也可以是多个类别。训练过程仍然采用多尺度训练,即网络会随机将图片缩放到设定尺寸的0.5-1.5倍之间

文件目录如下:

2. 实现思路

因为多类别的分割,mask模板都是灰度图,一般0为背景,255为前景。多类别的话,就是0为背景,1 , 2,3等等其他的灰度值为前景。

而为了方便观察,前景的灰度值不会设定的这么近,都会相隔很远。例如4分割,不会前景分为0123,而是0,63,127,255类似这样的

值得注意的是,VOC数据集的mask模板也是灰度图像,只是填充的颜色才导致显示出来是彩色的

2.1 mask的灰度值

多分割的unet网络,输出的通道数就是分割的个数,从0开始依次递增,所以将mask的灰度映射成0 1 2 3 是必要的

这个就类似于二值图像,将前景 255 映射为 1

因为对于不同的任务,mask的灰度值是不同的,对于新人小白也不会查看mask的灰度值或者找不全等等。要是自己在dataset里面一个个映射也很麻烦,这里提供了一个自动实现的方法

在utils脚本里提供了一个查找mask灰度值的方法,如下:

np.unique 是查找数组里出现过的数字,例如0 0 1 2 2,返回的就是0 1 2 

这里将gray 内容按照从小到大排序,后面映射需要用!!!

代码会遍历所有的训练图像的mask,找到所有的mask前景+背景(0)灰度值,为了在dataset和预测脚本使用,这里将前景的分割像素点灰度值保存为txt格式,保存的路径是data文件夹下

这里返回的len(gray)就是分割的个数,包括背景的,这样接受compute_gray 函数的返回值,可以直接定义unet 分割的通道数

保存的txt文本如下:

这是二值图像分割

这是腹部多脏器多类别分割

2.2 加载mask 灰度值映射

这部分内容在dataset.py脚本中

首先加载txt文本,self.txt 是紫色框中的列表内容

这里很常见,通过image找到mask图片,用replace根据自己图片后缀替换即可

这部分代码就是mask的灰度值映射

首先将当前mask的所有前景找到,用gray遍历。因为之前txt的灰度值是从小到大且从背景0开始排序的,而且self.txt加载的txt是列表形式。可以取个巧,将index就作为分割的映射值

例如,txt 内容是 0 62 125 252 ,说明这是一个包含背景四分类的分割项目

那么self.txt 列表的内容就是【0 62 125 252】

我们想要映射的结果就是0-->0、62-->1、125-->2、252-->3,而0123这些不正是列表值的index吗

2.3 加载数据可视化

打开这部分代码,可以查看可视化数据

如下:

对应的灰度值:

注意:这里classes打印出来有255,不是映射失败,因为本章采用的多尺度训练,图像放大后,会用255填充,这是没关心的,因为后面计算交叉熵损失会忽略255的像素

2.4 预测脚本

预测也很简单,加载完,在映射回去即可

3. 代码使用

说了这么多,代码如何使用最重要,README如下

这里需要更改的地方就三个:

1. 自定义数据按照data目录摆放,看README第二点

2. 因为image个mask的图像后缀不一定严格一致,所以要根据自己的数据更改dataset代码

3. 为了多尺度训练效果可以更好,建议将下面两个参数尽量改成和数据size接近的

base-size 为多尺度的尺寸,图像会缩放成 0.5 * base-size --- 1.5 * base-size之间

crop-size 会中心裁剪成规定的,建议改成和数据宽高接近的

3.1 训练过程

最后两个epoch结果

训练日志有每个类别的recall和precision:

loss 曲线:

网络还没有收敛,只是测试,增大epoch可以收敛的更好

推理:依次为原图、推理图、真实GT图片

3.2注意的点

需要注意的是,有的数据mask不是多值图像,例如二分割任务,像素点除了0 255仍有中间的灰度值等等。这时候建议检查数据,通过opencv处理在进行训练,否则会出错

除此外,因为这里的255也会被映射回去,作为分割的一部分。所以类似于VOC这种有255忽略点的数据集可能不支持本项目,当然可以自己更改代码,将dataset中255不映射即可,或者把txt文本中255删除

3.3 代码下载

项目封装在这:深度学习 Unet 实战分割项目、多尺度训练、多类别分割:腹部多脏器5类别分割数据集

4. 未来展望

后续,会将resnet加入unet中,对比下效果。还有更多的高阶API分割模型等等,也会做个项目

这里展示的是腹部多脏器MRI的多分割项目,代码对二值图像DRIVE数据集也做了测试,不必担心不能兼容

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

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

相关文章

在本地运行大型语言模型 (LLM) 的六种方法(2024 年 1 月)

一、说明 (开放)本地大型语言模型(LLM),特别是在 Meta 发布LLaMA和后Llama 2,变得越来越好,并且被越来越广泛地采用。 在本文中,我想演示在本地(即在您的计算机上&#x…

DataX详解和架构介绍

系列文章目录 一、 DataX详解和架构介绍 二、 DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录DataX是什么&#xff…

【QT】VS-code报错:LNK2019: 无法解析的外部符号

目录 0.环境 1.问题简述 2.分析报错原因 3.解决方法 1)set() 相关语句 2)target_link_libraries() 相关语句 4.参考 0.环境 windows11 、 vs-code 、 qt 、 c、编译器为vs2019-x86_amd64 1.问题简述 项目编译release版本时会报错:报错…

页面单跳转换率统计案例分析

需求说明 页面单跳转化率 计算页面单跳转化率,什么是页面单跳转换率,比如一个用户在一次 Session 过程中访问的页面路径 3,5,7,9,10,21,那么页面 3 跳到页面 5 叫一次单跳,7-9 也叫一次单跳, 那么单跳转化率就是要统计…

c语言--指针的传值调用和传址调用

目录 一、前言二、传值调用。三、传址调用四、总结 一、前言 学习指针的目的是使用指针解决问题&#xff0c;那什么问题&#xff0c;非指针不可呢&#xff1f; 二、传值调用。 写个函数&#xff0c;交换两个整数的内容。 #include<stdio.h> void Swap1(int x, int y)…

LabVIEW双光子荧光显微成像系统开发

双光子显微成像是一种高级荧光显微技术&#xff0c;广泛用于生物学和医学研究&#xff0c;尤其是用于活体组织的深层成像。在双光子成像过程中&#xff0c;振镜&#xff08;Galvo镜&#xff09;扮演了非常关键的角色&#xff0c;它负责精确控制激光束在样本上的扫描路径。以下是…

读分布式稳定性建设指南文档

最近还是在做一些和稳定性建设相关的事情&#xff0c;找到一份《分布式稳定性建设指南》文档&#xff0c;摘抄了其中的重点&#xff0c;以便后续回顾方便&#xff0c;一直没上传好资源&#xff0c;我之后再试试&#xff0c;原文内容质量非常高。 大家可以先看一级目录即可&…

掌握Web服务器之王:Nginx 学习网站全攻略!

介绍&#xff1a;Nginx是一款高性能的Web服务器&#xff0c;同时也是一个反向代理、负载均衡和HTTP缓存服务器。具体介绍如下&#xff1a; 轻量级设计&#xff1a;Nginx的设计理念是轻量级&#xff0c;这意味着它在占用最少的系统资源的同时提供高效的服务。 高并发能力&#x…

五、机器学习模型及其实现1

1_机器学习 1&#xff09;基础要求&#xff1a;所有的数据全部变为了特征&#xff0c;而不是eeg信号了 python基础已经实现了特征提取、特征选择&#xff08;可选&#xff09;进行了数据预处理.预处理指对数据进行清洗、转换等处理&#xff0c;使数据更适合机器学习的工具。S…

Datax3.0+DataX-Web部署分布式可视化ETL系统

一、DataX 简介 DataX 是阿里云 DataWorks 数据集成的开源版本&#xff0c;主要就是用于实现数据间的离线同步。DataX 致力于实现包括关系型数据库&#xff08;MySQL、Oracle 等&#xff09;、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源&#xff08;即不同的数据库&#x…

spring-security SecurityContextHolder

翻译版本【spring-security 6.2.1】SecurityContextHolder SecurityContextHolder Spring Security身份验证模型的核心是SecurityContextHolder。它包含SecurityContext。 SecurityContextHolder是Spring Security存储身份验证详细信息的地方。Spring Security并不关心Secur…

C++ 动态规划 状态压缩DP 蒙德里安的梦想

求把 NM 的棋盘分割成若干个 12 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4 时&#xff0c;共有 5 种方案。当 N2&#xff0c;M3 时&#xff0c;共有 3 种方案。 如下图所示&#xff1a; 2411_1.jpg 输入格式 输入包含多组测试用例。 每组测试用例占一行…

OCR文本纠错思路

文字错误类别&#xff1a;多字 少字 形近字 当前方案 文本纠错思路 简单&#xff1a; 一、构建自定义词典&#xff0c;提高分词正确率。不在词典中&#xff0c;也不是停用词&#xff0c;分成单字的数据极有可能是错字&#xff08;少部分可能是新词&#xff09;。错字与前后的…

uniapp设置不显示顶部返回按钮

一、pages文件中&#xff0c;在相应的页面中设置 "titleNView": {"autoBackButton": false} 二、对应的页面文件设置隐藏元素 document.querySelector(.uni-page-head-hd).style.display none

计算机网络实验四

实验四 VLAN划分与配置 1、实验目的 • 理解并掌握Port Vlan的配置方法 • 理解并掌握掌握跨交换机实现VLAN的配置方法 2、实验设备 &#xff08;1&#xff09;实验内容1&#xff1a;交换机端口隔离—Port Vlan的配置 以太网交换机一台笔记本电脑一台PC机两台配置电缆、网…

收藏:相当大赞的来自 Agilean产品团队的2篇关于重塑敏捷组织的绩效管理的文章

Agilean产品团队&#xff0c;是吴穹博士领导下最近在国内敏捷界很厉害的产品&#xff0c;今天看到两篇相当不错的说敏捷组织的上下篇文章&#xff0c;分享下&#xff0c;地址是&#xff1a;6个原则15项举措&#xff0c;重塑敏捷组织的绩效管理&#xff08;上&#xff09; 6个原…

星宸科技SSC8826Q 驾驶辅助(ADAS)行车记录仪方案

星宸科技SSC8826Q 驾驶辅助&#xff08;ADAS&#xff09;行车记录仪方案 一、方案描述 SSC8826Q是高度集成的行车记录仪、流媒体后视镜解决方案&#xff0c;主芯片为ARM Cortex A53&#xff0c;dual core&#xff0c;主频高达1.2GHz&#xff0c;集成了64-bit dual-core RISC 处…

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步&#xff1a;将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

如何有效的向 AI 提问 ?

目录 〇、导言 一、Base LLM 与 Instruction Tuned LLM 二、如何提出有效的问题 &#xff1f; 1. 明确问题&#xff1a; 2. 简明扼要&#xff1a; 3. 避免二义性&#xff1a; 4. 避免绝对化的问题&#xff1a; 5. 利用引导词&#xff1a; 6. 检查语法和拼写&#xff1…

哈希加密Python实现

一、代码 from cryptography.fernet import Fernet import os import bcrypt# 密钥管理和对称加密相关 def save_key_to_file(key: bytes, key_path: str):with open(key_path, wb) as file:file.write(key)def load_key_from_file(key_path: str) -> bytes:if not os.path…