AI-医学影像分割方法与流程

AI医学影像分割方法与流程–基于低场磁共振影像的病灶识别

– 作者:coder_fang
AI框架:PaddleSeg

  1. 数据准备,使用MedicalLabelMe进行dcm文件标注,产生同名.json文件。在这里插入图片描述

  2. 编写程序生成训练集图片,包括掩码图。

  3. 代码如下:

def doCvt(labelDir):outdir=labelDir+"\\output";if os.path.exists(outdir):shutil.rmtree(outdir)os.makedirs(outdir+"\\images") #原始图os.makedirs(outdir + "\\masks1") #可视掩码图,只包含0,255os.makedirs(outdir + "\\masks2") #训练掩码图,只包含0,1start=0files=glob.glob(labelDir+'\\*.json')for f in files:fname=os.path.basename(f)jsondata = json.load(open(labelDir+"\\"+ fname, encoding="utf-8"))imagePath = os.path.join(labelDir, jsondata.get("image_path"))ds = pydicom.read_file(imagePath)  # 读取.dcm文件img = ds.pixel_array  # 提取图像信息img = (img * (255/img.max())).astype(np.uint8)pathout ="{}\\images\\{:05d}.png".format(outdir,start)result=cv2.bilateralFilter(img,11,64,128) #对低场图片进行去噪声cv2.imwrite(pathout, result)label_name_to_value = {'_background_': 0,'H':1}for shape in jsondata.get("frames")[0].get("shapes"):label_name = shape['label']if label_name in label_name_to_value:label_value = label_name_to_value[label_name]else:label_value = len(label_name_to_value)label_name_to_value[label_name] = label_valuemask = np.zeros(img.shape ,dtype=np.uint8)  # 假设图片是灰度图,调整dtype为np.uint8# 遍历所有形状并绘制到掩码上for shape in jsondata.get("frames")[0].get("shapes"):# 获取形状的类型和坐标点shape_type = shape['shape_type']points = shape['points']if shape_type == 'polygon':# 绘制多边形掩码cv2.fillPoly(mask, [np.array(points).reshape((-1, 1, 2)).astype(np.int32)], 1)elif shape_type == 'rectangle':# 绘制矩形掩码(转换为多边形)x, y, w, h = pointspts = np.array([[x, y], [x + w, y], [x + w, y + h], [x, y + h]])cv2.fillPoly(mask, [pts.reshape((-1, 1, 2)).astype(np.int32)], 1)# 可以根据需要添加其他形状的处理方式,如圆形等。# 保存可视掩码图像(例如PNG格式)pathout = "{}\\masks1\\{:05d}.png".format(outdir, start)cv2.imwrite(pathout, (mask * 255).astype(np.uint8))# 保存训练掩码图像(例如PNG格式)pathout = "{}\\masks2\\{:05d}.png".format(outdir, start)cv2.imwrite(pathout, mask.astype(np.uint8))lbl_viz = imgviz.label2rgb(mask, img)start+=1

效果如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 使用PaddlePaddle 2.6.2版本,单独下载PaddleSeg2.8.1版本进行编译,2.8以前版本会有问题。
  2. 生成训练数据和验证数据集对应列表:
def create_list(data_path):image_path = os.path.join(data_path, 'images')label_path = os.path.join(data_path, 'masks2')data_names = os.listdir(image_path)random.shuffle(data_names)  # 打乱数据with open(os.path.join(data_path, 'train_list.txt'), 'w') as tf:with open(os.path.join(data_path, 'val_list.txt'), 'w') as vf:for idx, data_name in enumerate(data_names):img = os.path.join('images', data_name)lab = os.path.join('masks2', data_name)if idx % 9 == 0:  # 90%的作为训练集vf.write(img + ' ' + lab + '\n')else:tf.write(img + ' ' + lab + '\n')print('数据列表生成完成')data_path = 'work/output'
create_list(data_path)  # 生成数据列表
  1. 基于列表生成数据集并进行验证:
# 构建训练集
train_transforms = [T.RandomHorizontalFlip(),#水平翻转    T.RandomVerticalFlip(),T.RandomNoise(),T.Resize(),T.Normalize()  # 归一化
]
train_dataset = Dataset(transforms=train_transforms,dataset_root='work/output',num_classes=2,img_channels=1,mode='train',train_path='work/output/train_list.txt',separator=' ',
)
# 构建验证集
val_transforms = [T.Resize(),T.Normalize()
]
val_dataset = Dataset(transforms=val_transforms,dataset_root='work/output',num_classes=2,img_channels=1,mode='val',val_path='work/output/val_list.txt',separator=' ',
)#随机抽取训练集数据进行可视化验证
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(10,16))
for i in range(1,6,2): _,img,label,_= train_dataset[random.randint(0,100)].items()print(img[1].shape)img = np.transpose(img[1], (1,2,0))img = img*0.5 + 0.5plt.subplot(3,2,i),plt.imshow(img,'gray'),plt.title('img'),plt.xticks([]),plt.yticks([])plt.subplot(3,2,i+1),plt.imshow(label[1],'gray'),plt.title('label'),plt.xticks([]),plt.yticks([])plt.show

