Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
在深度学习的训练时,经常会碰到训练的样本数据集和标签数据集是在一个文件夹中,这个时候我们就不得不进行一些数据的预处理和文件的分类,例如将训练(training data)数据集和标签数据集(label data)分别放到不同的文件夹或者将训练数据集按照分类放到类别文件中,这样子的操作是为了我们能方便的读取和处理相关的图片数据。这篇博文主要是讲我在做项目过程碰到的其中一中情况,就是训练样本数据和标签数据在一个主文件夹下的不同文件夹内,这里有两种处理方式供参考。
1. 将文件分别放到不同的文件
利用Python的shutil.copy()函数对数据进行分类放到不同的文件夹。
import os import cv2 import shutil import numpy as np # 定义获取文件名的方法 def getFileNames(rootDir): fileNames = [] # 利用os.walk()函数获取根目录下文件夹名称,子文件夹名称及文件名称 for dirName, subDirList, fileList in os.walk(rootDir): for fname in fileList: # 用os.path.split()函数来判断并获取文件的后缀名 if os.path.splitext(fname)[1] == '.png': fileNames.append(dirName+'/'+fname) return fileNames # 读取文件并且移动文件到相应的文件夹 def readImgAndMove(imgPath): # 定义分类的文件夹名,判断是否存在,如若没有则创建相应的文件夹 data_destination = './train/' label_destination = './label/' if not (os.path.exists(data_destination) and os.path.exists(label_destination)): os.makedirs(data_destination) os.makedirs(label_destination) # 根据文件名的特征进行分类并复制相应的文件到新文件夹 for item in imgPath: if os.path.splitext(item)[1] == '.png' and 'XXX_123' in os.path.splitext(item)[0]: shutil.copy(item, label_destination) elif os.path.splitext(item)[1] == '.png' and 'YYY_123' in os.path.splitext(item)[0]: shutil.copy(item, data_destination)
2. 将训练数据和标签数据同时读取出来保存成矩阵形式
第二种方法就如小标题所说,将图片保存成矩阵形式,深度学习一个很根本的原因就是通过矩阵运算来得到预测结果的,所以我们也可以将图片利用OpenCV根据文件名称和格式进行读取,并保存成数组或者矩阵形式,方便后续的操作。
import os import cv2 import numpy as np # 获取训练数据和标签数据的文件名 def getFileNames(rootDir): dataListNames = [] labelListNames = [] for dirName, subDirList, fileList in os.walk(rootDir): for fname in fileList: if os.path.splitext(fname)[1] == '.png' and 'XXX_123' in os.path.splitext(fname)[0]: labelListNames.append(dirName+'/'+fname) elif os.path.splitext(fname)[1] == '.png' and 'YYY_123' in os.path.splitext(fname)[0]: dataListNames.append(dirName+'/'+fname) return dataListNames, labelListNames # 根据文件路径和文件名读取相应数据 def readImg(imgPath): imgs = [] for item in imgPath: img = cv2.imread(item) imgs.append(img) return np.array(imgs)
如对上述代码有疑问,请查询相关的的Python模块进行理解。读取文件数据还是相对比较简单,希望对有需要的小伙伴有所帮助,本人也一路在边学边探索,欢迎一起讨论。
注:有可能图片的大小不一,这个时候如果你采用的是第二种方法,那么你还得将数据先进行padding或者resize到同一个大小,再将数据合并进行打乱之类的操作。