当前位置: 首页 > news >正文

基于 U-Net 的医学图像分割

项目概述

该项目实现了一个端到端的医学图像分割流程,包括:

  • 数据预处理与增强

  • U-Net 模型构建与训练

  • 模型验证与可视化

  • 结果保存与分析

数据预处理

项目使用 DSB2018 数据集,通过 preprocess_dsb2018.py 进行数据预处理:

def main():img_size = 96paths = glob('inputs/stage1_train/*')# 创建输出目录os.makedirs('inputs/dsb2018_%d/images' % img_size, exist_ok=True)os.makedirs('inputs/dsb2018_%d/masks/0' % img_size, exist_ok=True)for i in tqdm(range(len(paths))):path = paths[i]img = cv2.imread(os.path.join(path, 'images', os.path.basename(path) + '.png'))mask = np.zeros((img.shape[0], img.shape[1]))# 合并多个掩码for mask_path in glob(os.path.join(path, 'masks', '*')):mask_ = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) > 127mask[mask_] = 1# 调整图像尺寸img = cv2.resize(img, (img_size, img_size))mask = cv2.resize(mask, (img_size, img_size))# 保存处理后的图像和掩码cv2.imwrite(os.path.join('inputs/dsb2018_%d/images' % img_size, os.path.basename(path) + '.png'), img)cv2.imwrite(os.path.join('inputs/dsb2018_%d/masks/0' % img_size, os.path.basename(path) + '.png'), (mask * 255).astype('uint8'))

预处理步骤包括:

  1. 统一图像尺寸为 96×96 像素

  2. 合并多个掩码文件为单个二值掩码

  3. 标准化图像格式和通道

数据集类设计

dataset.py 中实现了自定义数据集类,支持数据增强:

class Dataset(torch.utils.data.Dataset):def __init__(self, img_ids, img_dir, mask_dir, img_ext, mask_ext, num_classes, transform=None):self.img_ids = img_idsself.img_dir = img_dirself.mask_dir = mask_dirself.img_ext = img_extself.mask_ext = mask_extself.num_classes = num_classesself.transform = transformdef __getitem__(self, idx):img_id = self.img_ids[idx]# 读取图像和掩码img = cv2.imread(os.path.join(self.img_dir, img_id + self.img_ext))mask = []for i in range(self.num_classes):mask.append(cv2.imread(os.path.join(self.mask_dir, str(i),img_id + self.mask_ext), cv2.IMREAD_GRAYSCALE)[..., None])mask = np.dstack(mask)# 数据增强if self.transform is not None:augmented = self.transform(image=img, mask=mask)img = augmented['image']mask = augmented['mask']# 标准化和维度调整img = img.astype('float32') / 255img = img.transpose(2, 0, 1)mask = mask.astype('float32') / 255mask = mask.transpose(2, 0, 1)return img, mask, {'img_id': img_id}

数据增强策略

项目使用 Albumentations 库进行数据增强:

训练集增强:

train_transform = Compose([albu.RandomRotate90(),albu.HorizontalFlip(),albu.OneOf([albu.HueSaturationValue(),albu.RandomBrightnessContrast(),], p=1),albu.Resize(config['input_h'], config['input_w']),albu.Normalize(),
])

验证集增强:

val_transform = Compose([albu.Resize(config['input_h'], config['input_w']),albu.Normalize(),
])

模型训练

train.py 实现了完整的训练流程:

参数配置

def parse_args():parser = argparse.ArgumentParser()parser.add_argument('--name', default="dsb2018_96_NestedUNet_woDS")parser.add_argument('--epochs', default=100, type=int)parser.add_argument('--batch_size', default=8, type=int)parser.add_argument('--arch', default='NestedUNet')parser.add_argument('--deep_supervision', default=False, type=str2bool)parser.add_argument('--loss', default='BCEDiceLoss')parser.add_argument('--optimizer', default='SGD')parser.add_argument('--lr', default=1e-3, type=float)# ... 更多参数

训练循环

def train(config, train_loader, model, criterion, optimizer):model.train()for input, target, _ in train_loader:# 前向传播if config['deep_supervision']:outputs = model(input)loss = 0for output in outputs:loss += criterion(output, target)loss /= len(outputs)iou = iou_score(outputs[-1], target)else:output = model(input)loss = criterion(output, target)iou = iou_score(output, target)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()

模型验证与可视化

val.py 提供了模型验证和结果可视化功能:

