ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

nnU-Net 数据集规划与预处理完全指南:指纹提取、实验规划与数据预处理的原理与实操

nnU-Net 数据集规划与预处理完全指南:指纹提取、实验规划与数据预处理的原理与实操 人工智能深度学习计算机视觉医疗健康【免费下载链接】nnUNet项目地址https://gitcode.com/gh_mirrors/nn/nnUNet点击查看免费下载本指南围绕 nnU-Net 的nnUNetv2_plan_and_preprocess命令展开系统讲解数据集指纹fingerprint提取、实验规划experiment planning与数据预处理preprocessing三步流水线的原理、全部命令行参数与产物格式。读完本文你将能独立完成任意新数据集的规划与预处理掌握nnUNet_preprocessed目录下每个文件的含义并理解如何拆分为独立步骤、如何重建前景采样位置存储以及何时必须重新预处理。推荐命令一条命令完成全部三步对于一个新的数据集nnU-Net 推荐直接使用一站式命令nnUNetv2_plan_and_preprocess -d DATASET_ID --verify_dataset_integrity其中DATASET_ID是数据集的数字标识符例如2、3对应nnUNet_raw/DatasetXXX_Name目录中的数字部分。--verify_dataset_integrity是首次运行强烈推荐的标志它会在正式处理前全面检查数据集完整性确保你的输入数据格式无误避免后续训练阶段才发现问题。命令执行完毕后所有产物会写入nnUNet_preprocessed/DatasetXXX_Name目录。从源码看这一条命令在 plan_and_preprocess_entrypoints.py 中被拆分为三个连续阶段依次执行先打印Fingerprint extraction...调用extract_fingerprints再打印Experiment planning...调用plan_experiments最后打印Preprocessing...调用preprocess。命令实际做了什么三步流水线第一步提取数据集指纹Extract Fingerprint指纹提取是规划的前置条件。DatasetFingerprintExtractor实现见 fingerprint_extractor.py会逐 case 并行分析训练数据最终生成dataset_fingerprint.json其中包含spacings每个训练 case 的体素间距列表shapes_after_crop每个 case 裁剪掉背景crop to nonzero后的空间形状foreground_intensity_properties_per_channel每个通道在前景区域的强度统计mean、median、std、min、max、percentile_99_5、percentile_00_5用于后续的强度归一化median_relative_size_after_cropping裁剪后体积占原始体积比例的中位数规划器据此决定是否使用非零掩码进行归一化见 default_experiment_planner.py。指纹提取有几点值得注意的实现细节它不会预先保存裁剪后的图像而是在分析时即时执行crop_to_nonzero代价是预处理阶段会再裁一次源码注释明确说明了这一取舍为保证内存可控全数据集前台体素采样总量被限制在10e7self.num_foreground_voxels_for_intensitystats每个 case 采样int(10e7 / num_cases)个前景像素且使用有放回抽样rs.choice(..., replaceTrue)避免前景像素过少的 case 被低估指纹文件只写入nnUNet_preprocessed目录而非nnUNet_raw因为 raw 目录可能是只读的。第二步实验规划Plan Experiment实验规划器ExperimentPlanner见 default_experiment_planner.py读取上一步的指纹为数据集生成一到多个配置configuration最终写出nnUNetPlans.json。默认生成2d、3d_fullres、3d_lowres三种配置3d_cascade_fullres 复用 3d_fullres 的预处理数据无需单独规划。规划阶段的核心决策包括目标间距target spacing默认取所有 case 间距的第 50 百分位中位数对间距高度各向异性、且低分辨率轴体素明显偏少的数据集如 ACDC会改用第 10 百分位并加以约束避免插值伪影见determine_fullres_target_spacingdefault_experiment_planner.py网络拓扑与 patch size以目标间距的倒数作为长宽比先推得初始 patch size再通过get_pool_and_conv_props计算每轴池化次数、卷积核尺寸和最终 patch size并保证 patch 各轴能被2 ** num_pool整除batch size 与显存适配规划器会实例化网络不初始化权重静态估算卷积特征图大小并依据gpu_memory_target_in_gb默认 8 GB调整 patch/batch使单次前反向传播覆盖的数据不超过整个数据集的 5%self.max_dataset_covered 0.05且 batch size 至少为 2转置transpose将最大间距轴排到最前transpose_forward并记录对应的transpose_backward用于推理时把预测结果换回原始方向。生成的nnUNetPlans.json结构与字段含义可查阅 plans-and-configuration.md。全局字段包括image_reader_writer、label_manager、transpose_forward/backward、dataset_name每个配置下则是spacing、patch_size、batch_size、data_identifier、preprocessor_name、normalization_schemes、network_arch_class_name、conv_kernel_sizes、num_pool_per_axis、pool_op_kernel_sizes等。配置之间还可以通过inherits_from继承并覆写字段例如3d_fullres_bs40: { inherits_from: 3d_fullres, batch_size: 40 }第三步预处理数据PreprocessDefaultPreprocessor见 default_preprocessor.py依据 plans 中每个配置的参数将原始数据转换为训练可直接读取的格式。单个 case 的处理顺序run_case/run_case_npy为转置transpose按transpose_forward重排数据轴并同步重排 spacing裁剪crop执行crop_to_nonzero裁掉背景记录shape_before_cropping与bbox_used_for_cropping归一化normalize必须发生在重采样之前否则重采样后的非零掩码与图像无法完美对齐。归一化方案按通道从normalization_schemes查表获取例如 CT 图像使用基于foreground_intensity_properties_per_channel的 z-score 类方案重采样resample数据用三阶样条order: 3、分割用最近邻/一阶order: 1重采样到目标 spacing 对应的新形状后处理分割调用modify_seg_fn默认无操作可覆写用于稀疏标注实验并记录该 case 实际包含的标签列表present_labels保存图像与分割以 blosc2 压缩格式写入data_identifier/目录详见下文产物格式。预处理默认启用多进程2d用 8 进程、3d_fullres用 4 进程、3d_lowres用 8 进程。重采样非常消耗内存若内存吃紧必须调低-np源码与 CLI 帮助均以大写强调 MONITOR RAM USAGE。常用选项详解nnUNetv2_plan_and_preprocess的完整参数定义见 plan_and_preprocess_entrypoints.py参数默认值说明-d必填数据集 ID 列表如-d 1 2 3可一次处理多个数据集--verify_dataset_integrity关闭推荐开启每个数据集至少运行一次检查数据完整性-fpeDatasetFingerprintExtractor自定义指纹提取器类名-npfp8指纹提取使用的进程数--clean关闭强制覆盖已存在的指纹修改过数据集或更换提取器后必须开启--no_pp关闭只做指纹提取与实验规划跳过预处理适合调试-plExperimentPlanner自定义规划器类名不再区分 2d/3d 规划器-gpu_memory_targetNone规划器默认 8 GB⚠️ 危险区自定义 GPU 显存目标会改变 patch 与 batch size进而影响模型性能-preprocessor_nameDefaultPreprocessor⚠️ 危险区自定义预处理器类须位于nnunetv2.preprocessing-overwrite_target_spacingNone⚠️ 危险区仅对 3d_fullres 与 3d_cascade_fullres 生效须传三个 float-overwrite_plans_nameNone配合上面三个危险参数使用生成不同名字的 plans 文件避免覆盖默认 plans此后训练/推理需用-p指定该文件-c2d 3d_fullres 3d_lowres指定预处理的配置列表不存在于 plans 中的配置会被自动跳过3d_cascade_fullres 无需指定-np见上文预处理进程数可传一个数所有配置共用或与-c等长的列表--no_pbar关闭非交互/集群环境推荐禁用进度条配合--verbose输出详细日志--verbose关闭打印大量调试信息实践建议如果只关心某个配置例如只需 3D 全分辨率用-c 3d_fullres可以显著减少预处理时间与磁盘占用在 HPC/集群上务必加--no_pbar一旦在dataset.json、原始图像或分割文件上做过任何修改重跑时请加上--clean强制重新提取指纹。拆分为独立步骤更细粒度的控制如果需要对每个阶段单独控制例如只重跑预处理、或只重新规划可以分别运行nnUNetv2_extract_fingerprint -d DATASET_ID nnUNetv2_plan_experiment -d DATASET_ID nnUNetv2_preprocess -d DATASET_ID三个命令的入口同样定义在 plan_and_preprocess_entrypoints.pynnUNetv2_extract_fingerprint支持-fpe、-np、--verify_dataset_integrity、--cleannnUNetv2_plan_experiment支持-pl、-gpu_memory_target、-preprocessor_name、-overwrite_target_spacing、-overwrite_plans_namennUNetv2_preprocess支持-plans_name指定自定义 plans 文件、-c、-np。注意nnUNetv2_preprocess的-plans_name默认是nnUNetPlans如果你用-overwrite_plans_name生成了自定义 plans这里要传入对应的名字。为什么推荐--verify_dataset_integrityverify_dataset_integrity实现见 verify_dataset_integrity.py在指纹提取之前运行主要检查dataset.json必须存在且包含必需键labels、channel_names或旧式modality、numTraining、file_ending实际找到的训练 case 数量必须等于numTraining且每个 case 的图像与标签文件齐全标签必须是连续整数0, 1, 2, ...分割中不能出现预期之外的标签值仅含背景 0 的 case 会给出警告每个 case 的图像与分割的形状、间距必须一致通道数必须与channel_names匹配图像与分割都不能含 NaN对 nibabel 读取的图像检查 affine 是否一致、SimpleITK 读取的图像检查 origin 与 direction——这两类不一致仅警告不报错建议用nnUNetv2_plot_overlay_pngs人工复核配准是否正确。若检查未通过命令会抛出RuntimeError并指出具体是哪些文件、哪类错误。这个一次性检查能帮你把绝大多数数据集格式问题拦截在训练之前。预处理完成后需要检查什么预处理结束后nnUNet_preprocessed/DatasetXXX_Name目录下的结构为DatasetXXX_Name/ ├── dataset.json # 从 nnUNet_raw 复制的数据集描述供验证与推理使用 ├── dataset_fingerprint.json # 数据集指纹 ├── nnUNetPlans.json # 实验规划结果各配置定义 ├── gt_segmentations/ # 原始分割的备份用于原始分辨率下的验证 └── nnUNetPlans_2d/ # 2d 配置的预处理数据 └── nnUNetPlans_3d_fullres/ # 3d_fullres 配置的预处理数据 └── nnUNetPlans_3d_lowres/ # 3d_lowres 配置的预处理数据每个配置文件夹data_identifier/例如nnUNetPlans_3d_fullres/的内容与格式在 preprocessed-data-format.md 中有完整说明核心文件包括文件内容case.b2nd预处理后的图像数据(c, x, y, z)float32blosc2 压缩case_seg.b2nd预处理后的分割(1, x, y, z)blosc2 压缩case.pklcase 属性spacing、shape_before_cropping、bbox_used_for_cropping、shape_after_cropping_and_before_resampling、reader 元数据、present_labelsfg_sampling/全部 case 共享的前景采样位置存储见下其中present_labels是预处理时在分割仍驻留内存时记录的在modify_seg_fn之后因此构建采样存储时无需再扫描分割来推断每个 case 含哪些标签。此外预处理还会把原始分割复制到gt_segmentations/仅复制比现有文件更新的这样即使原始数据不再可用例如计算集群只保留预处理数据也能在原始分辨率下做验证。前景采样位置存储fg_sampling/训练时 nnU-Net 会以oversample_foreground_percent默认 0.33的比例对前景类为中心的 patch 进行过采样数据加载器需要从每个 case 中随机取一个前景体素坐标。旧版 nnU-Net 把全部坐标以class_locations存在每个 case 的.pkl里读取一个坐标就要反序列化整个文件在多类数据集上这成为数据加载与磁盘占用的主要开销例如 TotalSegmentator v2 上 1228 个 case、117 类的.pkl合计 18.26 GB占整个预处理目录的 28%。因此新版本将前景采样位置迁移到每个配置文件夹下独立的压缩存储fg_sampling/文件内容locations.b2nd1Duint64blosc2 数组扁平线性体素索引(case, class) 段内升序indptr.npyint64长度n_cases 1CSR 行指针class_id.npyuint16或uint32长度nnz指向类别键表count.npyuint32长度nnz每段坐标数base.npyint64长度n_cases每个 case 数据块的起始位置shape.npyint64(n_cases, 3)空间形状用于把线性索引展开为三维坐标meta.json存储版本、case 顺序、类别键表、采样参数该存储只记录非空的 (case, class) 段是真正的稀疏CSR结构体积随每个 case 实际含有的类别数增长而不是随数据集总类别数增长。单次坐标查询只需触摸少量内存映射值并解压一个 blosc2 块在 TotalSegmentator v2 上采样元数据从 18.26 GB 的 1228 个文件降为约 450 MB 的 7 个文件冷读取单次采样从 6.73 ms 降到约 0.06 ms。nnUNetv2_plan_and_preprocess与nnUNetv2_preprocess都会自动构建该存储。如需手动重建或迁移旧版数据可运行nnUNetv2_extract_sampling_locations -d DATASET_ID [-c 2d 3d_fullres] [-np 8] [--keep_existing]该命令见 extract_sampling_locations.py只读取预处理后的分割_seg.b2nd从不触碰图像数据因此非常廉价Hippocampus 260 例约 2 秒TotalSegmentator v2 上只涉及 0.24 GB 而非 45 GB可以随时重跑——例如在修改采样逻辑之后。采样本身的行为与旧版完全一致它调用DefaultPreprocessor._sample_foreground_locations参数同为min_num_samples10000、min_percent_coverage0.01、seed1234且已验证能逐坐标复现旧版结果Hippocampus 上 520 个 (case, class) 对、856,754 个坐标零不一致。旧版本 nnU-Net 预处理过的数据集无需重新预处理若找不到fg_sampling/存储数据加载器会自动回退到从.pkl的class_locations读取并打印一次性提示运行nnUNetv2_extract_sampling_locations即可原地完成迁移重跑预处理也可以并额外缩小.pkl的体积。从源码结构看这一回退逻辑由 foreground_locations.py 中的存储读写与数据加载器共同实现。何时需要重新预处理根据 plans-and-configuration.md 的说明需要重新预处理任何影响已准备数据的改动例如spacing、preprocessor_name、normalization_schemes、重采样函数以及任何要求新data_identifier的改动新增自定义配置时务必同时定义新的data_identifier避免与既有预处理数据混淆不需要重新预处理纯训练侧改动例如batch_size以及复用同一份预处理数据的一些纯架构设置。下一步训练模型规划与预处理完成后数据即可用于训练。请继续阅读 Train models 了解如何启动nnUNetv2_train训练各配置并执行交叉验证训练中涉及的nnUNetPlans.json深入定制可参考 plans-and-configuration.md 与 explanation_plans_files.md强度归一化原理见 explanation_normalization.md。赞分享人工智能深度学习计算机视觉医疗健康【免费下载链接】nnUNet项目地址https://gitcode.com/gh_mirrors/nn/nnUNet点击查看免费下载相关推荐XTuner 离线处理数据集指南大规模微调数据的预处理与复用实战XTuner 离线处理数据集指南大规模微调数据的预处理与复用实战 导读 当训练数据量非常庞大时如果每次启动训练都现场对原始数据进行加载、映射、打模板与 to大模型模型微调Theano大规模数据集处理高效数据加载与预处理Theano大规模数据集处理高效数据加载与预处理 在机器学习和深度学习项目中处理大规模数据集是一个常见挑战。你是否还在为数据加载速度慢、内存占用过高而烦恼人工智能深度学习机器学习科学计算3分钟快速上手SUSI Firefox Bot - 您的浏览器内置AI助手3分钟快速上手SUSI Firefox Bot 您的浏览器内置AI助手 在当今信息爆炸的时代我们经常需要在浏览网页时快速获取信息、解答疑问或执行简单任务。S上一篇精准肺部肿块检测开源数据集助力医学图像处理下一篇Phi-3-medium-128k-instruct多模态扩展结合视觉模型的未来发展方向创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表