nnUNetV2实战:从零构建医学影像2D分割数据集全流程解析
1. 环境准备与框架安装第一次接触nnUNetV2时我被它繁琐的环境依赖搞得焦头烂额。现在回想起来其实只要掌握几个关键点就能避开大部分坑。建议使用Python 3.9的环境我实测Python 3.10的兼容性最好。先通过conda创建隔离环境conda create -n nnunetv2 python3.10 -y conda activate nnunetv2安装PyTorch时要特别注意CUDA版本匹配。我的RTX 3090显卡需要CUDA 11.7对应以下安装命令pip install torch2.0.0cu117 torchvision0.15.1cu117 torchaudio2.0.1nnUNetV2有两种安装方式对于只想使用预训练模型的用户直接pip install nnunetv2即可但要做二次开发的话必须源码安装git clone https://github.com/MIC-DKFZ/nnUNet.git cd nnUNet pip install -e .这个-e参数很关键它会把nnUNet注册为可编辑模式同时安装所有命令行工具。安装完成后试试运行nnUNetv2_train --help如果能看到帮助信息说明安装成功。2. 数据集格式转换实战医学影像数据格式五花八门nnUNetV2要求的数据结构却非常严格。我处理过的DICOM、NIfTI、PNG等格式中RGB三通道PNG的转换最麻烦。假设原始数据存放在/data/original需要先创建三个目录mkdir -p nnUNet_raw/Dataset110_MyData/imagesTr mkdir -p nnUNet_raw/Dataset110_MyData/labelsTr mkdir -p nnUNet_raw/Dataset110_MyData/imagesTs关键点在于文件命名规则图像文件必须包含_0000后缀如case1_0000.png图像和标签要严格对应如case1_0000.png对应case1.png标签必须是单通道或三通道相同值的PNG我写了个自动转换脚本处理RGB标签from PIL import Image import numpy as np def convert_label(label_path): img np.array(Image.open(label_path)) if len(img.shape) 3: # RGB转单通道 img img[:,:,0] # 取R通道 Image.fromarray(img).save(new_label_path)3. 预处理配置技巧设置环境变量是很多新手忽略的关键步骤。在.bashrc中添加以下内容路径需替换export nnUNet_raw/path/to/nnUNet_raw export nnUNet_preprocessed/path/to/preprocessed export nnUNet_results/path/to/results运行预处理时会遇到两个常见问题内存不足对于大尺寸2D图像添加-overwrite_plans_identifier 2d参数数据校验失败检查标签是否包含非法值建议先用--verify_dataset_integrity参数预处理命令示例nnUNetv2_plan_and_preprocess -d 110 --verify_dataset_integrity4. 训练参数调优2D分割的训练配置比3D简单很多但仍有几个关键参数nnUNetv2_train 110 2d 5这里的5表示5折交叉验证。训练过程中要特别关注学习率曲线正常应该先上升后平稳下降GPU利用率2D训练通常能达到90%利用率验证集Dice系数波动小于0.02说明训练稳定遇到OOM错误时可以修改nnUNetPlans.json中的patch_size: [256, 256], batch_size: 165. 推理与后处理最佳配置查找命令nnUNetv2_find_best_configuration 110 -c 2d推理时注意输入输出路径的匹配nnUNetv2_predict -d 110 \ -i nnUNet_raw/Dataset110_MyData/imagesTs \ -o ./predictions \ -f 5 -c 2d后处理能提升约1-2%的Dice分数nnUNetv2_apply_postprocessing \ -i ./predictions \ -o ./predictions_pp \ -pp_pkl_file ./postprocessing.pkl6. 评估指标解读nnUNetV2的评估结果包含多个指标Dice系数主要评估指标0.9以上为优秀IoU比Dice更严苛的指标FP/FN分析过分割/欠分割情况我常用的评估脚本from nnunetv2.evaluation.evaluate_predictions import compute_metrics_on_folder metrics compute_metrics_on_folder( folder_refpath/to/labels, folder_predpath/to/predictions, file_ending.png ) print(fDice: {metrics[foreground_mean][Dice]:.4f})7. 自定义数据划分当需要固定训练集/验证集时创建splits_final.json[ { train: [case1, case2, case3], val: [case4, case5] } ]训练时指定fold 0nnUNetv2_train 110 2d 0这个功能在对比不同算法效果时特别有用能确保所有方法使用相同的数据划分。我在处理小样本数据时100例会手动确保每个类别在训练集和验证集中都有代表。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438436.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!