无所遁形——快把你的口罩戴上(口罩识别)

举报
nimo的小舔狗 发表于 2022/05/11 00:59:59 2022/05/11
【摘要】         人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。  &nbsp...

        人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。

        疫情当下,学校封校,教室上网课,食堂就餐等等环境,口罩佩戴依旧十分有意义,单靠人员监测效率太过低下,笔者就在考虑能否让计算机完成相关工作,就查阅了相关资料,在开源训练集的基础上,设计了本款口罩识别。

图片: 

视频: 

口罩识别案例

配置环境: 

windows10 系统

pyCharm

Anaconda环境下的python3.7

tenforflow1.15.0

cuda10.0

整体流程:

        相信小伙伴们已经迫不及待了,上代码走起!


  
  
  1. from tkinter import *
  2. from tkinter.filedialog import askdirectory
  3. from tkinter.messagebox import showinfo
  4. import cv2
  5. import numpy as np
  6. from PIL import Image, ImageTk
  7. from tkinter import ttk
  8. import pygame
  9. import time
  10. import tensorflow_infer as flow
  11. pygame.mixer.init(frequency=16000, size=-16, channels=2, buffer=4096)
  12. detector = cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
  13. mask_detector = cv2.CascadeClassifier('xml\\cascade.xml')
  14. class GUI:
  15. def __init__(self):
  16. self.camera = None # 摄像头
  17. self.root = Tk()
  18. self.root.title('maskdetection')
  19. self.root.geometry('%dx%d' % (800, 600))
  20. self.createFirstPage()
  21. mainloop()
  22. def createFirstPage(self):
  23. self.page1 = Frame(self.root)
  24. self.page1.pack()
  25. Label(self.page1, text='口罩追踪系统', font=('粗体', 20)).pack()
  26. image = Image.open("14.jpg") # 随便使用一张图片做背景界面 不要太大
  27. photo = ImageTk.PhotoImage(image = image)
  28. self.data1 = Label(self.page1, width=780,image = photo)
  29. self.data1.image = photo
  30. self.data1.pack(padx=5, pady=5)
  31. self.button11 = Button(self.page1, width=18, height=2, text="深度学习算法", bg='red', font=("宋", 12),
  32. relief='raise',command = self.createSecondPage1)
  33. self.button11.pack(side=LEFT, padx=25, pady = 10)
  34. self.button13.pack(side=LEFT, padx=25, pady = 10)
  35. self.button14 = Button(self.page1, width=18, height=2, text="退出系统", bg='gray', font=("宋", 12),
  36. relief='raise',command = self.quitMain)
  37. self.button14.pack(side=LEFT, padx=25, pady = 10)
  38. def createSecondPage1(self):
  39. self.camera = cv2.VideoCapture(0)
  40. self.page1.pack_forget()
  41. self.page2 = Frame(self.root)
  42. self.page2.pack()
  43. Label(self.page2, text='实时追踪口罩佩戴情况', font=('粗体', 20)).pack()
  44. self.data2 = Label(self.page2)
  45. self.data2.pack(padx=5, pady=5)
  46. self.button21 = Button(self.page2, width=18, height=2, text="返回", bg='gray', font=("宋", 12),
  47. relief='raise',command = self.backFirst)
  48. self.button21.pack(padx=25,pady = 10)
  49. self.video_loop1(self.data2)
  50. def video_loop1(self, panela):
  51. def slogan_short():
  52. timeplay = 1.5
  53. global playflag_short
  54. playflag_short = 1
  55. while playflag_short:
  56. track = pygame.mixer.music.load(file_slogan_short)
  57. print("------------请您戴好口罩")
  58. pygame.mixer.music.play()
  59. time.sleep(timeplay)
  60. playflag_short = 0
  61. time.sleep(0)
  62. success, img = self.camera.read() # 从摄像头读取照片
  63. if success:
  64. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  65. num,c,img = flow.inference(img, conf_thresh=0.5, iou_thresh=0.4, target_shape=(260, 260), draw_result=True,
  66. show_result=False)
  67. # 语音提示
  68. # if(isinstance(num/5,int)& (c=='NoMask')):
  69. # slogan_short()
  70. # cv2.imshow('image', img)
  71. # img = flow.inference(img, show_result=True, target_shape=(260, 260))
  72. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  73. cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA) # 转换颜色从BGR到RGBA
  74. current_image = Image.fromarray(cv2image) # 将图像转换成Image对象
  75. imgtk = ImageTk.PhotoImage(image=current_image)
  76. panela.imgtk = imgtk
  77. panela.config(image=imgtk)
  78. self.root.after(1, lambda: self.video_loop1(panela))
  79. def select_path(self):
  80. self.pash_= askdirectory()
  81. path = StringVar()
  82. path.set(self.pash_)
  83. def createSecondPage(self):
  84. self.camera = cv2.VideoCapture(0)
  85. self.page1.pack_forget()
  86. self.page2 = Frame(self.root)
  87. self.page2.pack()
  88. Label(self.page2, text='实时追踪口罩佩戴情况', font=('粗体', 20)).pack()
  89. self.data2 = Label(self.page2)
  90. self.data2.pack(padx=5, pady=5)
  91. self.button21 = Button(self.page2, width=18, height=2, text="返回", bg='gray', font=("宋", 12),
  92. relief='raise',command = self.backFirst)
  93. self.button21.pack(padx=25,pady = 10)
  94. self.video_loop(self.data2)
  95. def video_loop(self, panela):
  96. success, img = self.camera.read() # 从摄像头读取照片
  97. if success:
  98. faces = detector.detectMultiScale(img, 1.1, 3)
  99. for (x, y, w, h) in faces:
  100. # 参数分别为 图片、左上角坐标,右下角坐标,颜色,厚度
  101. face = img[y:y + h, x:x + w] # 裁剪坐标为[y0:y1, x0:x1]
  102. mask_face = mask_detector.detectMultiScale(img, 1.1, 5)
  103. for (x2, y2, w2, h2) in mask_face:
  104. cv2.putText(img, 'mask', (x2 - 2, y2 - 2),
  105. cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255))
  106. cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 255), 2)
  107. #img = mask.facesdetecter(img)
  108. cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA) # 转换颜色从BGR到RGBA
  109. #faces = detector.detectMultiScale(cv2image, 1.1, 3)
  110. current_image = Image.fromarray(cv2image) # 将图像转换成Image对象
  111. imgtk = ImageTk.PhotoImage(image=current_image)
  112. panela.imgtk = imgtk
  113. panela.config(image=imgtk)
  114. self.root.after(1, lambda: self.video_loop(panela))
  115. def backFirst(self):
  116. self.page2.pack_forget()
  117. self.page1.pack()
  118. # 释放摄像头资源
  119. self.camera.release()
  120. cv2.destroyAllWindows()
  121. def backMain(self):
  122. self.root.geometry('900x600')
  123. self.page3.pack_forget()
  124. self.page1.pack()
  125. def quitMain(self):
  126. sys.exit(0)
  127. if __name__ == '__main__':
  128. demo = GUI()

插播一句,深度学习的项目目前完全开源,大家可以先体验体验:

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

        深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。 
        深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。
        深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。


  
  
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import cv2
  4. # 测试打开摄像头检测跟踪人脸
  5. # 识别人脸的xml文件,构建人脸检测器
  6. detector = cv2.CascadeClassifier('haarcascades\\haarcascade_frontalface_default.xml')
  7. # 获取0号摄像头的实例
  8. cap = cv2.VideoCapture(0)
  9. while True:
  10. # 就是从摄像头获取到图像,这个函数返回了两个变量,第一个为布尔值表示成功与否,以及第二个是图像。
  11. ret, img = cap.read()
  12. #转为灰度图
  13. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  14. # 获取人脸坐标
  15. faces = detector.detectMultiScale(gray, 1.1, 3)
  16. for (x, y, w, h) in faces:
  17. # 参数分别为 图片、左上角坐标,右下角坐标,颜色,厚度
  18. cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
  19. cv2.imshow('Mask', img)
  20. cv2.waitKey(3)
  21. cap.release()
  22. cv2.destroyAllWindows()

  
  
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # -*- coding:utf-8 -*-
  4. import cv2
  5. import time
  6. import argparse
  7. import pygame
  8. import numpy as np
  9. from PIL import Image
  10. from tensorflow.keras.models import model_from_json
  11. from utils.anchor_generator import generate_anchors
  12. from utils.anchor_decode import decode_bbox
  13. from utils.nms import single_class_non_max_suppression
  14. from load_model.tensorflow_loader import load_tf_model, tf_inference
  15. # sess, graph = load_tf_model('FaceMaskDetection-master\models\face_mask_detection.pb')
  16. sess, graph = load_tf_model('models/face_mask_detection.pb')
  17. # anchor configuration
  18. feature_map_sizes = [[33, 33], [17, 17], [9, 9], [5, 5], [3, 3]]
  19. anchor_sizes = [[0.04, 0.056], [0.08, 0.11], [0.16, 0.22], [0.32, 0.45], [0.64, 0.72]]
  20. anchor_ratios = [[1, 0.62, 0.42]] * 5
  21. file_slogan = r'video/slogan.mp3'
  22. file_slogan_short = r'video/slogan_short.mp3'
  23. pygame.mixer.init(frequency=16000, size=-16, channels=2, buffer=4096)
  24. # generate anchors
  25. anchors = generate_anchors(feature_map_sizes, anchor_sizes, anchor_ratios)
  26. # 用于推断,批大小为1,模型输出形状为[1,N,4],因此将锚点的dim扩展为[1,anchor_num,4]
  27. anchors_exp = np.expand_dims(anchors, axis=0)
  28. id2class = {0: 'Mask', 1: 'NoMask'}
  29. def inference(image, conf_thresh=0.5, iou_thresh=0.4, target_shape=(160, 160), draw_result=True, show_result=True):
  30. n = 0
  31. n = n+1
  32. ''' 检测推理的主要功能
  33.    # :param image:3D numpy图片数组
  34.    # :param conf_thresh:分类概率的最小阈值。
  35.    # :param iou_thresh:网管的IOU门限
  36.    # :param target_shape:模型输入大小。
  37.    # :param draw_result:是否将边框拖入图像。
  38.    # :param show_result:是否显示图像。
  39. '''
  40. # image = np.copy(image)
  41. output_info = []
  42. height, width, _ = image.shape
  43. image_resized = cv2.resize(image, target_shape)
  44. image_np = image_resized / 255.0 # 归一化到0~1
  45. image_exp = np.expand_dims(image_np, axis=0)
  46. y_bboxes_output, y_cls_output = tf_inference(sess, graph, image_exp)
  47. # remove the batch dimension, for batch is always 1 for inference.
  48. y_bboxes = decode_bbox(anchors_exp, y_bboxes_output)[0]
  49. y_cls = y_cls_output[0]
  50. # 为了加快速度,请执行单类NMS,而不是多类NMS。
  51. bbox_max_scores = np.max(y_cls, axis=1)
  52. bbox_max_score_classes = np.argmax(y_cls, axis=1)
  53. # keep_idx是nms之后的活动边界框。
  54. keep_idxs = single_class_non_max_suppression(y_bboxes, bbox_max_scores, conf_thresh=conf_thresh,
  55. iou_thresh=iou_thresh)
  56. for idx in keep_idxs:
  57. conf = float(bbox_max_scores[idx])
  58. class_id = bbox_max_score_classes[idx]
  59. bbox = y_bboxes[idx]
  60. # 裁剪坐标,避免该值超出图像边界。
  61. xmin = max(0, int(bbox[0] * width))
  62. ymin = max(0, int(bbox[1] * height))
  63. xmax = min(int(bbox[2] * width), width)
  64. ymax = min(int(bbox[3] * height), height)
  65. if draw_result:
  66. if class_id == 0:
  67. color = (0, 255, 0)
  68. else:
  69. color = (255, 0, 0)
  70. cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, 2)
  71. cv2.putText(image, "%s: %.2f" % (id2class[class_id], conf), (xmin + 2, ymin - 2),
  72. cv2.FONT_HERSHEY_SIMPLEX, 1, color)
  73. output_info.append([class_id, conf, xmin, ymin, xmax, ymax])
  74. if show_result:
  75. Image.fromarray(image).show()
  76. # return output_info
  77. return n,id2class,image
  78. # 读取摄像头或者本地视频路径并处理
  79. def run_on_video(video_path, output_video_name, conf_thresh):
  80. cap = cv2.VideoCapture(video_path)
  81. height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
  82. width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
  83. fps = cap.get(cv2.CAP_PROP_FPS)
  84. fourcc = cv2.VideoWriter_fourcc(*'XVID')
  85. # writer = cv2.VideoWriter(output_video_name, fourcc, int(fps), (int(width), int(height)))
  86. total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
  87. if not cap.isOpened():
  88. raise ValueError("Video open failed.")
  89. return
  90. status = True
  91. idx = 0
  92. while status:
  93. start_stamp = time.time()
  94. status, img_raw = cap.read()
  95. img_raw = cv2.cvtColor(img_raw, cv2.COLOR_BGR2RGB)
  96. read_frame_stamp = time.time()
  97. if (status):
  98. inference(img_raw,
  99. conf_thresh,
  100. iou_thresh=0.5,
  101. target_shape=(260, 260),
  102. draw_result=True,
  103. show_result=False)
  104. cv2.imshow('image', img_raw[:, :, ::-1])
  105. cv2.waitKey(1)
  106. inference_stamp = time.time()
  107. # writer.write(img_raw)
  108. write_frame_stamp = time.time()
  109. idx += 1
  110. print("%d of %d" % (idx, total_frames))
  111. print("read_frame:%f, infer time:%f, write time:%f" % (read_frame_stamp - start_stamp,
  112. inference_stamp - read_frame_stamp,
  113. write_frame_stamp - inference_stamp))
  114. # writer.release()
  115. '''
  116. if __name__ == "__main__":
  117. parser = argparse.ArgumentParser(description="Face Mask Detection")
  118. parser.add_argument('--img-mode', type=int, default=0,
  119. help='set 1 to run on image, 0 to run on video.') # 这里设置为1:检测图片;还是设置为0:视频文件(实时图像数据)检测
  120. parser.add_argument('--img-path', type=str, help='path to your image.')
  121. parser.add_argument('--video-path', type=str, default='0', help='path to your video, `0` means to use camera.')
  122. # parser.add_argument('--hdf5', type=str, help='keras hdf5 file')
  123. args = parser.parse_args()
  124. if args.img_mode:
  125. imgPath = args.img_path
  126. # img = cv2.imread("imgPath")
  127. img = cv2.imread(imgPath)
  128. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  129. inference(img, show_result=True, target_shape=(260, 260))
  130. else:
  131. video_path = args.video_path
  132. if args.video_path == '0':
  133. video_path = 0
  134. run_on_video(video_path, '', conf_thresh=0.5)
  135. '''

由于代码过多无法详细展开,如有疑问欢迎大家在评论区留言,共同探讨问题。

代码源码地址: 

基于tenforflow的口罩识别项目-Python文档类资源-CSDN下载

本项目仅供学习参考,如有侵权告知立删

文章来源: blog.csdn.net,作者:渣渣ye,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yyfloveqcw/article/details/123971056

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。