资讯详情

使用TensorFlow和OpenCV实现口罩检测

点击上方“”,选择加""或“

重磅干货,第一时间送达

在这场艰难的疫情中,我们决定建立一个非常简单和基本的卷积神经网络(CNN)模型,使用TensorFlow与Keras库和OpenCV检查人们是否戴口罩。

4716604e444caf4a261096996486c3e8.png

图片来源于澳门图片社

为了建立这个模型,我们将使用它Prajna Bhandary 提供的口罩数据集。该数据集包括大约1376张图像,其中690张图像包括戴口罩的人,686张图像包括没有戴口罩的人。

基于这些图像悬链,我们将使用一个TensorFlow框架的CNN模型,然后通过电脑端的网络摄像头检测人们是否戴口罩。另外,我们也可以用手机相机做同样的事情。

首先,我们需要标记两类数据集中的所有图像。这里有690张图像,‘yes类别,也就是戴口罩的类别;有686张图像在‘no类别,也就是没有口罩的类别。

The number of images with facemask labelled 'yes': 690 The number of images with facemask labelled 'no': 686

在这里,我们需要加强我们的数据集,为训练提供更多的图像。当数据增强时,我们旋转和翻转数据集中的每个图像。数据增强后,我们有2751个图像,其中yes’类中有1380幅图像,‘no类中有1371幅图像。

Number of examples: 2751 Percentage of positive examples: 50.163576881134134%, number of pos examples: 1380 Percentage of negative examples: 49.836423118865866%, number of neg examples: 1371

我们将我们的数据分为训练集和测试集,包括即将到来的训练集CNN模型训练的图像集中在我们的模型测试中。

在这里,我们取split_size=0.8.这意味着80%的图像将进入训练集,其余20%的图像将进入测试集。

The number of images with facemask in the training set labelled 'yes': 1104 The number of images with facemask in the test set labelled 'yes': 276 The number of images without facemask in the training set labelled 'no': 1096 The number of images without facemask in the test set labelled 'no': 275

分割后,我们看到图像已经按分割的百分比分配给训练集和测试集。

在这一步中,我们将使用它Conv2D,MaxPooling2D,Flatten,Dropout和Dense等各层建设顺序CNN模型。最后一个Dense在层层中,我们使用‘softmax函数输出一个向量,给出两个类中每个类的概率。

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')     ])     model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

我们在这里使用它 ‘adam’ 优化器和‘binary_crossentropy’ 作为我们的损失函数,因为只有两类。此外,它甚至可以使用MobileNetV获得更高的精度。

构建我们的模型后,我们创建了train_generator”和“validation_generator为了在下一步与我们的模型相匹配。 训练中有2200幅图像,测试中有551幅图像。

Found 2200 images belonging to 2 classes. Found 551 images belonging to 2 classes.

这一步是主要步骤。我们使用训练集中的图像来训练我们的模型,并使用测试集中的数据来测试我们的训练结果并给出准确性。我们迭代了30次,以下是我们训练的输出结果。同时,我们可以训练更多的迭代来获得更高的精度,以避免拟合。

history = model.fit_generator(train_generator,                               epochs=30,                               validation_data=validation_generator,                               callbacks=[checkpoint])>>Epoch 30/30 220/220 [==============================] - 231s 1s/step - loss: 0.0368 - acc: 0.9886 - val_loss: 0.1072 - val_acc: 0.9619

我们可以看到,在第30个时期之后,我们模型中训练集的精度是98.测试集的精度为96%.19%。 这意味着训练结果很好,没有过度拟合。

建立模型后,我们为结果标记了两个概率

[‘0’作为‘without_mask’作为‘和1’,作为‘和1’with_mask我们还用RGB边界矩形颜色设置值。 [‘RED’代表‘without_mask’和‘GREEN’代表‘with_mask]

labels_dict={0:'without_mask',1:'with_mask'} color_dict={0:(0,0,255),1:(0,255,0)}

之后,我们计划使用它PC用网络摄像头检测我们是否戴口罩。因此,首先需要实现人脸检测。在这里,我们使用它Haar检测人脸特征的级联分类器。

face_clsfr=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

这种级联分类器是由OpenCV通过训练数千幅图像来检测正面的人脸。代码中需要的.xml可在微信官方账号后台回复口罩检测获取文件。

在最后一步,我们通过OpenCV库运行无限循环程序,使用我们的网络摄像头,我们使用它Cascade Classifier检测人脸。代码是webcam = cv2.VideoCapture(0)表示使用网络摄像头。

该模型将预测两类中每一类的可能性([without_mask, with_mask])。标签将根据概率选择并显示在我们脸的区域。

此外,手机和手机也可以下载PC的DroidCam 使用我们的移动应用程序相机,并将代码中的0改为1 webcam= cv2.VideoCapture(1).

测试:

我们来看一下测试的结果

从上面的演示视频中,我们看到模型能够正确地检测是否佩戴面具并在标签上显示相同的内容。

如果小伙伴需要本文的相关代码和文件,可以在公众号后台回复【】获得。

在「」公众号后台回复:即可下载全网第一份OpenCV扩展模块教程中文版,涵盖等二十多章内容。

在「」公众号后台回复:即可下载包括等31个视觉实战项目,助力快速学校计算机视觉。

在「」公众号后台回复:即可下载含有个基于实现20个,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。在群内发送广告,否则会请出群,谢谢理解~

标签: 自动化口罩机传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司