2017-09-05 2 views
2

Ich benutze den folgenden Keras-Code mit Tensorflow-Backend, um den Unterschied zwischen Hund und Katze zu klassifizieren. Es wird kein Bild über 800x800 Bild vorausgesagt. Wie kann ich das Bild vorhersagen oder die Größe ändern, um ein HD-Bild vorherzusagen?Wie kann ich ein größeres Bild vorhersagen, wenn das Modell auf ein kleineres Bild mit Keras trainiert wird?

-Code zum Zuge:

# 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) 

-Code zur Vorhersage:

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

Wenn Sie das TensorFlow-Backend verwenden, wäre wahrscheinlich die beste Option, eine [benutzerdefinierte Ebene] (https://keras.io/layers/writing-your-own-keras-layers/) zu schreiben, die [' tf.image.resize_images' (https://www.tensorflow.org/api_docs/python/tf/image/resize_images). Andernfalls können Sie die Größe der Daten ändern, bevor Sie sie in das Modell eingeben, z. B. mit SciPy ['imresize'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.imresize.html). – jdehesa

+0

Es macht mir nichts aus, das Modell mit Input noch einmal zu trainieren, aber gibt es eine Möglichkeit, ohne Re-Training vorherzusagen? – jason

Antwort

2

Nach dem Keras docs können Sie nur die Zielgröße angeben mit:

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

siehe https://keras.io/applications/ für ein Beispiel.

+0

Das ist richtig, wenn man [die Quelle] (https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py) ansieht (da die Funktion nirgends in der Dokumentation zu sein scheint) es führt die Größenänderung durch, und außerdem gibt die Funktion ein [PIL 'Image'-Objekt] (http://pillow.readthedocs.io/en/3.4.x/reference/Image.html) zurück, also im Prinzip Sie kann vor dem Aufruf von 'img_to_array' jede von PIL unterstützte Operation ausführen. – jdehesa

+0

Ich erhalte diesen Fehler: ValueError: Fehler bei der Überprüfung: erwartet conv2d_7_input, um Form zu haben (None, 64, 64, 3) aber Array mit Shape (1, 224, 224, 3) – jason

+0

nur Zielgröße auf 64,64 zu ändern – convolutionBoy

Verwandte Themen