图像分类数据集划分(创建ImageNet格式的数据集)

bash 复制代码
原始数据文件夹如下:
├──data
    ├── 0  类别1
    ├── 1  类别2

制作数据集格式如下所示:
├──datasets
    ├── meta
        │   ├── test.txt     # 测试数据集的标注文件
        │   ├── train.txt    # 训练数据集的标注文件
        │   └── val.txt      # 验证数据集的标注文件
        ├── train
        │   ├── 0
        │   ├── 1
        │   
        ├── test
        │   ├── 0
        │   ├── 1
        │
        └── val
        │   ├── 0
        │   ├── 1

划分数据集比例,训练集:验证集:测试集=0.6:0.2:0.2

划分数据集代码如下:

bash 复制代码
import os
import shutil
import random
from tqdm import tqdm

# 定义原始数据文件夹和目标数据集文件夹
data_dir = 'data'
target_dir = 'datasets'

# 定义数据集划分比例
train_split_ratio = 0.6
val_split_ratio = 0.2
test_split_ratio = 0.2

# 创建目标数据集文件夹及其子目录结构
os.makedirs(target_dir, exist_ok=True)
os.makedirs(os.path.join(target_dir, 'meta'), exist_ok=True)
os.makedirs(os.path.join(target_dir, 'train'), exist_ok=True)
os.makedirs(os.path.join(target_dir, 'test'), exist_ok=True)
os.makedirs(os.path.join(target_dir, 'val'), exist_ok=True)

# 获取原始数据文件夹下的子目录列表
categories = os.listdir(data_dir)

# 遍历每个子目录
for category in categories:
    # 获取该类别下的所有文件
    files = os.listdir(os.path.join(data_dir, category))

    # 随机打乱文件顺序
    random.shuffle(files)

    # 计算划分数据集的索引
    total_files = len(files)
    train_split = int(train_split_ratio * total_files)
    val_split = int(val_split_ratio * total_files)

    # 划分数据集并复制到目标文件夹,使用tqdm添加进度条
    for file in tqdm(files[:train_split], desc=f'Copying train data for {category}'):
        src = os.path.join(data_dir, category, file)
        dst = os.path.join(target_dir, 'train', category)
        os.makedirs(dst, exist_ok=True)
        shutil.copy(src, os.path.join(dst, file))

    for file in tqdm(files[train_split:train_split + val_split], desc=f'Copying validation data for {category}'):
        src = os.path.join(data_dir, category, file)
        dst = os.path.join(target_dir, 'val', category)
        os.makedirs(dst, exist_ok=True)
        shutil.copy(src, os.path.join(dst, file))

    for file in tqdm(files[train_split + val_split:], desc=f'Copying test data for {category}'):
        src = os.path.join(data_dir, category, file)
        dst = os.path.join(target_dir, 'test', category)
        os.makedirs(dst, exist_ok=True)
        shutil.copy(src, os.path.join(dst, file))

# 创建标注文件(train.txt、val.txt、test.txt)
with open(os.path.join(target_dir, 'meta', 'train.txt'), 'w') as train_txt:
    for category in categories:
        train_files = os.listdir(os.path.join(target_dir, 'train', category))
        for file in train_files:
            train_txt.write(f'{os.path.join("train", category, file)} {category}\n')

with open(os.path.join(target_dir, 'meta', 'val.txt'), 'w') as val_txt:
    for category in categories:
        val_files = os.listdir(os.path.join(target_dir, 'val', category))
        for file in val_files:
            val_txt.write(f'{os.path.join("val", category, file)} {category}\n')

with open(os.path.join(target_dir, 'meta', 'test.txt'), 'w') as test_txt:
    for category in categories:
        test_files = os.listdir(os.path.join(target_dir, 'test', category))
        for file in test_files:
            test_txt.write(f'{os.path.join("test", category, file)} {category}\n')

print("数据集划分完成!")
相关推荐
2的n次方_3 分钟前
CANN ascend-transformer-boost 深度解析:针对大模型的高性能融合算子库与算力优化机制
人工智能·深度学习·transformer
熊猫_豆豆4 分钟前
YOLOP车道检测
人工智能·python·算法
nimadan125 分钟前
**热门短剧小说扫榜工具2025推荐,精准捕捉爆款趋势与流量
人工智能·python
qq_12498707538 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
默默前行的虫虫9 分钟前
MQTT.fx实际操作
python
杜子不疼.17 分钟前
CANN计算机视觉算子库ops-cv的图像处理与特征提取优化实践
图像处理·人工智能·计算机视觉
张人玉18 分钟前
VisionPro 定位与卡尺测量学习笔记
笔记·学习·计算机视觉·vsionprp
YMWM_19 分钟前
python3继承使用
开发语言·python
JMchen12320 分钟前
AI编程与软件工程的学科融合:构建新一代智能驱动开发方法学
驱动开发·python·软件工程·ai编程
User_芊芊君子35 分钟前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf