#python #keras #deep-learning #neural-network
#python #keras #глубокое обучение #нейронная сеть
Вопрос:
Я пытаюсь использовать модель keras. Я обучил модель и хочу использовать ее с веб-камеры. Однако, насколько я понимаю, входные данные, которые я использую при обучении модели, и входные данные, которые я получаю от камеры, не совпадают. Как мне решить эту проблему?
Здесь код для поезда:
from keras.preprocessing.image import ImageDataGenerator
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dropout
from keras.layers import Dense
from keras.layers import Flatten
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.models import Sequential, load_model
import tensorflow as tf
import numpy as np
import os
# plot pretty figures
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
nbatch=32
train_datagen = ImageDataGenerator ( rescale=1./255,
rotation_range=12.,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.15,
horizontal_flip=True)
test_datagen = ImageDataGenerator (rescale=1./255)
train_gen = train_datagen.flow_from_directory(
'images/train/',
target_size=(256,256),
color_mode='grayscale',
batch_size=nbatch,
classes=['NONE','ONE','TWO','THREE','FOUR','FIVE'],
class_mode='categorical'
)
test_gen = test_datagen.flow_from_directory(
'images/test/',
target_size=(256,256),
color_mode='grayscale',
batch_size=nbatch,
classes=['NONE','ONE','TWO','THREE','FOUR','FIVE'],
class_mode='categorical'
)
for X, y in train_gen:
print(X.shape, y.shape)
plt.figure(figsize=(16,16))
for i in range(25):
plt.subplot(5,5,i 1)
plt.axis('off')
plt.title('Label: {}'.format(np.argmax(y[i])))
img= np.uint8(255*X[i,:,:,0])
plt.imshow(img,cmap='gray')
break
plt.show()
model = Sequential()
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(256,256,1)))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64,(3,3),activation='relu'))
model.add(Conv2D(64,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(128,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(256,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Flatten())
model.add(Dense(150, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(6,activation='softmax'))
model.summary()
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])
callback_list=[EarlyStopping(monitor='val_loss',patience=10),
ModelCheckpoint(filepath='model_6cat_2.h6',monitor='val_loss',save_best_only=True),]
os.environ["CUDA_VISIBLE_DEVİCES"] = "0"
with tf.device('/GPU:0'):
history = model.fit_generator(
train_gen,
steps_per_epoch=64,
epochs=200,
validation_data=test_gen,
validation_steps=28,
callbacks=callback_list
)
plt.figure(figsize=(16,6))
plt.subplot(1,2,1)
nepochs=len(history.history['loss'])
plt.plot(range(nepochs),history.history['loss'], 'g-', label='train')
plt.plot(range(nepochs),history.history['val_loss'], 'c-', label='test')
plt.legend(prop={'size':20})
plt.ylabel('loss')
plt.xlabel('number of epochs')
plt.subplot(1,2,2)
plt.plot(range(nepochs),history.history['acc'], 'g-', label='train')
plt.plot(range(nepochs),history.history['val_acc'], 'c-', label='test')
plt.legend(prop={'size':20})
plt.ylabel('accuracy')
plt.xlabel('number of epochs')
X_test, y_test= [], []
for ibatch, (X,y) in enumerate(test_gen):
X_test.append(X)
y_test.append(y)
ibatch =1
if (ibatch==5*28):break
X_test = np.concatenate(X_test)
y_test = np.concatenate(y_test)
y_test = np.int32([np.argmax(r) for r in y_test])
y_pred = np.int32([np.argmax(r) for r in model.predict(X_test)])
match=(y_test == y_pred)
print(("Testing Accuracy = {}").format(np.sum(match)*100/match.shape[0]))
Здесь код для прогнозирования:
model = load_model("C://Users//90544//OneDrive//Masaüstü//Yusuf//
ödevler//kerasGiris//model_6cat_2.h6", compile = True)
cap = cv2.VideoCapture(0)
while 1:
ret, frame = cap.read()
if ret:
frame = cv2.flip(frame, 1)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame = cv2.resize(frame, (256, 256))
frameNp = image.img_to_array(frame)
frameNp = np.expand_dims(frameNp, axis=0)
predictions = model.predict(frameNp)
print(predictions)
cv2.imshow("frame", frameNp)
k = cv2.waitKey(1) amp; 0xff
if k == 27: break # ESC pressed
cap.release()
cv2.destroyAllWindows()
ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 256, 256, 3]
Я попытался изменить форму изображения, полученного с камеры, но я не мог решить, какими должны быть размеры.
Ответ №1:
Вы можете определить входную форму модели из этой строки:
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(256,256,1)))
Эта строка означает, что модель принимает изображение формы (256, 256, 1) на основе аргумента input_shape, поэтому модель ожидает получения изображений такого размера.
Ваше сообщение об ошибке означает, что вы использовали изображение формы (256, 256, 3), и оно ожидало 1 вместо 3, поэтому вам нужно сделать так, чтобы значение каналов было равно 1, как на изображении с серой шкалой, а не 3, что является BGR.
Добавьте эту строку после первой строки в цикле while в коде для predict:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
Эта строка изменяет каналы изображения с BGR на шкалу серого, чтобы соответствовать каналам размера ввода для модели и форме ввода, запрошенной моделью.
Комментарии:
1. Окно открылось, но закрылось через 1 секунду. Я получил эту ошибку. Также я обновил код, как вы говорите.
2. Если этот пользователь решил вашу первоначальную проблему, вам нужно принять его ответ и задать другой вопрос для следующей проблемы, с которой вы столкнулись
3. @NicolasGervais Я почти уверен, что решил его проблему с input_shape, во всяком случае, я попытался со второй ошибкой, спасибо за упоминание.
4. Спасибо за вашу помощь, как вы говорите, я исправил первую ошибку. Я пытаюсь исправить вторую ошибку.
5. @codcod55 При всем уважении, вы должны опубликовать другой вопрос с новым сообщением об ошибке, я опубликовал ответ на ваше первое сообщение об ошибке (ошибка формы ввода), и это решило его, пожалуйста, примите этот ответ, поскольку он решил ваш вопрос.