2020年新冠肺炎席卷全球,新型冠状病毒可以通过呼吸道飞沫等方式传播,正确佩戴口罩可以有效切断新冠肺炎病毒的传播途径,是预防感染的有效措施。国内公众场合要求佩戴口罩。而商场、餐饮、地铁等人员密集型的场所对人流量高峰时段的应对措施往往令人力不从心,会消耗大量的人力资源且容易漏检,因此实现口罩人脸检测与识别能够自动检测是否佩戴口罩,减少防疫工作人员工作量。人脸识别核验身份,抓拍的数据可对接公安平台,进行人员布控和人员聚集管控,也适用于公安抓捕遮挡面部的逃犯等安防场景。
针对该问题,本系统是在复杂场景下的口罩佩戴检测算法,可以自动准确且快速地识别图片或视频中人物是否佩戴口罩,有着重要的应用场景和市场前景。
卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
传统的卷积网络在一个前向过程中每层只有一个连接,ResNet 增加了残差连接从而增加了信息从一层到下一层的流动。FractalNets 重复组合几个有不同卷积块数量的并行层序列,增加名义上的深度,却保持着网络前向传播短的路径。相类似的操作还有 Stochastic depth 和 Highway Networks 等。
这些模型都显示一个共有的特征,缩短前面层与后面层的路径,其主要的目的都是为了增加不同层之间的信息流动。
传统 L 层的网络仅有 L 个连接,在 DenseNet 中使用了 L(L+1)/2 个连接。这样做有几个明显的优点:避免了梯度消失问题,加强了特征传播,实现特征复用(feature reuse),以及实质上减少了参数量。
基于2018年百度收录于国际计算机视觉会议ECCV的论文PyramidBox研发,可以在人流密集的公共场景检测海量人脸的同时,将佩戴口罩和未佩戴口罩的人脸快速识别标注。基于此预训练模型,开发者仅需使用少量自有数据,便可快速完成自有场景的模型开发。
口罩人脸检测及分类模型,由两个功能单元组成,可以分别完成口罩人脸的检测和口罩人脸的分类。经测试,模型的人脸检测算法基于faceboxes的主干网络加入了超过10万张口罩人脸数据训练,可在准确率98%的情况下,召回率显著提升30%。而人脸口罩判断模型可实现对人脸是否佩戴口罩的判定,口罩判别准确率达到96.5%,满足常规口罩检测需求。开发者基于自有场景数据还可进行二次模型优化,可进一步提升模型准确率和召回率。
新模型采用了超过十万张图片的训练数据,确保样本量足够且有效。对于实际场景中的光照、口罩遮挡、表情变化、尺度变化等问题,模型具有鲁棒性,并且能够在多种不同端、云设备上实时检测,在落地过程中做到真正实用。
目前,百度提供了两个预训练模型,即服务器端口罩人脸检测及分类模型「pyramidbox_lite_server_mask」、以及移动端口罩人脸检测及分类模型「pyramidbox_lite_mobile_mask」,这两者能满足各种下游任务。
腾讯在人脸检测方面,基于优图开源的DSFD人脸检测算法,针对戴口罩场景下的五官遮挡,腾讯优图在模型设计上进行局部特征增强,提升可见区域权重。同时针对口罩种类丰富、佩戴位置多样等问题,在数据增强方面设计相应策略,提升模型鲁棒性。目前,口罩场景下的人脸检测算法准确率超过99%,召回率超过98%。
在人脸配准(关键点定位)方面,为解决口罩带来的面部区域大范围遮挡问题,基于优图自研的多分支轻量神经网络,优图快速通过图像编辑技术合成海量人脸口罩数据用于算法优化提升,实现戴口罩人员的精准五官定位,有效辅助后续算法模块的效果提升。
在口罩属性识别方面,目前优图算法可精细识别以下五种情形:未佩戴口罩、错误佩戴口罩且遮挡嘴部、错误佩戴口罩且遮挡下巴、错误佩戴口罩未遮挡面部、正确佩戴口罩。该属性识别基于优图开源的FAN属性识别,并针对口罩可能分布的人脸位置,加入更多的attention机制,可精准识别人脸是否正确佩戴。目前,对有无口罩佩戴的识别准确率超过99%。
在戴口罩人脸识别方面,优图提供了一套灵活兼具安全与便利的算法解决方案。利用优图人脸质量模型对被口罩遮挡的人脸进行口罩遮挡判断以及遮挡区域提取两类分析。其中,口罩遮挡判断目前已达99.5%以上准确率。
CNN 由许多神经网络层组成。卷积和池化这两种不同类型的层通常是交替的。网络中每个滤波器的深度从左到右增加。最后通常由一个或多个全连接的层组成。
如果想保留图像中的空间信息,那么用像素矩阵表示每个图像是很方便的。然后,编码局部结构的简单方法是将相邻输入神经元的子矩阵连接成属于下一层的单隐藏层神经元。这个单隐藏层神经元代表一个局部感受野。请注意,此操作名为“卷积”,此类网络也因此而得名。
假设想要从原始像素表示中获得移除与输入图像中位置信息无关的相同特征的能力。一个简单的直觉就是对隐藏层中的所有神经元使用相同的权重和偏置。通过这种方式,每层将从图像中学习到独立于位置信息的潜在特征。理解卷积的一个简单方法是考虑作用于矩阵的滑动窗函数。在下面的例子中,给定输入矩阵 I 和核 K,得到卷积输出。将 3×3 核 K(有时称为滤波器或特征检测器)与输入矩阵逐元素地相乘以得到输出卷积矩阵中的一个元素。
假设我们要总结一个特征映射的输出。我们可以使用从单个特征映射产生的输出的空间邻接性,并将子矩阵的值聚合成单个输出值,从而合成地描述与该物理区域相关联的含义。
多个层链接在一起组成了网络,将输入数据映射为预测值。然后损失函数将这些预测值与目标进行比较,得到损失值,用于衡量网络预测值与预期结果的匹配程度。优化器使用这个损失值来更新网络的权重。
神经网络的基本数据结构是层。层是一个数据处理模块,将一个或多个输入张量转换为一个或多个输出张量。
基本结构:输入层、隐藏层、输出层。 图2.1中,最左边的层称为输入层,用于数据输入;最右边的层称为输出层,用于预测结果输出。输出层的节点数目是根本实际问题的要求而设定的。 输入层和输出层之间,是逻辑推理层,从用户角度而言是不可见的,因此被称为隐藏层。图2.1的神经网络只含有一个隐藏层,图2.2的网络含有两个隐藏层。在设计神经网络时,隐藏层的层数一般跟问题的复杂度成正比。即,解决复杂的问题,需要更多的隐藏层。
在神经网络中,神经元是一个包含输入、计算和输出功能的模型。图3展示了一个典型的神经元模型,包含了3个输入,1个输出和2个运算。箭头线表示神经元之间的“连接”,每个连接上都有1个权重值。 一个神经网络的训练算法就是让权重调整到最佳,以使得网络的预测或分类效果最好。
卷积神经网络主要是用于计算机视觉领域,它指的是一类网络,而不是某一种,其包含很多不同种结构的网络。不同的网络结构通常表现会不一样。
一个简单的卷积神经网络是由各种层按照顺序排列组成,网络中的每个层使用一个可微分的函数将数据从一层传递到下一层。卷积神经网络主要由三种类型的层构成:卷积层,池化层和全连接层。通过将这些层叠加起来,就可以构建一个完整的卷积神经网络。
卷积层是卷积神经网络的核心,每个卷积层由多个卷积核组成。当输入图像经过卷积核时,每个通道的图像会与每个卷积核进行卷积操作。前一层的特征图与一个可学习的卷积核进行卷积运算,卷积的结果经过激活函数后的输出形成这一层的神经元,从而构成该层特征图,也称特征提取层,每个神经元的输入与前一层的局部感受野相连接,并提取该局部的特征,一旦该局部特征被提取,它与特征之间的位置关系就被确定。
进行卷积运算时,运算结果取决于卷积核覆盖的区域,这个区域之外的输入值都不会影响输出值,该区域就是感受野。随着图像数据的下采样,感受野会变大。
假设有一个 5×5 的特征图(共 25 个方块)。其中只有 9 个方块可以作为中心放入一个 3×3 的窗口,这 9 个方块形成一个 3×3 的网格(见图 5-5)。因此,输出特征图的尺寸是 3×3。 它比输入尺寸小了一点,在本例中沿着每个维度都正好缩小了 2 个方块。在前一个例子中你也 可以看到这种边界效应的作用:开始的输入尺寸为 28×28,经过第一个卷积层之后尺寸变为 26×26,如图2.6所示:
如果希望输出特征图的空间维度与输入相同,那么可以使用填充(padding)。填充是在 输入特征图的每一边添加适当数目的行和列,使得每个输入方块都能作为卷积窗口的中心。对 于 3×3 的窗口,在左右各添加一列,在上下各添加一行。对于 5×5 的窗口,各添加两行和两列(见图 2.7)。
引入非线性激活函数的主要目的是增加神经网络的非线性性。因为如果没有非线性激活函数的话,每一层输出都是上层输入的线性函数,因此,无论神经网络有多少层,得到的输出都是线性函数,这就是原始的感知机模型,这种线性性不利于发挥神经网络的优势。
常用的非线所示。目前比较常用的有ReLu和LReLu,Logistic(Sigmoid)单元由于其饱和区特性导致整个网络梯度消失而逐渐退出历史舞台(有的时候最后一层会用Sigmoid将输出限制在0.0-1.0)。
通常,在连续的卷积层之间会周期性地插入一个池化层。对卷积层学习到的特征图进行下采样(subsampling)处理,它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
B.平均池化:Avg Pooling,取窗口内的所有值的均值作为输出,倾向于保留突出背景特征
池化的结果使得网络参数减少,感受野变大,从而能够获得更全局的特征;同时,为模型提供了一定的缩放、平移和旋转不变性。
所谓全连接层即是传统的神经网络,每一个神经单元都和上一层所有的神经单元密集连接。如今,全连接层由于其巨大的参数量易过拟合以及不符合人类对图像的局部感知原理,一般不参与图像的特征提取(已由卷积层替代),只用于最后的线性分类, 相当于在提取的高层特征向量上进行线性组合并且输出最后的预测结果。全连接层存在的问题是参数冗余(仅全连接层参数就可占整个网络参数80%左右),降低了训练的速度,容易过拟合。
训练集使用Prajan Bhandary在Github上开源提供的口罩数据集,这个数据集包括大约1376幅图像,其中690幅包含戴口罩的人,686幅图像包含没有戴口罩的人。
验证集使用Prajan Bhandary在Github上开源提供的口罩数据集,这个数据集包括大约563幅图像,其中282幅包含戴口罩的人,281幅图像包含没有戴口罩的人。
(2)数据预处理:使用Kearas中提供的ImageDataGenerator类实现对图片的预处理操作,包括数据增强(旋转、扭曲、翻转、归一化等)、生成一个批次一个批次的图片,以生成器的形式给模型训练。再使用ImageDataGenerator类中的flow_from_directory函数实现对图片数据的读取和处理,以及图片标签的生成、该方法以训练图片文件夹为路径,生成经过数据增强/归一化的数据,在一个无限循环中生成无限产生batch数据供给模型进行训练。
b.对每张图片构建数据标签,对于口罩检测,人未戴口罩标记为without_mask,人戴口罩标记为with_mask。
c.将数据集分为训练集和验证集,一般比例为3:1。为了防止过拟合,需要在训练集上训练,之后在验证集测试,当训练集和验证集最终表现差不多。