nnunetv2(一)项目结构、配置文件和nnUNetv2_convert_MSD_dataset命令

CosyVoice 本地部署详细教程 手把手小白教程 本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。 阅读详情
AI摘要

本文介绍了nnunetv2的项目结构、配置文件和nnUNetv2_convert_MSD_dataset命令。项目结构涉及setup.py、pyproject.toml、configuration.py等。setup.py可用于安装nnunet v2,pyproject.toml是配置文件。nnUNetv2_convert_MSD_dataset是命令行代码入口,用于解析参数并调用函数,实现task文件到dataset的转换。

如有错误,欢迎评论

项目结构

## 0.0 文档说明
./documentation/__init__.py
├── benchmarking.md
├── changelog.md
├── convert_msd_dataset.md
├── dataset_format_inference.md
├── dataset_format.md                   #数据格式
├── explanation_normalization.md        #归一化方式
├── explanation_plans_files.md          #设计实验的方法
├── extending_nnunet.md
├── how_to_use_nnunet.md                #如何使用nnunet
├── __init__.py
├── installation_instructions.md        #如何安装nnunet
├── manual_data_splits.md               #手动区分训练集和验证集
├── pretraining_and_finetuning.md
├── region_based_training.md
├── run_inference_with_pretrained_models.md
├── set_environment_variables.md
├── setting_up_paths.md
└── tldr_migration_guide_from_v1.md
./setup.py
./nnunetv2/paths.py
./nnunetv2/configuration.py
## 1.0数据格式转换代码,通过下面的代码,可以将其他数据文件存储目录结构调整成nnunet可以使用的目录结构
./nnunetv2/dataset_conversion/__init__.py
./nnunetv2/dataset_conversion/generate_dataset_json.py
./nnunetv2/dataset_conversion/datasets_for_integration_tests/__init__.py
./nnunetv2/dataset_conversion/datasets_for_integration_tests/Dataset998_IntegrationTest_Hippocampus_ignore.py
./nnunetv2/dataset_conversion/datasets_for_integration_tests/Dataset996_IntegrationTest_Hippocampus_regions_ignore.py
./nnunetv2/dataset_conversion/datasets_for_integration_tests/Dataset999_IntegrationTest_Hippocampus.py
./nnunetv2/dataset_conversion/datasets_for_integration_tests/Dataset997_IntegrationTest_Hippocampus_regions.py
./nnunetv2/dataset_conversion/convert_raw_dataset_from_old_nnunet_format.py
./nnunetv2/dataset_conversion/convert_MSD_dataset.py # 命令使用
./nnunetv2/dataset_conversion/Dataset137_BraTS21.py
./nnunetv2/dataset_conversion/Dataset120_RoadSegmentation.py
./nnunetv2/dataset_conversion/Dataset114_MNMs.py
./nnunetv2/dataset_conversion/Dataset218_Amos2022_task1.py
./nnunetv2/dataset_conversion/Dataset988_dummyDataset4.py
./nnunetv2/dataset_conversion/Dataset027_ACDC.py
./nnunetv2/dataset_conversion/Dataset220_KiTS2023.py
./nnunetv2/dataset_conversion/Dataset073_Fluo_C3DH_A549_SIM.py
./nnunetv2/dataset_conversion/Dataset115_EMIDEC.py
./nnunetv2/dataset_conversion/Dataset219_Amos2022_task2.py

## 1.1、图像读取模块
./nnunetv2/imageio/nibabel_reader_writer.py
./nnunetv2/imageio/simpleitk_reader_writer.py
./nnunetv2/imageio/tif_reader_writer.py
./nnunetv2/imageio/__init__.py
./nnunetv2/imageio/natural_image_reager_writer.py
./nnunetv2/imageio/reader_writer_registry.py
./nnunetv2/imageio/base_reader_writer.py

## 1.2、工具包模块
./nnunetv2/utilities/get_network_from_plans.py
./nnunetv2/utilities/default_n_proc_DA.py
./nnunetv2/utilities/overlay_plots.py
./nnunetv2/utilities/helpers.py
./nnunetv2/utilities/collate_outputs.py
./nnunetv2/utilities/ddp_allgather.py
./nnunetv2/utilities/__init__.py
./nnunetv2/utilities/json_export.py
./nnunetv2/utilities/label_handling/__init__.py
./nnunetv2/utilities/label_handling/label_handling.py
./nnunetv2/utilities/network_initialization.py
./nnunetv2/utilities/dataset_name_id_conversion.py
./nnunetv2/utilities/file_path_utilities.py
./nnunetv2/utilities/find_class_by_name.py
./nnunetv2/utilities/utils.py
./nnunetv2/utilities/plans_handling/plans_handler.py
./nnunetv2/utilities/plans_handling/__init__.py


