人脸口罩检测GUI系统(基于opencv和深度学习两种方法对比)

由于疫情的影响,人脸口罩检测系统的开发成为很多人争相开发的一种算法。很多公司或者个人都开源了他们很多的代码或者SDK。大家在GitHub或者各种平台上都能够找到很多的资源。
前段时间在博客上看到几个有趣的开源项目,它能检测我们是否有戴口罩,跑起程序测试后,发现识别率挺高的,也适应不同环境;于是分享给大家。我用了其中两种并整合在一个GUI下面,一种是基于深度学习的,一种是基于opencv训练的。

测试环境

windows10 系统;
软件:pyCharm;
使用模型:tenforflow1.15.0 ;
python3.7

下面先看一下整个系统的GUI界面:

GUI程序:

from tkinter import *
from tkinter.filedialog import askdirectory
from tkinter.messagebox import showinfo
import cv2
import numpy as np
from PIL import Image, ImageTk
from tkinter import ttk
import pygame
import timeimport tensorflow_infer as flowfile_slogan = r'video/slogan.mp3'
file_slogan_short = r'video/slogan_short.mp3'
pygame.mixer.init(frequency=16000, size=-16, channels=2, buffer=4096)detector = cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
mask_detector = cv2.CascadeClassifier('xml\\cascade.xml')class GUI:def __init__(self):self.camera = None   # 摄像头self.root = Tk()self.root.title('maskdetection')self.root.geometry('%dx%d' % (800, 600))self.createFirstPage()mainloop()def createFirstPage(self):self.page1 = Frame(self.root)self.page1.pack()Label(self.page1, text='欢迎使用口罩检测跟踪系统', font=('粗体', 20)).pack()image = Image.open("demo2.jpg") # 随便使用一张图片做背景界面 不要太大photo = ImageTk.PhotoImage(image = image)self.data1 = Label(self.page1,  width=780,image = photo)self.data1.image = photoself.data1.pack(padx=5, pady=5)self.button11 = Button(self.page1, width=18, height=2, text="深度学习算法", bg='red', font=("宋", 12),relief='raise',command = self.createSecondPage1)self.button11.pack(side=LEFT, padx=25, pady = 10)self.button12 = Button(self.page1, width=18, height=2, text="传统算法", bg='green', font=("宋", 12),relief='raise', command = self.createSecondPage)self.button12.pack(side=LEFT, padx=25, pady = 10)self.button13 = Button(self.page1, width=18, height=2, text="打开本地视频", bg='white', font=("宋", 12), relief='raise',command = self.select_path)self.button13.pack(side=LEFT, padx=25, pady = 10)self.button14 = Button(self.page1, width=18, height=2, text="退出系统", bg='gray', font=("宋", 12),relief='raise',command = self.quitMain)self.button14.pack(side=LEFT, padx=25, pady = 10)def createSecondPage1(self):self.camera = cv2.VideoCapture(0)self.page1.pack_forget()self.page2 = Frame(self.root)self.page2.pack()Label(self.page2, text='欢迎使用口罩检测跟踪系统', font=('粗体', 20)).pack()self.data2 = Label(self.page2)self.data2.pack(padx=5, pady=5)self.button21 = Button(self.page2, width=18, height=2, text="返回", bg='gray', font=("宋", 12),relief='raise',command = self.backFirst)self.button21.pack(padx=25,pady = 10)self.video_loop1(self.data2)def video_loop1(self, panela):def slogan_short():timeplay = 1.5global playflag_shortplayflag_short = 1while playflag_short:track = pygame.mixer.music.load(file_slogan_short)print("------------请您戴好口罩")pygame.mixer.music.play()time.sleep(timeplay)playflag_short = 0time.sleep(0)success, img = self.camera.read()  # 从摄像头读取照片if success:img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)num,c,img = flow.inference(img, conf_thresh=0.5, iou_thresh=0.4, target_shape=(260, 260), draw_result=True,show_result=False)# 语音提示# if(isinstance(num/5,int)& (c=='NoMask')):# slogan_short()# cv2.imshow('image', img)# img = flow.inference(img, show_result=True, target_shape=(260, 260))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  # 转换颜色从BGR到RGBAcurrent_image = Image.fromarray(cv2image)  # 将图像转换成Image对象imgtk = ImageTk.PhotoImage(image=current_image)panela.imgtk = imgtkpanela.config(image=imgtk)self.root.after(1, lambda: self.video_loop1(panela))def select_path(self):self.pash_= askdirectory()path = StringVar()path.set(self.pash_)def createSecondPage(self):self.camera = cv2.VideoCapture(0)self.page1.pack_forget()self.page2 = Frame(self.root)self.page2.pack()Label(self.page2, text='欢迎使用口罩检测跟踪系统', font=('粗体', 20)).pack()self.data2 = Label(self.page2)self.data2.pack(padx=5, pady=5)self.button21 = Button(self.page2, width=18, height=2, text="返回", bg='gray', font=("宋", 12),relief='raise',command = self.backFirst)self.button21.pack(padx=25,pady = 10)self.video_loop(self.data2)def video_loop(self, panela):success, img = self.camera.read()  # 从摄像头读取照片if success:faces = detector.detectMultiScale(img, 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(img, 1.1, 5)for (x2, y2, w2, h2) in mask_face:cv2.putText(img, 'mask', (x2 - 2, y2 - 2),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255))cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 255), 2)#img = mask.facesdetecter(img)cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  # 转换颜色从BGR到RGBA#faces = detector.detectMultiScale(cv2image, 1.1, 3)current_image = Image.fromarray(cv2image)  # 将图像转换成Image对象imgtk = ImageTk.PhotoImage(image=current_image)panela.imgtk = imgtkpanela.config(image=imgtk)self.root.after(1, lambda: self.video_loop(panela))def backFirst(self):self.page2.pack_forget()self.page1.pack()# 释放摄像头资源self.camera.release()cv2.destroyAllWindows()def backMain(self):self.root.geometry('900x600')self.page3.pack_forget()self.page1.pack()def quitMain(self):sys.exit(0)if __name__ == '__main__':demo = GUI()

