0
点赞
收藏
分享

微信扫一扫

pytorch实现Oxford-102flower数据集的划分

Oxford-102flower是牛津工程大学于2008年发布的用于图像分类的数据集,总共分为102个类,每个类包含40-258张图像,一共8189张图像。

数据下载地址icon-default.png?t=M276https://www.robots.ox.ac.uk/~vgg/data/flowers/102/

下载图中1.4.5对应的文件,分别为数据的文件,标签的文件和划分的文件。

 数据下载解压后显示如下:

 

数据中个别图像展示:

 

 下载好的图像放在一个jpg文件夹中,该文件夹中包含了所有的图像,但其图像排列顺序是有规律,每一类的图像放在一起,然后再放下一类的所有图像,因此我们可以将数据集划分为训练集、验证集和测试集。

 数据集的划分主要依据imagelabels.mat文件和setid.mat文件完成。imagelabels.mat文件主要包换数据的标签信息。

导入头文件:

# encoding:utf-8
import scipy.io
import numpy as np
import os
from PIL import Image

依据imagelabels.mat文件读取图像的标签信息,该文件一共包含8189列,每一个数即代表的该图像所属的类别。在使用时修改imagelabels.mat文件的位置,使程序能够顺利读取。

labels = scipy.io.loadmat('./imagelabels.mat.txt')
labels = np.array(labels['labels'][0]) - 1
print("labels:", labels)

根据setid.mat文件将数据划分为训练集,验证集和测试集。setid.mat文件主要包含每一个类对应的图片信息文件,读取该文件,配合imagelabels.mat文件可实现数据的划分。在使用时修改setid.mat文件的位置,使程序能够顺利读取。

setid = scipy.io.loadmat('./setid.mat.txt')

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)

将数据存储在fflower_dir中:注意修改图片存储的位置。
 

flower_dir = list()
for img in os.listdir("./102flowers/jpg"):
    flower_dir.append(os.path.join("./102flowers/jpg", img))
flower_dir.sort()

根据setid划分出train并放入train文件夹中:

des_folder_train = "./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)

根据setid划分出val并放入val文件夹中:

des_folder_validation = "./val"#该地址为新建的验证数据集文件夹的相对地址

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)

根据setid划分出test并放入test文件夹中:

des_folder_test = "./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)

划分好的数据集如下所示:

 

举报

相关推荐

0 条评论