最近我接受了一些关于机器学习的教程,现在我想测试一下我是否可以自己制作一些图像识别程序。为此,我想使用CIFAR 10数据集,但我认为在转换数据集方面存在一个小问题。
对于谁不熟悉此集合:数据集以n行和3072列的列表形式出现,其中前1024列表示红色值,第二列1024表示绿色值,最后一列表示蓝色值。每行是单个图像(大小为32x32),像素行相互堆叠(前32个值是最顶部像素行的红色值等)。
我想用这个数据集做的是将它转换为4D张量(有numpy),所以我可以使用matplotlibs .imshow()
查看图像。我制作的张量有这样的形状:(n, 32, 32, 3)
,所以第一个'维度'存储所有图像,第二个存储像素行,第三个存储单个像素,最后一个表示这些像素的rgb值。这是我做的功能应该这样做:
def rawToRgb(data):
length = data.shape[0]
# convert to flat img array with rgb pixels
newAr = np.zeros([length, 1024, 3])
for img in range(length):
for pixel in range(1024):
newAr[img, pixel, 0] = data[img, pixel]
newAr[img, pixel, 1] = data[img, pixel+1024]
newAr[img, pixel, 2] = data[img, pixel+2048]
# convert to 2D img array
newAr2D = newAr.reshape([length, 32, 32, 3])
# plt.imshow(newAr2D[5998])
# plt.show()
return newAr2D
它采用单个参数(形状(n, 3072)
的张量)。我已经注释了pyplot代码,因为这仅用于测试,但是在测试时,我注意到一切似乎都没问题(我可以识别图像中对象的形状,但我不确定颜色是否良好或者不是,因为我得到了一些奇怪的图像以及一些非常正常的图像......以下是一些示例:purple plane,blue cat,normal horse,blue frog
任何人都可以告诉我,我犯了错误吗?
坦克提前!!答案 0 :(得分:2)
出现奇怪颜色的图像是实际图像的negative,因此您需要从255中减去每个像素值以获得真实值。如果您只想查看原始图像的外观,请使用:
from scipy.misc import imread
import matplotlib.pyplot as plt
img = imread(file_path)
plt.imshow(255 - img)
plt.show()
问题的最初原因是CIFAR-10数据以0-255的比例存储像素值,但matplotlib的imshow()
方法(我假设您正在使用)期望输入在0和1之间。如果输入未在0和1之间缩放,imshow()
会在内部进行一些归一化,这会导致某些图像变为负片。