基于Keras的Python掩码检测神经网络

基于Keras的Python掩码检测神经网络,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,这是我第一次用keras真正尝试神经网络。我一直在试着做一个分类器来判断是否有人戴着面具。下面我提供了我的模型。我获得了约87%的训练准确率和85%的验证准确率。对于自己的图像,它的表现也很好。我创建了自己的数据集,为这两个类中的每一类创建了大约600个图像。不过,我有一些问题 对吗?有什么改进建议吗?正如我所说,这是我的第一个神经网络项目,我真的不知道我是否做错了什么(我很可能做错了) 我将如何实现这一点,以预测摄像机的反馈,而不仅仅是图像。我会从opencv中获取帧并预测这些帧吗?非常感谢

这是我第一次用keras真正尝试神经网络。我一直在试着做一个分类器来判断是否有人戴着面具。下面我提供了我的模型。我获得了约87%的训练准确率和85%的验证准确率。对于自己的图像,它的表现也很好。我创建了自己的数据集,为这两个类中的每一类创建了大约600个图像。不过,我有一些问题

  • 对吗?有什么改进建议吗?正如我所说,这是我的第一个神经网络项目,我真的不知道我是否做错了什么(我很可能做错了)
  • 我将如何实现这一点,以预测摄像机的反馈,而不仅仅是图像。我会从opencv中获取帧并预测这些帧吗?非常感谢您的任何评论和/或帮助
这是我的模型:

from keras.layers import Dense, Input, Dropout, GlobalAveragePooling2D, Flatten, Conv2D, BatchNormalization, Activation, MaxPooling2D
from keras.models import Model, Sequential
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import RMSprop
from sklearn.model_selection import train_test_split

NAME = "mask-detection"
tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))
train_datagen = ImageDataGenerator(rescale=1 / 255)
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(100, 100),
    batch_size=32,
    class_mode='categorical',
    color_mode = "grayscale"
)

label_map = (train_generator.class_indices)

validation_generator = test_datagen.flow_from_directory(
    'data/test',
    target_size=(100, 100),
    batch_size=32,
    class_mode='categorical',
    color_mode = "grayscale"
)

model=Sequential()

model.add(Conv2D(100,(3,3),padding='same', input_shape=(100,100,1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(100,(3,3), padding='same',))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(50,activation='relu'))

model.add(Dense(2, activation='softmax'))

model.compile(
    optimizer=RMSprop(lr=0.0001),
    loss="binary_crossentropy",
    metrics=["accuracy"])

model.fit(train_generator, epochs=20, callbacks=[tensorboard])
model.evaluate(validation_generator)
model.save('saved_model/model')
model.summary()
print(label_map)
根据这一点,我预测IMG:

import numpy as np
from keras.preprocessing import image

model =  tf.keras.models.load_model('saved_model/model')
predictions = ["Mask", "No Mask"]

def predict_mask(img):
    x = image.load_img(img, color_mode="grayscale", target_size=(100, 100))
    x = image.img_to_array(x)
    x = np.expand_dims(x, axis= 0)
    x = np.array(x).astype("float32")/255  
    x = x.reshape([1, 100, 100, 1])

    classes = model.predict(x)
    return predictions[np.argmax(classes)]

img = "test.png"

print(predict_mask(img))

你可以做很多事情。如果您想使用现有的模型,那么我建议您使用keras回调ReduceLROnPlateau和ModelCheckpoint。第一种方法使您能够使用可调整的学习速率。将其设置为监视验证丢失。下面的代码中显示了一个典型的用法,如果验证丢失在一个历元中未能减少,则学习率将降低50%。这允许您最初使用更大的学习率,并在以后的历元中自动降低。第二种方法使您能够以最低的验证损失保存模型。下面的代码显示了典型的应用程序。这些回调的文档是在训练后加载此模型进行预测的。如果你想得到更好的结果,我建议你尝试迁移学习。很多模型都有文档,我更喜欢使用MobileNet模型,因为它只有400万个可训练参数,而VGG16只有1.4亿个可训练参数,并且在大多数情况下都差不多准确。下面的代码显示了典型的用法

rlrp=tf.keras.callbacks.ReduceLROnPlateau(
    monitor='val_loss', factor=0.5, patience=1, verbose=0, mode='auto',
    min_delta=0.0001, cooldown=0, min_lr=0)
checkpoint_filepath = '/tmp/checkpoint'
mcp=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_filepath,
     monitor='val_loss', verbose=0, save_best_only=True,
    save_weights_only=False, mode='auto', save_freq='epoch', options=None)
callbacks=[rlrp,mcp]
mobile = tf.keras.applications.mobilenet.MobileNet( include_top=False,
                                                           input_shape=(image_size,image_size,3),
                                                           pooling='max', weights='imagenet',
                                                           alpha=1, depth_multiplier=1,dropout=.5)
x=mobile.layers[-1].output  
x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x)
predictions=Dense (2, activation='softmax')(x)
model = Model(inputs=mobile.input, outputs=predictions)    
for layer in model.layers:
    layer.trainable=True
model.compile(Adamax(lr=.05), loss='categorical_crossentropy', metrics=['accuracy']) 
data=model.fit(x=train_generator,  epochs=20, verbose=1, 
                   callbacks=callbacks,  validation_data=validation_generator, shuffle=True)

好的,谢谢,我来试试