推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

基于Opencv的口罩佩戴识别系统

   2023-08-15 网络整理佚名1120
核心提示:人脸识别技术已经非常普及啦,现在戴口罩的脸支付宝也可以识别,据报道阿里现在正在尝试主导人脸识别技术的某些标准。不过非常遗憾没有口罩人脸识别,不然就非常简单了。因此我们就需要自己去训练构造出一个这样的人脸口罩xml模型。不然就不会有那么多公司自主研发自己的人脸识别技术了。下面使用训练出来的xml来进行戴口罩人脸识别!

疫情之下,有的人选择负重前行,有的人则在年假和工作期间毅然选择后者。 感谢“疫”路上有你们,祝祖国繁荣昌盛、国家和人民!

人脸识别技术已经非常流行,现在支付宝也可以识别戴口罩的人脸了。 据报道,阿里现在正试图主导人脸识别技术的某些标准。 在业务上,大多数企业会选择国内AI巨头,如百度智能云、阿里智能云、华为云、腾讯云等。 这些平台的AI解决方案可以说代表了中国AI的最高水平。 那么我们是否可以不使用他们提供的技术来进行相关开发呢? 我的答案是肯定的! 不吹、不黑,其效果适合精度要求不高的场景,满足一般需求。 当然,这些巨头公司是无法相提并论的!

特殊时期,在一些场合,比如药店、菜市场,都有无私的工作人员提醒戴口罩、测量体温。 那么戴口罩是否可以交给电脑来完成呢? 我们只需要一台电脑和一台相机。 当然,现实情况比这复杂得多,需要考虑很多非技术因素。 今天我们只使用开源社区的计算机视觉库从这个技术层面来解决。

所以我的想法是这样的:

按照上述步骤来实现,分为以下几个阶段:

环境建设:

所需环境:-,.0版本

安装参考零与现有博客相同

打开相机并检测人脸:

导入的是cv2,直接调用即可完成前三步:原理其实很简单,如果运行下面的代码,可以发现其实只是一个循环,不断读取相机的每一帧,然后进行灰度处理,然后进行人脸检测。 图片之所以能识别人脸,就是因为有这样一个文件。 xml 这个模型描述文件非常重要。 这是自带的人脸识别模型文件。 当然,还附带了其他的xml文件,比如笑脸识别等。 、猫脸识别、眼睛识别等,如果需要这个文件,可以下载下来,然后复制到项目中。 但可惜的是没有口罩人脸识别,不然就很简单了。 因此,我们需要自己训练构建这样一个口罩xml模型。

import cv2
#识别人脸的xml文件,构建人脸检测器
detector= cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
#获取0号摄像头的实例
cap = cv2.VideoCapture(0)
while True:
    # 就是从摄像头获取到图像,这个函数返回了两个变量,第一个为布尔值表示成功与否,以及第二个是图像。
    ret, img = cap.read()
    转为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #获取人脸坐标
    faces = detector.detectMultiScale(gray, 1.1, 3)
    for (x, y, w, h) in faces:
        #参数分别为 图片、左上角坐标,右下角坐标,颜色,厚度
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv2.imshow('Cheney', img)
    cv2.waitKey(3)
cap.release()
cv2.destroyAllWindows()

训练分类器:

需要明确的是,它是开源的,每个人都可以免费使用它。 这意味着它的准确度不够高,鲁棒性较差。 否则,也不会有这么多公司独立开发自己的人脸识别技术。 当学生用就够了。 要知道这是一本很厚的书,读起来需要花费很大的力气。 我们目前研究的只是它的应用而不是原理。 如果想深究原理的话,那就难受多了。 这可能是硕士学位与硕士学位的区别。 如果这个理解有偏差,还请指正!

数据预处理:

