我们在做深度学习时,一般都是跑别人公开的数据集,如果想要跑自己的数据集怎么办?今天就记录一下我自己用的一种方法。
1、假设待分类一共有n类
2、新建一个文件夹,在该文件夹下新建n子个文件夹和n个对应的txt文件。将对应分类的图片放入到新建的分类文件夹中。假设 训练图片子文件夹名称分别为train_1到train_n,相对应的txt文件命名为train_1.txt到train_2.txt
3、使用如下命令:将每个子文件夹的内容(图像的名字)和标签写到txt文件中。
import os
DIRECTORY= "C:\\Users\\FT\\jupyter\\train_1"#这里是自己子文件夹的图片的位置,train_1到train_n
f = open('C:\\Users\\FT\\jupyter\\train_1.txt','w') #txt文件位置train_1到train_n
files=os.listdir(DIRECTORY)
for file in files:
f.writelines(file+“ “+’num_class’)#num_class 是该类图像对应的分类一般用0-9
f.write('\n')
f.close()
写入的过后的txt文件如下:
4、将所有的train_n.txt文件复制到一个总的txt文件命名为train.txt。这个txt文件包括了所有训练图片的名字和对应的标签.。并将 train_1到train_n文件夹中所有的图片复制到一个文件夹train中
5、使用下面的命令将该train.txt文件中图片对应名字的图片和标签取出来。
DIRECTORY= "C:\\Users\\FTM\\jupyter\\train"#这里是自己的所有图片的位置
f = open('C:\\Users\\FTM\\jupyter\\train.txt','r')
#产生一个0-130的随机序列。130 是自己训练图片的总张数。用于将train.txt中的数据随机排序,训练时生成随机的batch
list=[]
for i in range(0,130):
list.append(i)
random.shuffle(list)
##########分开train.txt中的数据###############
num=[] #labels数据集
imgs=[]#data数据
line=f.readline()
while line:
a = line.split()#将txt分成两列
data = a[0] # 这是选取图像的名称,一般是xxx.jpg或其他图片格式
imgs.append(data) #将其添加在列表之中
label = a[1] # 这是选取图像的标签,一般是0-9的数字
num.append(label)
line = f.readline()
f.close()
##############读取图片数据######################
batch=[] #图像数据
labels=[] #标签
for j in range(len(list)): #随机取出train文件夹中的图像
num_1=list[j]
file_path=DIRECTORY+"\\"+imgs[num_1] #图像的位置
img=cv2.imread(file_path) #将图像的信息读出来
img=cv2.resize(img,(32,32),interpolation=cv2.INTER_CUBIC) #将图像变为指定大小
batch.append(img)#图像数据存入batch中
labels.append(num[num_1])#标签数据存入到labels中
6、使用时使用如下数据变换操作:
1)、将batch中的图像数据分批。即设置batch_size大小
2)、将batch数据转为Tensor : batch_train=torch.Tensor(batch).permute(0,3,2,1)/255
3)、 将labels数据做如下变换:
label1=[int(x)for x in label] #因为前面txt中加的标签是一个str
label1=torch.Tensor(label1).type(torch.LongTensor)
4)、到这一步,数据就完全处理好了,可以送入神经网络训练了。
7、如果有什么待改进和其他方法,欢迎在下面留言。上面这个步骤经过我试过是可以使用的。