Python如何为文件夹内图像分配对应标签并加载送入模型
病理切片图像数据集加载代码修复方案
问题背景
- 数据集结构:根目录下的
tiles文件夹存放所有患者的切片数据,每个独立子文件夹对应1名患者,子文件夹内存放该患者的多张病理切片JPG图像;COAD_CMS_label.csv文件记录每个患者子文件夹名称与对应的CMS_Subtype分类标签 - 图像命名规则:单张图像的文件名和所属父文件夹的名称主体完全一致,仅文件名末尾方括号
[]包裹的切片参数(倍率、坐标、裁切尺寸等)为可变内容 - 现存问题:原有代码路径拼接处错误使用
[*/*]写法,无法正确匹配文件路径,且逻辑未实现「单个文件夹标签同步分配给目录下所有图像」的需求,无法正常生成模型可用的训练/测试数据集
原错误实现代码
data = pd.read_csv("COAD_CMS_label.csv") training_data, testing_data = train_test_split(data, test_size=0.25, random_state=25) y = data['CMS_Subtype'] #add all the training images, store them in a list, and finally convert that list into a numpy array train_image = [] for i in tqdm(range(data.shape[0])): img = image.load_img('tiles/'+training_data['folder_name'][i]+ [*/*] +'.jpg', target_size=(256,256,3), grayscale=False) img = image.img_to_array(img) img = img/255 train_image.append(img) X = np.array(train_image)
错误原因说明
- Python原生字符串拼接不识别Shell风格的
[*/*]通配规则,无法自动匹配可变的文件名片段 - 循环逻辑错误:训练集拆分后仍使用全量数据集的长度做循环索引,会出现索引越界、训练样本匹配错位的问题
- 逻辑不符合数据集结构:每次循环仅尝试读取1张图像,没有处理单个文件夹下多张图像的场景,也未给所有图像分配对应标签
修复后可运行代码
import os import glob import numpy as np import pandas as pd from tqdm import tqdm from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing import image # 读取标签映射表 data = pd.read_csv("COAD_CMS_label.csv") # 按标签分层拆分训练集、测试集,保证两部分标签分布一致 train_df, test_df = train_test_split( data, test_size=0.25, random_state=25, stratify=data['CMS_Subtype'] ) def load_dataset(label_df, img_root="tiles", target_img_size=(256,256,3)): """ 遍历标签表对应所有患者文件夹,加载图像并做归一化预处理,返回图像数组和对应标签 """ img_arrays = [] img_labels = [] # 逐行遍历患者标签记录 for _, row in tqdm(label_df.iterrows(), total=len(label_df)): folder = row['folder_name'] cms_type = row['CMS_Subtype'] # 匹配当前患者文件夹下所有jpg图像,自动适配方括号内的可变参数部分 match_pattern = os.path.join(img_root, folder, f"{folder}*.jpg") all_img_paths = glob.glob(match_pattern) # 逐张加载预处理图像,绑定对应标签 for path in all_img_paths: img = image.load_img(path, target_size=target_img_size, grayscale=False) img = image.img_to_array(img) / 255.0 img_arrays.append(img) img_labels.append(cms_type) return np.array(img_arrays), np.array(img_labels) # 生成模型可用的训练、测试数据 X_train, y_train = load_dataset(train_df) X_test, y_test = load_dataset(test_df)
关键修复点
- 替换错误的
[*/*]路径写法:使用Python标准库glob实现文件名模糊匹配,匹配规则设为文件夹名*.jpg,自动兼容文件名末尾方括号内的可变切片参数,不需要手动截取字符串 - 修正循环索引逻辑:拆分训练、测试集后直接遍历拆分后的数据表记录,不再使用全量数据长度做循环,避免索引越界和样本错配
- 实现多图像自动标签分配:读取到单个患者的CMS标签后,给该文件夹下所有匹配到的图像绑定同一标签,符合数据集的标注逻辑
- 训练测试拆分新增
stratify参数做分层抽样,避免训练、测试集的标签分布出现偏移,影响模型训练效果
内容的提问来源于stack exchange,提问作者Neda Ghohabi
相关产品推荐
相关产品推荐

