制作自己的图片数据集(附代码)

自从入坑深度学习,一直都是用现有的数据集进行训练网络,今天想自己制作自己的数据集,因此将收集到的图片进行数据集制作。

我的图片是人眼睛的图片,平均每个人有40张图片,命名是一个人的图片名称的前几个是一样的,后面是按顺序增加的,全部图片是在一个文件夹下,并有一个txt文档罗列出来全部的图片。
目标:将图片分成3大部分,按照7:2:1的比例,分别作为训练集、验证集以及测试集,并实现一个人一个文件夹,文件夹名称是此人图片名称中一样的部分。
话不多说,先上代码~ 好东西要大家分享!

实现将图片进行比例分割,并生成相应的txt,并提取出名称

import os
import numpy as np

file_path = r'E:\datasets\DataPrePro\12.04\box.txt'
save_train_path = r'E:\datasets\DataPrePro\12.04\label_train.txt'
save_valid_path = r'E:\datasets\DataPrePro\12.04\label_valid.txt'
save_test_path = r'E:\datasets\DataPrePro\12.04\label_test.txt'

all_person_labels = []
person_dict = {}
person_dict_train = []
person_dict_valid = []
person_dict_test = []
label_dict = {}

# 将所有数据按[序号:所有图片]的形式提取
# 生成人序号与标签对于的字典
with open(file_path, 'r') as fp:
    index = 0
    #label_dict = {}
    ori_lines = fp.readlines()
    for line in ori_lines:
        line = line.strip().split('\t')
        name = line[0].split('/')[-1]
        data = line[1:]
        label = name.split('_')[0]
        if label not in person_dict.keys():
            person_dict[label] = [name]
        else:
            person_dict[label].append(name)
        if label not in label_dict:
            label_dict[label] = index
            index += 1
    print(label_dict)
    print(label_dict.values())


#按序号取出该序号人的所有图片,并随机打乱顺序然后按7:2:1保持到训练、验证、测试数据集,最后保持。
with open(save_train_path, 'w') as strp, open(save_valid_path, 'w') as svp, open(save_test_path, 'w') as step:
    for person in person_dict.keys():
        img_names = person_dict[person]
        Num_img = len(img_names)
        Num_train = int(Num_img * 0.7)
        Num_valid = int(Num_img * 0.2)
        Num_test = Num_img - Num_train - Num_valid
        img_names = np.array(img_names)
        np.random.shuffle(img_names)
        img_train = img_names[:Num_train]
        img_valid = img_names[Num_train:Num_train+Num_valid]
        img_test = img_names[Num_train+Num_valid:]
        for img_name in img_train:
            label = img_name.split(‘_’)[0]
            strp.write(img_name)
            strp.write(‘\t’)
            strp.write(label)
            strp.write(‘\n’)
        for img_name in img_valid:
            label = img_name.split(‘_’)[0]
            svp.write(img_name)
            svp.write(‘\t’)
            svp.write(label)
            svp.write(‘\n’)
        for img_name in img_test:
            label = img_name.split(‘_’)[0]
            step.write(img_name)
            step.write(‘\t’)
            step.write(label)
            step.write(‘\n’)

下面的部分就添加了将图片按照txt文档中的情况移动到相应的文件夹中:

import os
import numpy as np
import shutil
file_path = r'E:\datasets\DataPrePro\12.04\box.txt'
path = r'E:\datasets\DataPrePro\12.04\imgs'
save_train_path = r'E:\datasets\DataPrePro\12.04\label_train.txt'
save_valid_path = r'E:\datasets\DataPrePro\12.04\label_valid.txt'
save_test_path = r'E:\datasets\DataPrePro\12.04\label_test.txt'

train_path = r'E:\datasets\DataPrePro\12.04\train'
valid_path = r'E:\datasets\DataPrePro\12.04\valid'
test_path = r'E:\datasets\DataPrePro\12.04\test'
all_person_labels = []
person_dict = {}
person_dict_train = []
person_dict_valid = []
person_dict_test = []


# 将所有数据按[序号:所有图片]的形式提取
# 生成人序号与标签对于的字典
with open(file_path, 'r') as fp:
    index = 0
    label_dict = {}
    ori_lines = fp.readlines()
    for line in ori_lines:
        line = line.strip().split('\t')
        name = line[0].split('/')[-1]
        data = line[1:]
        label = name.split('_')[0]
        if label not in person_dict.keys():
            person_dict[label] = [name]
        else:
            person_dict[label].append(name)
        if label not in label_dict:
            label_dict[label] = index
            index += 1
    print(label_dict)
    print(label_dict.values())


