【OpenCV人臉檢測】3. 基於Harr特徵的人臉檢測分類器

【 1. 主要思想 】

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

【 2. 類Harr特徵 】

  • 圖像中的特徵通常是指,圖片的像素點經過一系列的運算之後得到的結果,這些結果可能是向量、矩陣和多維數據等等。類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代表高度。如:在這裏插入圖片描述

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