竞赛 基于机器视觉的行人口罩佩戴检测

2023-09-15 17:16:52
简介

2020新冠爆发以来,疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研发出了带有AI人脸检测算法的红外测温、口罩佩戴检测等设备,依图、阿里也研发出了通过深度学习来自动诊断新冠肺炎的医疗算法。

🔥 优质竞赛项目系列,今天要分享的是

图像口罩识别

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

效果展示

不多说, 先上效果
在这里插入图片描述
在这里插入图片描述

实现方法
模型介绍

在深度学习时代之前,人脸检测一般采用传统的、基于手动设计特征的方法,其中最知名的莫过于Viola-
Jones算法,至今部分手机和数码相机内置的人脸检测算法,仍旧采用Viola-
Jones算法。然而,随着深度学习技术的蓬勃发展,基于深度学习的人脸检测算法逐步取代了传统的计算机视觉算法。

在人脸检测最常用的数据集——WIDER Face数据集的评估结果上来看,使用深度学习的模型在准确率和召回率上极大的超过了传统算法。下图的青线是Viola-
Jones的Precision-Recall图。
在这里插入图片描述

下图是众多基于深度学习的人脸检测算法的性能评估PR曲线。可以看到基于深度学习的人脸检测算法的性能,大幅超过了VJ算法(曲线越靠右越好)。近两年来,人脸检测算法在WIDER
Face的简单测试集(easy 部分)上可以达到95%召回率下,准确率也高达90%,作为对比,VJ算法在40%召回率下,准确率只有75%左右。
在这里插入图片描述

其实,基于深度学习的人脸检测算法,多数都是基于深度学习目标检测算法进行的改进,或者说是把通用的目标检测模型,为适应人脸检测任务而进行的特定配置。而众多的目标检测模型(Faster
RCNN、SSD、YOLO)中,人脸检测算法最常用的是SSD算法,例如知名的SSH模型、S3FD模型、RetinaFace算法,都是受SSD算法的启发,或者基于SSD进行的任务定制化改进,
例如将定位层提到更靠前的位置,Anchor大小调整、Anchor标签分配规则的调整,在SSD基础上加入FPN等。

在我个人看来,SSD是最优雅、简洁的目标检测模型,因此,我们实现的人脸口罩检测模型,也是采用SSD的思想,限于篇幅原因

在本项目中,我们使用的是SSD架构的人脸检测算法,相比于普通的人脸检测模型只有人脸一个类别,而人脸口罩检测,只不过是增加了一个类别,变成戴口罩人脸和不戴口罩的人脸两个类别而已。

我们开源的模型是一个非常小的模型,输入是260x260大小,主干网络只有8层,有五个定位和分类层,一共只有28个卷积层。而每个卷积层的通道数,是32、64、128这三种,所有这个模型总的参数量只有101.5万个参数。下图是网络的结构图。
在这里插入图片描述

其中,上面八个卷积层是主干网络,也就是特征提取层,下面20层是定位和分类层(注意,为了方便显示,我们没有画出BN层)。

训练目标检测模型,最重要的合理的设置anchor的大小和宽高比,笔者个人在做项目时,一般会统计数据集的目标物体的宽高比和大小来设置anchor的大小和宽高比。例如,在我们标注的口罩人脸数据集上,我们读取了所有人脸的标注信息,并计算每个人脸高度与宽度的比值,统计得到高度与宽比的分布直方图,如下:
在这里插入图片描述

因为人脸的一般是长方形的,而很多图片是比较宽的,例如16:9的图片,人脸的宽度和高度归一化后,有很多图片的高度是宽度的2倍甚至更大。从上图也可以看出,归一化后的人脸高宽比集中在1~2.5之间。所以,根据数据的分布,我们将五个定位层的anchor的宽高比统一设置为1,0.62,
0.42。(转换为高宽比,也就是约1,1.6:1,2.4:1)

五个定位层的配置信息如下表所示:

在这里插入图片描述

笔者使用基于Keras实现的目标检测微框架训练的人脸口罩检测模型,为了避免一些网友提到的使用手挡住嘴巴就会欺骗部分口罩检测系统的情况,我们在数据集中加入了部分嘴巴被手捂住的数据,另外,我们还在训练的过程中,随机的往嘴巴部分粘贴一些其他物体的图片,从而避免模型认为只要露出嘴巴的就是没戴口罩,没露出嘴巴的就是带口罩这个问题,通过这两个规避方法,我们很好的解决了这个问题,大家可以在aizoo.com体验我们的模型效果。

后处理部分主要就是非最大抑制(NMS),我们使用了单类的NMS,也就是戴口罩人脸和不戴口罩人脸两个类别一起做NMS,从而提高速度。

获取数据集

人脸口罩数据集下载

下载人脸口罩数据集的目的是利用OpenCV进行模型训练,这里采用口罩数据集的正负比列为1:3,即500张戴口罩的人脸图片和1500张不戴口罩的人脸图片。

数据集获取:联系博主获取

解压之后,将压缩包中的mask文件自行选择文件夹放置,以便之后的操作。

如下:
在这里插入图片描述

上面带口罩的人脸图像我们命名为正样本,相反,没带口罩的数据集合命名为负样本, 如下:

