OpenCV3電腦視覺+Python(五)

來源:互聯網
上載者:User

標籤:輸入   保留   eal   pos   and   其他   imp   沒有   作品   

臉部偵測和識別

本章將介紹Haar級聯分類器,通過對比分析相鄰映像地區來判斷給定映像或子映像與已知對象是否匹配。本章將考慮如何將多個Haar級聯分類器構成一個階層,即一個分類器能識別整體地區(如人臉),而其他的分類器可識別小的地區(眼睛、鼻子和嘴)。

Haar級聯的概念

當談到目標分類和位置跟蹤時,希望精確定位什嗎?什麼才是目標的可識別部分?

攝影作品(甚至是來自網路攝影機的映像)可能包含很多令人愉悅的細節。但是,由於燈光、視角、視距、網路攝影機抖動以及數字雜訊的變化,映像細節變得不穩定。人們在分類時不會受這些物理細節方面差異的影響。

提取出映像的細節對產生穩定分類結果和跟蹤結果很有用。這些提取的結果被稱為特徵,專業的表述為:從映像資料中提取特徵。雖然任意像素都可能影響多個特徵,但特徵應該比像素數少得多。兩個映像的相似程度可以通過它們對應特徵的歐式距離來度量。

例如,距離可能以空間座標或顏色座標來定義。類Haar特徵是一種用於實現即時人臉跟蹤的特徵。文獻《Robust Real-Time Face Detection,Paul Viola and Michael Jones,Kluwer Academic Publishers,2001》首次採用這種特徵來進行臉部偵測。每個類Haar特徵都描述了相鄰映像地區的對比模式。例如,邊、頂點和細線都能產生具有判別性的特徵。

對給定的映像,特徵可能會因地區大小而有所不同,地區大小也可被稱為視窗大小。即使視窗大小不一樣,僅在尺度上不同的兩幅映像也應該有相似的特徵。因此,能為不同大小的視窗產生特徵非常有用。這些特徵集合稱為級聯。Haar級聯具有尺度不變性,換句話說,它在尺度變化上具有魯棒性。OpenCV提供了尺度不變Haar級聯的分類器和跟蹤器,並可將其儲存成指定的檔案格式。

OpenCV的Haar級聯不具有旋轉不變性。例如,Haar級聯不認為倒置的人臉映像和直立的人臉映像一樣,而側面的人臉映像與正面的人臉映像也不一樣。更可通過多種映像變換和多種視窗大小來提高Haar級聯的旋轉魯棒性,但這樣會變得很複雜,而且會耗費更多計算資源。

擷取Haar級聯資料

在OpenCV3原始碼的副本中會有一個檔案夾data/haarcascades.該檔案夾包含了所有OpenCV的臉部偵測的XML檔案,並將haarcascades檔案夾中的所有檔案複製到cascades檔案夾中:

haarcascade_profileface.xml

haarcascade_righteye_2splits.xml

haarcascade_russian_plate_number.xml

haarcascade_smile.xml

haarcascade_upperbody.xml

從檔案名稱可知這些級聯是用於人臉、眼睛、鼻子和嘴的跟蹤。這些檔案需要正面、直立的人臉映像。在稍後建立臉部偵測器時會使用這些檔案。有了很大的耐心以及強大的電腦,就可以建立自己的級聯,並訓練這些級聯來檢測各種對象。

使用OpenCV進行臉部偵測

在靜態映像或視頻中檢測人臉的操作非常相似。視頻臉部偵測只是從網路攝影機讀出每幀映像,然後採用靜態映像中的臉部偵測方法進行檢測。當然,視頻臉部偵測還涉及其他的概念,例如跟蹤,而靜態映像中的臉部偵測就沒有這樣的概念,但它們基本理論是一致的。

靜態映像中的臉部偵測

臉部偵測首先是載入映像並檢測人臉,這也是最基本的一步。為了使所得到的結果有意義,可在原始映像的人臉周圍繪製矩形框。

現在,項目中已經包含了haarcascades檔案夾的內容,下面建立一個基本的指令碼來實現臉部偵測。

import cv2filename=‘3.jpg‘def detect(filename):    face_cascade=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml‘)    face_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml‘)    img=cv2.imread(filename)    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    faces=face_cascade.detectMultiScale(gray,1.3,5)    for (x,y,w,h) in faces:        img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)    cv2.namedWindow(‘Vikings Detected‘)    cv2.imshow(‘Vikings Detected‘,img)    cv2.waitKey()detect(filename)

注意:

