2017-09-08 36 views
-1

我已經使用Keras庫在Python中訓練了手寫圖像分類器。最初,我使用標準的MNIST數據集來進行培訓和測試。但現在我想用我自己的數據集進行測試,其中所有圖像的尺寸爲900*1200*3而不是28*28*1無法重塑包含PNG圖像的numpy數組

所以我需要在測試之前重新塑造所有圖像。我正在使用下面的代碼來重塑,但它會給出錯誤。

代碼:

bb = lol.reshape(lol.shape[0], 28, 28, 1).astype('float32') 

其中lol是我含形狀(900,1200,3)

和錯誤日誌的55個圖像numpy的數組如下:

ValueError        Traceback (most recent call last) 
<ipython-input-46-87da95da73e9> in <module>() 
    24 #  # you can show every image 
    25 #  img.show() 
---> 26 bb = lol.reshape(lol.shape[0], 28, 28, 1).astype('float32') 
    27 # model = loaded_model 
    28 # classes = model.predict(bb) 

ValueError: cannot reshape array of size 178200000 into shape (55,28,28,1) 

所以我是什麼做錯了?即使在將大圖像調整爲28 * 28的非常小的圖像之後,我是否可以獲得準確的預測結果?感謝幫助。

+0

你不應該改變:'lol.reshape(lol.shape [0],28,28,1).astype('FLOAT32 ')'使用新的圖像形狀,即'900 x 1200x 3'? – Divakar

+0

'900 x 1200x 3'是我目前的形狀。我想在'28,28,1'中重塑形狀 – Kaushal28

+2

你知道'reshape'的功能嗎? – Divakar

回答

0

它會更直觀地處理每個圖像單獨,這也會給你最好的機會來保存一些信息。

嘗試使用PIL庫:

import numpy 
from PIL import Image 

lol = numpy.zeros((55,900,1200,3),dtype=numpy.uint8) 
new_array = numpy.zeros((lol.shape[0],28,28),dtype=numpy.float32) 

for i in range(lol.shape[0]): 
    img = Image.fromarray(lol[i]) 
    img_resize = img.resize((28,28)) 
    img_mono = img_resize.convert('L') 
    arr = numpy.array(img_mono,dtype=numpy.uint8) 
    new_array[i] = arr 
1

你在做什麼是錯的。您不能將(55,900,1200,3)數組重新整形爲(55,28,28,1)的數組,因爲您試圖在數組中存儲55 * 900 * 1200 * 3 = 178200000個元素只能存儲55 * 28 * 28 = 43120個元素。

你想要做的兩件事情:

1)將您的RGB圖像(由最後一個維度是3個通道指示)爲灰度(1路)。最簡單的方法是(R + B + G)/ 3。所有與圖像有關的python庫(PIL,OpenCV,skimage,tensorflow,keras等)都已經實現了。例如:

from skimage.color import rgb2gray 
gray = rgb2gray(original) 

2)從900x1200調整圖像的大小,以28x28。再次,你可以在所有主要的圖像相關的Python庫中做到這一點。例如:

from skimage.transform import resize 
resized = resize(gray, (28,28)) 

現在如果你想做到這一點在所有55幅圖像,你可以寫它把一種圖像的功能,並在您的陣圖,或使用一個簡單的for循環並填充新的數組一個圖像一次。

在你的情況下,代碼應該是這個樣子:

num_images = lol.shape[0] # 55 in your case 
resized_images = np.zeros(shape=(num_images, 28, 28, 1)) # your final array 
for i in range(num_images): 
    gray = rgb2gray(lol[i,:,:,:]) # gray.shape should be (900,1200,1) 
    resized = resize(gray, (28,28)) # resized.shape should be (28,28,1) 
    resized_images[i,:,:,:] = resized # resized_images.shape should be (55,28,28,1) 
+0

感謝您的重播。但是在執行第二步之後,當我打印'resize'形狀時,它會給出'28 * 28 * 1200',但我需要的是'28 * 28 * 1'。 – Kaushal28

+0

灰度陣列的形狀是什麼? – Djib2011

+0

它是55,1200,900 – Kaushal28