用自己的数据,制作python版本的cifar10数据集

前期准备:3通道图片60000张,如果你没有那么大的数据量,需要改变cifar-10-API中的定义,下面会具体说到。
如果你的图片是灰度图(单通道)可以用这种方法来改为三通道:
opencv将灰度图转化为RGB三通道图像
要求为python2.7版本,由于cifar10就是在python2.7下面定义的,用python3版本与2.7版本最主要的不同是在2.7版本中打包模块为cPickle,而在python3中为pickle。在cifar-10-API中打开二进制文件为cPickle。
有任何问题的可以在下方留言,或者邮箱留言:ielijing@163.com

1、将图片转化为32*32的三通道图片

def img_tra():
    for k in range(0,num):
        currentpath=folder+"/"+imglist[k]
        im=Image.open(currentpath)
        #width=im.size[0]
        #height=im.size[1]
        x_s=32
        y_s=32
        out = im.resize((x_s,y_s),Image.ANTIALIAS)
        out.save(folder_ad+"/"+str(imglist[k]))

2、进行进行像素点操作。

python版本的cifar数据集格式为在一个字典中存在batch_label,labels,data,filenames四种信息,其中batch_label与filenames为utf-8编码的字符串,data为uint8编码的numpy数组,labels为utf-8编码的列表。先将条桶图片转化为32*32的RGB图,然后依次读取RGB通道像素值,存入3*1024numpy数组,图片标签存入labels,图片名存入filenames,将其打包成一个二进制文件。
下图是打开官方cifar数据集文件内容(6个文件都一样,以data_batch_1为例)

import cPickle as p
import numpy as np
import chardet
def unpickle(file):
    import cPickle
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo, encoding='latin-1')
    return dict
cc=unpickle("J:/get4/data_atch_1")
print(cc)

打开后为:
这里写图片描述

这里写图片描述

我们将点操作与写文件写在一个函数mkcf()函数中:

def mkcf():
    global data
    global list1
    global list2
    global list3
    global list4
    for k in range(0,num):
        currentpath=folder_ad+"/"+imglist[k]
        im=Image.open(currentpath)
        with open(binpath, 'a') as f:
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #print(imglist[k])
                    #print(type(cl[0]))
                    #with open(binpath, 'a') as f:
                        #print(str(cl[0]))
                    list1.append(cl[0])
                    #print(list1)


            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[1])
                    #f.write(mid)
                    list1.append(cl[1])

            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[2])
                    #f.write(mid)
                    list1.append(cl[2])
        list2.append(list1)
        list1=[]
        #arr2=np.array(list2)
        #print(arr4)
        f.close()
        print("image"+str(k+1)+"saved.")
        list3.append(imglist[k].encode('utf-8'))
    arr2=np.array(list2,dtype=np.uint8)
    data['batch_label'.encode('utf-8')]='testing batch 1 of 1'.encode('utf-8')
    #addWord(cifar10,"batch_label".encode('utf-8'),'training batch 5 of 5'.encode('utf-8'))
    data.setdefault('labels'.encode('utf-8'),label)
    data.setdefault('data'.encode('utf-8'),arr2)
    #addWord(cifar10,'labels'.encode('utf-8'),label)
    #addWord(cifar10,'data'.encode('utf-8'),arr2)
    data.setdefault('filenames'.encode('utf-8'),list3)
    #addWord(cifar10,'filenames'.encode('utf-8'),list3)
    output = open(binpath, 'wb')
    pickle.dump(data, output)
    output.close()

3、总体代码粘贴如下

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 18 14:17:45 2017

