【问题标题】:Python- Mask Detection Nerual Network using Keras [closed]Python- 使用 Keras 的面具检测神经网络 [关闭]
【发布时间】:2020-09-04 19:42:34
【问题描述】:

所以这是我第一次真正尝试使用 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)

用这个我预测imgs:

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))

【问题讨论】:

    标签: python tensorflow machine-learning keras neural-network


    【解决方案1】:

    您可以做很多事情。如果您想使用现有模型,那么我建议您使用 keras 回调 ReduceLROnPlateau 和 ModelCheckpoint。第一个使您能够使用可调节的学习率。设置它以监控验证丢失。下面的代码显示了一个典型的用法,如果验证损失未能在一个 epoch 上减少,则学习率会降低 50%。这允许您最初使用更大的学习率,并在以后的 epoch 中自动降低。第二个使您能够以最低的验证损失保存模型。典型应用如下面的代码所示。这些回调的文档是here. 训练后加载此模型进行预测。如果您想获得更好的结果,我建议您尝试迁移学习。许多模型都可通过文档here. 获得,我更喜欢使用 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)
    

    【讨论】:

    • 好的,谢谢,我试试
    猜你喜欢
    • 2017-11-21
    • 2018-11-01
    • 2011-01-10
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多