转换为cifar 10格式的数据集时出错

时间:2016-10-25 18:21:04

标签: python

您好我在https://github.com/gskielian/PNG-2-CIFAR10/blob/master/convert-images-to-cifar-format.py

中找到了此代码

我想以这种格式转换我的图像数据集,但是我收到错误:

data.append(pix[x,y][color]) TypeError: 'int' object has no attribute '__getitem__'

我是python的初学者,我不知道错误,请帮帮我

`#python script for converting 32x32 pngs to format
 from PIL import Image
 import os
 from array import *

 data = array('B')

 for dirname, dirnames, filenames in os.walk('./classes'):
 for filename in filenames:
 if filename.endswith('.png'):

    ################
    #grab the image#
    ################

    im = Image.open(os.path.join(dirname, filename))
    pix = im.load()
    #print(os.path.join(dirname, filename))

    #store the class name from look at path
    class_name = int(os.path.join(dirname).split('/')[-1])
    #print class_name

    ###########################
    #get image into byte array#
    ###########################

    # create array of bytes to hold stuff

    #first append the class_name byte
    data.append(class_name)

    #then write the rows
    #Extract RGB from pixels and append
    #note: first we get red channel, then green then blue
    #note: no delimeters, just append for all images in the set
    for color in range(0,3):
    for x in range(0,32):
        for y in range(0,32):
        data.append(pix[x,y][color])


############################################
#write all to binary, all set for cifar10!!#
############################################

output_file = open('cifar10-ready.bin', 'wb')
data.tofile(output_file)
output_file.close()
`

1 个答案:

答案 0 :(得分:0)

您的收藏中至少有一个图像是“单波段”图像。

__getitem__ method of a PixelAccess object为单波段图像返回单个整数,或为多波段图像返回元组。 __getitem__是一个“魔术”方法名称:如果对象obj有一个名为__getitem__的方法,那么您可以将obj[something]写为obj.__getitem__(something)。因此,可以编写pix[x,y]而不是pix.__getitem__((x,y))

四个三波段RGB图像,pix[x,y]返回一个3元组的整数,表示像素处的颜色(xy)。因此pix[x,y][color]返回这三个中的一个。对于单波段图像,pix[x,y]返回单个整数,尝试在整数上调用__getitem__没有意义,因此pix[x,y][color]将抛出异常。

您找到的脚本似乎只能处理三波段RGB图像(也许是四波段RGBA图像,忽略A通道)。正如您所见,单频段图像失败了。它可能会成功,但会返回CMYK或YCbCr图像的错误结果。幸运的是,对这些问题的修复似乎相当简单:如果im不是RGB或RGBA图像,请将其转换为1。通过添加以下两行

来完成此操作
    if im.mode not in ("RGB", "RGBA"):
        im = im.convert("RGB")

立即

    im = Image.open(os.path.join(dirname, filename))