数据集拆分后如何按对应文件名匹配加载图像?
解决方法
核心思路是先获取目标子集(如验证集)实际存在的文件名,再与CSV中的标签匹配,避免遍历全部8327个文件。以下是具体实现步骤:
1. 提取子集的实际文件名
先读取output/val/stenosis文件夹里的所有图像文件名,确保只处理该子集真实存在的文件:
import os # 验证集图像目录 val_img_dir = r'C:\Users\conm\Desktop\Stenosis-Project\output\val\stenosis' # 获取目录下所有文件(排除子文件夹) val_existing_filenames = [f for f in os.listdir(val_img_dir) if os.path.isfile(os.path.join(val_img_dir, f))]
2. 构建文件名到边界框标签的映射
把CSV数据转换成字典,用文件名作为键、边界框标签作为值,实现快速匹配:
# 假设你的labels是包含filename和bbox列的DataFrame filename_to_bbox = labels.set_index('filename')['bbox'].to_dict()
3. 加载匹配的图像与标签
遍历验证集的实际文件名,只加载在CSV中有对应标签的图像,同时关联边界框:
import cv2 import numpy as np val_images = [] val_bboxes = [] for fname in val_existing_filenames: # 检查当前文件名是否在CSV标签中 if fname in filename_to_bbox: img_path = os.path.join(val_img_dir, fname) img = cv2.imread(img_path) # 跳过加载失败的损坏图像 if img is not None: val_images.append(img) val_bboxes.append(filename_to_bbox[fname]) # 按需转成numpy数组 val_images_np = np.array(val_images) val_bboxes_np = np.array(val_bboxes)
额外优化:处理文件名大小写不匹配
如果CSV与文件夹中的文件名存在大小写差异(如test.jpg vs TEST.JPG),可以统一转小写避免匹配失败:
# 统一文件名大小写 val_filenames_lower = [f.lower() for f in val_existing_filenames] filename_to_bbox_lower = {k.lower(): v for k, v in filename_to_bbox.items()} # 调整加载逻辑 val_images = [] val_bboxes = [] for fname in val_existing_filenames: fname_lower = fname.lower() if fname_lower in filename_to_bbox_lower: img_path = os.path.join(val_img_dir, fname) img = cv2.imread(img_path) if img is not None: val_images.append(img) val_bboxes.append(filename_to_bbox_lower[fname_lower])
原有代码问题说明
你之前的代码是遍历CSV中的所有8327个文件名,不管val文件夹中是否存在该文件,导致大量不存在的文件被尝试加载(返回None)。现在的方法是先拿子集实际存在的文件,再匹配标签,确保只加载目标子集的有效图像。
内容的提问来源于stack exchange,提问作者NevMthw
相关产品推荐
相关产品推荐

