使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器
使用Python,OpenCV和Haar級聯(lián)進(jìn)行人臉檢測——輕量級的人臉檢測器
- 1. 效果圖
- 2. 原理
- 2.1 項(xiàng)目結(jié)構(gòu)
- 2.2 [haarcascade_frontalface_default.xml下載](https://github.com/seminar2012/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml)
- 3. 源碼
- 3.1 圖像檢測源碼
- 3.2 視頻流實(shí)時檢測源碼
- 參考
這篇博客將介紹一個輕量級的人臉檢測器——Haar級聯(lián)人臉檢測器,并實(shí)現(xiàn)對圖像進(jìn)行檢測和實(shí)時視頻中進(jìn)行人臉檢測。
盡管深度學(xué)習(xí)的人臉檢測可以得到更準(zhǔn)確的結(jié)果和更強(qiáng)大的臉部檢測,但Haar級聯(lián)人臉檢測器也有其優(yōu)勢:模型小而輕巧 930kb;即使在資源受限的設(shè)備上,也超快速, 很適合在資源受限的設(shè)備上使用。
Haar級聯(lián)人臉檢測器缺點(diǎn):易于偽陽性檢測;比HOG線性SVM檢測器,SSD,YOLO、深度學(xué)習(xí)人臉檢測的準(zhǔn)確性稍低;需要手動進(jìn)行參數(shù)調(diào)整;
1. 效果圖
用了我最喜歡的一對,晉嫣圖,效果圖1如下:
效果圖2,可以看到左下角包含一個偽陽性結(jié)果
對于這種假陽性結(jié)果,可以調(diào)整minNeighbors 或者 minSize來保證正確的檢測,消除假陽性結(jié)果。
rects = detector.detectMultiScale(gray, scaleFactor=1.05,
minNeighbors=5, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
通過調(diào)整minNeighbors=10,得到了正確的檢測結(jié)果,效果圖3如下:
2. 原理
當(dāng)執(zhí)行面部檢測時,Haar級聯(lián)檢測器在圖像上從左右和頂?shù)降撞炕瑒哟翱?#xff0c;沿途計(jì)算整體圖像。當(dāng)Haar級聯(lián)認(rèn)為臉部在某個區(qū)域時,它將返回更高的置信度。如果給定區(qū)域有足夠的高置信度分?jǐn)?shù),那么Haar Cascade將報告陽性檢測。
通過增加區(qū)域的鄰居個數(shù),可以提升其消除假陽性結(jié)果。
2.1 項(xiàng)目結(jié)構(gòu)
2.2 haarcascade_frontalface_default.xml下載
3. 源碼
3.1 圖像檢測源碼
# USAGE
# python haar_face_detector.py --image images/ty.png# 導(dǎo)入必要的包
import argparse
import imutils
import cv2# 構(gòu)建命令行參數(shù)及解析
# --image 檢測人臉的圖像
# --cascade Haar Cascade的人臉檢測器路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True,help="path to input image")
ap.add_argument("-c", "--cascade", type=str,default="haarcascade_frontalface_default.xml",help="path to haar cascade face detector")
args = vars(ap.parse_args())# 加載 haar級聯(lián)人臉檢測器
print("[INFO] loading face detector...")
detector = cv2.CascadeClassifier(args["cascade"])# 從磁盤加載輸入圖像,等比例縮放寬度為500,轉(zhuǎn)換為灰度圖
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 對圖像進(jìn)行haar級聯(lián)人臉檢測
print("[INFO] performing face detection...")
# scaleFactor 在每個圖像刻度下圖像尺寸減小了多少。此值用于創(chuàng)建圖像金字塔。為了在圖像中的多個不同大小處檢測人臉(一些人臉可能更靠近前景,因此更大,其他在背景中的人臉可能更小,因此用不同尺度的使用)。
# 值1.05 表示在金字塔中的每個級別將圖像的大小降低5%。
# minneighbors 級聯(lián)分類器將圍繞臉部檢測多個窗口,每個臉部窗口至少具有5個鄰居。此參數(shù)控制需要圍繞臉部檢測幾個鄰居矩形窗口。
# inssize 寬度和高度(以像素為單位)的元組,表示窗口的最小尺寸。小于此大小的邊界框?qū)⒈缓雎浴?#xff08;30,30)開始,然后微調(diào).# 對于假陽性結(jié)果,可以調(diào)整minNeighbors 或者 minSize來保證正確的檢測,消除假陽性結(jié)果。
rects = detector.detectMultiScale(gray, scaleFactor=1.05,minNeighbors=10, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)
print("[INFO] {} faces detected...".format(len(rects)))# 遍歷檢測到的人臉邊界框
for (x, y, w, h) in rects:# 繪制人臉在圖像上cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 展示結(jié)果圖像
cv2.imshow("Image", image)
cv2.waitKey(0)
3.2 視頻流實(shí)時檢測源碼
在實(shí)時視頻流中進(jìn)行面部檢測,Haar級聯(lián)人臉檢測器輕巧而速度快,非常的合適。
如果想要更準(zhǔn)確的結(jié)果,也可以選用基于深度學(xué)習(xí)的人臉檢測器。
# USAGE
# python video_face_detector.py# 導(dǎo)入必要的包
from imutils.video import VideoStream # 獲取視頻流或者攝像頭流
import argparse
import imutils
import time
import cv2# 構(gòu)建命令行參數(shù)及解析
# --cascade Haar Cascade的人臉檢測器(haarcascade_frontalface_default.xml)路徑
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--cascade", type=str,default="haarcascade_frontalface_default.xml",help="path to haar cascade face detector")
args = vars(ap.parse_args())# 加載 haar級聯(lián)人臉檢測器
print("[INFO] loading face detector...")
detector = cv2.CascadeClassifier(args["cascade"])# 初始化攝像頭流,并預(yù)熱相機(jī)傳感器2s
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)# 遍歷視頻流中的幀
while True:# 獲取下一幀,等比例縮放寬度為500,轉(zhuǎn)換為灰度圖frame = vs.read()frame = imutils.resize(frame, width=500)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用Haar級聯(lián)執(zhí)行人臉檢測rects = detector.detectMultiScale(gray, scaleFactor=1.05,minNeighbors=5, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)# 遍歷檢測結(jié)果(人臉邊界框)for (x, y, w, h) in rects:# 在圖像上繪制人臉邊界框cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 展示輸出幀cv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# 按下‘q’鍵,結(jié)束檢測if key == ord("q"):break# 做一些清理工作
cv2.destroyAllWindows()
vs.stop()
參考
- https://www.pyimagesearch.com/2021/04/05/opencv-face-detection-with-haar-cascades/
總結(jié)
以上是生活随笔為你收集整理的使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《春雪》第一句是什么
- 下一篇: 使用Python,OpenCV捕获关键事