【发布时间】:2020-09-13 18:02:10
【问题描述】:
我在 30,000 张图像上训练了一个 CNN,并希望加载该模型。该模型被命名为“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 代码添加线程,但我不能简单地加载模型。我该怎么办?
【问题讨论】:
-
你认为它为什么会被重新训练?
-
@AniketBote 它再次开始训练过程(即 epoch 1/150)
-
如果您运行第一部分,模型将开始训练。评论
model.fit()或为第二部分使用单独的文件。据我所知,您可以在代码的第二部分使用不同的文件,而不会出现任何问题。 -
不!训练模型后,您不必使用
model.fit()。只需创建一个新文件并将第二部分的代码复制粘贴到该文件中并运行该文件。 -
@AniketBote 我已经这样做了。我的目录中有模型。我只需要加载它并使其适合实时数据
标签: python machine-learning model computer-vision