Kaggle实战:用Python一键整理EyePacs眼底数据集(附分类脚本与预处理技巧)

张开发
2026/5/4 10:49:37 15 分钟阅读
Kaggle实战:用Python一键整理EyePacs眼底数据集(附分类脚本与预处理技巧)
Kaggle实战用Python一键整理EyePacs眼底数据集附分类脚本与预处理技巧当你第一次从Kaggle下载EyePacs数据集时面对3万多张杂乱无章的眼底图像和CSV标签文件可能会感到无从下手。作为一名曾经同样困惑过的开发者我将分享一套完整的Python解决方案帮助你高效整理这个庞大的医学影像数据集。1. 环境准备与数据理解在开始之前我们需要确保开发环境配置正确。推荐使用Python 3.8版本并安装以下关键库pip install pandas pillow opencv-python scikit-image numpyEyePacs数据集包含两个核心部分train文件夹35,126张JPEG格式的眼底图像trainLabels.csv包含每张图像对应的糖尿病视网膜病变等级0-4常见问题许多初学者会遇到图像尺寸不一致的问题从433×289到5184×3456不等。此外部分图像存在失焦、曝光异常等质量问题这在后续预处理阶段需要特别注意。2. 自动化分类整理脚本下面这个脚本可以自动将图像按病变等级分类到不同文件夹import os import shutil import pandas as pd from tqdm import tqdm # 进度条显示 def organize_eyepacs_dataset(csv_path, img_dir, output_dir): 参数: csv_path: trainLabels.csv文件路径 img_dir: 原始图像存放目录 output_dir: 分类后输出目录 # 读取CSV文件 labels_df pd.read_csv(csv_path) # 创建等级目录 for level in range(5): os.makedirs(os.path.join(output_dir, str(level)), exist_okTrue) # 移动图像到对应目录 for _, row in tqdm(labels_df.iterrows(), totallen(labels_df)): img_name row[image] level row[level] src_path os.path.join(img_dir, f{img_name}.jpeg) dst_path os.path.join(output_dir, str(level), f{img_name}.jpeg) try: shutil.move(src_path, dst_path) except FileNotFoundError: print(f警告: 未找到图像 {img_name}) # 使用示例 organize_eyepacs_dataset( csv_pathpath/to/trainLabels.csv, img_dirpath/to/train, output_dirpath/to/classified )关键改进点添加了tqdm进度条处理大量文件时更直观使用exist_okTrue避免重复创建目录时的错误增加了异常处理防止因缺失图像导致脚本中断3. 高效预处理流程眼底图像通常需要以下预处理步骤预处理步骤目的实现方法黑边裁剪去除无信息区域OpenCV轮廓检测CLAHE增强对比度cv2.createCLAHE()尺寸归一化统一输入尺寸双三次插值缩放质量过滤排除低质量图像模糊度检测以下是完整的预处理代码示例import cv2 import numpy as np from skimage import filters def preprocess_retinal_image(img_path, target_size(512, 512)): 眼底图像预处理流水线 # 读取图像 img cv2.imread(img_path) if img is None: return None # 1. 转换为灰度并裁剪黑边 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY) contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt max(contours, keycv2.contourArea) x,y,w,h cv2.boundingRect(cnt) cropped img[y:yh, x:xw] # 2. CLAHE增强 lab cv2.cvtColor(cropped, cv2.COLOR_BGR2LAB) l, a, b cv2.split(lab) clahe cv2.createCLAHE(clipLimit3.0, tileGridSize(8,8)) cl clahe.apply(l) enhanced cv2.merge((cl,a,b)) enhanced cv2.cvtColor(enhanced, cv2.COLOR_LAB2BGR) # 3. 尺寸归一化 resized cv2.resize(enhanced, target_size, interpolationcv2.INTER_CUBIC) return resized def is_blurry(image, threshold100): 检测图像是否模糊 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return cv2.Laplacian(gray, cv2.CV_64F).var() threshold4. 数据增强策略医学影像数据通常面临类别不平衡问题。EyePacs数据集中正常图像等级0占比往往过高。我们可以采用以下增强策略针对少数类的过采样使用albumentations库创建多样化的增强重点增强3-4级病变图像几何变换组合import albumentations as A transform A.Compose([ A.RandomRotate90(), A.Flip(), A.ShiftScaleRotate(shift_limit0.1, scale_limit0.1), A.RandomBrightnessContrast(brightness_limit0.1, contrast_limit0.1), ])颜色空间扰动在HSV空间随机调整色调和饱和度模拟不同拍摄设备的效果差异实用技巧建议将预处理后的图像保存为NPZ格式可以大幅减少后续读取时间# 保存预处理结果 np.savez_compressed(preprocessed.npz, imagespreprocessed_images, labelslabels) # 加载时只需 data np.load(preprocessed.npz) images, labels data[images], data[labels]5. 质量控制和常见问题排查处理EyePacs数据集时有几个关键点需要特别注意图像质量筛选自动排除模糊图像Laplacian方差100手动检查极端曝光案例标签一致性检查# 验证图像与标签匹配 missing_images [] for img_name in labels_df[image]: if not os.path.exists(fpath/to/train/{img_name}.jpeg): missing_images.append(img_name)内存管理技巧使用生成器逐步处理大尺寸图像考虑分块保存处理结果提示在处理超大规模图像时可以使用Dask库进行并行处理显著提升效率。6. 扩展应用与性能优化将这套流程扩展到其他眼底数据集时需要注意几个适配点多数据集统一处理框架class RetinalDatasetProcessor: def __init__(self, dataset_typeeyepacs): self.dataset_type dataset_type self.preprocessors { eyepacs: self._eyepacs_preprocess, aptos: self._aptos_preprocess } def process(self, img_path): return self.preprocessors[self.dataset_type](img_path)GPU加速技巧使用CuPy替代NumPy将OpenCV操作转换为PyTorch/TensorFlow运算分布式处理方案使用Ray框架进行集群分发对图像分片并行处理在实际项目中这套流程帮助我将数据处理时间从原来的8小时缩短到30分钟以内。特别是在处理APTOS2019等其他眼底数据集时只需稍作调整即可复用大部分代码。

更多文章