首先,我们要获取带口罩的照片和不带口罩的人脸照片。 我们将带口罩的图片视为正样本,不带口罩的图片视为负样本。 先来看看我收集到的样本吧! 左边是戴口罩的照片,右边是不戴口罩的照片。 我发现一个现象。 收集到的戴口罩的照片基本都是女性,这可能与喜欢自拍有关。 我还没研究过哈哈本来想直接用下面的图片来训练,但是觉得不太准确,而且噪声样本的影响很大。 我可能必须清理数据以确保准确性。 想要照片的同学可以在这里下载!

第一步:将所有照片的命名统计放入Excel表格中,方便每张照片的循环、读取和处理。 操作方法是:打开cmd,cd到所有照片的父目录,然后输入以下命令:

dir /b/s/p/w *.jpg > pos.txt

我的所有照片都放在文件夹 1 下,我这样做:

然后到1文件夹下,你会发现这样一段txt文本,里面记录了这个文件夹下的所有文件名,复制到Excel中,就可以读取里面的文件路径了。 如下所示:

步骤2:我们不能直接拍摄这些戴着口罩的照片进行训练,因为整张照片中人脸与口罩的比例很小。 其他部位如手、肩膀等的动作都是噪音,我们不需要用它们来训练。 不仅会增加CPU的计算量,还会对模型产生干扰。 我们只需要把戴口罩的人脸剪下来,因为识别人脸时存在一些错误,需要我们手动删除不合格的口罩人脸的灰度图像。 正样本:只包含被检测物体的样本,与边界的距离应尽可能小,并且图像大小应相同。 负样本:不包含待检测物体的样本,对图像的大小没有要求。 切割的时候顺便进行一下灰度处理。 如下:

以下是反例,照片是为了学习交流,没有任何盈利目的,所以我认为不构成侵权,但是如果你给我发律师函,我会立即删除,真的! 因为我胆小! 公民享有肖像权,未经公民同意,不得以营利为目的使用公民肖像。 “构成侵犯公民肖像权的行为通常有两个要件:一是未经本人同意;二是将他人肖像用于商业广告、产品装潢、书籍封面、印刷挂历等。有点牵强!

import pandas as pd
import cv2
names=pd.read_excel('data\\imgName.xlsx')['names']# 读取所有照片名字
i=100000 #用于重新命名
for imagepath in names:
    #读取图片
    img = cv2.imread(imagepath)
    #转成灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #人脸识别器
    detector = cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
    #获取人脸位置
    faces = detector.detectMultiScale(gray, 1.1, 5)
    for (x, y, w, h) in faces:
        #裁减图片
        gray = gray[y:y+h,x:x+w]  # 裁剪坐标为[y0:y1, x0:x1]
        #如果人脸不为空
        try:
            # 保存裁减后的灰度图
            cv2.imwrite('Q:\\GraduationProject\\mask\\gray1\\'+str(i)+'.jpg', gray)
            # cv2.waitKey(3000)
            i += 1
        except:
            print()

第三步:使正样本所有照片像素一致(必须一致)。 这里使用50X50的像素,负样本的像素必须大于50X50。

import pandas as pd
import cv2
for n in range(100000,100352):
    path='Q:\\GraduationProject\\mask\\gray1_2\\'+str(n)+'.jpg'
    # 读取图片
    img = cv2.imread(path)
    img=cv2.resize(img,(50,50))
    cv2.imwrite('Q:\\GraduationProject\\mask\\gray1_2\\' + str(n) + '.jpg', img)
    n += 1

并在pos.txt文件中添加1 0 0 50 50(全部替换)如下图:这里1表示当前图片重复次数为1,0 0 50 50表示目标图片大小是一个从 (0, 0) 到 (50, 50) 的矩形框。 负样本只需要第一列路径,不需要后者! (没错,我后来改成了20X20,因为官方推荐是20X20)

以下部分内容是参考.3版本训练自己的物体分类器训练分类器_刘彦林.的博客-CSDN博客 此文,告知侵删!