def plot_examples(datax, datay, model, num_examples=6):fig, ax = plt.subplots(nrows=num_examples, ncols=3, figsize=(18,4*num_examples))m = datax.shape[0]for row_num in range(num_examples):image_indx = np.random.randint(m)image_arr = model(datax[image_indx:image_indx+1]).squeeze(0).detach().cpu().numpy()ax[row_num][0].imshow(np.transpose(datax[image_indx].cpu().numpy(), (1,2,0))[:,:,0])ax[row_num][0].set_title("Orignal Image")ax[row_num][1].imshow(np.squeeze((image_arr > 0.40)[0,:,:].astype(int)))ax[row_num][1].set_title("Segmented Image localization")ax[row_num][2].imshow(np.transpose(datay[image_indx].cpu().numpy(), (1,2,0))[:,:,0])ax[row_num][2].set_title("Target image")plt.show()

关键特性

1. 深度监督

支持深度监督训练,通过多个输出层提供中间监督信号。

2. 灵活的损失函数

支持多种损失函数,包括 BCEWithLogitsLoss 和自定义的 BCEDiceLoss。

3. 学习率调度

提供多种学习率调度策略:

  • CosineAnnealingLR

  • ReduceLROnPlateau

  • MultiStepLR

  • ConstantLR

4. 早停机制

通过监控验证集性能实现早停,防止过拟合。

使用方式

训练模型

python train.py --dataset dsb2018_96 --arch NestedUNet

验证模型

python val.py --name dsb2018_96_NestedUNet_woDS

总结

该项目提供了一个完整的医学图像分割解决方案,具有以下优点:

  1. 模块化设计:各个组件独立,便于修改和扩展

  2. 丰富的数据增强:提高模型泛化能力

  3. 灵活的配置:通过配置文件管理所有超参数

  4. 完整的训练监控:记录训练过程中的各项指标

  5. 结果可视化:直观展示分割效果

这个项目不仅适用于细胞核分割,通过调整配置也可以应用于其他医学图像分割任务,为医学图像分析研究提供了有力的工具。

http://www.dtcms.com/a/564873.html

相关文章:

  • 【图像处理基石】多频谱图像融合算法入门
  • 室温反应蒸发+200℃退火调控 MoOₓ/NiOₓ薄膜:光伏空穴传输材料性能优化与效率潜力(>25%)分析
  • 微算法科技(NASDAQ MLGO):DPoS驱动区块链治理与DAO机制融合,共筑Web3.0坚实基石
  • 视频直播点播平台EasyDSS:助力现代农业驶入数字科技“快车道”
  • 迈网科技 官方网站网站建设调研问卷
  • vue 实现自定义message 全局提示
  • 电商网站里的图片网站开发中 视频播放卡
  • [手机AI开发sdk] 模型冻结解冻.pb | `aidlite`加速AI模型
  • 2025 年热门 CV 会议论文【源码复现】:Neural Inverse Rendering from Propagating Light
  • 中小企业网站建设与管理南通网站排名团队
  • TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
  • LeetCode hot100:189 轮转数组:三种解法从入门到精通
  • 初识MYSQL —— 基本查询
  • 项目打包与部署 —— 把 Java 项目 “装瓶带走”(本地运行→服务器落地全流程)
  • 湘潭做网站价格找磐石网络一流河北网站建设哪家好
  • React 11 登录页项目框架搭建
  • MySQL物理备份之Percona XtraBackup
  • 糖尿病预测多个机器学习维度预测
  • CSP-J教程——第一阶段——第三课:基本的输入与输出
  • 营销网站怎么做合适全站搜索
  • 解决IntelliJ IDEA控制台输出中文乱码问题
  • 昆仑芯 X HAMi X 百度智能云 | 昆仑芯 P800 XPU/vXPU 双模式算力调度方案落地
  • HarmonyOS6.0开发实战:HTTP 网络请求与 API 交互全指南
  • 合肥网站开发建设wordpress使用难不难
  • 杭州市上城区建设局网站江阴网页设计
  • 【软考】信息系统项目管理师-进度管理论文范文
  • 开关电源的短路保护如何测试?又需要哪些仪器呢?-纳米软件
  • 从 0 到 1 掌握医学图像分割 的完整实战指南
  • HTML应用指南:利用POST请求获取全国爱回收门店位置信息
  • 在线下载免费软件的网站网页设计模板图片html