数据集划分,Oxford Flower102花卉分类数据集,分为训练集、测试集、验证集

数据集划分,Oxford Flower102花卉分类数据集,分为训练集、测试集

Oxford Flower102数据集链接:https://www.robots.ox.ac.uk/~vgg/data/flowers/102/
参考:https://www.jianshu.com/p/71d4a8c1b68b

1、Flower102鲜花分类数据集概览及下载

在这里插入图片描述

  1. 下载上图的145,1解压后可得到一个包含8189张.jpg格式的图片(放在jpg文件夹中)以及imagelabels.mat和setid.mat。
  2. 数据集结构:
    -imagelabels.mat:总共有8189列,每列上的数字代表类别号。
    -setid.mat:
    trnid.mat:总共有1020列,每10列为一类花卉的图片,每列上的数字代表图片号。
    valid.mat:总共有1020列,每10列为一类花卉的图片,每列上的数字代表图片号。
    tstid.mat:总共有6149列,每一类花卉的列数不定,每列上的数字代表图片

2、准备工作

在项目中新建文件夹prepare_pic,再在prepare_pic下新建文件夹test、train、validation。之后会把数据分进这三个文件夹中。把jpg文件夹(包含8189张.jpg格式图片)、imagelabels.mat和setid.mat如图所示放好。data_prepare.ipynb用来数据集处理。
在这里插入图片描述

3、实现数据集划分

3.1 引入所需库

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

3.2 获取label

labels = scipy.io.loadmat('imagelabels.mat')#该地址为imagelabels.mat的相对地址
labels = np.array(labels['labels'][0]) - 1
print("labels:", labels)

3.3 用data split的setid,分出validation、train、test

setid = scipy.io.loadmat('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)

3.4 把数据导进flower_dir

flower_dir = list()

for img in os.listdir("..\\flower_data\\jpg"):#该地址为源数据图片的相对地址         
    flower_dir.append(os.path.join("..\\flower_data\\jpg", img))

flower_dir.sort()

3.5 根据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)

3.6 根据setid分出的validation,把验证数据放进validation文件夹

des_folder_validation = "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)

3.7 根据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)

4、最终结果

在这里插入图片描述

在Python中,我们可以使用几个库来下载和预处理花卉数据集,比如Oxford Flowers数据集。首先,你需要安装必要的库,如`requests`, `numpy`, `pandas`, `tensorflow.keras`(如果要用深度学习模型)以及图像处理库如`PIL`或`opencv`。 以下是一个简单的步骤说明: 1. **下载数据**: - 你可以通过`scikit-image`的`data_dir`函数获取官方数据集,例如 Oxford-IIIT Pet 数据集。```python from skimage import data_dir flowers_path = data_dir('oxford_flowers102') ``` 2. **解压文件**: - 如果数据不是预装好的,你可能需要先从网上下载数据,然后使用`shutil`库解压。例如: ```python import shutil url = 'http://www.robots.ox.ac.uk/~vgg/data/flowers/102/102flowers.tgz' filename = '102flowers.tgz' shutil.unpack_archive(filename, flowers_path) ``` 3. **数据预处理**: - 使用`PIL`库读取、缩放和归一化图片。这里假设你会将图片大小调整为所需的尺寸,并转换为灰度或RGB,根据模型需求。 ```python from PIL import Image def preprocess_image(image_path): img = Image.open(image_path).resize((224, 224)) # 或者其他所需尺寸 img = img.convert('RGB') # 如果是灰度图,改为'RGB' return img train_data = [preprocess_image(os.path.join(flowers_path, 'jpg', f)) for f in os.listdir(os.path.join(flowers_path, 'jpg'))] ``` 4. **创建数据集对象**: - 使用`numpy`数组存储图片数据和标签。例如,对于分类任务,可以创建一个包含像素值和对应的类别索引的列表。 ```python import numpy as np labels = [int(f.split('.')[0].split('_')[0]) for f in os.listdir(os.path.join(flowers_path, 'jpg'))] X_train = np.array(train_data) y_train = np.array(labels) ``` 5. **分割训练集验证集**: - 可以使用`train_test_split`函数将数据划分训练集验证集。 ```python from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42) ``` 6. **准备数据迭代器**: - 最后,为了用于机器学习模型,可能还需要将数据包装成`tf.data.Dataset`对象,以便进行批量训练。 ```python if using_tensorflow: dataset = tf.data.Dataset.from_tensor_slices(({'image': X_train}, y_train)) dataset = dataset.shuffle(buffer_size=len(X_train), seed=42).batch(batch_size) val_dataset = tf.data.Dataset.from_tensor_slices(({'image': X_val}, y_val)).batch(batch_size) ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值