Flower102的鲜花分类数据准备及处理教程

Flower102的鲜花分类数据准备及处理


flower102数据集

写在前面

写这篇文章的初衷是想帮助像我一样疑惑在flower102分类中数据处理阶段的小朋友。

不知大家发现没有,现有的网络资源中,大部分博主都详细记载了分类过程,但是对于数据准备阶段,都轻描淡写的说“简单处理一下”。如下图所示,只告诉了数据的组织方式,却没有告知如何生成这种数据的组织方式。

项目组织目录1
项目组织目录2

当然啦,博主们热心的提供了已做好处理的数据收费链接,而我呢,就不想花钱。

如果你也有上述疑惑和需求,那就继续往下看吧~

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文件夹中。

项目组织目录3

在项目中新建文件夹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。

运行之后,就可以看到项目目录里面有了已经划分好的数据集了。

分好类别的数据集

好啦,恭喜你,你可以继续做分类了,另外,如果你觉得有用请给我点赞,哈哈哈,让它获得流量,帮助更多的人。

你可能感兴趣的:(Flower102的鲜花分类数据准备及处理教程)