python+opencv入門-基於Harr特徵的人臉檢測分類器

python+opencv入門-基於Harr特徵的人臉檢測分類器

任務描述

理解Harr分類器原理,使用OpenCV中的Harr分類器進行人臉檢測。

相關知識

主要思想

openCV的人臉檢測,使用Harr分類器。該分類器採用的Viola-Jones人臉檢測算法。它是在2001年由Viola和Jones提出的基於機器學習的人臉檢測算法。
算法首先需要大量的積極圖片(包含人臉的圖片)和消極圖片(不包含人臉的圖片)。然後從中提取類Harr特徵( Harr-like features),之所以稱爲 Harr分類器,是正是因爲它使用了類Harr特徵。最後,訓練出一個級聯檢測器,用其來檢測人臉。

類Harr特徵

圖像中的特徵通常是指,圖片的像素點經過一系列的運算之後得到的結果,這些結果可能是向量、矩陣和多維數據等等。類Harr特徵是一種反映圖像的灰度變化的,像素分模塊求差值的一種特徵。

Harr特徵類別

它分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵。用黑色兩種矩形框組成爲特徵模板。
1.邊緣特徵:
在這裏插入圖片描述
2.線性特徵:
在這裏插入圖片描述
3.中心特徵和對角線特徵:
在這裏插入圖片描述

特徵值計算

特徵模板的特徵值計算的方式,是用黑色矩形像素總和的均值減去白色矩形像素總和的均值。
在這裏插入圖片描述
例如,對於4x4的像素塊。
理想情況下,黑色和白色的像素塊分佈如下:
在這裏插入圖片描述
符合邊緣特徵的情況(a)。
但是通常情況,一張灰階照片的黑白分佈並非如此的明顯,例如:
根據公式,
第一張圖特徵值爲1,第二張圖特徵值爲0.75-0.18=0.56。
一張圖中,對於識別人臉,只有部分特徵是有效的。例如,用下圖中的特徵模板可以看出,眉毛區域比額頭要亮,鼻樑區域比眼鏡區域要亮。嘴脣區域比牙齒區域要暗。這樣的類Harr特徵能很好的識別出人臉。
在這裏插入圖片描述
爲簡化特徵值計算,可以使用積分圖算法。得到類Harr特徵後,使用AdaBoost的方法選擇出有效特徵。最後再使用瀑布型級聯檢測器提高檢測速度。其中,瀑布的每一層都是一個由Adaboost算法訓練得到的強分類器。
Harr人臉檢測一個簡單的動畫過程如下:
在這裏插入圖片描述
紅色的搜索框不斷移動,檢測出是否包含人臉。一般來說,輸入的圖片會大於樣本,爲了檢索出不同大小的目標,分類器可以按比例的改變自己的尺寸,對輸入圖片進行多次的掃描。

訓練Harr分類器

訓練 Harr 分類器的主要步驟如下:

蒐集製作大量的“消極”圖像
蒐集製作大量“積極”圖像,確保這些圖像中包含要檢測的對象
創建“積極”向量文件
使用 OpenCV 訓練 Harr 分類器

因爲訓練需要花費較多的資源和時間,所以我們學習時,先使用 OpenCV 中已經訓練好的 Harr 分類器。

使用Harr分類器檢測人臉

OpenCV 中的人臉訓練模型格式爲 XML,可以從 官網下載 。在此我們使用Harrcascade_frontalface_default.xml模型檢測人臉。
聲明分類器:

CascadeClassifier(模型文件路徑)

調用分類函數:

detectMultiScale(圖片對象,scaleFactor, minNeighbors, minSize)

參數說明:

1.圖片對象:待識別圖片對象;
2.scaleFactor:圖像縮放比例;
3.minNeighbors:對特徵檢測點周邊多少有效點同時檢測,這樣可避免因選取的特徵檢測點太小而導致遺漏;
4.minSize:特徵檢測點的最小尺寸,可選參數。
示例如下:

import numpy as np
import cv2 as cv
# 讀取圖片
img = cv.imread('face.jpg')
# 轉換爲灰度圖片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 人臉檢測器
face_cascade = cv.CascadeClassifier('Harrcascade_frontalface_default.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代表高度。
如圖所示:
在這裏插入圖片描述
繪製人臉將在下個關卡學習。

編程要求

請在右側編輯器補充代碼,調用 Harr 完成人臉識別,具體任務如下:

*讀取圖片;
*轉化圖片爲灰度圖片;
*聲明人臉檢測器;
*調用人臉檢測函數,scaleFactor參數設定爲1.3, minNeighbors參數設定爲5。

import numpy as np
import cv2 as cv
#********** Begin **********#
# 讀取圖片image_path = 'step3/image/face.jpg'
img = cv.imread(image_path)
# 轉換爲灰度圖片
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 人臉檢測器
modle_path = 'sample/data/haarcascades/haarcascade_frontalface_default.xml'
#補齊
# 識別人臉
#補齊
#********** End **********#
print(faces)

=================== =answer== ==================
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章