@author: ielij
"""
import numpy as np
from PIL import Image
import operator
from os import listdir
import sys
import cPickle as pickle
import random
data={}
list1=[]
list2=[]
list3=[]
def img_tra():
    for k in range(0,num):
        currentpath=folder+"/"+imglist[k]
        im=Image.open(currentpath)
        #width=im.size[0]
        #height=im.size[1]
        x_s=32
        y_s=32
        out = im.resize((x_s,y_s),Image.ANTIALIAS)
        out.save(folder_ad+"/"+str(imglist[k]))
def addWord(theIndex,word,adder):
    theIndex.setdefault(word,[]).append(adder)
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
def mkcf():
    global data
    global list1
    global list2
    global list3
    for k in range(0,num):
        currentpath=folder_ad+"/"+imglist[k]
        im=Image.open(currentpath)
        with open(binpath, 'a') as f:
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    list1.append(cl[0])
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[1])
                    #f.write(mid)
                    list1.append(cl[1])

            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    list1.append(cl[2])
        list2.append(list1)
        list1=[]
        f.close()
        print("image"+str(k+1)+"saved.")
        list3.append(imglist[k].encode('utf-8'))
    arr2=np.array(list2,dtype=np.uint8)
    data['batch_label'.encode('utf-8')]='testing batch 1 of 1'.encode('utf-8')
    data.setdefault('labels'.encode('utf-8'),label)
    data.setdefault('data'.encode('utf-8'),arr2)
    data.setdefault('filenames'.encode('utf-8'),list3)
    output = open(binpath, 'wb')
    pickle.dump(data, output)
    output.close()

folder="H:/VOC2007/test_ad"
folder_ad="H:/VOC2007/test_rs"
imglist=listdir(folder_ad)
num=len(imglist)
img_tra()
label=[]
for i in range (0,num):
    label.append(seplabel(imglist[i]))
binpath="H:/VOC2007/get4/test_batch"
print(binpath)
mkcf()

需要说明一点,图片存储格式为:0_126.jpg,其中0为标签,得到标签的方式为(此函数已在总代码里)

def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label

4、结果展示

这里写图片描述

100张精度
这里写图片描述
1000张精度
这里写图片描述

注:如果没有那么多数据集,只想换其中一个类,即只替换6000张照片,可以考虑我做的另一个版本(cifar10-置换版本,置换标签为9的类):
http://download.csdn.net/detail/l297969586/9832449

  • 15
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 106
    评论
### 回答1: Python可以使用以下步骤读取CIFAR-10数据集: 1. 下载CIFAR-10数据集并解压缩。 2. 使用Python的pickle模块读取数据集文件。 3. 将读取的数据集转换为NumPy数组。 4. 对数据集进行预处理,例如归一化和标准化。 以下是一个示例代码: ```python import pickle import numpy as np # 读取CIFAR-10数据集 def load_cifar10_data(path): with open(path, 'rb') as f: cifar10 = pickle.load(f, encoding='bytes') # 将数据集转换为NumPy数组 X = np.array(cifar10[b'data']) y = np.array(cifar10[b'labels']) return X, y # 对数据集进行预处理 def preprocess_cifar10_data(X): # 归一化 X = X / 255.0 # 标准化 mean = np.mean(X, axis=0) std = np.std(X, axis=0) X = (X - mean) / std return X # 加载训练集和测试集 X_train, y_train = load_cifar10_data('cifar-10-batches-py/data_batch_1') X_test, y_test = load_cifar10_data('cifar-10-batches-py/test_batch') # 对数据集进行预处理 X_train = preprocess_cifar10_data(X_train) X_test = preprocess_cifar10_data(X_test) ``` 希望这可以帮助到你! ### 回答2: CIFAR-10是一个包含10个类别共计60,000张32x32像素彩色图像的数据集,可用于图像分类的基准测试。使用Python读取CIFAR-10数据集需要进行以下步骤: 1. 下载CIFAR-10数据集,可以从网络上找到开源的下载接口,也可以使用Python自带的urllib库。下载后解压缩得到五个数据文件。 2. 使用Python的numpy库读取数据文件。数据文件中是二进制数据,需要借助Numpy库中的fromfile函数将其读入内存。在读取数据之前,需要明确数据的格式。 3. 解析数据文件,将其中的二进制数据转换成图像矩阵。CIFAR-10数据集文件中包含训练集数据文件和测试集数据文件,每个数据文件中数据的组织方式如下:每个样本数据由标签和图像数据组成,标签表明该图像属于哪一分类,图像数据则是一个3x32x32的矩阵,每个数据点是一个0-255的整数,代表颜色值。 4. 加载图像数据至内存中,并对其进行预处理。由于图像数据中每个像素的取值范围在0-255之间,为了避免出现数值范围问题,需要将其进行归一化处理,将其范围缩放到0-1之间。 5. 在数据集加载完毕后,我们对其进行划分,分为训练集和测试集两个部分,一般采用80%来作为训练集,20%的数据作为测试集。 6. 将处理好的数据输入到模型中进行训练。 总之,通过Python读取CIFAR-10数据集是一项比较复杂的工作,需要考虑到数据的格式、读取数据的方式、数据的预处理,以及数据的划分等因素。但是,通过Python语言提供的丰富库函数可以完成这样的任务,并且可以非常方便地对数据进行预处理和划分。 ### 回答3: CIFAR-10 是计算机视觉中广泛使用的一个数据集,包含 60,000 张 32x32 的彩色图像,共分为 10 个类别。这个数据集可以用于训练和测试图像分类模型。在 Python 中,我们可以使用 Tensorflow 或 PyTorch 库来读取 CIFAR-10 数据集。 使用 Tensorflow 读取 CIFAR-10 数据集: 1.导入 TensorFlow 库: ``` import tensorflow as tf ``` 2.定义数据集路径及一些超参数: ``` cifar10 = tf.keras.datasets.cifar10 (train_images, train_labels), (test_images, test_labels) = cifar10.load_data() class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] ``` 3.读取数据集并预处理: ``` # 将像素值归一化到 [0, 1] 的范围内 train_images, test_images = train_images/255.0, test_images/255.0 ``` 4.可视化图像: ``` import matplotlib.pyplot as plt plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i][0]]) plt.show() ``` 使用 PyTorch 读取 CIFAR-10 数据集: 1.导入 PyTorch 库: ``` import torch import torchvision import torchvision.transforms as transforms ``` 2.定义数据集路径及一些超参数: ``` transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') ``` 3.读取数据集及预处理: ``` # 不需要特定的代码读取和归一化数据集 ``` 4.可视化图像: ``` import matplotlib.pyplot as plt import numpy as np # 从数据集中随机选择一些图片并可视化 dataiter = iter(trainloader) images, labels = dataiter.next() fig, axes = plt.subplots(1, len(images), figsize=(12,12)) for idx in np.arange(len(images)): ax = axes[idx] image = images[idx] label = labels[idx] ax.imshow(np.transpose(image, (1, 2, 0))) ax.set_title(classes[label]) ax.axis('off') ``` 无论是 Tensorflow 还是 PyTorch,读取 CIFAR-10 数据集的步骤大体相同,只是具体实现方式有所差异。掌握数据集读取方法是进行计算机视觉模型训练和实践的基础,也是开发实用系统的第一步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值