## 2.0、生成nnunet可以使用的数据类型,并且对数据进行统计分析,设计模型需要使用的各种超参
./nnunetv2/experiment_planning/plan_and_preprocess_api.py
./nnunetv2/experiment_planning/plan_and_preprocess_entrypoints.py
./nnunetv2/experiment_planning/__init__.py
./nnunetv2/experiment_planning/dataset_fingerprint/__init__.py
./nnunetv2/experiment_planning/dataset_fingerprint/fingerprint_extractor.py
./nnunetv2/experiment_planning/plans_for_pretraining/__init__.py
./nnunetv2/experiment_planning/plans_for_pretraining/move_plans_between_datasets.py
./nnunetv2/experiment_planning/experiment_planners/__init__.py
./nnunetv2/experiment_planning/experiment_planners/network_topology.py
./nnunetv2/experiment_planning/experiment_planners/resencUNet_planner.py
./nnunetv2/experiment_planning/experiment_planners/default_experiment_planner.py
./nnunetv2/experiment_planning/verify_dataset_integrity.py

## 2.1、前处理模块
./nnunetv2/preprocessing/cropping/cropping.py
./nnunetv2/preprocessing/cropping/__init__.py
./nnunetv2/preprocessing/resampling/__init__.py
./nnunetv2/preprocessing/resampling/default_resampling.py
./nnunetv2/preprocessing/resampling/utils.py
./nnunetv2/preprocessing/__init__.py
./nnunetv2/preprocessing/normalization/map_channel_name_to_normalization.py
./nnunetv2/preprocessing/normalization/default_normalization_schemes.py
./nnunetv2/preprocessing/normalization/__init__.py
./nnunetv2/preprocessing/preprocessors/__init__.py
./nnunetv2/preprocessing/preprocessors/default_preprocessor.py

## 2.2、后处理模块
./nnunetv2/postprocessing/remove_connected_components.py
./nnunetv2/postprocessing/__init__.py

## 2.3、模型加载
./nnunetv2/__init__.py
./nnunetv2/model_sharing/model_download.py
./nnunetv2/model_sharing/__init__.py
./nnunetv2/model_sharing/model_import.py
./nnunetv2/model_sharing/entry_points.py
./nnunetv2/model_sharing/model_export.py

## 3.0、训练模块
./nnunetv2/training/__init__.py
#3.1、数据加载模块
./nnunetv2/training/dataloading/data_loader_3d.py
./nnunetv2/training/dataloading/__init__.py
./nnunetv2/training/dataloading/utils.py
./nnunetv2/training/dataloading/nnunet_dataset.py
./nnunetv2/training/dataloading/data_loader_2d.py
./nnunetv2/training/dataloading/base_data_loader.py
#3.2、数据增强模块
./nnunetv2/training/data_augmentation/__init__.py
./nnunetv2/training/data_augmentation/compute_initial_patch_size.py
./nnunetv2/training/data_augmentation/custom_transforms/region_based_training.py
./nnunetv2/training/data_augmentation/custom_transforms/deep_supervision_donwsampling.py
./nnunetv2/training/data_augmentation/custom_transforms/__init__.py
./nnunetv2/training/data_augmentation/custom_transforms/transforms_for_dummy_2d.py
./nnunetv2/training/data_augmentation/custom_transforms/masking.py
./nnunetv2/training/data_augmentation/custom_transforms/cascade_transforms.py
./nnunetv2/training/data_augmentation/custom_transforms/manipulating_data_dict.py
./nnunetv2/training/data_augmentation/custom_transforms/limited_length_multithreaded_augmenter.py
#3.3、损失函数模块
./nnunetv2/training/loss/deep_supervision.py
./nnunetv2/training/loss/__init__.py
./nnunetv2/training/loss/dice.py
./nnunetv2/training/loss/robust_ce_loss.py
./nnunetv2/training/loss/compound_losses.py
#3.4、学习率模块
./nnunetv2/training/lr_scheduler/__init__.py
./nnunetv2/training/lr_scheduler/polylr.py
#3.5、日志模块
./nnunetv2/training/logging/nnunet_logger.py
./nnunetv2/training/logging/__init__.py
#3.6、训练最佳实践模块
./nnunetv2/training/nnUNetTrainer/nnUNetTrainer.py
./nnunetv2/training/nnUNetTrainer/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/optimizer/nnUNetTrainerAdan.py
./nnunetv2/training/nnUNetTrainer/variants/optimizer/nnUNetTrainerAdam.py
./nnunetv2/training/nnUNetTrainer/variants/optimizer/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/network_architecture/nnUNetTrainerNoDeepSupervision.py
./nnunetv2/training/nnUNetTrainer/variants/network_architecture/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/network_architecture/nnUNetTrainerBN.py
./nnunetv2/training/nnUNetTrainer/variants/loss/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerTopkLoss.py
./nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerDiceLoss.py
./nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerCELoss.py
./nnunetv2/training/nnUNetTrainer/variants/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/lr_schedule/nnUNetTrainerCosAnneal.py
./nnunetv2/training/nnUNetTrainer/variants/lr_schedule/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/sampling/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/sampling/nnUNetTrainer_probabilisticOversampling.py
./nnunetv2/training/nnUNetTrainer/variants/data_augmentation/nnUNetTrainerNoMirroring.py
./nnunetv2/training/nnUNetTrainer/variants/data_augmentation/nnUNetTrainerDA5.py
./nnunetv2/training/nnUNetTrainer/variants/data_augmentation/nnUNetTrainerNoDA.py
./nnunetv2/training/nnUNetTrainer/variants/data_augmentation/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/data_augmentation/nnUNetTrainerDAOrd0.py
./nnunetv2/training/nnUNetTrainer/variants/benchmarking/nnUNetTrainerBenchmark_5epochs.py
./nnunetv2/training/nnUNetTrainer/variants/benchmarking/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/benchmarking/nnUNetTrainerBenchmark_5epochs_noDataLoading.py
./nnunetv2/training/nnUNetTrainer/variants/training_length/nnUNetTrainer_Xepochs_NoMirroring.py
./nnunetv2/training/nnUNetTrainer/variants/training_length/__init__.py
./nnunetv2/training/nnUNetTrainer/variants/training_length/nnUNetTrainer_Xepochs.py



