教大家单手撸一个7层的卷积神经网络口罩检测模型

点击上方码农的后花园”,选择星标” 公众号

精选文章,第一时间送达

这里手把手教大家,从数据集图像的预处理开始,然后搭建一个7层的浅层的CNN模型,使用Tensorflow和OpenCV单手撸一个卷积神经CNN网络口罩检测模型,浅层的卷积神经网络模型也可以有很好的检测效果哦。

文章目录

一、数据集准备和预处理

二、搭建口罩检测卷积神经网络CNN模型

三、训练并保存口罩检测模型

四、导入人脸检测程序Cascade Classifier检测人脸

五、加载口罩检测模型,预测是否佩戴口罩

一、数据集准备和预处理

数据集: 使用Prajna Bhandary在Github上开源提供的口罩数据集,这个数据集包括大约1376幅图像,其中690幅包含戴口罩的人,686幅图像包含没有戴口罩的人。

数据预处理

使用Kearas中提供的ImageDataGenerator类实现对图片的预处理操作,包括数据增强(旋转、扭曲、翻转、归一化等)、生成一个批次一个批次的图片,以生成器的形式给模型训练。

再使用ImageDataGenerator类中的flow_from_directory函数实现对图片数据的读取和处理,以及图片标签的生成、该方法以训练图片文件夹为路径,生成经过数据增强/归一化的数据,在一个无限循环中生成无限产生batch数据供给模型进行训练,具体代码如下:

print("The number of images with facemask labelled 'yes':",len(os.listdir(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\train\with_mask')))
print("The number of images with facemask labelled 'no':",len(os.listdir(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\train\without_mask')))

运行结果如下:

二、搭建口罩检测卷积神经网络CNN模型

为了检测是否佩戴口罩,搭建一个7层:Conv2D->MaxPooling2D->Conv2D->Maxpooling2D->Flatten->Dense->Dense的顺序浅层CNN模型用来预测,这个模型实际上就是实现二分类,佩戴口罩with_maskwithout_mask,使用的损失函数是二元交叉熵损失binary_crossentropy,网络结构图如下:

创建模型:

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(100, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2,2),


    tf.keras.layers.Conv2D(100, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),


    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(50, activation='relu'),
    tf.keras.layers.Dense(2, activation='softmax')
])


print(model.summary())

模型结构网络如下:

三、训练并保存口罩检测模型

训练之前我们需要对模型进行一些简单的配置:优化器、损失函数的定义、以及训练过程记录的回调函数checkpoint,训练完之后使用keras自带的model.save()方法以h5文件格式将模型结构完整保存下来。

#编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['mse','acc'])
#模型训练记录
checkpoint = ModelCheckpoint('model-{epoch:03d}.model',monitor='val_loss',verbose=0,save_best_only=True,mode='auto')
#训练模型
history = model.fit_generator(train_generator,
                              epochs=8,
                              # validation_data=validation_generator,
                              callbacks=[checkpoint])
#模型保存
model.save(filepath=r'D:\Project\OpenCV\06_Face-Mask-Detection-master\mask_model.h5') #保存模型到那个文件路径

训练结果如下:


绘制最终训练损失和准确率变化曲线图:

#模型训练结果展示
print(history.history.keys())
# loss
plt.plot(history.epoch,history.history.get('loss'),color='green',label = 'loss')
# acc
plt.plot(history.epoch,history.history.get('acc'),color='red',label = 'acc')
plt.legend()
plt.show()

变化曲线图如下,我们可以看到准确率在上升,但是缓慢,损失值在下降,有坡度,说明模型还可以进一步优化,比如加深网络或者增加数据集的多样性。

导入人脸检测程序Cascade Classifier检测人脸

在检测是否佩戴口罩之前,首先我们需要实现人脸检测,这里使用OpenCV内置的基于Haar特征的级联分类器->CascadeClassifier来检测人脸的特征。

CascadeClassifier:是opencv下目标检测模块中用来检测目标的级联分类器的一个类,简单来说就是采用滑动窗口机制+级联分类器的形式,级联分类器包括:训练和检测,这里直接使用训练好的去检测人脸classifier.detectMultiScale方法。

# We load the xml fileclassifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 载入图像img_eye = cv2.imread(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\without_mask\1.jpg')# 利用分类器进行检测eyeRects = classifier.detectMultiScale(img_eye, 1.2, 2, cv2.CASCADE_DO_CANNY_PRUNING, (20, 20))# 检测结果if len(eyeRects) > 0:    counter = 0for eyeRect in eyeRects:        counter += 1        x, y, w, h = eyeRect        cv2.rectangle(img_eye, (int(x), int(y)), (int(x + w), int(y + h)), (0, 255, 0), 2, 8)cv2.imshow('eye', img_eye)cv2.waitKey()

检测结果如下:

五、加载口罩检测模型,预测是否佩戴口罩

检测到人脸区域之后,再使用keras自带的load_model方法加载我们已经训练好了的口罩检测模型,具体代码见detect.py,检测结果如下:

#加载模型
mask_model = tf.keras.models.load_model(filepath=r'D:\Project\OpenCV\06_Face-Mask-Detection-master\mask_model.h5') #要加载模型的路径


#导入人脸检测程序
face_clsfr=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')


# 标记信息
labels_dict={0:'without_mask',1:'with_mask'}
color_dict={0:(0,0,255),1:(0,255,0)}

检测图如下:

六、代码下载和环境设置

完整代码下载,回复:项目实战,即可获取数据集和源代码,本机环境设置如下:

  • python==3.6

  • tensorflow-gpu==1.13.1

  • keras==2.1.5

更多优质内容?等你点在看

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值