#python #machine-learning #model #computer-vision
#python #машинное обучение #Модель #компьютерное зрение
Вопрос:
Я обучил CNN на 30 000 изображениях и хочу загрузить модель. Модель называется «emotion_recognition_model.h5». Каждый раз, когда я пытаюсь вызвать модель, она начинает переобучаться. Как мне просто загрузить ее без переподготовки? Вот код для обучения модели:
from __future__ import print_function
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from keras.layers import Conv2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator
import os
from keras.models import Sequential
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.advanced_activations import ELU
from keras.layers.core import Activation, Flatten, Dropout, Dense
from keras.optimizers import RMSprop, SGD, Adam
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
from keras import regularizers
from keras.regularizers import l1
num_classes = 7
img_rows, img_cols = 48, 48
batch_size = 512
train_data_dir = "/Users/../Behavior/images/train"
validation_data_dir = "/Users/../Behavior/images/validation"
val_datagen = ImageDataGenerator(rescale=1./255)
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=30,
shear_range=0.3,
zoom_range=0.3,
horizontal_flip=True,
fill_mode='nearest'
)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(48, 48),
batch_size=batch_size,
color_mode="grayscale",
class_mode="categorical"
)
validation_generator = val_datagen.flow_from_directory(
validation_data_dir,
target_size=(48, 48),
batch_size=batch_size,
color_mode="grayscale",
class_mode="categorical"
)
print(validation_generator.class_indices)
class_labels = validation_generator.class_indices
class_labels = {v: k for k, v in class_labels.items()}
classes = list(class_labels.values())
print(class_labels)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu',kernel_regularizer=regularizers.l2(0.0001),input_shape=(48,48,1)))
model.add(BatchNormalization())
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu',kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(7, kernel_size=(1, 1), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Conv2D(7, kernel_size=(4, 4), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
model.add(Activation("softmax"))
filepath = os.path.join("./emotion_detector_models/model_v6_{epoch}.hdf5")
checkpoint = keras.callbacks.ModelCheckpoint("best_model.hdf5",
monitor='val_accuracy',
verbose=1,
save_best_only=True,
mode='max')
callbacks = [checkpoint]
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001, decay=1e-6), metrics=['accuracy'])
nb_train_samples = 28709
nb_validation_samples = 3589
epochs = 150
model_info = model.fit(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
callbacks=callbacks,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
model.save('emotion_recognition_model.h5')
print("Saved model")
обучение с использованием приведенного выше кода заняло более 24 часов, поэтому я хотел бы просто иметь возможность загружать модель вместо этого. Вот код, в котором я пытаюсь загрузить модель:
from emotion_recognition_model_file import train_generator, class_labels
from keras.models import load_model
import cv2
import numpy as np
from time import sleep
from keras.preprocessing.image import img_to_array
face_classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
try:
classifier = load_model("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/emotion_recognition_model.h5")
except:
try:
classifier = load_model("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/best_model.hdf5")
except:
print('e')
eye_cascade = cv2.CascadeClassifier("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/haarcascade_eye.xml")
def face_detector(img):
# Convert image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_classifier.detectMultiScale(gray, 1.3, 5)
if faces == ():
return (0, 0, 0, 0), np.zeros((48, 48), np.uint8), img
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x w, y h), (255, 0, 0), 2)
roi_gray = gray[y:y h, x:x w]
roi_color = img[y:y h, x:x w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex ew, ey eh), (0, 255, 0), 2)
try:
roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA)
except:
return (x,w,y,h), np.zeros((48, 48), np.uint8), img
return (x,w,y,h), roi_gray, img
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
rect, face, image = face_detector(frame)
if np.sum([face]) != 0.0:
roi = face.astype("float") / 255.0
roi = img_to_array(roi)
roi = np.expand_dims(roi, axis=0)
# make a prediction on the ROI, then lookup the class
preds = classifier.predict(roi)[0]
label = class_labels[preds.argmax()]
label_position = (rect[0] int((rect[1] / 2)), rect[2] 25)
cv2.putText(image, label, label_position, cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
else:
cv2.putText(image, "No Face Found", (20, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
cv2.imshow('All', image)
if cv2.waitKey(1) == 13: # 13 is the Enter Key
break
cap.release()
cv2.destroyAllWindows()
Я также собираюсь добавить потоковую обработку для кода cv2, но я не могу просто загрузить модель. Что мне делать?
РЕДАКТИРОВАТЬ: Скриншот того, как я знаю, что это переподготовка
Комментарии:
1. Как вы думаете, почему она проходит переподготовку?
2. @AniketBote он снова начинает проходить процесс обучения (т. Е. Эпоху 1/150)
3. Если вы запустите первую часть, модель начнет обучение. Либо прокомментируйте
model.fit()
, либо используйте отдельный файл для второй части. Насколько я могу судить, вы можете использовать другой файл для второй части кода без каких-либо проблем.4. НЕТ!!. Вам не нужно использовать
model.fit()
после того, как модель обучена. Просто создайте новый файл и скопируйте-вставьте в него код второй части и запустите файл.5. @AniketBote Я уже это сделал. У меня есть модель в моем каталоге. Мне просто нужно загрузить ее и подогнать к данным реального времени
Ответ №1:
Интересно, вы хотите спросить о том, «как сохранить модель после обучения?», Верно? Я вижу, что вы используете Keras, который вы выбираете Tensorflow в качестве своего бэкэнда, для обучения вашей модели. Так что, возможно, вы можете использовать
from keras.model import load_model
# save model,assuming "model" is the name of the your instance,give a name as parameter
model.save("name.h5")
#load model
model = load_model("name.h5")
Возможно, вы также можете использовать некоторые методы, исходящие из Tensorflow, а не Keras, для удовлетворения ваших требований. Я не уверен в этом.
Я надеюсь, что это может быть полезно, удачи!
Комментарии:
1. это не работает. Я уже пробовал это. Тем не менее, спасибо за попытку.