## 4.0、推理模块
./nnunetv2/inference/examples.py
./nnunetv2/inference/__init__.py
./nnunetv2/inference/sliding_window_prediction.py
./nnunetv2/inference/predict_from_raw_data.py
./nnunetv2/inference/export_prediction.py
./nnunetv2/inference/data_iterators.py
./nnunetv2/ensembling/ensemble.py
./nnunetv2/ensembling/__init__.py
./nnunetv2/run/run_training.py
./nnunetv2/run/load_pretrained_weights.py
./nnunetv2/run/__init__.py
./nnunetv2/batch_running/generate_lsf_runs_customDecathlon.py
./nnunetv2/batch_running/__init__.py
./nnunetv2/batch_running/release_trainings/__init__.py
./nnunetv2/batch_running/release_trainings/nnunetv2_v1/__init__.py
./nnunetv2/batch_running/release_trainings/nnunetv2_v1/generate_lsf_commands.py
./nnunetv2/batch_running/release_trainings/nnunetv2_v1/collect_results.py
./nnunetv2/batch_running/benchmarking/__init__.py
./nnunetv2/batch_running/benchmarking/generate_benchmarking_commands.py
./nnunetv2/batch_running/benchmarking/summarize_benchmark_results.py
./nnunetv2/batch_running/collect_results_custom_Decathlon_2d.py
./nnunetv2/batch_running/collect_results_custom_Decathlon.py

## 5.0、测试模块
./nnunetv2/tests/__init__.py
./nnunetv2/tests/integration_tests/__init__.py
./nnunetv2/tests/integration_tests/run_integration_test_bestconfig_inference.py
./nnunetv2/tests/integration_tests/add_lowres_and_cascade.py
./nnunetv2/tests/integration_tests/cleanup_integration_test.py


## 6.0、验证模块
./nnunetv2/evaluation/accumulate_cv_results.py
./nnunetv2/evaluation/__init__.py
./nnunetv2/evaluation/find_best_configuration.py
./nnunetv2/evaluation/evaluate_predictions.py

参考:知乎

setup.py

可以使用pip install .命令来安装nnunet v2

pyproject.toml

配置文件

[project]
name = "nnunetv2" # 项目名称
version = "2.5" # 版本
requires-python = ">=3.9" # python版本3.9以上
description = "nnU-Net is a framework for out-of-the box image segmentation." # 描述:开箱即用
readme = "readme.md" # 指定README文件
license = { file = "LICENSE" } # 许可证
authors = [ # 作者信息
    { name = "Fabian Isensee", email = "f.isensee@dkfz-heidelberg.de"},
    { name = "Helmholtz Imaging Applied Computer Vision Lab" }
]
classifiers = [ # 分类,提供了一系列关于项目状态、受众、编程语言、许可证和主题相关的信息
    "Development Status :: 5 - Production/Stable",
    "Intended Audience :: Developers",
    "Intended Audience :: Science/Research",
    "Intended Audience :: Healthcare Industry",
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: Apache Software License",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
    "Topic :: Scientific/Engineering :: Image Recognition",
    "Topic :: Scientific/Engineering :: Medical Science Apps.",
]
keywords = [ # 项目关键字
    'deep learning',
    'image segmentation',
    'semantic segmentation',
    'medical image analysis',
    'medical image segmentation',
    'nnU-Net',
    'nnunet'
]
dependencies = [ # 依赖包
    "torch>=2.1.2",
    "acvl-utils>=0.2,<0.3",  # 0.3 may bring breaking changes. Careful!
    "dynamic-network-architectures>=0.3.1,<0.4",  # 0.3.1 and lower are supported, 0.4 may have breaking changes. Let's be careful here
    "tqdm",
    "dicom2nifti",
    "scipy",
    "batchgenerators>=0.25",
    "numpy",
    "scikit-learn",
    "scikit-image>=0.19.3",
    "SimpleITK>=2.2.1",
    "pandas",
    "graphviz",
    'tifffile',
    'requests',
    "nibabel",
    "matplotlib",
    "seaborn",
    "imagecodecs",
    "yacs",
    "batchgeneratorsv2",
    "einops"
]

[project.urls] # 项目主页
homepage = "https://github.com/MIC-DKFZ/nnUNet"
repository = "https://github.com/MIC-DKFZ/nnUNet"

[project.scripts] # 项目脚本入口点
# 数据集准备
nnUNetv2_plan_and_preprocess = "nnunetv2.experiment_planning.plan_and_preprocess_entrypoints:plan_and_preprocess_entry"
# 从数据集中提取指纹
nnUNetv2_extract_fingerprint = "nnunetv2.experiment_planning.plan_and_preprocess_entrypoints:extract_fingerprint_entry"
# 还没有进行预处理
nnUNetv2_plan_experiment = "nnunetv2.experiment_planning.plan_and_preprocess_entrypoints:plan_experiment_entry"
# 数据预处理
nnUNetv2_preprocess = "nnunetv2.experiment_planning.plan_and_preprocess_entrypoints:preprocess_entry"
# 模型训练
nnUNetv2_train = "nnunetv2.run.run_training:run_training_entry"
# 模型加载并预测
nnUNetv2_predict_from_modelfolder = "nnunetv2.inference.predict_from_raw_data:predict_entry_point_modelfolder"
# 模型预测
nnUNetv2_predict = "nnunetv2.inference.predict_from_raw_data:predict_entry_point"
# 将旧版本的nnunet数据集转换为新格式
nnUNetv2_convert_old_nnUNet_dataset = "nnunetv2.dataset_conversion.convert_raw_dataset_from_old_nnunet_format:convert_entry_point"
# 在交叉验证结果中查找最佳模型配置
nnUNetv2_find_best_configuration = "nnunetv2.evaluation.find_best_configuration:find_best_configuration_entry_point"
# 后处理
nnUNetv2_determine_postprocessing = "nnunetv2.postprocessing.remove_connected_components:entry_point_determine_postprocessing_folder"
nnUNetv2_apply_postprocessing = "nnunetv2.postprocessing.remove_connected_components:entry_point_apply_postprocessing"
# 多个模型集成
nnUNetv2_ensemble = "nnunetv2.ensembling.ensemble:entry_point_ensemble_folders"
# 累积交叉验证结果
nnUNetv2_accumulate_crossval_results = "nnunetv2.evaluation.find_best_configuration:accumulate_crossval_results_entry_point"
# 生成预测结果
nnUNetv2_plot_overlay_pngs = "nnunetv2.utilities.overlay_plots:entry_point_generate_overlay"
# 从url中下载预训练模型
nnUNetv2_download_pretrained_model_by_url = "nnunetv2.model_sharing.entry_points:download_by_url"
nnUNetv2_install_pretrained_model_from_zip = "nnunetv2.model_sharing.entry_points:install_from_zip_entry_point"
# 将预训练模型导出
nnUNetv2_export_model_to_zip = "nnunetv2.model_sharing.entry_points:export_pretrained_model_entry"
# 数据集之间移动
nnUNetv2_move_plans_between_datasets = "nnunetv2.experiment_planning.plans_for_pretraining.move_plans_between_datasets:entry_point_move_plans_between_datasets"
# 模型评估
nnUNetv2_evaluate_folder = "nnunetv2.evaluation.evaluate_predictions:evaluate_folder_entry_point"
nnUNetv2_evaluate_simple = "nnunetv2.evaluation.evaluate_predictions:evaluate_simple_entry_point"
# 转换task为dataset
nnUNetv2_convert_MSD_dataset = "nnunetv2.dataset_conversion.convert_MSD_dataset:entry_point"

[project.optional-dependencies] # 项目可选依赖
dev = [
    "black",
    "ruff",
    "pre-commit"
]

[build-system] # 构建系统的要求
requires = ["setuptools>=67.8.0"]
build-backend = "setuptools.build_meta" # 构建后端

[tool.codespell] # 跳过以下后缀文件
skip = '.git,*.pdf,*.svg'
#
# ignore-words-list = ''

configuration.py

nnUNet.nnunetv2.configuration

import os

from nnunetv2.utilities.default_n_proc_DA import get_allowed_n_proc_DA
# 检测环境变量中nnUNet_def_n_proc,如果不存在,默认进程数为8
default_num_processes = 8 if 'nnUNet_def_n_proc' not in os.environ else int(os.environ['nnUNet_def_n_proc'])
# 在一个样本中,最低分辨率轴上的间距是次高分辨率轴上间距的3倍或更大,那么这个样本就被视为是各向异性的
ANISO_THRESHOLD = 3  # determines when a sample is considered anisotropic (3 means that the spacing in the low
# resolution axis must be 3x as large as the next largest spacing)
# 根据当前运行环境设置在数据增强过程中使用的进程数
default_n_proc_DA = get_allowed_n_proc_DA()

nnUNetv2_convert_MSD_dataset

nnunetv2.dataset_conversion.convert_MSD_dataset

entry_point():使用命令行的代码入口,用来解析命令行参数,并且调用函数。
例如如下命令:nnUNetv2_convert_MSD_dataset -i nnUNetFrame/DATASET/nnUNet_raw/Task04_Hippocampus

def entry_point():
    parser = argparse.ArgumentParser()
    # 指定已经下载并且解压的MSD数据文件夹路径,参数不可缺
    parser.add_argument('-i', type=str, required=True,
                        help='Downloaded and extracted MSD dataset folder. CANNOT be nnUNetv1 dataset! Example: '
                             '/home/fabian/Downloads/Task05_Prostate')
    # 用指定的整数来覆盖数据集的ID,参数可选
    parser.add_argument('-overwrite_id', type=int, required=False, default=None,
                        help='Overwrite the dataset id. If not set we use the id of the MSD task (inferred from '
                             'folder name). Only use this if you already have an equivalently numbered dataset!')
    # 进程数,默认是12
    parser.add_argument('-np', type=int, required=False, default=default_num_processes,
                        help=f'Number of processes used. Default: {default_num_processes}')
    args = parser.parse_args()
    convert_msd_dataset(args.i, args.overwrite_id, args.np)

split_4d_nifti:把task文件转换成dataset的具体操作

def split_4d_nifti(filename, output_folder):# 对于四维的图像,其中一个维度可能是时间或者序列
    """对四维的图像分割成三维的图像,对三维的图像保留,并且复制到指定路径"""
    # 读取图像文件
    img_itk = sitk.ReadImage(filename)
    # 获取图像维度
    dim = img_itk.GetDimension()
    # 取出文件名
    file_base = os.path.basename(filename)
    if dim == 3:
        # 去掉后面的.nii.gz
        shutil.copy(filename, join(output_folder, file_base[:-7] + "_0000.nii.gz"))
        return
    elif dim != 4:
        raise RuntimeError("Unexpected dimensionality: %d of file %s, cannot split" % (dim, filename))
    else:
        # 转换为numpy
        img_npy = sitk.GetArrayFromImage(img_itk)
        # 获取图像间距
        spacing = img_itk.GetSpacing()
        # 图像原点
        origin = img_itk.GetOrigin()
        # 图像的方向矩阵
        direction = np.array(img_itk.GetDirection()).reshape(4,4)
        # now modify these to remove the fourth dimension
        spacing = tuple(list(spacing[:-1]))
        origin = tuple(list(origin[:-1]))
        direction = tuple(direction[:-1, :-1].reshape(-1))
        # 遍历每个时间点
        for i, t in enumerate(range(img_npy.shape[0])):
            img = img_npy[t]# 提取当前时间点的三维图像
            img_itk_new = sitk.GetImageFromArray(img)# 将array转换为图像
            img_itk_new.SetSpacing(spacing)# 设置间距
            img_itk_new.SetOrigin(origin)# 设置原点
            img_itk_new.SetDirection(direction)# 设置方向
            sitk.WriteImage(img_itk_new, join(output_folder, file_base[:-7] + "_%04.0d.nii.gz" % i))# 保存图像

convert_msd_dataset:将task变成dataset的主要函数

def convert_msd_dataset(source_folder: str, overwrite_target_id: Optional[int] = None,
                        num_processes: int = default_num_processes) -> None:
    """将task变成dataset的主要函数"""
    if source_folder.endswith('/') or source_folder.endswith('\\'):
        source_folder = source_folder[:-1]

    # 找寻数据结构,必须包含三个子目录(labelsTr,imagesTs,imagesTr)和一个子文件(dataset.json)
    labelsTr = join(source_folder, 'labelsTr')
    imagesTs = join(source_folder, 'imagesTs')
    imagesTr = join(source_folder, 'imagesTr')
    assert isdir(labelsTr), f"labelsTr subfolder missing in source folder"
    assert isdir(imagesTs), f"imagesTs subfolder missing in source folder"
    assert isdir(imagesTr), f"imagesTr subfolder missing in source folder"
    dataset_json = join(source_folder, 'dataset.json')
    assert isfile(dataset_json), f"dataset.json missing in source_folder"

    # infer source dataset id and name,推断id和数据集名字
    task, dataset_name = os.path.basename(source_folder).split('_')
    task_id = int(task[4:])

    # check if target dataset id is taken
    target_id = task_id if overwrite_target_id is None else overwrite_target_id
    # 查找是否有包含dataset_id的数据集,如果有就返回
    existing_datasets = find_candidate_datasets(target_id)
    # 判断数据集是否唯一,不唯一就报错,输出报错信息
    assert len(existing_datasets) == 0, f"Target dataset id {target_id} is already taken, please consider changing " \
                                        f"it using overwrite_target_id. Conflicting dataset: {existing_datasets} (check nnUNet_results, nnUNet_preprocessed and nnUNet_raw!)"

    # 处理后的数据集的数据结构命名
    target_dataset_name = f"Dataset{target_id:03d}_{dataset_name}"
    target_folder = join(nnUNet_raw, target_dataset_name)
    target_imagesTr = join(target_folder, 'imagesTr')
    target_imagesTs = join(target_folder, 'imagesTs')
    target_labelsTr = join(target_folder, 'labelsTr')
    # 新建目录
    maybe_mkdir_p(target_imagesTr)
    maybe_mkdir_p(target_imagesTs)
    maybe_mkdir_p(target_labelsTr)

    with multiprocessing.get_context("spawn").Pool(num_processes) as p:
        results = []

        # convert 4d train images
        # 不以点或者横线开头的,以.nii.gz结尾的文件
        source_images = [i for i in subfiles(imagesTr, suffix='.nii.gz', join=False) if
                         not i.startswith('.') and not i.startswith('_')]
        source_images = [join(imagesTr, i) for i in source_images]

        results.append(
            p.starmap_async(# 异步
                # 对四维的图像分割成三维的图像,对三维的图像保留,并且复制到指定路径
                split_4d_nifti, zip(source_images, [target_imagesTr] * len(source_images))
            )
        )

        # convert 4d test images
        source_images = [i for i in subfiles(imagesTs, suffix='.nii.gz', join=False) if
                         not i.startswith('.') and not i.startswith('_')]
        source_images = [join(imagesTs, i) for i in source_images]

        results.append(
            p.starmap_async(
                split_4d_nifti, zip(source_images, [target_imagesTs] * len(source_images))
            )
        )

        # copy segmentations
        source_images = [i for i in subfiles(labelsTr, suffix='.nii.gz', join=False) if
                         not i.startswith('.') and not i.startswith('_')]
        for s in source_images:
            shutil.copy(join(labelsTr, s), join(target_labelsTr, s))

        [i.get() for i in results]

    dataset_json = load_json(dataset_json)
    dataset_json['labels'] = {j: int(i) for i, j in dataset_json['labels'].items()}
    dataset_json['file_ending'] = ".nii.gz"
    dataset_json["channel_names"] = dataset_json["modality"]
    del dataset_json["modality"]
    del dataset_json["training"]
    del dataset_json["test"]
    save_json(dataset_json, join(nnUNet_raw, target_dataset_name, 'dataset.json'), sort_keys=False)
LayaBox CommandBuffer描边使用详细 项目需要使用LayaBox做一个给3D物体动态描边的一个功能,前前后后踩了一些坑算是把这个东西给做出来了把我改好的代码贴上,分享给大家。 (1)想要使用描边你的引擎版本必须 >=2.9.0 (2)你必须下载 Laya官方的BlurShader库才能使用这个功能,下载地址:https://github.com/layabox/layaair-demo/tree/master/h5/3d/ts/LayaAir3D_PostProcess/BlurShader 下载完之后把BlurShader放到自己项目的 阅读详情

相关推荐

遗传病变异注释预测工具安装系列之------Exomiser 安装及bug处理

Exomiser是一个Java程序,它从全外显子组或全基因组测序数据中发现潜在的致病变异。 Java 版本必须为1.8以上。 Exomiser 最新版本下载 wget -c https://github.com/exomiser/Exomiser/releases/download/11.0.0/exomiser-cli-11.0.0-distribution.zip unzip ...

qq_37329349的博客 1536

nnUNetV2使用教程,超详细!!(使用MSD十项全能数据集)

关于nnUNet的具体概念这里不在赘述,总的来说它是一个自适应数据集的分割网络,仅仅使用unet网络,V2版本在数据集上的包容性更强,除了nii,gz格式,还支持png格式等等,如果有需要转文件格式,请参考我以前的博文。

m0_73677889的博客 1万+

5分钟搞定mmdetection3d多模态推理可视化:从KITTI数据集到3D检测结果展示

本文提供了一份快速上手MMDetection3D进行多模态推理可视化的实战指南。文章详细介绍了从环境搭建、KITTI数据集准备,到模型选择、配置解析,再到执行多模态推理并生成3D检测结果可视化的完整流程,旨在帮助开发者在30分钟内快速验证模型并直观展示检测效果。

weixin_29051149的博客 250

NNUNetv2代码解读:convert_msd_dataset

获取task、dataset_name: os.path.basename来获取地址的最后一部分,并以split切割,task[4:]来获取id。当source_folder是以' \ ' 或者 ' \\ ' 结尾时,使用字符串切片截取最后一个字符,即(' \ ' 或者 ' \\ ')将地址分别与labelsTr、imagesTs、imagesTr ......相结合, 当对应的文件不存在时,给出断言中止程序。1.函数作用:将MSD数据集转换成nnUNet要求的格式。

