Я работаю над классификацией, а затем обнаруживаю объект с помощью Keras и Python. Я классифицировал кошек/собак с точностью до 80% +, Im ok с текущим результатом на данный момент. Мой вопрос: как определить кошку или собаку из входного изображения? Я совершенно смущен. Я хочу использовать свои собственные высоты, а не предварительно подготовленные из Интернета.
Вот мой код:
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
#########################################################################################################
#VALUES
# dimensions of our images.
img_width, img_height = 150, 150
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 2000 #1000 cats/dogs
nb_validation_samples = 800 #400cats/dogs
nb_epoch = 50
#########################################################################################################
#MODEL
model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=(3, img_width, img_height)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
##########################################################################################################
#TEST AUGMENTATION
img = load_img('data/train/cats/cat.0.jpg') # this is a PIL image
x = img_to_array(img) # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape) # this is a Numpy array with shape (1, 3, 150, 150)
# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory
i = 0
for batch in train_datagen.flow(x, batch_size=1,
save_to_dir='data/TEST AUGMENTATION', save_prefix='cat', save_format='jpeg'):
i += 1
if i > 20:
break # otherwise the generator would loop indefinitely
##########################################################################################################
# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1./255)
#PREPARE TRAINING DATA
train_generator = train_datagen.flow_from_directory(
train_data_dir, #data/train
target_size=(img_width, img_height), #RESIZE to 150/150
batch_size=32,
class_mode='binary') #since we are using binarycrosentropy need binary labels
#PREPARE VALIDATION DATA
validation_generator = test_datagen.flow_from_directory(
validation_data_dir, #data/validation
target_size=(img_width, img_height), #RESIZE 150/150
batch_size=32,
class_mode='binary')
#START model.fit
history =model.fit_generator(
train_generator, #train data
samples_per_epoch=nb_train_samples,
nb_epoch=nb_epoch,
validation_data=validation_generator, #validation data
nb_val_samples=nb_validation_samples)
model.save_weights('savedweights.h5')
# list all data in history
print(history.history.keys())
#ACC VS VAL_ACC
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy ACC VS VAL_ACC')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
#LOSS VS VAL_LOSS
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss LOSS vs VAL_LOSS')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
model.load_weights('first_try.h5')
Итак, теперь, когда я классифицировал кошку и собаку, как и что мне нужно сделать, чтобы ввести изображение и пройти через него, чтобы найти в нем кошку или собаку с ограничивающей коробкой? Я совершенно новичок в этом и не уверен, правильно ли я занялся этим? Спасибо.
UPDATE Привет, Извините, что опубликовать результаты так поздно, не удалось работать над этим в течение нескольких дней. Я импортирую изображение и изменяю его до формы 1,3 150 150, когда форма 150 150 приносит ошибку:
Exception: Error when checking : expected convolution2d_input_1 to have 4 dimensions, but got array with shape (150L, 150L)
Импорт изображения:
#load test image
img=load_img('data/prediction/cat.155.jpg')
#reshape to 1,3,150,150
img = np.arange(1* 150 * 150).reshape((1,3,150, 150))
#check shape
print(img.shape)
Затем я изменил def prec_function (x) на:
def predict_function(x):
# example of prediction function for simplicity, you
# should probably use `return model.predict(x)`
# random.seed(x[0][0])
# return random.random()
return model.predict(img)
Теперь, когда я запускаю:
best_box = get_best_bounding_box(img, predict_function)
print('best bounding box %r' % (best_box, ))
Я получаю вывод как лучший ограничивающий прямоугольник: None
Итак, я побежал просто:
model.predict(img)
И получите следующее:
model.predict(img)
Out[54]: array([[ 0.]], dtype=float32)
Так что это совсем не проверка, если это кошка или собака... Любые идеи?
ПРИМЕЧАНИЕ: когда def pred) функция (x) использует:
random.seed(x[0][0])
return random.random()
Я получаю вывод как, это флажки и дает лучший.