在这里插入图片描述

  1. 构建训练网络并训练:
#可以尝试PaddelSeg中多种分割模型,这里目前测试的BiSeNetV2均衡了效果和训练验证速度,表现还可以
model = BiSeNetV2(num_classes=2,#二分类分割in_channels=1,#单通道lambd=0.25,align_corners=False,pretrained='OutDir/best_model/model.pdparams')base_lr = 0.0005
lr = paddle.optimizer.lr.PolynomialDecay(learning_rate=base_lr, decay_steps=1500, verbose=False)
optimizer = paddle.optimizer.Momentum(lr, parameters=model.parameters(), momentum=0.9, weight_decay=4.0e-
losses = {}
losses['types'] = [CrossEntropyLoss()] *5
losses['coef'] = [0.8,0.2]*5from paddleseg.core import train
train(model=model,train_dataset=train_dataset,val_dataset=val_dataset,optimizer=optimizer,save_dir='OutDir',iters=3000,batch_size=8,save_interval=200,log_iters=20,num_workers=0,losses=losses,use_vdl=True)#开始训练,这里最好使用GPU训练
  1. 验证数据,并将预测结果融合到原始图中
#测试结果 transforms = T.Compose([T.Resize(target_size=(512, 512)),T.Normalize()
])#显示图片时调整合适的窗宽窗位
def wwwl(im,window_width,window_level):# 计算最大值和最小值min_val = window_level - window_width / 2max_val = window_level + window_width / 2           #im = ((im - min_val) / (max_val - min_val)) * 255im=np.clip(im,min_val,max_val).astype(np.uint8)return im#加载模型
model = BiSeNetV2(num_classes=2,    in_channels=1,)model_path = 'OutDir/best_model/model.pdparams'
para_state_dict = paddle.load(model_path)
model.set_dict(para_state_dict)import matplotlib.pyplot as plt
import numpy as np#testimg里放置一些病灶图片,尽量不是训练集里数据
files = glob.glob('work/testimg/*.png')
row=(int)(len(files))
plt.figure(figsize=(16,row*8))
i=1;
for f in files:#读取数据    im = cv2.imread(f, 0).astype('float32')im=F.normalize(im,0.5,0.5)h,w = im.shapedata = np.expand_dims(im,axis=0).repeat(1,axis=0)data = data[np.newaxis, ...]data = paddle.to_tensor(data)predata=model(data)output = predata[0].numpy()output = np.argmax(output,axis=1)output = np.squeeze(output)#输入模型预测的时候缩放到(512,512),现在要缩放到原始数据的大小output = cv2.resize(output, (h, w), interpolation=cv2.INTER_NEAREST)output = output.astype(np.uint8)*128#归到255im=(im*0.5+0.5)*255im=wwwl(im,128,60)max_val = np.max(im)im=im*(255/max_val)imgori=cv2.cvtColor(im.astype(np.uint8), cv2.COLOR_GRAY2BGR);imgpre=cv2.cvtColor(output, cv2.COLOR_GRAY2BGR);imgpre[:,:,1]= 0imgpre[:,:,2]= 0mask_img=cv2.addWeighted(imgpre, 0.2, imgori, 0.5, 0)plt.subplot(row,2,i),plt.imshow(mask_img,'gray'),plt.title('img'),plt.xticks([]),plt.yticks([])i+=1plt.show

在这里插入图片描述

  1. 基于上述模型持续优化并训练,如需模型工程化,可使用paddleseg 中的export.py ,将模型进行转换,转换后可将其集成到python或c++工程使用,转换命令如下:
python export.py --model_path OutDir/best_model/model.pdparams --input_shape 1 1 512 512 --save_dir OutDir/Saved --config work/config.yml 

完!

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

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

相关文章

【蓝桥杯每日一题】3.16

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接: 题目描述: 解题思路: 解题代码: 二、高精度减法 题目链接: 题目描述&…

人工智能组第一次培训——deepseek本地部署和知识库的建立

deepseek本地部署的用处 减少对网络依赖性: 在断网环境下,依然可以使用预先下载的AI模型进行处理,避免因网络不稳定而无法完成任务。 提高响应速度: 数据和模型已经在本地设备上准备好,可以直接调用,不…

windows协议不再续签,华为再无windows可用,将于四月发布鸿蒙PC

