将images按照2:1:1的比例随机分成train,validate,test

毕设将做一个基于计算机视觉的垃圾分类识别系统,现在从网上找到数据集,从
构建用于垃圾分类的图像分类器–穿着帆布鞋也能走猫步这里下载的数据集,总共有2500张image左右。里面有6个文件夹,分别存放纸板,玻璃瓶,金属制品(主要是易拉罐等),paper(主要是杂志,报纸,干净卫生纸等),plastic(主要是塑料瓶),一般垃圾trash(包括小塑料袋,纸片,牙膏袋等)
在这里插入图片描述
现在需要将其分成三种数据集:训练集,验证集,测试集。
参看waste_sorter
代码

from pathlib import Path
import numpy as np   # 用于将文件保存为.npy文件格式
import random
import os
import glob        # 查找符合特定规则的文件名
from PIL import Image
import zipfile as zf
import shutil
import tensorflow as tf
import re

'''
需要将paper,cardboard,glass,metal,plastic这5个文件夹
重新组织成train,validate,test三种:按照2:1:1的比例进行划分
将train_iamges文件夹:是将从5个文件中随机抽取的image,合并成一个文件夹train_images,并生成一个标签文件train_labels
同理生成validate_images,validate_lables,test_images,test_labels

思路:将5个子文件中的内容copy到同一个文件夹train_images下,
同时根据len(os.listdir('E:\\train_data\\trash_dataset\\data\\train\\plastic')),查看plastic中包含多少张image,
据此就生成多少个label。label只能用数字来表示,0,1,2,3,4
label   name
0       cardboard
1       glass
2       metal
3       paper
4       plastic

划分好之后,每个图像不能直接保存到npy文件中,因为图像太大,
后面进行批量读取时,受内存大小的限制,会导致读取失败。

所以先挨个将原始的图片进行缩放,调用tf.image.resized_images(),
然后将缩放后的images保存到对应的npy文件。
缩放image的步骤在resize_image.py中
'''
## splits indices for a folder into train, validation, and test indices with random sampling
## input: folder path
## output: train, valid, and test indices(索引;下标)
# 返回的是存放文件夹中image的下标或者说是image的序号,返回的是3个索引列表
def split_indices(folder, seed1, seed2):
    n = len(os.listdir(folder))  # n=指定的垃圾类型文件夹中的image文件数目(即图片数)
    full_set = list(range(1, n + 1))

    random.seed(seed1)
    train = random.sample(list(range(1, n + 1)), int(.5 * n))  # 从list(n个元素)中随机选出n/2个数;训练数据集占总数据的一半

    remain = list(set(full_set) - set(train))  # 集合 减去 其子集

    ## separate remaining into validation and test
    random.seed(seed2)
    valid = random.sample(remain, int(.5 * len(remain)))  # random.sample()返回的是从list随机截取的一个长度确定的片段
    test = list(set(remain) - set(valid))

    return (train, valid, test)

## gets file names for a particular type of trash, given indices
## input: waste category and indices
# indices是一个索引列表
## return:返回的是一个图片名称(由waste_type和对应的index组成的)的列表
def get_names(waste_type, indices):
    file_names = [waste_type + str(i) + ".jpg" for i in indices]
    return file_names

## moves group of source files to another folder,将原文件中的内容移动到新的文件路径
## input: list of source files and destination folder
## no output
def move_files(source_files, destination_folder):
    for file in source_files:
        shutil.move(file, destination_folder)  # shutil.move()其实就是将文件(或者文件夹)移动到指定的文件夹路径下面

## move files to destination folders for each waste type
# 将文件移动到对应的train,validate,test等的文件夹下面
train_label_list=[]
validate_label_list=[]
test_label_list=[]
waste_types = ['cardboard', 'glass', 'metal', 'paper', 'plastic']  # 5种可回收的垃圾图片类型
label_list=[0,1,2,3,4]    # 对应5个标签
for i in range(5):
    source_folder = os.path.join('E:\\train_data\\trash_dataset\\dataset-resized\\dataset-resized', waste_types[i])
    train_ind, valid_ind, test_ind = split_indices(source_folder, 1, 1)  # 将每种垃圾中的图片分成三部分,返回对应的图片索引列表
    # move source image files to train_images, and save these images' labels into the train_label_list[]
    train_names = get_names(waste_types[i], train_ind)  # train_names是一个图片名称的列表
    # train_source_files是一个列表,包含所有选中的image文件的完整的路径
    train_source_files = [os.path.join(source_folder, name) for name in train_names]
    train_dest = "E:\\train_data\\trash_dataset\\data\\train_images"
    move_files(train_source_files, train_dest)
    for j in range(len(train_names)):
       train_label_list.append(label_list[i])  # 将图像对应的label保存至train_label_list【】中

    # move source image files to validate_images, and save these images' labels into the validate_label_list[]
    valid_names = get_names(waste_types[i], valid_ind)
    valid_source_files = [os.path.join(source_folder, name) for name in valid_names]
    valid_dest = "E:\\train_data\\trash_dataset\\data\\validate_images"
    move_files(valid_source_files, valid_dest)
    for j in range(len(valid_names)):
        validate_label_list.append(label_list[i])

    # move source image files to test_images, and save these images' labels into the test_label_list[]
    test_names = get_names(waste_types[i], test_ind)
    test_source_files = [os.path.join(source_folder, name) for name in test_names]
    test_dest = "E:\\train_data\\trash_dataset\\data\\test_images"
    move_files(test_source_files, test_dest)
    for j in range(len(test_names)):
        test_label_list.append(label_list[i]) 

arr1=np.array(train_label_list)
np.save("E:\\train_data\\trash_dataset\\data\\train_labels.npy",arr1)

arr2=np.array(validate_label_list)
np.save("E:\\train_data\\trash_dataset\\data\\validate_labels.npy",arr2)

arr3=np.array(test_label_list)
np.save("E:\\train_data\\trash_dataset\\data\\test_labels.npy",arr3)

运行上面的代码,总共生成6个文件(文件夹)。train_images,validate_images,test_images这3个文件夹存放了各自的images数据(JPG格式)。如下图
在这里插入图片描述
train_images中的部分数据如下:
在这里插入图片描述
同时还生成3个存放标签的.npy文件,如下图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值