基于帧间差分法的口罩佩戴检测算法研究
2022-11-29付莲莲丁鑫圣王映龙
付莲莲,丁鑫圣,王映龙
(江西农业大学计算机与信息工程学院,江西南昌 330045)
1 引言
自2020年2月来,新冠肺炎病毒在全球爆发,确诊病例已过亿,死亡人数超过二百余万。造成如今的严重现象,完全是群众不按照国家指示,不佩戴口罩,在公众场合人群繁杂等复杂环境下不仅会对自己而且对他人也会造成极大的风险隐患。
国内百度公司为了早日战胜疫情,通过了一项为了集人类智慧和方案,将“口罩人脸识别”预训练模型免费提供给社会的决定。百度这模型不仅解决了复杂环境识别困难的同时,还可对多人进行检测,并且能将具体的人是否佩戴口罩进行提醒。还有一些文章将YOLO算法改进,加入了注意力机制,优化了神经网络和损失函数,也较好地实现了口罩识别,但需要提前训练模型,有一定的误判率,且对计算机的要求较高,资源消耗也较大,对微小型设备不适用[1]。美国的研究团队则提出了一种在手术室特定环境下,简易地识别医生是否佩戴口罩的算法,但是有一定的几率会将假人脸佩戴口罩视为真人佩戴口罩,在实际应用中容易以假乱真,逃避检测,这也表明此方法欠佳[3]。按照国内外的研究现状,百度的方法简单直接,输入待预测数据,加载预训练模型,调用module的相应预测API,完成预测功能。并且可移植性很强,对于一些运算力低的设备也能很好地适配;国外的研究团体同时对于两个面部检测器进行预测,面部和口罩,此方法运算量较大,移植性未知,鲁棒性亦不足。
上述方法为佩戴口罩识别提供了思路和技术支持,但也存在有待进一步完善的地方。首先部分方法识别过程复杂,需要提前训练模型,参数过多,存在大量冗余数据,导致程序任务处理量繁重,识别速度缓慢;其次特征提取难把控,识别率较低,有较大的误判率,鲁棒性较差。为此,提出一种基于帧间差分法的口罩佩戴检测算法。通过对输入图像进行高斯降噪、灰度处理、二值化、膨胀与腐蚀,大幅减少数据的处理量,加快计算速度,根据前背景的动静态差异,利用帧间差分法分离出前景,使得集中于脸部。根据皮肤与口罩的色调有较大的差异的特点,利用OpenCV识别出眼部和口部,对两区域的肤色通道单独提取,并统计两区域的肤色面积,进行比较,并引入霍夫直线检测对参数空间转换辅助检测,得出结果。相比其它方法,此算法简洁高效,资源消耗少,识别效率更高,鲁棒性更佳。流程由图1可知。
图1 算法流程图
2 图像预处理
将电脑的摄像头对图形进行采集,为了解决电脑前置摄像头成像素质不高的问题,必须将噪点消除,使图像更易处理,文章采用以下方法进行图像预处理,减少程序的计算量,加快识别速度。
2.1 高斯滤波
一般分布在物体边缘的噪声多为高频,过滤掉高频信号,达到去除高频噪声和平滑边缘的目的。文章采用高斯滤波,其在通常情况下可对图像的平滑,也可以对图像进行模糊处理。高斯低通滤波是指只允许低频率的信号通过,过滤中高频率的信号。以二维高斯滤波为例,由式(1)可知。
(1)
经过公式的运算,各点得到不同的权重。由图2可知。高斯滤波的原理为将图像上周围八个点的像素值通过加权平均的方式计算出像素值,用计算出的像素值去代替该点的像素值。然后去遍历每一个像素点,依次得到新的像素值[4]。
图2 坐标经公式计算后的权重
2.2 灰度处理
将图像灰度处理,图像的数据量大幅减少,可提高运算速度。将图像中彩色的RGB三个通道转换为一个通道,即令这三个彩色分量相等,则变成了灰色。转换为一个通道后,且各点都有了0-255的灰度值。
2.3 二值化
将上文得到的像素值,自定义某一阈值,如果灰度值大于该阈值,则该像素点重置为255,即为黑色;如果灰度值小于该阈值,则重置为0,即为白色。文章采用的是60,如果灰度值大于60,则该像素点重置为黑色;如果灰度值小于60重置为白色。由式(2)可知,其中x为该点的像素值。
(2)
2.4 膨胀与腐蚀
膨胀,将原图像上的相距较近的物体融合;结构图像在图像边缘进行遍历,原图像与结构图像部分重合时,该部分的黑块保留;不重合的部分涂黑;得到额外的黑块。
腐蚀,将原图像上的相距相近的物体区分。当锚点在图像上时,原图像与结构图像完全重合时,保留该点黑块;不完全重合的部分,舍去该点黑块。
2.5 边缘检测
采用边缘检测,确定好边缘,对前后背景的差分提供便利,一般有以下步骤。非极大值抑制,查找图像的强度梯度,获得像素点的梯度大小和方向。如果是非极大值,则抑制。如果不是,则继续遍历。如此去除不构成边缘的像素。去除多余的像素点,对实时处理能力有一定的增强,也减少了瞬时的存储量。但有一定的几率去除真正的边缘。因为图像中的边缘可指向任何方向,所以边缘检测可返回水平和垂直方向的导数,便可计算出像素点的梯度大小和方向。由式(3)、(4)可知。
(3)
θ=arctan(Gy/Gx)
(4)
其中G代表梯度强度,θ代表梯度方向。以Sobel算子为例,简易地实现该过程。在以下的例子中,Sx代表x方向的Sobel算子,用于检测y方向的边缘;Sy代表y方向的Sobel算子,用于检测x方向的边缘。图像出现一个3X3的窗口为A,设要计算中心点e的梯度大小和方向,则应该与Sobel算子进行卷积。
经过非极大值抑制步骤后,可能会误将真正的边缘去除。应用磁滞阈值这一步骤则是为了防止误操作,决定真正的边缘。首先设定两个阈值,最小阈值和最大阈值。强度梯度大于最大阈值的边缘一定是边缘,保留。而小于最小阈值的边缘必定是假边缘,将其去除。而处于中间值的像素,如果它们与已确定的边缘像素有接触,则视为边缘像素。反之,则视之为非边缘。从图3可看出,A边缘的强度梯度大于最大阈值,认定为边缘。而处于两阈值中间的C边缘,因为与A边缘有接触,则也认定为边缘。但是同处于中间的B点,因未和任意边缘有接触,视为非边缘。此方法的好处是避免中间点误判为边缘的情况,确定真正的边缘。
图3 双阈值检测
3 帧间差分法
通过帧间差分法,差分连续两帧获得运动目标区域。当图像序列中出现运动目标时,背景静止,前景运动,两帧之间出现较明显的变化。两帧做差得到差分图像,差分图像再通过设定的阈值进行判断,进行图像二值化,确定图像序列中有无运动目标[5]。通过式(5)可知,第k帧图像PK(x,y)和第k-1帧图像PK-1(x,y)相减,得到差分图像EK(x,y)。
Ek(x,y)=|Pk(x,y)-Pk-1(x,y)|
(5)
然后根据式(6)对差分图像EK(x,y)的像素值与给定的阈值比较,对差分图像二值化。其中T为给定阈值,1代表运动目标区域,0代表背景区域。
(6)
由式(6)可知,大于T为前景,反之,为背景。
4 人脸检测
算法采用了OpenCV分类器,将人脸和非人脸进行分类[9]。利用了OpenCV库提供的基于Haar特征的Adaboost的训练文件,对脸部各个重点部位的进行检测。
Haar分类器算法有以下步骤:
1)Haar-like特征模板对人脸拟合;
2)利用积分图对此部位进行计算;
3)通过Adaboost算法对真人脸和假人脸训练,反复训练出两极分化的分类器;
4)将一个强分类器视为判定条件,多个强分类器组合,可提高识别率。
Haar-like特征一般分为三类:边缘特征、线性特征、对角线特征。特征模板内有黑白矩形,这两种矩形模拟人脸肤色的深浅。设定该模板的特征值为白色矩形像素和与黑色矩形像素和相减。使用的积分图计算法,比起传统方法,每遍历一次,都需要计算矩形的像素值的繁琐过程,积分图计算法只需计算一次,减少了重复计算过程,减轻了程序的负担,进一步加快了算法识别速度。
该模型采用的结构是树型结构,把每一个分类器当作树的一个分支,当检测个体时,将脸部分为不同的特征,分别计数。把不同的特征送入不同的分类器,例如特征1送入下一分支检测判断,符合标准,再将特征2送入下一分支检测判断,如果其中有一个特征不符合,则拒绝检测,判定识别失败。由图4可知。
图4 级联分类器
每一个强分类器的构成都是通过级联的方式,由数个弱分类器组建的。由图5可知。而整个Haar分类器则是通过多个强分类器的级联组建的。
图5 强弱分类器关系图
由于人类皮肤的色调和口罩的色调差异较大,通过HSV中的H(色调)通道提取肤色,再定位到眼部和口部,分别检测眼部和口部并计算这两部分在这一范围的肤色面积,比较大小。如果眼部区域的肤色面积大于口部的肤色面积,则视为佩戴口罩;反之,则视为未佩戴口罩。
考虑到异物遮挡口部,此时眼部肤色面积依然大于口部肤色面积,导致算法依然识别为佩戴口罩。为避免此误判,特此加入了霍夫直线检测,重点检测口罩带,如此可大幅减少误判的几率。
由图6可看出,在同一条直线的三个点(X1,Y1)、(p,q)、(X2,Y2)。
图6 示意图
在此将极坐标作为参数空间,所以:
(p,q)=(rcosθ,rsinθ)
原直线与x轴的夹角为90+θ,则其斜率为:
(7)
设直线上的任意一点为(x,y),则斜率为:
(8)
由上面(7-8)两式可得:r=xcosθ+ysinθ。
同理:r=x1cosθ+y1sinθ,r=x2cosθ+y2sinθ
依上述推导可知,参数空间采用极坐标系,参数空间的每个点都对应了图像空间的一条直线,这样就可以在参数空间表示原始空间的所有直线。霍夫直线检测就是把图像空间中的直线变换到参数空间中的点,通过统计特性解决检测问题。一幅图像中的像素构成一条直线,那么这些像素坐标值(x,y)在参数空间对应的曲线一定相交于一个点,只需要将图像中的所有像素点变换成参数空间的曲线,并在参数空间检测曲线交点可确定直线。由图7、8可知。
图7 直角坐标示例图
根据上述推导,将二维三个点转换为以极坐标的霍夫空间的曲线。
r1=cosθ
r2=3cosθ+3sinθ
r3=5cosθ+6sinθ
经过上述的转换,三个点在霍夫空间的交点如图8所示。
图8 霍夫空间转换图
5 性能测试与分析
经测试,该算法识别率较高,且识别速度较快,基本做到了无感识别。测试效果对比,由图9、10可看出。其中No Mask代表未佩戴口罩,Have Mask代表佩戴口罩。
图9 未佩戴口罩 图10 佩戴口罩
此外,文章还测试了帧间差分算法对光照和年龄的依赖性。为测试该算法在不同光照环境的性能,分别选择中午和傍晚两个光照条件相差较大的时间段,实验表明在良好的光照条件下,可达到较高的识别率,识别速度较快。但在昏暗的条件下,识别效果略微下降。由表1所示。
表1 不同光照条件下性能表现
另外挑选不同年龄层的人,测试算法的性能,实验表明算法对任何人群都适用,识别率和识别速度没有受到年龄对脸部的影响,依然符合要求。由表2所示。
表2 不同年龄层性能表现
以上实验,分别测试10次,得到统计结,再计算平均值。综上可知,帧间差分算法对光照有依赖性,光照好的环境下,识别率和识别速度较快;算法的识别率和速度不随着年龄的变化而改变。
6 结论
文章提出基于帧间差分法的口罩佩戴检测算法,经过一系列预处理后,减少大量冗余的计算数据,再利用背景的静态不变性差分连续两帧提取前景,解决前背景分离难的问题,通过OpenCV提供的基于Haar特征的Adaboost的训练文件,利用决策树和级联器识别出眼部和口部,并根据色调差异,提取色调单一通道,计算区域内处于肤色色调范围的面积,辅以霍夫直线检测加强鲁棒性,完成口罩检测。实验结果表明,①帧间差分法分离前景成功率高,Haar特征选取准确,使得所提方法识别率较高,在光照条件良好下识别率可达100%,识别速度快,仅需0.3s;②经高斯降噪、灰度处理后,即使在弱光条件下,主要性能指标依旧良好,未出现明显下降,识别率可达90%,识别速度仅下降0.1s,算法的性能指标对年龄无依赖性;③算法设计不复杂,计算便捷,适用于微型计算机,适配性和移植性良好;④应用场景广,人流量大的场景尤佳,更具实用价值。