2017-09-05 23 views
2

我使用以下kera代碼和tensorflow後端來區分狗和貓之間的區別。它不會預測800x800以上的圖像。如何預測或調整圖像大小以預測高清圖像。如果模型使用keras在較小尺寸的圖像上訓練,我該如何預測更大尺寸的圖像

代碼以火車:

# Importing the Keras libraries and packages 
from keras.models import Sequential 
from keras.layers import Convolution2D 
from keras.layers import MaxPooling2D 
from keras.layers import Flatten 
from keras.layers import Dense 
from keras.preprocessing.image import load_img, img_to_array 
from keras.models import model_from_json 
from scipy.misc import imresize 


# Initialising the CNN 
classifier = Sequential() 

# Step 1 - Convolution 
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu')) 

# Step 2 - Pooling 
classifier.add(MaxPooling2D(pool_size = (2, 2))) 

# Adding a second convolutional layer 
classifier.add(Convolution2D(32, 3, 3, activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2))) 

# Step 3 - Flattening 
classifier.add(Flatten()) 

# Step 4 - Full connection 
classifier.add(Dense(output_dim = 128, activation = 'relu')) 
classifier.add(Dense(output_dim = 1, activation = 'sigmoid')) 

# Compiling the CNN 
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 

# Part 2 - Fitting the CNN to the images 

from keras.preprocessing.image import ImageDataGenerator 

train_datagen = ImageDataGenerator(rescale = 1./255, 
            shear_range = 0.2, 
            zoom_range = 0.2, 
            horizontal_flip = True) 

test_datagen = ImageDataGenerator(rescale = 1./255) 

training_set = train_datagen.flow_from_directory('dataset/training_set', 
               target_size = (64, 64), 
               batch_size = 32, 
               class_mode = 'binary') 

test_set = test_datagen.flow_from_directory('dataset/test_set', 
              target_size = (64, 64), 
              batch_size = 32, 
              class_mode = 'binary') 

classifier.fit_generator(
    training_set, 
    samples_per_epoch=80, 
    nb_epoch=100, 
    validation_data=test_set, 
    nb_val_samples=2000 
) 


print(training_set.class_indices) 

碼預測:

from keras.models import model_from_json 

json_file = open('model.json', 'r') 
model_json = json_file.read() 
json_file.close() 
model = model_from_json(model_json) 
# load weights into new model 
model.load_weights("model.h5") 

# evaluate loaded model on test data 
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 


import shutil 
import matplotlib.pyplot as plt 
import requests 

url = raw_input("Please enter the image url/link") 
response = requests.get(url, stream=True) 
with open('test.jpg', 'wb') as out_file: 
    shutil.copyfileobj(response.raw, out_file) 


from keras.preprocessing import image 
import numpy as np 

test = image.load_img('test.jpg') 
test = image.img_to_array(test) 
test = np.expand_dims(test, axis=0) 
result = model.predict(test) 

if result[0][0] == 1: 
    prediction = 'dog' 
    print prediction 
else: 
    prediction = 'cat' 
    print prediction 
+0

如果您使用的是TensorFlow後端,最好的選擇可能是編寫一個[自定義圖層](https://keras.io/layers/writing-your-own-keras-layers/)來調用[ tf.image.resize_images'](https://www.tensorflow.org/api_docs/python/tf/image/resize_images)。否則,您可以在將數據輸入到模型之前調整數據大小,例如使用SciPy的['imresize'](https://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.imresize.html)。 – jdehesa

+0

我不介意再次用輸入訓練模型,但沒有任何方法可以預測而不需要重新訓練? – jason

回答

2

按照Keras文檔則可以僅使用指定的目標大小:

test = image.load_img('test.jpg', target_size=(224, 224)) 

https://keras.io/applications/爲例。

+0

沒錯,查看[源代碼](https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py)(因爲該函數似乎不在文檔中的任何位置)它確實執行調整大小,而且函數返回一個[PIL'Image'對象](http://pillow.readthedocs.io/en/3.4.x/reference/Image.html),所以原則上你可以在調用'img_to_array'之前執行PIL支持的任何操作。 – jdehesa

+0

我得到這個錯誤: ValueError:錯誤時檢查:預期conv2d_7_input有形狀(無,64,64,3),但有形狀的陣列(1,224,224,3) – jason

+0

只是將目標大小更改爲64,64 – convolutionBoy