1.深度学习的效果:

检测出胡歌没有带口罩。红色框框是圈出人脸部分,上方的字体:NoMask ,准确率 1 (即有100%把握认为没带口罩)

如果在多人的情况下,能检测出来吗?

这个模型能同时检测多人的,并且准确高。以上是基于照片的。

下面是基于GUI打开摄像头的,有无口罩的对比:

这个深度学习的项目完全开源,可以自己先到网页上去体验一波:

https://demo.aizoo.com/face-mask-detection.html

深度学习开源项目简单介绍:

1)支持5大主流深度学习框架(PyTorch、TensorFlow、MXNet、Keras和Caffe),已经写好接口了;可以根据自身的环境选择合适的框架,比如:TensorFlow;所有模型都在models文件夹下。

2)公开了进8000张的人脸口罩数据和模型,数据集来自于WIDER Face和MAFA数据集, 重新修改了标注并进行了校验(主要是 MAFA和WIDER Face的人脸位置定义不一样,所以进行了修改标注)并将其开源出来。

另外如果自己想要利用tensorflow训练自己的图片数据集,可参考下面这个博客:

https://blog.csdn.net/jesmine_gu/article/details/81155787

2.基于Opencv的口罩佩戴识别

我是完全参照下面这位博主的训练方法训练的。

附上地址 : 基于Opencv的口罩佩戴识别系统

:这个方法只能检测有口罩的,无口罩就没法检测,不给任何提示或者标注。

看看有口罩的效果:

演示视频视频好像还不支持。故这里不放演示视频了。需要这两种方法完整的源代码都可以去下面的地址找到:

1.深度学习
2.基于Opencv的口罩佩戴识别系统

然后本人整合两种方法有GUI界面的源代码已经放到网盘,有需要的朋友自取:

链接:https://pan.baidu.com/s/1ChGprBpvb2xm7nL4wkNtOA(有效链接 )

提取码:ogq5

python实现人脸口罩检测(基于opencv和深度学习两种方法)相关推荐

  1. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  2. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  3. 【技术综述】基于弱监督深度学习的图像分割方法综述​

    文章首发于微信公众号<有三AI> [技术综述]基于弱监督深度学习的图像分割方法综述​ 本文是基于弱监督的深度学习的图像分割方法的综述,阐述了弱监督方法的原理以及相对于全监督方法的优势,首发 ...

  4. python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  5. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  6. Python进阶之使用Scrapy实现自动登录Github的两种方法(POST,FormRequest,from_response)

    Python进阶之使用Scrapy实现自动登录Github的两种方法 1. 通过.FormRequest()实现登录github github1.py 2. 通过.FormRequest.from_r ...

  7. Python实现人脸口罩检测!这玩意太强大了啊!

    由于疫情的影响,人脸口罩检测系统的开发成为很多人争相开发的一种算法.很多公司或者个人都开源了他们很多的代码或者SDK.大家在GitHub或者各种平台上都能够找到很多的资源. 前段时间在博客上看到几个有 ...

  8. 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)

    导读 本文主要介绍如何使用OpenCV和PaddleHub实现一个实时人脸口罩检测系统.(公众号:OpenCV与AI深度学习) 背景介绍 从19年疫情爆发到现在,佩戴口罩对大家来说已是常态.应运而生的 ...

  9. 「技术综述」基于弱监督深度学习的图像分割方法综述

    https://www.toutiao.com/a6713527528251720200/ 本文是基于弱监督的深度学习的图像分割方法的综述,阐述了弱监督方法的原理以及相对于全监督方法的优势. 作者 | ...

最新文章

  1. 软键盘挡住WebView中输入框解决方法
  2. python爬取aspx数据
  3. PeleeNet 测试
  4. JEPLUS之简单流程创建——JEPLUS软件快速开发平台
  5. golang经典书籍--go并发编程
  6. 集成平台集群任务动态分派
  7. [Docker]Docker拉取,上传镜像到Harbor仓库
  8. 传统form表单提交方式的文件上传与文件存储
  9. 阿里云发布首个流式存储与播放解决方案
  10. Foobar2000是一款完全可定制的音乐播放器
  11. springboot农机装备生产车间物料配送车辆调度管理系统毕业设计源码181710
  12. 17. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据
  13. vue手写上一页下一页
  14. 消防应急疏散指示系统在某居民社区综合体项目的应用
  15. java 类加载器的理解及加载机制?
  16. 笨方法学Python(二)
  17. VR垃圾分类游戏的“入门”场景|广州华锐互动
  18. 【leetcode慢速刷题记录】1. 两数之和
  19. windows server 安装显示 sufficient privileges to install
  20. 爱心网页浪漫,博主司机搞事情啦,附百度网盘源码自取哦

热门文章

  1. 迪文串口屏(T5L2 DGUS II)开发 -- 入门
  2. 推荐算法(3):利用用户标签数据
  3. 客户端渲染(CSR)和服务端渲染(SSR)差别
  4. centos 64位linux系统下安装appt(只有32位)命令的apktool工具包的笔记
  5. Android 来电监听
  6. vsc 如何编译c语言,FW:win下轻量级的c语言开发环境配置:vsc + gcc
  7. 丑小鸭到白天鹅的蜕变—棋牌游戏
  8. 微信小程序中weui的正确打开方式
  9. 【财务分析】从老板的角度制定财务分析报表
  10. 浅谈vue2与vue3的区别