COVID-19:具有OpenCV,Keras / TensorFlow和深度学习的面罩检测器

在本教程中,你将学习如何使用OpenCV,Keras / TensorFlow和Deep Learning训练COVID-19面罩检测器。

以下内容由公众号:AIRX社区(国内领先的AI、AR、VR技术学习与交流平台) 整理

在使用Keras和TensorFlow的数据集上训练一个面罩检测器,然后使用这个Python脚训练口罩检测器并检查结果。

  • 在图像中检测COVID-19口罩

  • 检测实时视频流中的口罩

具体的实现过程主要分成两个阶段:

为了训练一个自定义口罩检测器,我们需要将我们的项目分为两个不同的阶段,每个阶段都有其各自的子步骤(如上图所示):

  • 培训:这里我们主要从磁盘加载口罩检测数据集,在该数据集上培训一个模型(使用Keras/TensorFlow),然后将口罩检测器序列化到磁盘

  • 部署:一旦口罩检测器接受了训练,我们就可以加载口罩检测器,执行人脸检测,然后将每个脸分类为with_mask或without_mask

我们的COVID-19面罩检测数据集,此数据集包含1,376张图像,类别:

  • with_mask:690张图片

  • without_mask:686张图片

 

数据集下载链接:

面部标志可以让我们自动推断出面部结构的位置,包括:眼睛、眉毛、鼻子、口、颚线。要使用面部标志构建戴着口罩的面部数据集,我们首先需要从不戴着口罩的人的图像开始:

我们应用面部检测(opencv)来计算图像中面部的边界框位置:

使用OpenCV和NumPy切片提取面部ROI:

然后,我们使用dlib 检测面部标志(能够定位眼睛,鼻子,嘴巴等)以便我们知道将遮罩放置在脸上哪里:

接下来,我们需要一张带有透明背景的蒙版图像,例如以下图像,COVID-19 冠状病毒面罩/护罩的示例。由于我们知道面部标志位置,因此该面罩将自动覆盖在原始面部ROI上:

 

然后调整面罩的大小并旋转,将其放在脸上:

然后,我们可以对所有输入图像重复此过程,从而创建人造面罩数据集:

涵盖如何使用ROI将蒙版应用于面部的方法不在本教程的讨论范围之内,但是,如果你想了解更多信息,可以查看:

https://github.com/prajnasb/observations/tree/master/mask_classifier/Data_Generator

项目结构

下载文件之后的目录结构如下:

$ tree --dirsfirst --filelimit 10.├── dataset│   ├── with_mask [690 entries]│   └── without_mask [686 entries]├── examples│   ├── example_01.png│   ├── example_02.png│   └── example_03.png├── face_detector│   ├── deploy.prototxt│   └── res10_300x300_ssd_iter_140000.caffemodel├── detect_mask_image.py├── detect_mask_video.py├── mask_detector.model├── plot.png└── train_mask_detector.py5 directories, 10 files

数据集/目录包含“COVID-19口罩检测数据集”的数据。提供了三个图像示例,以便你可以测试静态图像口罩检测器。在本教程中,我们将使用三个Python脚本:

  • train_mask_detector.py:接受我们的输入数据集并对MobileNetV2进行微调,以创建我们的mask_detector.model。同时制作了包含精度/损失曲线的训练历史图。

  • detect_mask_image.py:使用静态图像中执行口罩检测

  • detect_mask_video.py:使用camera流

训练脚本

接下来使用Keras和TensorFlow训练分类器,以自动检测一个人是否戴着口罩。打开 train_mask_detector.py 文件并插入以下代码:​​​​​​​

# import the necessary packagesfrom tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.applications import MobileNetV2from tensorflow.keras.layers import AveragePooling2Dfrom tensorflow.keras.layers import Dropoutfrom tensorflow.keras.layers import Flattenfrom tensorflow.keras.layers import Densefrom tensorflow.keras.layers import Inputfrom tensorflow.keras.models import Modelfrom tensorflow.keras.optimizers import Adamfrom tensorflow.keras.applications.mobilenet_v2 import preprocess_inputfrom tensorflow.keras.preprocessing.image import img_to_arrayfrom tensorflow.keras.preprocessing.image import load_imgfrom tensorflow.keras.utils import to_categoricalfrom sklearn.preprocessing import LabelBinarizerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom imutils import pathsimport matplotlib.pyplot as pltimport numpy as npimport argparseimport os

上述import的目的主要是:

  • 数据增加

  • 加载MobilNetV2分类器(我们将使用预先训练的ImageNet权重对该模型进行微调)

  • 预处理

  • 加载图像数据

我们使用scikit-learn (sklearn)对类标签进行二值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值