在这里插入图片描述
由于数据集解压后样本图像命名是乱序的,我们要进行重命名,上面两幅图是已经处理好的, 下面给出示例代码



    #对数据集重命名
    #coding:utf-8
    import os
    path = "E:\\facemask\\mask\\have_mask" #人脸口罩数据集正样本的路径
    filelist = os.listdir(path)
    count=1000 #开始文件名1000.jpg
    for file in filelist:   
        Olddir=os.path.join(path,file)  
        if os.path.isdir(Olddir):  
            continue
        filename=os.path.splitext(file)[0]   
        filetype=os.path.splitext(file)[1]
     
        Newdir=os.path.join(path,str(count)+filetype)  
        os.rename(Olddir,Newdir)
        count+=1


    #对数据集重命名
    #coding:utf-8
    import os
    path = "E:\\facemask\\mask\\no_mask" #人脸口罩数据集的路径
    filelist = os.listdir(path)
    count=10000 #开始文件名1000.jpg
    for file in filelist:   
        Olddir=os.path.join(path,file)  
        if os.path.isdir(Olddir):  
            continue
        filename=os.path.splitext(file)[0]   
        filetype=os.path.splitext(file)[1]
     
        Newdir=os.path.join(path,str(count)+filetype)  
        os.rename(Olddir,Newdir)
        count+=1

最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

更多推荐

Docker文档阅读笔记-How to Commit Changes to a Docker Image with Examples

介绍在工作中使用Docker镜像和容器,用得最多的就是如何提交修改过的Docker镜像。当提交修改后,就会在原有的镜像上创建一个新的镜像。本博文说明如何提交一个新的Docker镜像。前提①有一个可以直接访问服务器的运行终端;②帐号需要root权限;③已经安装并且配置好了docker手把手教提交修改后的Docker镜像s

【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理

Godot4.1因为我在游戏中发现,越运行游戏变得越来越卡,当你使用Node节点中的print_orphan_nodes()方法打印信息的时候,会出现如下的孤儿节点信息孤儿节点信息是以节点实例ID-StrayNode:节点名称(Type:节点类型)作为格式输出,可以多运行几次查看是否节点实例ID是否是相同的,通常不是随

LeNet-5

目录一、知识点二、代码三、查看卷积层的featuremap1.查看每层信息​2.show_featureMap.py背景:LeNet-5是一个经典的CNN,由YannLeCun在1998年提出,旨在解决手写数字识别问题。一、知识点1.iter()+next()iter():返回迭代器next():使用next()来获取

【Python】json 格式转换 ② ( Json 格式简介 | Json 概念 | Json 功能 | 对象 / 数组 格式 | 嵌套格式 | Json 特点 )

文章目录一、Json格式简介1、Json概念2、Json功能3、Json格式-对象/数组格式4、Json格式-对象/数组嵌套格式5、Json特点一、Json格式简介1、Json概念Json的英文全称为"JavaScriptObjectNotation",JavaScript对象符号;Json是轻量级数据交换格式;Jso

【Python】json 格式转换 ① ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )

文章目录一、json格式转换1、json模块使用2、代码示例分析-列表转json3、代码示例分析-字典转jsonjson格式字符串与Python中的字典dict和列表list变量可以无缝转换;调用json.dumps函数可以将Python列表/字典转为json;调用json.loads函数,可以将json转为pytho

SQL 性能优化总结

文章目录一、性能优化策略二、索引创建规则三、查询优化总结一、性能优化策略1.SQL语句中IN包含的值不应过多MySQL将IN中的常量全部存储在一个排好序的数组里面,但是如果数值较多,产生的消耗也是比较大的。所以对于连续的数值,能用between就不要用in。2.SELECT语句务必指明字段名称SELECT*增加很多不必

长胜证券:开盘竞价买卖技巧?

开盘竞价是股票生意进程中的一个重要环节,对于出资者来说,怎么在这个短暂的时间内下单买入或卖出股票,成为了检测出资者生意技巧的重要挑战。一、认识开盘竞价开盘竞价是指在股票商场开盘前,一切买进卖出单据的价格在必定的时间内进行比较,最终构成当日股票开盘价的进程。开盘竞价辅导股票在当天的生意价格,也是股票价格走势的一个重要起点

Docker 容器数据卷

是什么卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFileSystem提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。一句话:有点类似我们Redis里面的

外星人入侵游戏-(创新版)

🌈writeinfront🌈🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.🆔本文由Aileen_0v0🧸原创CSDN首发🐒如需转载还请通知⚠️📝个人主页:Aileen_0v0🧸—CSDN博客🎁欢迎各位→点赞👍+收藏⭐️+留言📝​📣系列专栏:Aileen

chatgpt综述和报告

ChatGPT究竟强在哪?复旦大学邱锡鹏教授《大型语言模型的能力分析与应用》_哔哩哔哩_bilibili2022年底,美国OpenA1公司发布了ChatGPT,一个可以与人类对话交互的千亿规模参数的大型语言模型。它可以根据用户输入的指令完成各种语言相关的任务,例如写文章、写代码、回答问题、日常聊天等等,能够极大地提高人

kubeadm搭建k8s高可用集群(keepalived+nginx+3master)

目录前言服务器准备架构讲解环境初始化安装keepalived软件安装nginx软件初始化k8s节点安装docker初始化master01节点的控制面板master02、master03节点加入集群node01、node02节点加入集群检查集群配置docker和kubectl命令补全创建应用验证集群功能验证master节

热文推荐