D139898的博客 597

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4077

TwinCAT3 实时核异步通信:基于ADS的C++ Server/Client数据交换实战解析

本文深入解析了在TwinCAT3实时核中,如何利用ADS协议实现C++ Server与Client之间的异步数据交换。文章从核心概念入手,详细阐述了实时核、ADS通信及异步机制,并通过实战步骤指导环境搭建、路由配置、Server端服务创建与Client端请求发起,重点剖析了Req/Ind/Res/Con异步回调模型,旨在帮助开发者构建高效、非阻塞的实时工业控制应用。

purple的博客 469

nnUNet-v2 官方调用教程(节选关键内容)

如何调用2023.03.17最新发布的nnUNet-v2。详细教程!

RickieLim的博客 4834

【AI产品与商业航图】Flux.1 完全开源 AI 绘图模型:本地部署与 ComfyUI 实战指南

Flux.1是一个开源项目,用户可以自由使用和修改,完全免除使用费用。🖥️本地部署支持:与一些依赖云端计算的工具不同,Flux.1支持本地部署,确保用户可以离线使用并自主控制数据隐私。🔄兼容ComfyUI框架:Flux.1可以无缝集成到ComfyUI中,用户可以享受更加简便和直观的操作界面。🎨卓越的图像生成能力:Flux.1能够生成高质量、细腻的图像,支持多种风格与创作主题的切换。💾低硬件要求。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1737

Windows环境下使用nnunet v2 第一天的努力--数据的准备

数据准备,本次用的是Task04_Hippocampus数据集,放在了文件夹nnUNet\DataSet\nnUNet_raw下。就可以实现数据的准备,由Task04_Hippocampus变为Dataset004_Hippocampus进行下一步的学习。但是在视频和教程中使用的 nnUNetv2_convert_MSD_dataset -i xxxx 的没有成功,显示错误为。要进行医学图像分割,使用nnunetv2,看了很多的帖子,但是还是很多坑要过,记录一下。在环境配置完成后,需要设置的环境变量。

weixin_52250491的博客 656

SAP ABAP 获取采购订单未清数量/在途库存的 6 种方式

这篇文章我总结了获取采购订单未清数量/在途库存的 6 种方式,每种方式的优劣势和适用场景有所不同。读者请结合自身需要选择。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2664

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

多语言版本解决方案是应对全球化趋势的关键策略,它通过构建灵活且可扩展的架构,支持软件产品在不同语言和文化环境下的顺畅运行与展示。此方案涵盖了前端多语言界面实现、后端多语言数据处理及大数据环境下的多语言支持等多个层面,确保公司能够高效地推出适应全球用户多样化需求的软件产品。在前端多语言界面实现方面,解决方案采用了国际化与本地化的结合方法。国际化过程确保软件的功能和代码设计能够处理多种语言和文化习惯,而本地化则针对特定地区进行界面和内容的调整。

大模型大数据攻城狮的专栏 2753

nnUNetv2代码详解与调试

nnUNetv2代码复现

weixin_48111108的博客 3407

【置顶】TEE从入门到精通-[目录]

此专栏讲解包含不限于optee、商用TEE、常规的安全业务设计。但主要基于optee最新代码,深度讲解和剖析各项原理和机制...

baron-周贺贺-代码改变世界ctw 6427

在Windows上实现nnU-Net v2的环境配置

nnU-Net v2在Windows上的使用

weixin_53939134的博客 4927

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

nnU-Net v2 完整安装指南:系统要求、路径配置与 nnUNetv2 命令行工具详解

本文面向需要在本机(Linux / Windows / macOS)部署 nnU-Net v2 的开发者与研究人员,系统性地讲解安装前必须满足的软硬件条件、PyTorch 与 nnunetv2 的安装顺序、三大数据路径环境变量的设置方法,以及安装后获得的 `nnUNetv2_*` 命令行工具族。读完本文,你将能够在一台新机器上从零完成 nnU-Net v2 的安装、路径配置与安装验证,并正确选择数

gitblog_00199的博客 1005

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

nnU-Net V1 迁移指南(TLDR):从 Task 到 Dataset、从 `nnUNet_` 到 `nnUNetv2_` 的完整升级路径

