使用annotated_images拆分带标注图像时报错,求同步拆分图片与JSON标注的方法
报错原因
该TypeError由annotated_images库自身的代码缺陷导致:其源码的list_files函数中,错误将glob模块的glob函数本身直接赋值给了files变量,没有传入路径参数执行文件搜索,后续调用len()判断函数对象的长度自然触发报错。该库维护状态较差,不建议继续使用。
替代解决方案(可直接在Colab运行)
以下代码无需额外安装第三方依赖,逻辑透明易调整,可自动匹配同名图片和JSON标注文件同步拆分,你只需修改开头的配置参数即可:
import os import random import shutil # -------------------------- 仅需修改以下配置参数 -------------------------- RANDOM_SEED = 1337 # 原始数据集存放路径:所有图片和对应JSON标注都放在该文件夹下 RAW_DATA_PATH = "/content/Untitled Folder" # 拆分后数据集的输出根路径 OUTPUT_PATH = "/content/split_dataset" # 训练集、验证集、测试集拆分比例,三者之和需为1 SPLIT_RATIO = (0.8, 0.15, 0.05) # 支持的图片格式,如有其他格式可自行添加 SUPPORT_IMG_EXTS = ['.jpg', '.jpeg', '.png', '.bmp'] # ------------------------------------------------------------------------ random.seed(RANDOM_SEED) # 初始化输出目录 for split_dir in ['train', 'val', 'test']: os.makedirs(os.path.join(OUTPUT_PATH, split_dir), exist_ok=True) # 筛选同时存在图片和对应JSON标注的有效样本 valid_samples = [] for filename in os.listdir(RAW_DATA_PATH): file_basename, file_ext = os.path.splitext(filename) if file_ext.lower() in SUPPORT_IMG_EXTS: json_path = os.path.join(RAW_DATA_PATH, f"{file_basename}.json") if os.path.exists(json_path): valid_samples.append((filename, f"{file_basename}.json")) # 打乱样本顺序 random.shuffle(valid_samples) total_count = len(valid_samples) train_cutoff = int(total_count * SPLIT_RATIO[0]) val_cutoff = train_cutoff + int(total_count * SPLIT_RATIO[1]) # 拆分并复制文件 for idx, (img_file, json_file) in enumerate(valid_samples): if idx < train_cutoff: target_split = 'train' elif idx < val_cutoff: target_split = 'val' else: target_split = 'test' # 复制图片 shutil.copy2( os.path.join(RAW_DATA_PATH, img_file), os.path.join(OUTPUT_PATH, target_split, img_file) ) # 复制对应标注 shutil.copy2( os.path.join(RAW_DATA_PATH, json_file), os.path.join(OUTPUT_PATH, target_split, json_file) ) # 输出拆分结果 print(f"拆分完成,共匹配到{total_count}组有效样本:") print(f"训练集:{train_cutoff} 组") print(f"验证集:{val_cutoff - train_cutoff} 组") print(f"测试集:{total_count - val_cutoff} 组")
代码说明
- 仅会将同时存在同名图片和JSON标注的样本纳入拆分,自动过滤缺标注的脏数据
- 拆分后的train/val/test三个文件夹会自动生成在你设置的
OUTPUT_PATH下 - 样本拆分顺序固定,设置
RANDOM_SEED可保证每次拆分结果一致
内容的提问来源于stack exchange,提问作者dAmss Soltani
相关产品推荐
相关产品推荐

