如何创建类似于 cifar-10 的数据集 [关闭]

Posted

技术标签:

【中文标题】如何创建类似于 cifar-10 的数据集 [关闭]【英文标题】:How to create dataset similar to cifar-10 [closed] 【发布时间】:2016-05-04 03:04:10 【问题描述】:

我想创建一个与 cifar-10 数据集格式相同的数据集,以用于 Tensorflow。它应该有图像和标签。我希望能够获取 cifar-10 代码但不同的图像和标签,并运行该代码。

【问题讨论】:

【参考方案1】:

首先我们需要了解 CIFAR10 数据集所处的格式。如果我们参考:https://www.cs.toronto.edu/~kriz/cifar.html,特别是二进制版本部分,我们会看到:

第一个字节是第一张图片的标签,它 是 0-9 范围内的数字。接下来的 3072 字节是 图像的像素。前 1024 个字节是红色通道 值,接下来的 1024 是绿色,最后的 1024 是蓝色。这 值以行优先顺序存储,因此前 32 个字节是 图片第一行的红色通道值。

直观地说,我们需要以这种格式存储数据。作为基线实验,您接下来可以做的首先是获取与 CIFAR10 大小和类别数量完全相同的图像,并将它们放在这种格式中。这意味着您的图像应该有 32x32x3 的大小并且有 10 个类。如果你能成功运行它,那么你可以进一步分析单通道、不同大小的输入和不同的类等因素。这样做意味着您必须更改代码其他部分中的许多变量。你必须慢慢完成。

我正在制定一个通用模块。我的代码在https://github.com/jkschin/svhn。如果您参考 svhn_flags.py 代码,您会在其中看到许多可以更改以满足您的需要的标志。我承认它现在很神秘,因为我没有清理它以使其可读,但它可以工作。如果你愿意花一些时间粗略看看,你就会想出一些东西。

这可能是在 CIFAR10 上运行您自己的数据集的简单方法。您当然可以只复制神经网络定义并实现自己的阅读器、输入格式、批处理等,但如果您希望它快速启动并运行,只需调整您的输入以适应 CIFAR10。

编辑:

一些非常基本的代码,我希望能有所帮助。

from PIL import Image
import numpy as np

im = Image.open('images.jpeg')
im = (np.array(im))

r = im[:,:,0].flatten()
g = im[:,:,1].flatten()
b = im[:,:,2].flatten()
label = [1]

out = np.array(list(label) + list(r) + list(g) + list(b),np.uint8)
out.tofile("out.bin")

这会将图像转换为可在 CIFAR10 中使用的字节文件。对于多个图像,只需继续连接数组,如上述格式中所述。要检查您的格式是否正确,特别是针对 Asker 的用例,您应该获得 4274273 + 1 = 546988 字节的文件大小。假设您的图片是 RGB 并且值范围为 0-255。一旦你验证了这一点,你就可以在 TensorFlow 中运行了。一定要使用 TensorBoard 来可视化一张图像,只是为了保证正确性。

编辑 2:

根据 Asker 在 cmets 中的问题,

if not eval_data:
    filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i)
                 for i in xrange(1, 6)]

如果你真的想让它按原样工作,你需要研究 CIFAR10 代码的函数调用。在 cifar10_input 中,批次是硬编码的。因此,您必须编辑这行代码以适合 bin 文件的名称。或者,只需将图像平均分配到 6 个 bin 文件中。

【讨论】:

非常感谢!如果我可能会问,我不确定这是否在您的代码中,但这就是我主要困惑的地方:我有图像(现在是 jpeg)和标签(假设有 1 个热向量)。我如何阅读这两个文件以使它们符合我需要的格式?或者我如何将它们转换为所需的格式(带有字节)。如果那在您的代码中,我找不到。我的问题是如何将 jpeg+label 转换为标签和通道的字节列表? 这真的取决于你的数据集。我通常不上传我的解析器,因为它们不是通用的。我可以知道您使用的是哪些图像吗?此外,将标签存储为整数更容易,因为这就是 CIFAR10 的编码方式。我可以给你写一些代码并更新答案。 我用的是jpegs(星系照片,我想最后对星系进行分类)。它们可以缩放到任何尺寸,现在它们是 427x427。我最有可能将标签转换为整数(我猜你的意思是 0 到 9 或 1 到 10,对吧?)。 0-9 仅适用于 CIFAR10。我的意思当然是如果你指定 20 个类,那么 0-19。请参阅我之前的帖子***.com/questions/34759227/tensorflow-cifar10-example。我很难解决这个粗心的错误。我在编辑中发布了一些代码,假设图像是 RGB 格式。我希望代码有所帮助。 我了解它如何适用于单个图像。如何以二进制格式连接多个图像?即如何将下一张图片添加到out 变量?【参考方案2】:

我没有找到任何答案来做我想做的事情我自己制定了解决方案。可以在我的github上找到:https://github.com/jdeepee/machine_learning/tree/master

此脚本会将大量图像转换为训练和测试数据,其中数组的形状与 cifar10 数据集相同。

代码已注释,因此应该很容易理解。我应该注意到它遍历了一个包含多个包含图像的文件夹的主目录。

【讨论】:

标签呢?你从哪里读到它们?你能提供一个示例目录结构吗? 从记忆中我相信输入目录中的每个目录都会对应一个图像标签。因此,如果您要对狗、猫和鸟的图像进行分类,您将需要三个目录:狗、猫和鸟,以及所述目录中的相应图像。分类标签 1 将表示“狗”分类 2 表示“猫”,依此类推。 我自己已经弄明白了,谢谢你的回答!【参考方案3】:

对于 SVHN 数据集 对于多个输入图像,您可以这样尝试:

import numpy as np
import scipy.io 

mat = scipy.io.loadmat('train_32x32.mat')
data = mat['X']
label = mat['y']

R_data = data[:,:,0,:]
G_data = data[:,:,1,:]
B_data = data[:,:,2,:]

R_data = np.transpose(R_data, (2,0,1))
G_data = np.transpose(G_data, (2,0,1))
B_data = np.transpose(B_data, (2,0,1))

R_data = np.reshape(R_data,(73257,32*32))
G_data = np.reshape(G_data,(73257,32*32))
B_data = np.reshape(B_data,(73257,32*32))

outdata = np.concatenate((label,R_data,G_data,B_data), axis = 1)
step = 10000
for i in range(1,6):
    temp = outdata[i*step:(i+1)*step,:]
    temp.tofile('SVHN_train_data_batch%d.bin' % i)
    print('save data %d' % i)

【讨论】:

以上是关于如何创建类似于 cifar-10 的数据集 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PaddlePaddle系列CIFAR-10图像分类

我使用 CNN 模型创建了 CIFAR10 数据集学习模型。为啥会出现错误?

cifar10数据集怎么换成其他的

CIFAR-10数据集图像分类PCA+基于最小错误率的贝叶斯决策

CIFAR10/CIFAR100数据集介绍

CIFAR-10 图像识别