Kaggle实战:用Python脚本快速整理EyePacs眼底数据集(附分类代码)
2026/6/1 23:29:42 网站建设 项目流程

Kaggle实战:用Python脚本高效分类EyePacs眼底数据集

当你第一次从Kaggle下载EyePacs数据集时,面对3万多张混在一起的眼底图片和CSV标签文件,可能会感到无从下手。作为糖尿病视网膜病变研究中最常用的数据集之一,EyePacs的规模和质量都令人印象深刻,但原始数据的杂乱无章也让许多数据科学家头疼。本文将分享一个经过实战检验的Python分类脚本,帮你快速完成这项基础但关键的数据准备工作。

1. 理解EyePacs数据集结构

在开始编写代码前,我们需要清楚原始数据的存放方式:

eyepacs_train/ ├── 1_left.jpeg ├── 2_right.jpeg ├── ... └── 35126_left.jpeg trainLabels.csv

CSV文件包含两列关键数据:

  • image: 图片文件名(不含扩展名)
  • level: 糖尿病视网膜病变分级(0-4)

常见痛点分析

  • 文件名与CSV记录的对应关系
  • 不同尺寸图片的处理兼容性
  • 缺失文件的容错处理
  • 分类后的验证机制

2. 环境准备与基础脚本

2.1 安装必要库

确保已安装以下Python库:

pip install pandas tqdm

2.2 基础分类脚本

import os import shutil import pandas as pd from tqdm import tqdm def classify_eyepacs_images(csv_path, src_dir, dest_dir): """根据CSV标签分类眼底图片 Args: csv_path: trainLabels.csv路径 src_dir: 原始图片目录(eyepacs_train) dest_dir: 目标根目录 """ # 读取CSV文件 df = pd.read_csv(csv_path) # 创建分级目录 for level in range(5): os.makedirs(os.path.join(dest_dir, str(level)), exist_ok=True) # 分类转移图片 for _, row in tqdm(df.iterrows(), total=len(df)): src_path = os.path.join(src_dir, f"{row['image']}.jpeg") dest_path = os.path.join(dest_dir, str(row['level']), f"{row['image']}.jpeg") if os.path.exists(src_path): shutil.copy2(src_path, dest_path) else: print(f"警告: 文件不存在 - {src_path}") # 使用示例 classify_eyepacs_images( csv_path="path/to/trainLabels.csv", src_dir="path/to/eyepacs_train", dest_dir="path/to/classified" )

3. 高级功能扩展

3.1 并行处理加速

对于大规模数据集,可以使用多进程加速:

from multiprocessing import Pool def process_row(row, src_dir, dest_dir): src_path = os.path.join(src_dir, f"{row['image']}.jpeg") dest_path = os.path.join(dest_dir, str(row['level']), f"{row['image']}.jpeg") if os.path.exists(src_path): shutil.copy2(src_path, dest_path) return os.path.exists(dest_path) def parallel_classify(df, src_dir, dest_dir, workers=4): with Pool(workers) as p: results = p.starmap(process_row, [(row, src_dir, dest_dir) for _, row in df.iterrows()]) return sum(results)

3.2 数据完整性验证

分类完成后,建议运行验证检查:

def validate_classification(csv_path, dest_dir): df = pd.read_csv(csv_path) missing = 0 for _, row in df.iterrows(): expected_path = os.path.join(dest_dir, str(row['level']), f"{row['image']}.jpeg") if not os.path.exists(expected_path): missing += 1 print(f"验证完成。总图片数: {len(df)},缺失数: {missing}") return missing == 0

4. 实战技巧与问题排查

4.1 常见错误处理

错误类型解决方案预防措施
文件不存在跳过或记录日志提前检查CSV与图片目录匹配
权限问题检查目标目录可写性使用try-except捕获异常
内存不足分批处理数据使用生成器或分块读取CSV

4.2 性能优化建议

  1. I/O优化

    • 使用SSD而非HDD
    • 减少小文件操作次数
  2. 内存管理

    • 分块读取大型CSV
    chunksize = 10000 for chunk in pd.read_csv(csv_path, chunksize=chunksize): process_chunk(chunk)
  3. 日志记录

    import logging logging.basicConfig(filename='classification.log', level=logging.INFO)

5. 分类后的数据探索

完成分类后,可以快速统计各级别分布:

import matplotlib.pyplot as plt def plot_class_distribution(csv_path): df = pd.read_csv(csv_path) class_dist = df['level'].value_counts().sort_index() plt.figure(figsize=(10, 5)) class_dist.plot(kind='bar') plt.title('Class Distribution') plt.xlabel('DR Level') plt.ylabel('Count') plt.xticks(rotation=0) plt.show()

对于EyePacs数据集,典型的类别分布呈现严重不平衡,这是糖尿病视网膜病变数据集的普遍特点。在实际项目中,你可能需要:

  • 考虑过采样/欠采样
  • 使用类别权重
  • 尝试分层抽样

6. 与其他眼底数据集的协同处理

当同时使用多个数据集时,建议统一目录结构:

datasets/ ├── eyepacs/ │ ├── 0/ │ ├── 1/ │ └── ... └── aptos2019/ ├── 0/ ├── 1/ └── ...

可以编写适配器函数处理不同数据集的标签差异:

def standardize_level(original_level, dataset_name): """将不同数据集的标签统一到相同标准""" if dataset_name == 'eyepacs': return original_level elif dataset_name == 'aptos2019': return min(original_level, 4) # APTOS有5级但Eyepacs只有5级 else: raise ValueError(f"未知数据集: {dataset_name}")

处理眼底数据集时,文件命名规范往往各不相同。这个Python脚本不仅解决了EyePacs的基础分类问题,其模块化设计也便于扩展到其他医学图像处理场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询