大家好,我是国货系创始人张云泽,最近不少小伙伴在后台问:“听说Windows协议要到期了?我的电脑会不会变砖?”还有人说:“华为笔记本以后用不了Windows了?鸿蒙系统能用吗?”今天咱们就…

数据结构-----初始数据结构、及GDB调试

一、数据结构核心概念 相互之间存在一种或多种特定关系的数据元素的集合。 1. 数据结构定义 // 嵌入式场景示例:传感器网络节点结构 struct SensorNode {uint16_t node_id; // 2字节float temperature; // 4字节uint32_t timestamp; // 4字节struct Se…

HOT100(1)

目前想到的办法是暴力枚举,有什么更好的办法请多指教。。。。代码如下: 让数组第一个元素和后面的元素相加判断是否相等,让数组第二个元素与后面的元素相加判断是否相等,以此类推 /** * Note: The returned array must be mallo…

QuickAPI 和 DBAPI 谁更香?SQL生成API工具的硬核对比(一)

最近低代码开发火得不行,尤其是能把数据库秒变API的工具,简直是开发者的救星。今天咱就聊聊两款国内玩家:QuickAPI(麦聪软件搞出来的低代码神器)和 DBAPI(开源社区的硬核作品)。这两货都能靠SQL…

MySQL单表查询大全【SELECT】

山再高,往上攀,总能登顶;路再长,走下去,定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

开启云服务器ubuntu22.04的远程桌面,支持Windows远程连接 - 开启XRDP支持

效果图 环境 云服务器 Ubuntu 22.04 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy 本地windows10 步骤 前置动作 # 远程登录 ssh rootx.x.x.x# 看看硬盘够不够空间&…

虚拟化数据恢复—重装系统服务器崩了的数据恢复过程

虚拟化数据恢复环境&故障: VMware虚拟化平台 vmfs文件系统 工作人员误操作重装操作系统,服务器崩溃。 重装系统会导致文件系统元文件被覆盖。要恢复数据,必须找到&提取重装系统前的文件系统残留信息,通过提取出来的元文件…

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…

AI智能混剪工具:AnKo打造高效创作的利器!

AI智能混剪工具:AnKo打造高效创作的利器! 随着AI技术的迅速发展,AI智能混剪工具逐渐成为内容创作的利器,尤其是AnKo,作为一款免费的AI创作平台,提供了多模型AI聚合工具平台,能为用户带来更高效…

【Hestia Project 数据集】美国化石燃料 CO₂ 排放数据

Hestia Project™ 是一个革命性的研究项目,旨在帮助城市更精确地量化和管理与气候变化相关的碳排放问题。该项目提供了细粒度(建筑、街道、工厂级别)的化石燃料 CO₂ 排放数据,并通过直观的三维可视化系统向公众、政策制定者、科学家和工业界提供详细的时空信息,支持碳管理…

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

传感云揭秘:边缘计算的革新力量

在当今快速发展的科技时代,传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体,通过虚拟化技术将物理节点转化为多个服务节点,为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…

Springboot中的 Mapper 无法找到的 可能原因及解决方案

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 问题所示 执行代码的时候,出现如下问题: A component required a bean of type cn.iocoder.yudao.module.gate.dal.mysql.logger.GateOperateLogMap…

【c++】开发环境IDE、常见调试方法(gdb等)、基础c++语法特性、算法OJ刷题、入门c++项目【持续更新】

1 开发环境&IDE 基本就是如下3款,个人使用体验: vscode:优点-轻量化,插件多,便于远程调试,缺点-配置复杂 clion:优点-集成环境,最易于上手,缺点-商业软件,收费 visu…

Leetcode做题记录----3

1474、删除链表M个节点之后的N个节点 思路: 1、两个循环解决问题 第一个循环移动M个位置,第二个循环确定移动N个位置后的,然后将M位置的节点的next指向,N位置后的节点即可 2、注意边界条件和判空处理 代码实现: pub…

pytorch快速入门——手写数字分类GPU加速

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! pytorch快速入门——手写数字分类GPU加速 一、tensor1&#…

阿里wan2.1本地部署

1.安装虚拟环境, a) 安装python-3.11.8 b)在本地目录运行 - python -m venv Wan2.1-env - cd Scripts - activate 2.下载代码 git clone https://github.com/Wan-Video/Wan2.1.git cd Wan2.1 3.安装依赖库 pip install torch torchvision --index-url https://…

HTTPS建立连接过程

一、混合加密 通过混合加密的方式可以保证信息的机密性,解决了窃听的风险。 HTTPS采用的是对称加密和非对称加密结合的混合加密方式: (1) 在通信建立前采用非对称加密的方式交换会话密钥,后续就不再使用非对称加密。 &…