本文是 nnU-Net 从 V1 迁移到 V2 的速查指南,面向已经使用过旧版 nnU-Net、希望平滑升级到当前仓库 `nnunetv2` 的用户。文章以仓库中的 [documentation/tldr_migration_guide_from_v1.md](https://link.gitcode.com/i/3b077ba0c145cd5f46ae5a0978484816) 为核心骨架,结合

gitblog_00875的博客 246

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

nnU-Netv2使用教程(从建立数据集到推理)--运行代码版本和指令运行版本--(‘nnUNetv2_convert_MSD_dataset‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。)

大部分人开始使用nnU-Net时,总会出现各种报错以及很多问题,本人在使用nnU-Net时,经历了下面几种报错,以及其对应的解决办法。

qq_42748165的博客 4501

nnU-Net 数据集准备完整指南:从目录布局、命名规范到 dataset.json 与格式转换

本文是 nnU-Net(nnunetv2)训练前的数据准备实战指南,覆盖从零组织 `nnUNet_raw/DatasetXXX_Name` 目录结构、掌握 `{CASE_IDENTIFIER}_{XXXX}` 命名规则、编写 `dataset.json`,到从 Medical Segmentation Decathlon(MSD)或 nnU-Net v1 旧任务批量迁移数据的完整流程。读完本文,你

gitblog_01083的博客 657

nnU-Net v2 命令行总览:从数据集转换到模型部署的完整工作流指南

nnU-Net v2(当前仓库版本 2.8.1,见 [pyproject.toml](https://link.gitcode.com/i/9c09006eb8d5920ac2180510f4a79a34))将整个医学图像分割流程拆分为**数据集准备、规划与预处理、训练、推理、评估与模型选择、模型打包与分享、实用工具**等多个工作流阶段,并为每个阶段提供独立的 `nnUNetv2_*` 命令行入口

gitblog_00672的博客 1029

nnU-Net v2 数据集与输入格式完全参考:目录结构、dataset.json 与推理命名规范

本篇是 nnU-Net v2 数据集布局与推理输入命名的权威参考指南。它从 `nnUNet_raw` 目录的顶层结构讲起,逐步深入病例命名规则、多通道输入的几何约束、`dataset.json` 元数据字段、内置文件格式(Reader/Writer)以及推理阶段的输入输出约定,并给出从 nnU-Net v1 与 MSD 数据集迁移的实操路径。读完本文,你将能够把任意医学影像数据集(NIfTI、NR

gitblog_00793的博客 173

nnU-Net v2 数据集格式详解:目录结构、dataset.json 与多模态输入规范

nnU-Net(nnUNet)v2 采用一套与 Medical Segmentation Decathlon(MSD)一脉相承但又显著演进的标准化数据集格式,所有数据必须先转换为该格式才能被规划(plan)、预处理与训练流程消费。本文以官方文档 [documentation/dataset_format.md](https://link.gitcode.com/i/4b53d720c8c9994a

gitblog_00249的博客 392

nnU-Net(nnUNetv2)语义分割框架完全指南:自动配置管线、快速安装与端到端工作流

nnU-Net 是一个会自动适配数据集的语义分割框架:它通过分析训练数据生成数据集指纹(dataset fingerprint),自动配置合适的 U-Net 变体,并提供从数据预处理、训练、模型选择到推理的完整端到端工作流。本文以仓库根目录的 [readme.md](https://link.gitcode.com/i/d2915a2d3d48bc702bea591a47fe74e8) 为主线,结

gitblog_01104的博客 202

nnU-Net v2 入门指南:从安装、数据准备到训练与推理的完整工作流

本指南是面向首次使用 nnU-Net v2 用户的完整入门路线图:它把官方文档中分散的步骤串联为一条可执行的主线——环境安装与目录配置、数据集整理、自动规划与预处理、五折交叉验证训练、最佳配置选择与推理部署。读完本文,你将掌握 nnU-Net v2 在新数据集上跑通全流程所需的全部命令、参数与目录规范,并理解每个步骤背后的源码实现位置。 ## 概述:Getting Started 的路线图 官

gitblog_00111的博客 389

nnU-Net 新数据集实战指南:从数据准备、自动配置、五折训练到推理部署的完整流水线

本文以 nnUNet 仓库中的 [how_to_use_nnunet.md](https://link.gitcode.com/i/054ac83268eddb9e296cd80f1f19061d) 为主线,完整讲解如何在**一个新数据集**上运行 nnU-Net v2 的端到端分割流水线:从数据格式整理、指纹提取与实验规划、预处理,到 2D/3D 各配置的五折交叉验证训练、自动挑选最优配置(含集

gitblog_00006的博客 436

UMamba部署及训练教程

本文介绍了UMamba框架的部署、数据集制作及训练

weixin_51914600的博客 598

终极指南:30分钟掌握nnUNet医学影像分割完整流程

想要快速上手医学影像分割却不知从何开始?nnUNet作为当前最先进的自动化医学影像分割框架,让普通用户也能在30分钟内构建专业级分割系统。本文将为你提供一份完整的nnUNet实战指南,从环境配置到模型部署,带你快速掌握这个强大的工具。 ## 为什么选择nnUNet?医学影像分割的革命性解决方案 医学影像分割是医疗AI领域的核心技术,但传统方法需要深度学习专家手动调整数十个超参数,耗时耗力且难以

gitblog_00153的博客 516
上一篇: ubuntu服务器安装labelimg报错记录
下一篇: latex给图片加上背景颜色
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值