1. 程式人生 > 程式設計 >使用python-cv2實現Harr+Adaboost人臉識別的示例

使用python-cv2實現Harr+Adaboost人臉識別的示例

Haar特徵

哈爾特徵使用檢測視窗中指定位置的相鄰矩形,計算每一個矩形的畫素和並取其差值。然後用這些差值來對影象的子區域進行分類。

haar特徵模板有以下幾種:

在這裡插入圖片描述

以第一個haar特徵模板為例

在這裡插入圖片描述

計算方式

1.特徵 = 白色 - 黑色(用白色區域的畫素之和減去黑色區域的象徵之和)

2.特徵 = 整個區域 * 權重 + 黑色 * 權重

使用haar模板處理影象

從影象的起點開始,利用haar模板從左往右遍歷,從上往下遍歷,並設定步長,同時考慮影象大小和模板大小的資訊

假如我們現在有一個 1080 * 720 大小的影象,10*10 的haar模板,並且步長為2,那麼我我們所需要的的計算量為: (1080 / 2 * 720 / 2) * 100 * 模板數量 * 縮放 約等於50-100億,計算量太大。

積分圖

使用積分圖可大量減少運算時間,實際上就是運用了字首和的原理

在這裡插入圖片描述

Adaboost分類器

Adaboost是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。

演算法流程

該演算法其實是一個簡單的弱分類演算法提升過程,這個過程通過不斷的訓練,可以提高對資料的分類能力。整個過程如下所示:

1. 先通過對N個訓練樣本的學習得到第一個弱分類器;
2. 將分錯的樣本和其他的新資料一起構成一個新的N個的訓練樣本,通過對這個樣本的學習得到第二個弱分類器 ;
3. 將1和2都分錯了的樣本加上其他的新樣本構成另一個新的N個的訓練樣本,通過對這個樣本的學習得到第三個弱分類器;

4. 最終經過提升的強分類器。即某個資料被分為哪一類要由各分類器權值決定。

我們需要從官網下載倆個Adaboost分類器檔案,分別是人臉和眼睛的分類器:
下載地址:https://github.com/opencv/opencv/tree/master/data/haarcascades

在這裡插入圖片描述

在這裡插入圖片描述

程式碼實現

實現人臉識別的基本步驟:

1.載入檔案和圖片
2.進行灰度處理
3.得到haar特徵
4.檢測人臉
5.進行標記

我們使用cv2.CascadeClassifier()來載入我們下載好的分類器。

然後我們使用detectMultiScale()方法來得到識別結果

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1.載入檔案和圖片 2.進行灰度處理 3.得到haar特徵 4.檢測人臉 5.標記

face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('img.png')
cv2.imshow('img',img)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 1.灰色影象 2.縮放係數 3.目標大小
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face = ',len(faces))
print(faces)
#繪製人臉,為人臉畫方框
for (x,y,w,h) in faces:
  cv2.rectangle(img,(x,y),(x + w,y + h),(255,0),2)
  roi_face = gray[y:y+h,x:x+w]
  roi_color = img[y:y+h,x:x+w]
  eyes = eye_xml.detectMultiScale(roi_face)
  print('eyes = ',len(eyes))
  for (ex,ey,ew,eh) in eyes:
    cv2.rectangle(roi_color,(ex,ey),(ex + ew,ey + eh),(0,255,2)
cv2.imshow('dat',img)
cv2.waitKey(0)
face = 1
[[133 82 94 94]]
eyes = 2

在這裡插入圖片描述

在這裡插入圖片描述

到此這篇關於使用python-cv2實現Harr+Adaboost人臉識別的示例的文章就介紹到這了,更多相關python cv2 人臉識別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!