医疗影像识别模型的训练效果很大程度上取决于数据准备的质量,完整的Python深度学习数据准备流程需要覆盖数据收集、预处理、标注、划分等多个环节,每个环节都有对应的操作规范。

一、医疗影像数据收集
首先需要收集对应病种的医疗影像数据,常见的医疗影像类型包括CT、MRI、X光片等,数据来源可以是公开的医疗影像数据集,也可以是合规的医疗机构内部数据。收集时需要注意数据的合规性,确保使用的数据符合医疗数据隐私保护相关规定。
收集到的原始数据通常是DICOM、NIfTI等格式,我们需要先将其转换为深度学习模型常用的格式,比如PNG、JPG。以下是使用pydicom库读取DICOM格式影像并转换为PNG的示例代码:
import pydicom
import cv2
import numpy as np
import os
def dicom_to_png(dicom_path, save_dir):
# 读取DICOM文件
dicom_data = pydicom.dcmread(dicom_path)
# 获取影像像素数据
img_array = dicom_data.pixel_array
# 归一化到0-255范围
img_array = (img_array - img_array.min()) / (img_array.max() - img_array.min()) * 255
img_array = img_array.astype(np.uint8)
# 保存为PNG
file_name = os.path.basename(dicom_path).replace('.dcm', '.png')
save_path = os.path.join(save_dir, file_name)
cv2.imwrite(save_path, img_array)
return save_path
# 使用示例
dicom_path = 'data/dicom/example.dcm'
save_dir = 'data/png'
if not os.path.exists(save_dir):
os.makedirs(save_dir)
dicom_to_png(dicom_path, save_dir)
二、医疗影像数据预处理
原始影像数据存在尺寸不一致、对比度差异大、存在噪声等问题,需要进行预处理操作,提升数据质量。常见的预处理操作包括尺寸统一、灰度归一化、去噪、数据增强等。
1. 基础预处理操作
首先将所有影像统一到相同的尺寸,比如统一为224*224,同时进行灰度归一化,将像素值缩放到0-1区间,适配深度学习模型的输入要求。以下是使用OpenCV和numpy实现基础预处理的代码:
import cv2
import numpy as np
def basic_preprocess(img_path, target_size=(224, 224)):
# 读取影像
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
# 尺寸统一
img = cv2.resize(img, target_size)
# 灰度归一化
img = img.astype(np.float32) / 255.0
# 增加通道维度,适配模型输入
img = np.expand_dims(img, axis=-1)
return img
# 使用示例
img_path = 'data/png/example.png'
processed_img = basic_preprocess(img_path)
print(processed_img.shape) # 输出(224, 224, 1)
2. 数据增强
医疗影像数据通常样本量有限,通过数据增强可以扩充数据集规模,提升模型的泛化能力。常见的增强方式包括旋转、翻转、缩放、亮度调整等,注意不要使用会改变影像病理特征的增强操作。以下是使用imgaug库实现数据增强的示例:
import imgaug.augmenters as iaa
import cv2
def augment_image(img):
# 定义增强序列
aug_seq = iaa.Sequential([
iaa.Fliplr(0.5), # 50%概率水平翻转
iaa.Flipud(0.3), # 30%概率垂直翻转
iaa.Affine(rotate=(-15, 15)), # 随机旋转-15到15度
iaa.Multiply((0.8, 1.2)) # 随机调整亮度
])
# 执行增强
augmented_img = aug_seq(image=img)
return augmented_img
# 使用示例
img = cv2.imread('data/png/example.png', cv2.IMREAD_GRAYSCALE)
augmented_img = augment_image(img)
cv2.imwrite('data/png/augmented_example.png', augmented_img)
三、医疗影像数据标注
监督学习训练医疗影像识别模型需要标注数据,标注类型根据任务不同分为分类标注、目标检测标注、分割标注等。标注工作需要由专业的医疗人员完成,确保标注的准确性。
标注完成后需要将标注信息保存为统一的格式,比如分类任务可以保存为CSV文件,每一行对应一张影像的路径和对应的类别标签。以下是生成分类标注CSV的示例代码:
import os
import pandas as pd
def generate_label_csv(img_dir, label_map, save_path):
"""
img_dir: 影像存放目录
label_map: 类别映射字典,比如{'normal': 0, 'pneumonia': 1}
save_path: CSV保存路径
"""
data = []
for class_name, label in label_map.items():
class_dir = os.path.join(img_dir, class_name)
if not os.path.exists(class_dir):
continue
for img_name in os.listdir(class_dir):
if img_name.endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(class_dir, img_name)
data.append([img_path, label])
df = pd.DataFrame(data, columns=['img_path', 'label'])
df.to_csv(save_path, index=False)
return df
# 使用示例
img_dir = 'data/png'
label_map = {'normal': 0, 'pneumonia': 1}
save_path = 'data/labels.csv'
df = generate_label_csv(img_dir, label_map, save_path)
print(df.head())
四、数据集划分
准备好标注数据后,需要将数据集划分为训练集、验证集和测试集,通常划分比例为7:2:1或者8:1:1,确保三个集合的数据分布一致,避免数据泄露。
以下是使用sklearn库划分数据集的示例代码:
import pandas as pd
from sklearn.model_selection import train_test_split
def split_dataset(label_csv_path, train_ratio=0.7, val_ratio=0.2, test_ratio=0.1):
# 读取标注文件
df = pd.read_csv(label_csv_path)
# 先划分训练集和临时集
train_df, temp_df = train_test_split(df, test_size=(val_ratio + test_ratio), stratify=df['label'], random_state=42)
# 再划分验证集和测试集
val_df, test_df = train_test_split(temp_df, test_size=(test_ratio/(val_ratio + test_ratio)), stratify=temp_df['label'], random_state=42)
# 保存划分结果
train_df.to_csv('data/train.csv', index=False)
val_df.to_csv('data/val.csv', index=False)
test_df.to_csv('data/test.csv', index=False)
return train_df, val_df, test_df
# 使用示例
label_csv_path = 'data/labels.csv'
train_df, val_df, test_df = split_dataset(label_csv_path)
print(f'训练集大小: {len(train_df)}, 验证集大小: {len(val_df)}, 测试集大小: {len(test_df)}')
五、数据加载器构建
最后需要构建PyTorch或TensorFlow的数据加载器,实现数据的批量读取和预处理,适配模型训练的输入要求。以下是使用PyTorch构建数据加载器的示例:
import torch
from torch.utils.data import Dataset, DataLoader
import pandas as pd
import cv2
import numpy as np
class MedicalImageDataset(Dataset):
def __init__(self, label_csv_path, target_size=(224, 224)):
self.df = pd.read_csv(label_csv_path)
self.target_size = target_size
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
img_path = self.df.iloc[idx]['img_path']
label = self.df.iloc[idx]['label']
# 读取并预处理影像
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, self.target_size)
img = img.astype(np.float32) / 255.0
img = np.expand_dims(img, axis=0) # 增加通道维度,变为(1, 224, 224)
return torch.tensor(img), torch.tensor(label, dtype=torch.long)
# 使用示例
train_dataset = MedicalImageDataset('data/train.csv')
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
# 测试数据加载器
for imgs, labels in train_loader:
print(f'批次影像形状: {imgs.shape}, 批次标签形状: {labels.shape}')
break
以上就是Python深度学习训练医疗影像识别模型的完整数据准备流程,每个环节都需要严格把控质量,才能保证后续训练的模型具备良好的识别效果。在实际操作中可以根据具体的任务需求调整对应环节的操作细节。