#按序号取出该序号人的所有图片,并随机打乱顺序然后按7:2:1保持到训练、验证、测试数据集,最后保持。
with open(save_train_path, 'w') as strp, open(save_valid_path, 'w') as svp, open(save_test_path, 'w') as step:
    for person in person_dict.keys():
        img_names = person_dict[person]
        Num_img = len(img_names)
        Num_train = int(Num_img * 0.7)
        Num_valid = int(Num_img * 0.2)
        Num_test = Num_img - Num_train - Num_valid
        img_names = np.array(img_names)
        np.random.shuffle(img_names)
        img_train = img_names[:Num_train]
        img_valid = img_names[Num_train:Num_train+Num_valid]
        img_test = img_names[Num_train+Num_valid:]
        if not os.path.exists(train_path):
            print(“Create new folder:” + train_path)
            os.mkdir(train_path)
        for img_name in img_train:
            label = img_name.split(‘_’)[0]
            strp.write(img_name)
            strp.write(‘\t’)
            strp.write(label)
            strp.write(‘\n’)
            for file in os.listdir(path):
                if os.path.isfile(path + ‘/‘ + file):
                    if img_name in file:
                        shutil.copy(path + ‘/‘ + file, train_path + ‘/‘ + file)

        if not os.path.exists(valid_path):
            print(“Create new folder:” + valid_path)
            os.mkdir(valid_path)
        for img_name in img_valid:
            label = img_name.split(‘_’)[0]
            svp.write(img_name)
            svp.write(‘\t’)
            svp.write(label)
            svp.write(‘\n’)
            for file in os.listdir(path):
                if os.path.isfile(path + ‘/‘ + file):
                    if img_name in file:
                        shutil.copy(path + ‘/‘ + file, valid_path + ‘/‘ + file)

        if not os.path.exists(test_path):
            print(“Create new folder:” + test_path)
            os.mkdir(test_path)
        for img_name in img_test:
            label = img_name.split(‘_’)[0]
            step.write(img_name)
            step.write(‘\t’)
            step.write(label)
            step.write(‘\n’)
            for file in os.listdir(path):
                if os.path.isfile(path + ‘/‘ + file):
                    if img_name in file:
                        shutil.copy(path + ‘/‘ + file, test_path + ‘/‘ + file)

为了实现将每个人的图片放到同一个文件夹下,代码如下:

import os
import shutil

train_path = r'E:\datasets\DataPrePro\12.04\label_train.txt'
valid_path = r'E:\datasets\DataPrePro\12.04\label_valid.txt'
test_path = r'E:\datasets\DataPrePro\12.04\label_test.txt'
path_01 = r'E:\datasets\DataPrePro\12.04\train'
path_02 = r'E:\datasets\DataPrePro\12.04\valid'
path_03 = r'E:\datasets\DataPrePro\12.04\test'

f = open(train_path, 'r')
lines = f.readlines()
for line in lines:
    line = line.strip().split(‘\t’)
    name = line[1]
    if not os.path.exists(path_01 + ‘/‘ + name):
        os.mkdir(path_01 + ‘/‘ + name)
    for file in os.listdir(path_01):
        if os.path.isfile(path_01 + ‘/‘ + file):
            if name in file:
                shutil.move(path_01 + ‘/‘ + file, path_01 + ‘/‘ + name + ‘/‘ + file)

f = open(valid_path, ‘r’)
lines = f.readlines()
for line in lines:
    line = line.strip().split(‘\t’)
    name = line[1]
    if not os.path.exists(path_02 + ‘/‘ + name):
        os.mkdir(path_02 + ‘/‘ + name)
    for file in os.listdir(path_02):
        if os.path.isfile(path_02 + ‘/‘ + file):
            if name in file:
                shutil.move(path_02 + ‘/‘ + file, path_02+ ‘/‘ + name + ‘/‘ + file)

f = open(test_path, ‘r’)
lines = f.readlines()
for line in lines:
    line = line.strip().split(‘\t’)
    name = line[1]
    if not os.path.exists(path_03 + ‘/‘ + name):
        os.mkdir(path_03 + ‘/‘ + name)
    for file in os.listdir(path_03):
        if os.path.isfile(path_03 + ‘/‘ + file):
            if name in file:
                shutil.move(path_03 + ‘/‘ + file, path_03 + ‘/‘ + name + ‘/‘ + file)

这是本人第一次制作数据集,如有不妥之处,希望大家多多指教,一起进步~

  • 23
    点赞
  • 330
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
制作自己的数据集,可以参考以下步骤: 1. 收集数据:收集跟你想要训练的模型相关的数据,比如图片、音频、文本等。这些数据应该尽可能地包含模型将要面对的各种情况和变化,以便训练出更加鲁棒和准确的模型。 2. 标注数据:在收集到数据后,需要对这些数据进行标注,以便机器学习模型能够理解和学习。对于图像数据,可以标注每张图片中的目标物体、位置和类别等信息;对于文本数据,可以标注情感极性、主题类别等信息;对于音频数据,可以标注声音的类型和频率等信息。 3. 数据预处理:数据预处理是非常重要的一步,它可以提高模型的训练效果。对于图像数据,可以进行缩放、裁剪、旋转、翻转等操作;对于文本数据,可以进行分词、去除停用词、词向量化等操作;对于音频数据,可以进行傅里叶变换、语音识别等操作。 4. 划分数据集:将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型的参数和超参数,测试集用于测试模型的泛化能力和准确率。 5. 导出数据:将数据集导出为适合模型训练的格式,比如图片可以导出为JPEG或PNG格式,文本可以导出为CSV格式,音频可以导出为WAV格式等。 对于MNIST数据集,它已经是一个标准的数据集,可以直接使用。如果你要制作类似MNIST的数据集,可以采用类似的方法进行制作,并且按照MNIST的格式进行存储和导出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值