)
Kaggle实战用Python脚本一键整理EyePacs眼底数据集附分类代码当你第一次从Kaggle下载EyePacs数据集时面对混在一起的数万张眼底图片和CSV标签文件可能会感到无从下手。作为数据工程师或算法初学者如何高效地完成数据预处理的第一步——分类整理本文将手把手教你用Python脚本实现自动化分类解决这个实际痛点。1. 准备工作与环境配置在开始编写脚本前我们需要先了解数据集的基本结构和准备必要的工具。EyePacs数据集通常包含两个核心部分train文件夹存放所有未分类的眼底图片JPEG格式trainLabels.csv文件包含每张图片对应的分类标签0-4级推荐工具栈import pandas as pd # 处理CSV文件 import shutil # 文件操作 import os # 路径管理 from tqdm import tqdm # 进度条显示注意建议使用Jupyter Notebook或VS Code等支持交互式编程的环境方便调试和验证每一步操作。2. 数据集目录结构设计合理的目录结构是后续机器学习项目的基础。我们建议采用以下结构eyepacs_project/ ├── raw_data/ │ ├── train/ # 原始未分类图片 │ └── trainLabels.csv # 原始标签文件 └── processed_data/ ├── class_0/ # 分级为0的图片 ├── class_1/ # 分级为1的图片 ├── class_2/ # 分级为2的图片 ├── class_3/ # 分级为3的图片 └── class_4/ # 分级为4的图片提示保持原始数据(raw_data)不变所有处理都在processed_data中进行这是数据科学项目的黄金实践。3. 核心分类脚本实现下面是一个健壮的分类脚本包含错误处理和进度显示def classify_eyepacs_images(csv_path, src_img_dir, dest_dir): 根据CSV标签分类眼底图片 参数: csv_path: CSV标签文件路径 src_img_dir: 原始图片目录 dest_dir: 分类后目标目录 # 读取CSV文件 try: labels_df pd.read_csv(csv_path) print(f成功读取CSV文件共{len(labels_df)}条记录) except Exception as e: print(f读取CSV文件失败: {e}) return # 创建目标目录 for class_id in range(5): class_dir os.path.join(dest_dir, fclass_{class_id}) os.makedirs(class_dir, exist_okTrue) # 分类图片 moved_count 0 missing_count 0 for _, row in tqdm(labels_df.iterrows(), totallen(labels_df)): img_name row[image] class_id row[level] src_path os.path.join(src_img_dir, f{img_name}.jpeg) dest_path os.path.join(dest_dir, fclass_{class_id}, f{img_name}.jpeg) try: if os.path.exists(src_path): shutil.copy2(src_path, dest_path) moved_count 1 else: missing_count 1 except Exception as e: print(f移动{img_name}时出错: {e}) print(f\n分类完成成功移动{moved_count}张图片{missing_count}张图片缺失)关键改进点使用copy2代替move保留原始文件添加了完善的错误处理包含进度显示和统计信息4. 实际应用与异常处理在实际操作中你可能会遇到以下常见问题及解决方案问题类型可能原因解决方案文件不存在文件名不匹配或下载不完整检查文件扩展名(.jpeg/.jpg)验证下载完整性权限错误没有写入权限检查目标目录权限或更换有权限的目录内存不足数据集太大分批处理或使用更高效的数据结构推荐执行方式# 配置路径 csv_path path/to/trainLabels.csv src_img_dir path/to/train dest_dir path/to/processed_data # 执行分类 classify_eyepacs_images(csv_path, src_img_dir, dest_dir)5. 分类后验证与质量检查完成分类后建议进行以下验证步骤数量核对# 检查每个类别的图片数量 for class_id in range(5): class_dir os.path.join(dest_dir, fclass_{class_id}) print(f类别{class_id}图片数量: {len(os.listdir(class_dir))})随机抽样检查从每个类别随机选择5-10张图片肉眼检查图片是否与标签匹配数据分布分析import matplotlib.pyplot as plt # 绘制类别分布图 class_counts labels_df[level].value_counts().sort_index() plt.bar(class_counts.index, class_counts.values) plt.xlabel(DR Level) plt.ylabel(Count) plt.title(Class Distribution) plt.show()6. 进阶技巧与优化建议对于大型数据集处理可以考虑以下优化方案多进程加速from multiprocessing import Pool def process_image(row, src_img_dir, dest_dir): # 实现单张图片处理逻辑 pass with Pool(processes4) as pool: results pool.starmap(process_image, [(row, src_img_dir, dest_dir) for _, row in labels_df.iterrows()])增量处理记录已处理的图片名支持断点续处理避免重复处理相同文件日志记录import logging logging.basicConfig(filenameclassification.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s)7. 后续数据处理流程建议完成基础分类后通常还需要数据清洗去除低质量图片模糊、过暗/过曝处理类别不平衡问题标准化处理统一图片尺寸去除黑色边框应用CLAHE等增强技术数据集划分from sklearn.model_selection import train_test_split # 按比例划分训练集和验证集 train_df, val_df train_test_split(labels_df, test_size0.2, stratifylabels_df[level], random_state42)在实际项目中这套分类脚本帮我节省了大量手动整理时间。特别是在处理35,000图片的大数据集时自动化流程的优势更加明显。记得在处理完成后检查各类别的样本分布情况这对后续建模策略有重要影响。