CT数据集分类实验

数据预处理

直接使用nii.gz文件,在最开始时,内存中直接先预处理和加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import yaml
from monai.transforms import (
Compose,
LoadImaged,
EnsureChannelFirstd,
Orientationd,
Spacingd,
ScaleIntensityRanged,
CropForegroundd,
Resized,
RandFlipd,
RandRotate90d,
RandShiftIntensityd,
RandGaussianNoised,
EnsureTyped
)

config_path = "config/config.yaml"
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)

# 目标空间尺寸,例如 [128, 128, 128]
target_size = config['transforms']['resize']['spatial_size']

# --- 训练集数据增强 ---
train_transforms = Compose(
[
# 1. 只加载 image 路径,label 保持为整数
LoadImaged(keys=["image"]),
EnsureChannelFirstd(keys=["image"]),

# 2. 空间归一化 (仅作用于 image)
Orientationd(keys=["image"], axcodes="RAS"),
Spacingd(
keys=["image"],
pixdim=config['transforms']['spacing']['pixdim'],
mode=config['transforms']['spacing']['mode'],
),

# 3. 数值归一化 (针对 CT 值范围)
ScaleIntensityRanged(
keys=["image"],
a_min=config['transforms']['scale_intensity']['a_min'],
a_max=config['transforms']['scale_intensity']['a_max'],
b_min=config['transforms']['scale_intensity']['b_min'],
b_max=config['transforms']['scale_intensity']['b_max'],
clip=config['transforms']['scale_intensity']['clip'],
),

# 4. 自动剪切背景(以图像本身非0区域为基准)
CropForegroundd(keys=["image"], source_key="image"),

# 6. 分类常用的数据增强 (仅 image)
RandFlipd(keys=["image"], spatial_axis=[0], prob=0.5),
RandFlipd(keys=["image"], spatial_axis=[1], prob=0.5),
RandFlipd(keys=["image"], spatial_axis=[2], prob=0.5),
RandRotate90d(keys=["image"], prob=0.5, max_k=4),

# 5. 统一缩放到 ResNet 输入尺寸
Resized(keys=["image"], spatial_size=target_size),

# 强度增强
RandShiftIntensityd(
keys=["image"],
offsets=config['transforms']['rand_shift_intensity']['offsets'],
prob=config['transforms']['rand_shift_intensity']['prob'],
),
# 推荐增加:随机高斯噪声,提升分类鲁棒性
RandGaussianNoised(keys=["image"], prob=0.1, mean=0.0, std=0.1),

# 7. 转换为 Tensor 格式供网络训练
EnsureTyped(keys=["image", "label"]),
]
)

# --- 验证集数据预处理 ---
val_transforms = Compose(
[
LoadImaged(keys=["image"]),
EnsureChannelFirstd(keys=["image"]),
Orientationd(keys=["image"], axcodes="RAS"),
Spacingd(
keys=["image"],
pixdim=config['transforms']['spacing']['pixdim'],
mode=config['transforms']['spacing']['mode'],
),
ScaleIntensityRanged(
keys=["image"],
a_min=config['transforms']['scale_intensity']['a_min'],
a_max=config['transforms']['scale_intensity']['a_max'],
b_min=config['transforms']['scale_intensity']['b_min'],
b_max=config['transforms']['scale_intensity']['b_max'],
clip=config['transforms']['scale_intensity']['clip'],
),
CropForegroundd(keys=["image"], source_key="image"),
Resized(keys=["image"], spatial_size=target_size),
EnsureTyped(keys=["image", "label"]),
]
)


实验

先使用resnet18

exp acc auc ppv npv rec spec
exp_260311-1405 out1
exp_260311-1417 out2

数据很不平衡,使用focal试试

exp acc auc ppv npv rec spec
exp_260311-1431 out3

CT数据集分类实验
http://example.com/2026/03/11/CT-classification/
作者
Mercury
发布于
2026年3月11日
许可协议