You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:09:03