2017-05-11 110 views
1

我正在与Keras库一起进行验证码识别项目。对于训练集,我使用以下函数生成至多5位数验证码。如何重塑颜色通道的numpy图像阵列

def genData(n=1000, max_digs=5, width=60): 
    capgen = ImageCaptcha() 
    data = [] 
    target = [] 
    for i in range(n): 
     x = np.random.randint(0, 10 ** max_digs) 
     img = misc.imread(capgen.generate(str(x))) 
     img = np.mean(img, axis=2)[:, :width] 
     data.append(img.flatten()) 
     target.append(x) 
    return np.array(data), np.array(target) 

然后,我正在尝试重塑下面的训练数据数组;

train_data = train_data.reshape(train_data.shape[0], 60, 60, 3) 

我想我的验证码有3个颜色通道。但是,当我试图重塑我所面临的培训数据时,出现以下错误;

ValueError: cannot reshape array of size 3600000 into shape (1000,60,60,3)

注:如果我尝试用1而不是3的错误没有发生,但我的精度甚至不是取平均接近1%

回答

1

您正在创建一个单一的通道图像。错误表示您正在尝试重新组合一个阵列中的3600000个元素,其大小是三次(1000 * 60 * 60 * 3 = 10800000)。调整你的功能,下面的例子让它起作用。

此外,由于您正在将图像的宽度降低到60像素,因此目标不再正确。这解释了低精度。尝试使用更大的宽度,并且您的准确度很可能会增加(例如150-155)。

def genData(n=1000, max_digs=5, width=60): 
    capgen = ImageCaptcha() 
    data = [] 
    target = [] 
    for i in range(n): 
     x = np.random.randint(0, 10 ** max_digs) 
     img = misc.imread(capgen.generate(str(x))) 
     img = img[:,:width,:] 
     data.append(img.flatten()) 
     target.append(x) 
    return np.array(data), np.array(target) 
+0

非常感谢您的建议。我没有意识到采取的意思是将深度降低到1.我将继续使用相同的结构,但我还有一个问题。我正在创建具有不同长度的验证码,因此每个图像的大小都不相同。我是否需要分别为每个长度训练我的模型? @Wilmar – cano

+0

没有那会花费很多时间和精力。调整captha的大小以使它们大小相同更好。但是,你正在做的是减少宽度。最好通过增加零或任何值来增加验证码的宽度。比你不会丢失信息 –