face_cascade=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml‘)

face_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml‘)

該變數為CascadeClassifier對象

face_cascade.detectMultiScale傳遞參數是scaleFactor和minNeighbors,它們分別表示臉部偵測過程中每次迭代時映像的壓縮率以及每個人臉矩形保留近鄰數目的最小值。

檢測操作的傳回值為人臉矩形數組。函數cv2.rectangle允許通過座標來繪製矩形(x和y表示左上方的座標,w和h表示人臉矩形的寬度和高度)

通過依次提取faces變數中的值來找到人臉,並在人臉周圍繪製藍色矩形,這是在原始映像而不是映像的灰色版本上進行繪製。


視頻中的臉部偵測

在視頻的幀上重複這個過程就能完成視頻(如網路攝影機的輸入或視頻檔案)中的臉部偵測。

該指令碼將執行以下任務:開啟網路攝影機,讀取幀,檢測幀中的人臉,掃描檢測到的人臉中的眼睛,對人臉繪製藍色的矩形框,對眼睛繪製綠色的矩形框。

import cv2def detect():    face_cascade=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml‘)    eye_cascade=cv2.CascadeClassifier(‘haarcascade_eye.xml‘)    face_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml‘)    eye_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_eye.xml‘)    camera=cv2.VideoCapture(0)    while(True):        ret,frame=camera.read()        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)        faces=face_cascade.detectMultiScale(gray,1.3,5)        for (x,y,w,h) in faces:            img=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)            roi_gray=gray[y:y+h,x:x+w]            eyes=eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))            for (ex,ey,ew,eh)in eyes:                cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)            cv2.imshow("camera",frame)    camera.release()    cv2.destroyAllWindows()if __name__=="__main__":    detect()

首先用detect函數載入Haar級聯檔案,由此可以執行臉部偵測。

然後開啟一個VideoCapture目標(初始化網路攝影機)。VideoCapture建構函式的參數用來表示要使用的網路攝影機

接下來捕獲幀。read()函數會返回兩個值:第一個值為布爾值,用來表明是否成功讀取幀,第二個值為幀本身。捕捉到幀後,將其轉換為灰階映像。這個操作很有必要。

與靜態映像的例子一樣,對具有灰階色彩空間的幀調用detectMultiScale

在眼睛檢測中還有另外幾個參數,因為眼睛是在確定了人臉的基礎上,在比較小的映像上確定眼睛。

同樣用迴圈輸出檢測眼睛的結果,並在其周圍繪製綠色的矩形框

Face Service

臉部偵測是OpenCV的一個很不錯的功能,它是Face Service的基礎。什麼是Face Service?其實就是一個程式能識別給定映像或視頻中的人臉。實現這一目標的方法之一(OpenCV也採用這種方法)是用一系列分好類的映像(人臉資料庫)來訓練程式,並基於這些映像來進行識別。

這就是OpenCV及其Face Service模組進行Face Service的過程。

Face Service模組的另一個重要特徵是:每個識別都具有轉置信評分,因此可在實際應用中通過對其設定閾值來進行篩選。

Face Service所需要的人臉可以通過兩種方式來得到:自己獲得映像或從人臉資料庫免費獲得可用的人臉映像

1.產生Face Service資料

下面繼續介紹產生映像的指令碼。這裡需要一些包含不同表情的映像,但是,必須確保樣本映像滿足如下條件:

1)映像是灰階格式,尾碼名為.pgm

2)映像形狀為正方形

3)映像大小要一樣

import cv2def generate():    face_cascade=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml‘)    eye_cascade=cv2.CascadeClassifier(‘haarcascade_eye.xml‘)    face_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml‘)    eye_cascade.load(‘C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_eye.xml‘)    camera=cv2.VideoCapture(0)    count=0    while(True):        ret,frame=camera.read()        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)        faces=face_cascade.detectMultiScale(gray,1.3,5)        for (x,y,w,h)in faces:            img=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)            f=cv2.resize(gray[y:y+h,x:x+w],(200,200))            cv2.imwrite(‘./data/%s.pgm‘%str(count),f)            count+=1        cv2.imshow("camera",frame)        if (cv2.waitKey(int(1000/12)))&(0xff==ord("q")):            break    camera.release()    cv2.destroyAllWindows()if __name__=="__main__":    generate()


2.Face Service

OpenCV3有三種Face Service的方法,它們分別基於三種不同的演算法:Eigenfaces、Fisherfaces和Local Binary Pattern

OpenCV3電腦視覺+Python(五)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.