2017-05-11 111 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的大小以使它們大小相同更好。但是,你正在做的是減少寬度。最好通過增加零或任何值來增加驗證碼的寬度。比你不會丟失信息 –