【 1. 主要思想 】
- OpenCV的人臉檢測,使用Harr分類器。該分類器採用的Viola-Jones人臉檢測算法。它是在2001年由Viola和Jones提出的基於機器學習的人臉檢測算法。
- 算法首先需要大量的積極圖片(包含人臉的圖片)和消極圖片(不包含人臉的圖片)。然後從中提取類Harr特徵( Harr-like features),之所以稱爲 Harr分類器,是正是因爲它使用了類Harr特徵。最後,訓練出一個級聯檢測器,用其來檢測人臉。
【 2. 類Harr特徵 】
- 圖像中的特徵通常是指,圖片的像素點經過一系列的運算之後得到的結果,這些結果可能是向量、矩陣和多維數據等等。類Harr特徵是一種反映圖像的灰度變化的,像素分模塊求差值的一種特徵。
它分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵。
用黑色兩種矩形框組成爲特徵模板。
邊緣特徵:
線性特徵:
中心特徵和對角線特徵:
特徵模板的特徵值計算的方式,是用黑色矩形像素總和的均值減去白色矩形像素總和的均值。
- 例如,對於4x4的像素塊。理想情況下,黑色和白色的像素塊分佈如下:
符合邊緣特徵的情況(a)。
- 但是通常情況,一張灰階照片的黑白分佈並非如此的明顯,例如:
根據公式,
第一張圖特徵值爲1,第二張圖特徵值爲0.75-0.18=0.56。
- 一張圖中,對於識別人臉,只有部分特徵是有效的。例如,用下圖中的特徵模板可以看出,眉毛區域比額頭要亮,鼻樑區域比眼鏡區域要亮。嘴脣區域比牙齒區域要暗。這樣的類Harr特徵能很好的識別出人臉。
- 爲簡化特徵值計算,可以使用積分圖算法。得到類Harr特徵後,使用AdaBoost的方法選擇出有效特徵。最後再使用瀑布型級聯檢測器提高檢測速度。其中,瀑布的每一層都是一個由Adaboost算法訓練得到的強分類器。
Harr人臉檢測一個簡單的動畫過程如下:
紅色的搜索框不斷移動,檢測出是否包含人臉。一般來說,輸入的圖片會大於樣本,爲了檢索出不同大小的目標,分類器可以按比例的改變自己的尺寸,對輸入圖片進行多次的掃描。
【 3. 訓練Harr分類器 】
訓練 Harr 分類器的主要步驟:
- 蒐集製作大量的“消極”圖像
- 蒐集製作大量“積極”圖像,確保這些圖像中包含要檢測的對象
- 創建“積極”向量文件
- 使用 OpenCV 訓練 Harr 分類器
因爲訓練需要花費較多的資源和時間,所以學習時,先使用 OpenCV 中已經訓練好的 Harr 分類器。
【 4. 使用Harr分類器檢測人臉 】
- OpenCV 中的人臉訓練模型格式爲 XML,可以從 官網下載,把文件放在源文件目錄中。
在此我們使用harrcascade_frontalface_default.xml模型檢測人臉。- 也可以使用python中自帶的文件,一般路徑是
G:\Python32\Lib\site-packages\cv2\data\harrcascade_frontalface_default.xml’)
- 聲明分類器:
CascadeClassifier(模型文件路徑)
- 調用分類函數:
detectMultiScale(圖片對象,scaleFactor, minNeighbors, minSize)
參數說明:
- 圖片對象:待識別圖片對象;
- scaleFactor:圖像縮放比例;
- minNeighbors:對特徵檢測點周邊多少有效點同時檢測,這樣可避免因選取的特徵檢測點太小而導致遺漏;
- minSize:特徵檢測點的最小尺寸,可選參數。
- 範例:
import numpy as np
import cv2 as cv
img = cv.imread('mypicture.jpg') # 讀取圖片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 轉換爲灰度圖片
face_cascade = cv.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml') #人臉檢測器
faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 識別人臉
for (x,y,w,h) in faces:
print(x,y,w,h)
其中,圖片座標系以左上角爲原點,x,y代表人臉區域左上角座標,w代表寬度,h代表高度。如: