0

我遇到了以下问题,一些我正在运行的 python 代码。它应该只是遍历一个列表,但它似乎在做一些我真的无法弄清楚的奇怪而微妙的事情。

from skimage.io import imread

def addImageData(self):
    for image in self.images:
        print image.signatureId
    for image in self.images:
        print image.signatureId
        imageNumber = str(image.signatureId).zfill(4)
        filePath = self.imageDirectory + imageNumber + ".jpg"
        image.construct(filePath)

def construct(self, filePath):
    self.imageData = imread(filePath, as_grey=True)

imread 来自 skimage.io。addImageData 下的第一个 for 循环完美运行,打印出一系列从 1 到 ~600 的数字。然而,第二个循环,当添加构造方法时,只打印数字 1 直到遇到内存错误。老实说,我不知道是什么原因造成的。想法?

当使用键盘中断时,这是回溯:

 File "rbm.py", line 22, in buildImages
    self.addImageData()
  File "rbm.py", line 41, in addImageData
    image.construct(filePath)
  File "rbm.py", line 61, in construct
    self.imageData = imread(filePath, as_grey=True)
  File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/io/_io.py", line 142, in imread
    img = rgb2grey(img)
  File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/color/colorconv.py", line 540, in rgb2gray
    return _convert(gray_from_rgb, rgb[:, :, :3])[..., 0]
  File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/color/colorconv.py", line 339, in _convert
    out = np.dot(matrix, arr)

在下面添加与 self.images 相关的所有代码:

class TrainingImages:
    def __init__(self, csvFile = "../train.csv", imageDirectory = "../images/"):
        self.csvFile = csvFile
        self.imageDirectory = imageDirectory
        self.images = []

    def appendCsvLine(self, line):
        '''Assumes the line is from a csv.reader object'''
        signatureId = line[1]
        if len(self.images) <= signatureId:
            newImage = Image(signatureId)
            self.images.append(newImage)
            newImage.append(line)
        else:
            self.images[(signatureId-1)].append(line)

    def buildImages(self):
        with open(self.csvFile, 'rb') as strokeData:
            reader = csv.reader(strokeData, delimiter=",")
            for line in reader:
                self.appendCsvLine(line)
        self.addImageData()
4

1 回答 1

1

感谢所有的评论家伙,他们对解决这个问题非常有帮助,但是当一切都说完了,这是一个非常奇怪的错误,但我发现了源代码并想分享它。

在函数 appendCsvLine 中,我显然是在将字符串与整数进行比较。csv.reader 类的结果始终是一个字符串,而不管条目中的实际对象如何。我的隐含假设是,如果我做一些像比较字符串和整数 python 那样愚蠢的事情会抛出 valueError。显然情况并非如此。

def appendCsvLine(self, line):
    '''Assumes the line is from a csv.reader object'''
    signatureId = int(line[1])
    if len(self.images) <= signatureId:
        newImage = Image(signatureId)
        self.images.append(newImage)
        newImage.append(line)
    else:
        self.images[(signatureId-1)].append(line)

这个令人难以置信的微小更改修复了我的代码,这是一个非常难以追踪和查找的错误。这个问题可能最好通过以下代码片段来解释:

>>> "100" > 99999999999999999999999
True

至于我注意到这个问题的方法,我首先实现了 EOL 的建议,即print [img.signatureID for img in self.images]在我的代码中添加该行。我发现它打印出一个长数组,其中有大量的 1,然后是大量的 2,然后是大量的 3,等等。

然后我开始查看实际构建图像的代码段,并将简单的打印行放在 appendCsvLine 函数的 if 和 else 下。我意识到程序永远不会到达 else 语句,并且从那里我测试了 if 语句的输出,然后意识到将 signatureId 显式转换为整数可以解决问题。然后在使用 csvl.reader 在 shell 中运行一些测试并在 python 中比较字符串和整数之后,我意识到我的错误。

于 2013-04-02T00:49:49.880 回答