Flower102的鲜花分类数据准备及处理
写在前面
写这篇文章的初衷是想帮助像我一样疑惑在flower102分类中数据处理阶段的小朋友。
不知大家发现没有,现有的网络资源中,大部分博主都详细记载了分类过程,但是对于数据准备阶段,都轻描淡写的说“简单处理一下”。如下图所示,只告诉了数据的组织方式,却没有告知如何生成这种数据的组织方式。
当然啦,博主们热心的提供了已做好处理的数据收费链接,而我呢,就不想花钱。
如果你也有上述疑惑和需求,那就继续往下看吧~
1、数据下载
flower102数据集链接地址为:http://www.robots.ox.ac.uk/~vgg/data/flowers/102/
看到上图的Downloads,下载1,4,5。其中1为全部数据集图片,下载后解压,备用。4和5都为mat文件,他们标记了整个数据集的label。其中4文件总共有8189列,每列上的数字代表类别号。5文件总共有3个字段,分别为trnid:1020列;valid:1020列;tstid:6149列。
2、数据预处理编码
经历过上一步下载数据之后,我们已经把需要的物料都准备好了,接下来就是将数据分成训练集、测试集以进行训练。我们理想状态下需要将数据组织成下面形式:
data_prepare/
pic/
train/
class1/
img1
img2
...
class2
img1
img2
...
validation/
class1/
img1
img2
...
class2
img1
img2
...
为了将数据组织成上述形式,我们要先将下载好的1,4,5文件存放在项目目录里,下图为我存放的数据地址,将4和5文件存放在项目直系目录下,将1源数据放在flower_data目录下,这里的jpg里面包含了所有数据图片。jpg文件夹来自下载好数据压缩包解压后得到的文件名,我没有去掉,你也可以去掉,直接将全部数据图片放到flower_data文件夹中。
在项目中新建文件夹prepare_pic,再在prepare_pic下新建文件夹test、train、validation。
实现数据集划分的编码:
# encoding:utf-8
import scipy.io
import numpy as np
import os
from PIL import Image
import shutil
labels = scipy.io.loadmat('D:\\felicity\\code\\flower102\\imagelabels.mat')#该地址为imagelabels.mat的绝对地址
labels = np.array(labels['labels'][0]) - 1
print("labels:", labels)
setid = scipy.io.loadmat('D:\\felicity\\code\\flower102\\setid.mat')#该地址为setid.mat的绝对地址
validation = np.array(setid['valid'][0]) - 1
np.random.shuffle(validation)
train = np.array(setid['trnid'][0]) - 1
np.random.shuffle(train)
test = np.array(setid['tstid'][0]) - 1
np.random.shuffle(test)
flower_dir = list()
for img in os.listdir("D:\\felicity\\code\\flower102\\flower_data\\jpg"):#该地址为源数据图片的绝对地址 flower_dir.append(os.path.join("D:\\felicity\\code\\flower102\\flower_data\\jpg", img))
flower_dir.sort()
# print(flower_dir)
des_folder_train = "D:\\felicity\\code\\flower102\\prepare_pic\\train"#该地址为新建的训练数据集文件夹的绝对地址
for tid in train:
#打开图片并获取标签
img = Image.open(flower_dir[tid])
print(img)
# print(flower_dir[tid])
img = img.resize((256, 256), Image.ANTIALIAS)
lable = labels[tid]
# print(lable)
path = flower_dir[tid]
print("path:", path)
base_path = os.path.basename(path)
print("base_path:", base_path)
classes = "c" + str(lable)
class_path = os.path.join(des_folder_train, classes)
# 判断结果
if not os.path.exists(class_path):
os.makedirs(class_path)
print("class_path:", class_path)
despath = os.path.join(class_path, base_path)
print("despath:", despath)
img.save(despath)
des_folder_validation = "D:\\felicity\\code\\flower102\\prepare_pic\\validation"#该地址为新建的验证数据集文件夹的绝对地址
for tid in validation:
img = Image.open(flower_dir[tid])
# print(flower_dir[tid])
img = img.resize((256, 256), Image.ANTIALIAS)
lable = labels[tid]
# print(lable)
path = flower_dir[tid]
print("path:", path)
base_path = os.path.basename(path)
print("base_path:", base_path)
classes = "c" + str(lable)
class_path = os.path.join(des_folder_validation, classes)
# 判断结果
if not os.path.exists(class_path):
os.makedirs(class_path)
print("class_path:", class_path)
despath = os.path.join(class_path, base_path)
print("despath:", despath)
img.save(despath)
des_folder_test = "D:\\felicity\\code\\flower102\\prepare_pic\\test"#该地址为新建的测试数据集文件夹的绝对地址
for tid in test:
img = Image.open(flower_dir[tid])
# print(flower_dir[tid])
img = img.resize((256, 256), Image.ANTIALIAS)
lable = labels[tid]
# print(lable)
path = flower_dir[tid]
print("path:", path)
base_path = os.path.basename(path)
print("base_path:", base_path)
classes = "c" + str(lable)
class_path = os.path.join(des_folder_test, classes)
# 判断结果
if not os.path.exists(class_path):
os.makedirs(class_path)
print("class_path:", class_path)
despath = os.path.join(class_path, base_path)
print("despath:", despath)
img.save(despath)
将所有涉及的地址部分修改正确后,就可以运行该文件,我将该文件命名为data_prepare.py。
运行之后,就可以看到项目目录里面有了已经划分好的数据集了。
好啦,恭喜你,你可以继续做分类了,另外,如果你觉得有用请给我点赞,哈哈哈,让它获得流量,帮助更多的人。