图像分类任务1——读取自己的数据集

文章目录

  • 数据集准备
    • 数据集形式
    • 数据集处理
    • 合并时文件统一重新命名
  • 读取数据集

数据集准备

数据集形式

初学图像分类任务时往往会用MNIST或者CIFAR-10作为实验练手项目,但这两个数据集是各大框架内部已经集成的,导入的时候只需要直接调用即可。
当使用自己的数据集时要先做一些处理。
这次的图像分类任务数据集形式如下:
在这里插入图片描述
共有11个文件夹,前10个是类别及其对应的图片,第11是测试(预测)图片,分类任务的成绩由Testset文件夹的准确度给定。

图像分类任务1——读取自己的数据集_第1张图片

数据集处理

在网上查阅相关资料后,把文件夹分为如下形式:
在这里插入图片描述
TL_Dataset中存放训练集:
图像分类任务1——读取自己的数据集_第2张图片

由于最后两类都是Negative类,故统一成一类,变为9分类任务
图像分类任务1——读取自己的数据集_第3张图片

合并时文件统一重新命名

由于要把最后两类合并成一类,而在每一类文件夹中。图片都是从0开始命名,因此要把第10类的文件从5001(第9类标号到5000)开始重命名。

  • 文件批量重命名
import os
class BatchRename():
    #批量重命名文件夹中的图片文件
    def __init__(self):
        self.path = r'C:\Users\yzh_1\Desktop\assignment2\TL_Dataset\TL_Dataset\9'
     def rename(self):
        filelist = os.listdir(self.path)
        #获取文件夹下文件的路径 获取的只有文件名(如1.png)而非绝对路径
        total_num = len(filelist)#获取文件长度(个数)
        i = 5001#表示文件命名时从5001开始的
        for item in filelist:
            #if item.endwith('.png'): #初始的图片的格式为png格式)
            #后面的转换格式可以调整为自己需要的格式
            #这里由于文件夹中全部是png文件,故不需要这个if语句
            src = os.path.join(os.path.abspath(self.path),item)#要修改的文件的绝对路径
            dst = os.path.join(os.path.abspath(self.path),str(i)+'.png')
            #也可以设置为其他格式。。。
            #dst = os.path.join(os.path.abspath(self.path),'002_'+str(i)+'.png')
            #dst = os.path.join(os.path.abspath(self.path),'0000'+format(str(i),'0>3s')+'.png')
            #这种情况下的命名格式为0000000.png形式
            try:
                os.rename(src,dst)
                print('converting %s to %s...'%(src,dst))
                i = i+1
            except:
                continue
        print('total %d to rename & converted %d pngs'%(total_num,i))

if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()


            
  • 这里存在一个问题,由于读取路径的时候不是按照图片编号的大小顺序,而是先比较第1位,再比较第2位…(即顺序为1、10、11…在是2、20…)
  • 所以重新排序后顺序会改变,由于这是训练集,打乱顺序并不影响。但在测试的时候顺序不能打乱,否则无法完成测试。
  • 关于format
    图像分类任务1——读取自己的数据集_第4张图片

读取数据集

目标:把图像和其对应的标签分别放入两个list中
函数load_data用于加载数据,代码如下:

def load_data(path,norm_size,class_num):
	data = []#数据
	label = []#标签
	image_paths = sorted(list(paths.list_images(path)))
	random.seed(0)#只要seed的值一样,后续生成的随机数一样
	random.shuffle(image_paths)#将所有文件的路径打乱
	for each_path in image_paths:
		image = cv2.imread(each_path)
		image = cv2.resize(image,(norm_size,norm_size))#统一图片尺寸
		image = img_to_array(image)
		data.append(image)
		maker = int(each_path.split(os.path.sep)[-2])#sep切分文件目录
		label.append(maker)
	data = np.array(data,dtype = 'float')/255.0#归一化
	label = np.array(label)
	label = to_categorical(label,num_class = class_num)#分类one-hot编码
	return data,label

你可能感兴趣的:(deep-learning)