python学习 | 将CIFAR-10数据集中的图片按类别存放并生成组合图片

当年做作业时候 没搜到能让作为代码小白的我能看懂的。左抄右抄也凑不出题目要求的结果。😥
现在整理一份最终的代码。希望能对大家学习python有帮助~💪


一、题目

  1、分别将 CIFAR-10 数据集 中训练集与测试集中的图片分类,分类后将每个类别输出存放在一个文件夹中,并将文件夹名称改为该类别名称,每类文件夹内的图片名字格式为“类别名.序号.jpeg”

  2.每个类别随机选出10张图片组合成一张大图,生成4张大图,且4张大图中 相同类别的小图片各不重复。

二、完整代码

直接无脑复制即可👍🏼
记得改文件位置

1.分类并保存至文件夹

import os
from imageio import imsave

def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict


# 训练集
filename = '文件位置\cifar-10-batches-py'  # 图片的路径
meta = unpickle(filename + '/batches.meta')
label_name = meta[b'label_names']
print(label_name) #打印标签

for i in range(len(label_name)):  #建立文件夹train
    file = label_name[i].decode()
    path = '文件位置/train/' + file
    isExist = os.path.exists(path)
    if not isExist:
        os.makedirs(path)

for i in range(1, 6):
    content = unpickle(filename + '/data_batch_' + str(i))  # 解压后的每个data_batch_
    for j in range(10000):
        img = content[b'data'][j]
        img = img.reshape(3, 32, 32)
        img = img.transpose(1, 2, 0)
        img_name = '文件位置/train/' + label_name[content[b'labels'][j]].decode() + '/batch_' + str(i) + '_num_' + str(j) + '.jpeg'
        imsave(img_name, img)


# 训练集改名
path = '文件位置/train/'
filelist = os.listdir(path)
for item in filelist:
    pathnew=os.path.join(path,item)
    imagelist = os.listdir(pathnew)
    j = 1
    for i in imagelist:
        src = os.path.join(os.path.abspath(pathnew), i)
        dst = os.path.join(os.path.abspath(pathnew), '' + item + '.' + str(j) + '.jpeg')
        j = j+1
        os.rename(src, dst)


# 测试集
meta1 = unpickle(filename + '/test_batch')  # 解压test_batch
label_name1 = meta[b'label_names']

for i in range(len(label_name1)):
    file = label_name1[i].decode()
    path = '文件位置/test/' + file
    isExist = os.path.exists(path)
    if not isExist:
        os.makedirs(path)

for j in range(10000):
    img = meta1[b'data'][j]
    img = img.reshape(3, 32, 32)
    img = img.transpose(1, 2, 0)
    img_name = '文件位置/test/' + label_name[
        meta1[b'labels'][j]].decode() + '/batch_' + str(j) + '_num_' + str(j) + '.jpeg'
    imsave(img_name, img)


# 测试集改名
path = '文件位置/test/'
filelist = os.listdir(path)
for item in filelist:
    pathnew=os.path.join(path,item)
    imagelist = os.listdir(pathnew)
    j = 1
    for i in imagelist:
        src = os.path.join(os.path.abspath(pathnew), i)
        dst = os.path.join(os.path.abspath(pathnew), '' + item + '.' + str(j) + '.jpeg')
        j = j+1
        os.rename(src, dst)

结果
在这里插入图片描述

在这里插入图片描述

2.组合图片

import os
# from scipy.misc import imsave
from imageio import imsave
from PIL import Image
from PIL import ImageDraw, ImageFont

# 组合图片
IMAGE_SIZE = 32  # 每张小图片的大小
IMAGE_ROW = 10  # 行数
IMAGE_COLUMN = 10  # 列数
IMAGE_SPACE = 10 #图片间隙

path = '文件位置/train/'
filelist = os.listdir(path)

for i in range(4): #生成4张
    to_image = Image.new('RGB', (430, 430), '#E6E6FA')  # 创建一个新图,设置大小和背景色
    for j in range(IMAGE_ROW):
        pathnew=os.path.join(path, filelist[j])
        imagelist = os.listdir(pathnew)
        for k in range(IMAGE_COLUMN):
            from_image = Image.open(os.path.join(pathnew,imagelist[k + i*30]))
            to_image.paste(from_image, (10+k * (IMAGE_SPACE + IMAGE_SIZE), 10+j * (IMAGE_SPACE + IMAGE_SIZE)))
    to_image.save('文件位置/tupian' + str(i+1) + '.jpeg')

结果
在这里插入图片描述

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,生成卷积神经网络代码如下: ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models # Load the CIFAR-100 dataset (train_images, train_labels), (test_images, test_labels) = datasets.cifar100.load_data() # Normalize pixel values to be between 0 and 1 train_images, test_images = train_images / 255.0, test_images / 255.0 # Define the convolutional neural network model = models.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.Flatten(), layers.Dense(64, activation='relu'), layers.Dense(100) ]) # Compile the model model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # Train the model history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) ``` 这段代码使用了 TensorFlow 2 和 Keras API 来定义一个卷积神经网络模型,用来对 CIFAR-100 数据集的图像进行分类。模型包括了三个卷积层、两个池化层、一个全连接层和一个输出层。损失函数使用交叉熵,优化器使用 Adam,评估指标使用准确率。 训练过程,我们使用了 10 个 epoch,并在测试集上进行了验证。可以看到,模型的准确率随着训练次数的增加而提高。 接下来,我们可以使用这个模型对任意一张图片进行分类预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值