步骤4:获取vec文件进行训练。 首先介绍一下我们的主角.exe,它位于\build\x64\vc14\bin下,它用于创建示例描述文件,后缀为.vec。 是专门为训练准备的,只需要正样本,不需要负样本。 .exe:是一个内置工具,封装了haar特征提取LBP和HOG特征分类器。 旧版本有 .exe,我们今天不使用它。

一般来说,正负样本比例为1:3时训练效果较好,但也不是绝对的。 由于每个样本的变异性和其他因素,不存在绝对的比例关系。 但是负样本需要比正样本多,因为原则上负样本的多样性越大越好,这样我们才能有效的降低误检率,而不是仅仅通过正样本的训练这样就可以了识别物体。 在这次训练中,我选择了350个正样本和1100个负样本,都是灰度图像。

创建正样本vec文件

训练时需要输入的正样本是vec文件,因此需要使用程序将正样本转换为vec文件。完成上述工作后,进入主角中的\build\x64\vc14\bin。 exe目录下,将pos.txt和neg.txt复制到该目录下:然后cmd进入该目录

opencv_createsamples.exe -vec pos.vec -info pos.txt -num 353 -w 20 -h 20

阐明:

-info,指样本描述文件

-vec,样本描述文件的名称和路径

-num,一共有多少个样本,需要注意的是,这里的样本数是指确定后20x20的样本数,而不是大图的个数,其实是里面所有数字的累加示例描述文件的第二列

-w -h 指定您希望将样本缩放到的大小。

如图:获取pos.vec文件

训练样本新建文件.bat

.exe -data xml -vec pos.vec -bg neg.txt - 500 - 656 - 20 -w 20 -h 20 -模式全部

暂停

复制进去保存,将pos.txt和neg.txt改回如图格式(注意:这一步很重要)并新建一个xml文件夹!

运行 .bat 并等待获取 xml 文件:

如果有错误,请参考该博主的博客!

HR是命中率(理解为模型猜对的概率!),FA是误报率(就是误报率?理解为模型猜错的概率)。 命中率越高,误报率越低。 这个模型比较好,但是也应该考虑泛化吗? 懂的朋友请赐教,只有当每层训练的FA低于你命令中声明的值时,才会进入下一层训练。 前10层速度比较快,后面10层就很慢了。 但心情却很开心,就像看着自己精心养大的小宝宝即将长大一样,哈哈哈哈哈哈哈哈哈。 小骄傲!

误报率已达标,无需再培训! 接下来,使用训练好的xml来识别戴口罩的人脸!

最后的效果还不错。 不戴口罩根本无法识别。 佩戴口罩需要在强光下进行识别,否则效果不太好。 毕竟只用了330个阳性样本。 找个时间运行 1000 个样本。 300份阳性样本运行了近两个小时,过程中出现了几次中断。 总体来说效果达到了预期,以后会尝试训练一千个以上的正样本。

import cv2
detector= cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
mask_detector=cv2.CascadeClassifier('data\\cascade.xml')
cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.1, 3)
    for (x, y, w, h) in faces:
        #参数分别为 图片、左上角坐标,右下角坐标,颜色,厚度
        face=img[y:y+h,x:x+w]  # 裁剪坐标为[y0:y1, x0:x1]
        mask_face=mask_detector.detectMultiScale(gray, 1.1, 5)
        for (x2,y2,w2,h2) in mask_face:
            cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 255), 2)
    cv2.imshow('Cheney', img)
    cv2.waitKey(3)
cap.release()
cv2.destroyAllWindows()

附上用完的.xml 文件! 最后,感谢所有负重前行的追梦人,加油!

后来发现摘掉眼镜后识别准确率大大提高了,吓死我了! 原因是泛化能力太强,因为正样本中没有戴眼镜的图片,所有后期改进都要适当添加到戴眼镜和口罩的图片上。 那么负样本要泛化,不仅是脸,还包括身体。 然后增加训练次数。 这个模型应该会取得非常好的效果。

附两张对比照片:

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON