Face Mask Detection using Open CVOur motto is to detect facial mask monitoring using Open CV and Python to stop the flow of corona virus.
https://karanshah1910.hashnode.dev/face-mask-detection-using-open-cv
根據 Worldometer 匯編的資料(截至 2020 年 6 月 5 日),冠狀病毒病已蔓延到超過 213 個國家,在全球范圍內感染了超過 700 萬人并造成超過 403,202 人死亡
為了限制冠狀病毒的傳播,保持社交距離和遵守衛生標準(例如強制佩戴口罩、使用手手套、面罩和使用消毒劑)非常重要,
許多組織強制要求遵守社交距離和戴口罩,本文介紹了如何使用 OpenCV 和 Python 檢測口罩監控,
我假設您具有 OpenCV 和 Python 的基本知識,
主要有兩個步驟:
-
在輸入視頻的每一幀中識別人臉和嘴巴
-
識別人員是否使用面具
第 1 步:使用 Python 和 OpenCV 識別人臉和嘴巴進行人臉預測的步驟是:
-
使用“CascadeClassifier”函式和“haarcascade_frontalface_default.xml”創建HAAR Cascade物件
-
使用功能讀取的影像“imread”(或用于視頻“讀” /相機輸入)功能
-
使用'cvtColor'函式進行灰度轉換
-
使用“detectMultiScale”功能檢測人臉
要獲取 Open CV 如何檢測人臉的詳細資訊,請參閱使用 OpenCV 的人臉識別鏈接— OpenCV 2.4.13.7 檔案
據觀察,戴白色面具的人,大多數時候 OpenCV 無法正確識別人臉,為了克服這個困難,使用“閾值”函式轉換黑白影像,然后將此影像發送到“detectMultiScale”函式,
注意:根據相機和周圍光線在80 到 105 “閾值”范圍內調整閾值 (bw_threshold) 值很重要,
以下代碼檢測影像中人臉和嘴巴:

第 2 步:識別是否使用面具
如上代碼所示,一共有三個矩形物件:
- “灰色”影像人臉矩形,
- “黑白”影像人臉矩形,
- '灰色' 影像 嘴矩形,
添加以下代碼以在“檢測嘴巴”代碼后驗證掩碼/無掩碼,
=> 當人戴著面具時,它將顯示為檢測到面具:-

=> 當人不戴口罩時,它將顯示為未檢測到口罩:-

質量檢測標準
根據矩形的數量和矩形的嘴和臉的位置,我們可以創建規則來檢測面具,以下真值表將提供帶面具/不帶面具的正確條件,

您可以從 GitHub 下載完整的代碼和 HAAR 級聯 XML 檔案,
import numpy as np
import cv2
import random
# multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
face_cascade = cv2.CascadeClassifier('data\\xml\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('data\\xml\\haarcascade_eye.xml')
mouth_cascade = cv2.CascadeClassifier('data\\xml\\haarcascade_mcs_mouth.xml')
upper_body = cv2.CascadeClassifier('data\\xml\\haarcascade_upperbody.xml')
# Adjust threshold value in range 80 to 105 based on your light.
bw_threshold = 80
# User message
font = cv2.FONT_HERSHEY_SIMPLEX
org = (30, 30)
weared_mask_font_color = (255, 255, 255)
not_weared_mask_font_color = (0, 0, 255)
thickness = 2
font_scale = 1
weared_mask = "Thank You for wearing MASK"
not_weared_mask = "Please wear MASK to defeat Corona"
# Read video
cap = cv2.VideoCapture(0)
while 1:
# Get individual frame
ret, img = cap.read()
img = cv2.flip(img,1)
# Convert Image into gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Convert image in black and white
(thresh, black_and_white) = cv2.threshold(gray, bw_threshold, 255, cv2.THRESH_BINARY)
#cv2.imshow('black_and_white', black_and_white)
# detect face
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Face prediction for black and white
faces_bw = face_cascade.detectMultiScale(black_and_white, 1.1, 4)
if(len(faces) == 0 and len(faces_bw) == 0):
cv2.putText(img, "No face found...", org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
elif(len(faces) == 0 and len(faces_bw) == 1):
# It has been observed that for white mask covering mouth, with gray image face prediction is not happening
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
# Draw rectangle on gace
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
# Detect lips counters
mouth_rects = mouth_cascade.detectMultiScale(gray, 1.5, 5)
# Face detected but Lips not detected which means person is wearing mask
if(len(mouth_rects) == 0):
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
for (mx, my, mw, mh) in mouth_rects:
if(y < my < y + h):
# Face and Lips are detected but lips coordinates are within face cordinates which `means lips prediction is true and
# person is not waring mask
cv2.putText(img, not_weared_mask, org, font, font_scale, not_weared_mask_font_color, thickness, cv2.LINE_AA)
#cv2.rectangle(img, (mx, my), (mx + mh, my + mw), (0, 0, 255), 3)
break
# Show frame with results
cv2.imshow('Mask Detection', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Release video
cap.release()
cv2.destroyAllWindows()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325442.html
標籤:AI
