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