日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

OpenCV是一個強(qiáng)大的圖像處理庫,包含各種功能。人臉識別只是其眾多應(yīng)用的其中一個。

 

本篇文章與上一篇所講述的知識有很大的重合 ,請按需觀看。

 

理論知識

 

計算機(jī)的視覺系統(tǒng),計算機(jī)通過攝像頭看到的,簡單來說,就是一堆由數(shù)字組成的矩陣。這些數(shù)字表明了物體發(fā)出的光的強(qiáng)弱,攝像頭的光敏元件將光信號轉(zhuǎn)化成數(shù)字信號,將其量化為矩陣。

 


計算機(jī)中的彩色圖片都是由若干個色彩通道累積出來的,比如RGB模式的圖片,這三個通道都是灰度圖,比如一個點由8位來表示,則一 個通道可以表示2^8=256個灰度。那樣三個通道進(jìn)行疊加以后可以表3*8=24位種色彩。

 


對這樣的圖片做處理,無疑是一件很復(fù)雜的事,所以有必要先將彩色圖轉(zhuǎn)為灰度圖,那樣可以減少數(shù)據(jù)量(比如RGB模式,可以減少到原圖片的1/3),同時可 以去掉一些噪聲信號。先將圖片轉(zhuǎn)化為灰度圖,然后將這個灰度圖的對比度增高,這樣可以使得圖片本來暗的地方更暗,亮的地方更亮一些。這樣處理以后,圖片就更容易被算法識別出來了。

 

Haar特征

 

Haar特征包含三種:邊緣特征、線性特征、和中心圍繞特征。

OpenCV項目實戰(zhàn)---人臉檢測

 


OpenCV項目實戰(zhàn)---人臉檢測

 

Haar特征提取流程圖

在OpenCV人臉檢測中,Haar特征分類器就是一個XML文件,該文件中會描述人體各個部位的Haar特征值。包括人臉、眼睛、嘴唇等等。

 

HOG (Histograms of Oriented Gradients

對于一張待檢測圖片,我們分析每個像素以及其周圍的像素,根據(jù)明暗度畫一個箭頭,箭頭的指向代表了像素逐漸變暗的方向,如果我們重復(fù)操作每一個像素,最終像素會被箭頭取代。這些箭頭被稱為梯度(gradients),它們能顯示出圖像從明亮到黑暗流動的過程。

OpenCV項目實戰(zhàn)---人臉檢測

 

分析每個像素對我們來說太過細(xì)節(jié)化了,像素過多不利于整體的分析,我們應(yīng)該從更高的角度觀察明暗的流動。為此我們將圖像分割成16x16像素的小方塊。在每個小方塊中,計算出每個主方向有多少個梯度(有多少指向上,指向右上,指向右等)。然后用指向性最強(qiáng)的那個方向箭頭來代替原來那個小方塊

OpenCV項目實戰(zhàn)---人臉檢測

 

最終結(jié)果,我們把原始圖像轉(zhuǎn)換成非常簡單的HOG圖像,它可以很輕松的捕獲面部的基本結(jié)構(gòu)。為了在HOG圖像中找到臉部,我們需要做的是,與已知的一些HOG圖案中,來尋找看起來最相似的部分。

這些HOG圖案都是從其他面部訓(xùn)練數(shù)據(jù)中提取出來的。

 

級聯(lián)分類器

對于本次的設(shè)計人臉檢測,可以說是一次機(jī)器學(xué)習(xí)的過程。級聯(lián)分類器中有一個級聯(lián)分類函數(shù),此函數(shù)當(dāng)中的一些參數(shù)就是由機(jī)器訓(xùn)練得到的。對于人臉識別,計算機(jī)通過大量帶人臉和不帶人臉的圖片,對人臉上的幾萬個特征,通過機(jī)器學(xué)習(xí)找出人臉分類效果最好、錯誤率最小的特征。訓(xùn)練開始時,所有訓(xùn)練集中的圖片具有相同的權(quán)重,對于被分類錯誤的圖片,提升權(quán)重,重新計算出新的錯誤率和新的權(quán)重。直到錯誤率或迭代次數(shù)達(dá)到要求。這種訓(xùn)練方法叫做Adaboost

上文提到的hog圖像,正是由adaboost訓(xùn)練方法對大量圖片進(jìn)行訓(xùn)練后所提取出來的。

 

Cascade級聯(lián)分類器

Cascade 譯為級聯(lián),階梯。cascade級聯(lián)分類器是一種基于Haar特征的有效的物體檢測方法。

 

一張圖片絕大部分的區(qū)域都不是人臉。如果對一張圖片的每個角落都提取6000個特征,將會浪費巨量的計算資源。

如果能找到一個簡單的方法能夠檢測某個窗口是不是人臉區(qū)域,如果該窗口不是人臉區(qū)域,那么就只看一眼便直接跳過,也就不用進(jìn)行后續(xù)處理了,這樣就能集中精力判別那些可能是人臉的區(qū)域。為此,有人引入了Cascade 分類器。它不是將6000個特征都用在一個窗口,而是將特征分為不同的階段,然后一個階段一個階段的應(yīng)用這些特征(通常情況下,前幾個階段只有很少量的特征)。如果窗口在第一個階段就檢測失敗了,那么就直接舍棄它,無需考慮剩下的特征。如果檢測通過,則考慮第二階段的特征并繼續(xù)處理。如果所有階段的都通過了,那么這個窗口就是人臉區(qū)域。

OpenCV項目實戰(zhàn)---人臉檢測

 

比如上圖中,橫的黑道將人臉中較暗的雙眼提取了出來,而豎的白道將人臉中較亮的鼻梁提取了出來。

由于事先不太可能知道要檢測的目標(biāo)的大小,這就要求我們的級聯(lián)表中的分類器具有按比例增大(或者縮小)的能力,這樣,當(dāng)小的窗口移動完整個待檢測圖片沒有發(fā)現(xiàn)目標(biāo)時,我們可以調(diào)整分類器的大小,然后繼續(xù)檢測,直到檢測到目標(biāo)或者窗口與待檢測圖片的大小相當(dāng)為止。人臉檢測流程圖見圖

OpenCV項目實戰(zhàn)---人臉檢測

 

人臉檢測具體實現(xiàn)

環(huán)境搭建

本項目采用Python作為編輯器,pycharm作為解釋器。

OpenCV是一個可跨平臺的計算機(jī)視覺和機(jī)器學(xué)習(xí)的軟件庫,實現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。

安裝OpenCV時,有以下幾種方法。

一,首先可以利用的是pycharm來進(jìn)行引入

file -- settings --project interpreter-- +

OpenCV項目實戰(zhàn)---人臉檢測

 

選擇OpenCV--python ---install

OpenCV項目實戰(zhàn)---人臉檢測

 

如果安裝成功,隨后你可以在project interpreter里來進(jìn)行版本的查看。

OpenCV項目實戰(zhàn)---人臉檢測

 

二,利用常規(guī)命令

Win+r后輸入cmd,隨后輸入pip install OpenCV-python

如果顯示install successfully,則安裝完成。

 

如果報錯,read time error ,則可能是庫在下載時有延遲的問題,需要在命令里加入一個代理,這里用到的是豆瓣的,在install 后面加入以下命令即可。

- -index-url https://pypi.douban.com/simple opencv-python

OpenCV項目實戰(zhàn)---人臉檢測

 

OpenCV可以說是人臉物體檢測識別中比較常用的一個庫,利用import cv2來進(jìn)行調(diào)用。

 

項目代碼

對于識別本地圖片中的人臉,我們需要進(jìn)行以下幾個步驟的操作:

1)把圖像轉(zhuǎn)換為灰度圖,這樣可以去除色彩對目標(biāo)檢測的影響。同時可以降低圖像的噪聲。

import cv2  #引入OpenCV模塊
 #規(guī)定圖像的路徑。
filepath = "./image1.png" 
 # ./為當(dāng)前文件夾下的相對路徑,我們需要將檢測圖片與程序文件放于同一文件夾下。
img = cv2.imread(filepath)
#cv2.IMread就是利用OpenCV模塊來讀取此路徑下的圖片文件   imread=image-read
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#img為原始彩色圖片,這里我們用到了cv2模塊的圖像顏色轉(zhuǎn)換功能,將轉(zhuǎn)換后的圖像命名為gray
cv2.imshow("Image", gray)
#顯示灰色圖像

 

2)在灰色圖像上進(jìn)行矩形框的繪制

cv2.imshow("Image-gray", img)
x = y = 100  # 任意規(guī)定一個坐標(biāo)w =h= 135  # 矩形的寬、高color = (0,255,0)  # 定義繪制顏色,遵循bgr模式cv2.rectangle(img, (x, y), (x + w, y + h),color , 3)  #調(diào)用cv2里的rectangle來 繪制矩形,rectangle(圖像,左上角坐標(biāo),右下角坐標(biāo),顏色,線粗)cv2.imshow("Image-gray-square", img)  # 顯示灰色方框圖像

 

3)使用分類器查找人臉

CascadeClassifier是Opencv中做人臉檢測時候的一個級聯(lián)分類器。數(shù)據(jù)結(jié)構(gòu)包括Data和FeatureEvaluator兩個主要部分。Data中存儲的是從訓(xùn)練獲得的xml文件中載入的分類器數(shù)據(jù);而FeatureEvaluator中是關(guān)于特征的載入、存儲和計算。這里采用的訓(xùn)練文件是OpenCV中默認(rèn)提供的haarcascade_frontalface_default.xml。至于Haar,LBP的具體原理,可以參考o(jì)pencv的相關(guān)文檔,簡單地,可以理解為人臉的特征數(shù)據(jù)。

face_engine=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 導(dǎo)入人臉級聯(lián)分類器引擎,'.xml'文件里包含已經(jīng)訓(xùn)練出來的人臉特征

 
faces=face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)
# 用人臉級聯(lián)分類器引擎進(jìn)行人臉識別,返回的faces為人臉坐標(biāo)列表,1.3是放大比例,5是重復(fù)識別次數(shù)

 

 

整體代碼如下:

importcv2
img=cv2.imread('image1.jpg',1)
face_engine=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
faces=face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)
for(x,y,w,h)infaces:
    img =cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('img2',img)
cv2.waitKey(0)
cv2.destroyAllwindows()
cv2.imwrite('output.jpg',img)

 

 

注:

* cv2.waitKey等待鍵盤輸入,單位為毫秒,即等待指定的毫秒數(shù)看是否有鍵盤輸入,若在等待時間內(nèi)按下任意鍵則返回按鍵的ASCII碼,程序繼續(xù)運行。若沒有按下任何鍵,超時后返回-1。參數(shù)為0表示無限等待。不調(diào)用waitKey的話,窗口會一閃而逝,看不到顯示的圖片。

* cv2.destroyAllWindow()銷毀所有窗口

* cv2.destroyWindow(wname)銷毀指定窗口

 

運行結(jié)果圖

OpenCV項目實戰(zhàn)---人臉檢測

 

由此可以看出此代碼運行結(jié)果良好,符合預(yù)期結(jié)果。

 

代碼改進(jìn)

上述代碼為引入本地圖片來進(jìn)行人臉測量。現(xiàn)在改進(jìn)下代碼,可以通過攝像頭進(jìn)行實時的人臉檢測。

在源代碼的基礎(chǔ)上,增加以下語句:

cap=cv2.VideoCapture(0)
while(True):
   # 獲取攝像頭拍攝到的畫面
    ret, frame=cap.read()
faces=face_cascade.detectMultiScale(frame,1.3,5)
#frame是攝像頭捕捉到的畫面

 
.....

 
   #每隔5毫秒監(jiān)聽一次鍵盤,當(dāng)按下q鍵時退出攝像窗口
ifcv2.waitKey(5)&0xFF==ord('q'):
   break
# 關(guān)閉所有窗口
cap.release()
cv2.destroyAllWindows()

 

利用手機(jī)播放視頻,可進(jìn)行實時人臉檢測,運行結(jié)果良好。結(jié)果如圖

OpenCV項目實戰(zhàn)---人臉檢測

 

1)在用cv2.rectangle進(jìn)行畫框時,原始定義為(圖像,左上角,右下角)。但由于疏忽,有一次我將左上角和右下角的坐標(biāo)順序?qū)懛矗矗ㄓ蚁陆牵笊辖牵5墙Y(jié)果卻依然正確。在后來我將數(shù)據(jù)改為(右上角,左下角)(左下角,右上角),結(jié)果依然一樣。因此得知,rectangle是利用對角線來進(jìn)行矩形的框定。

在此附上此次驗證的相關(guān)代碼:


 
import cv2
# filepath = "./men-face.jpg"
image = cv2.imread('./men-face.jpg',cv2.IMREAD_GRAYSCALE)
h, w = image.shape[:2]
h, w = map(int, [h/4, w/4])
draw_0 = cv2.rectangle(image, (2*w, 2*h), (3*w, 3*h), (255, 0, 0), 2)
draw_1 = cv2.rectangle(image, (2*w, 3*h), (3*w, 2*h), (255, 0, 0), 2)
draw_2 = cv2.rectangle(image, (3*w, 2*h), (2*w, 3*h), (255, 0, 0), 2)
draw_3 = cv2.rectangle(image, (3*w, 3*h), (2*w, 2*h), (255, 0, 0), 2)
cv2.imshow("origin.jpg", draw_0)
cv2.imshow("change1.jpg", draw_1)
cv2.imshow("change2.jpg", draw_2)
cv2.imshow("change3.jpg", draw_3)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV項目實戰(zhàn)---人臉檢測

 

2)HOG的發(fā)明者是Navneet Dalal,在2005年其在CVPR上發(fā)表了Histograms of Oriented Gradients forHuman Detection這一篇論文。

HOG算法思想

在計算機(jī)視覺以及數(shù)字圖像處理中梯度方向直方圖(HOG)是一種能對物體進(jìn)行檢測的基于形狀邊緣特征的描述算子,它的基本思想是利用梯度信息能很好的反映圖像目標(biāo)的邊緣信息并通過局部梯度的大小將圖像局部的外觀和形狀特征化。一些研究者利用梯度HOG特征并結(jié)合其他特征對人體進(jìn)行檢測得到了較好的結(jié)果。

HOG特征的提取可以用下圖所示的過程表示: 顏色空間的歸一化是為了減少光照以及背景等因素的影響;劃分檢測窗口成大小相同的細(xì)胞單元(cell),并分別提取相應(yīng)的梯度信息;組合相鄰的細(xì)胞單元成大的相互有重疊的塊(block),這樣能有效的利用重疊的邊緣信息,以統(tǒng)計整個塊的直方圖;并對每個塊內(nèi)的梯度直方圖進(jìn)行歸一化,從而進(jìn)一步減少背景顏色及噪聲的影響;最后將整個窗口中所有塊的HOG特征收集起來,并使用特征向量來表示其特征。在這一過程中,不同尺度的參數(shù)模板、梯度方向的選擇、重疊塊及單元格的大小還有歸一化因子等因素都會影響最終的檢測結(jié)果。最終通過SVM或cascade分類器分離出正確的行人目標(biāo)。

HOG的整體流程圖如下所示。

OpenCV項目實戰(zhàn)---人臉檢測

 


OpenCV項目實戰(zhàn)---人臉檢測

 

顏色空間歸一化:

在現(xiàn)實的情況,圖像目標(biāo)會出現(xiàn)在不同的環(huán)境中,光照也會有所不一樣,顏色空間歸一化就是對整幅圖像的顏色信息作歸一化處理從而減少不同光照及背景的影響,也為了提高檢測的魯棒性,引入圖像Gamma校正和顏色空間歸一化來作為特征提取的預(yù)處理手段。ND等人也對不同的圖像像素點的表達(dá)方式包括灰度空間等進(jìn)行了評估,最終驗證RGB還有LAB色彩空間能使檢測結(jié)果大致相同且能起到積極的影響,且另一方面,ND等人在研究中分別在每個顏色通道上使用了兩種不同的Gamma歸一化方式,取平方根或者使用對數(shù)法,最終驗證這一預(yù)處理對檢測的結(jié)果幾乎沒有影響,而不能對圖像進(jìn)行高斯平滑處理,因平滑處理會降低圖像目標(biāo)邊緣信息的辨識度,影響檢測結(jié)果。

 

梯度計算:

邊緣是由圖像局部特征包括灰度、顏色和紋理的突變導(dǎo)致的。一幅圖像中相鄰的像素點之間變化比較少,區(qū)域變化比較平坦,則梯度幅值就會比較小,反之,則梯度幅值就會比較大。梯度在圖像中對應(yīng)的就是其一階導(dǎo)數(shù)。模擬圖像f(x,y)中任一像素點(x,y)的梯度是一個矢量:

OpenCV項目實戰(zhàn)---人臉檢測

 

其中,Gx是沿x方向上的梯度,Gy是沿y方向上的梯度,梯度的幅值及方向角可表示如下:

OpenCV項目實戰(zhàn)---人臉檢測

 

數(shù)字圖像中像素點的梯度是用差分來計算的:

OpenCV項目實戰(zhàn)---人臉檢測

 

一維離散微分模板在將圖像的梯度信息簡單、快速且有效地計算出來,其公式如下:

OpenCV項目實戰(zhàn)---人臉檢測

 

式中,Gx,Gy,H(x,y)分別表示的是像素點(x,y)在水平方向上及垂直方向上的梯度以及像素的灰度值,其梯度的幅值及方向計算公式如下:

OpenCV項目實戰(zhàn)---人臉檢測

 

ND等人也驗證,不同的梯度運算模板在其檢測效果上也不一樣,如下表,可以看出,使用簡單的一維離散微分模板[-1,0,1]進(jìn)行的梯度運算得到的檢測效果是最好的,而使用其他形式的梯度運算模板如Prewitt和Sobel等算子,如下圖所示,不僅增加運算量而同時也降低了其檢測效果。

OpenCV項目實戰(zhàn)---人臉檢測

 

計算細(xì)胞單元的梯度直方圖:

對于整個目標(biāo)窗口,我們需要將其分成互不重疊大小相同的細(xì)胞單元(cell),然后分別計算出每個cell的梯度信息,包括梯度大小和梯度方向。ND大神等人實驗指出,將像素的梯度方向在0-180°區(qū)間內(nèi)平均劃分為9個bins,超過9個時不僅檢測性能沒有明顯的提高反而增加了檢測運算量, 每個cell內(nèi)的像素為其所在的梯度方向直方圖進(jìn)行加權(quán)投票,加權(quán)的權(quán)值可以是像素本身的梯度幅值,也可以是幅值的平方或平方根等,而若使用平方或平方根,實驗的檢測性能會有所降低,ND等人也驗證,使用梯度幅值的實驗效果更可靠

OpenCV項目實戰(zhàn)---人臉檢測

 

梯度直方圖的計算

 

對組合成塊的梯度直方圖作歸一化:

從梯度計算公式中可以看出,梯度幅值絕對值的大小容易受到前景與背景對比度及局部光照的影響,要減少這種影響得到較準(zhǔn)確的檢測效果就必須對局部細(xì)胞單元進(jìn)行歸一化處理。歸一化方法多種多樣,但整體思想基本上是一致的:將幾個細(xì)胞單元(cell)組合成更大的塊(block),這時整幅圖像就可看成是待檢測窗口,將更大的塊看成是滑動窗口,依次從左到右從上到下進(jìn)行滑動,得到一些有重復(fù)細(xì)胞單元的塊及一些相同細(xì)胞單元(cell)在不同塊(block)中的梯度信息,再對這些塊(block)信息分別作歸一化處理,不同的細(xì)胞單元尺寸大小及不同塊的尺寸大小會影響最終的檢測效果。

 

假設(shè)64×64像素是檢測的窗口的尺寸,分成 4×4=16 個細(xì)胞單元(cell),如下圖中黑色的小框(1-16),16×16 像素是每個細(xì)胞單元的大小,塊(block)是由相鄰的 2×2=4 個細(xì)胞單元組成的,如圖紫色的小框,滑動窗口的大小為一個塊的大小,依次將滑動窗口從左到右從上到下進(jìn)行滑動來獲得整個待測窗口的邊緣信息,得到9個塊,統(tǒng)計這9個塊在9個不同方向上的梯度信息,在整個窗口中得到的梯度特征是9×9=81 維的向量。在實際情況中我們的檢測窗口的大小為128×64像素,一個細(xì)胞單元的大小為8×8像素,由2×2個細(xì)胞單元組成大小為16×16像素的塊,一個細(xì)胞單元的梯度直方圖化成9個bins,塊的移動步長是8個像素,則檢測窗口在圖像中移動的步長也為8個像素,這樣檢測窗口就有((128-16)/8+1)×((64-16)/8+1)= 105個塊,一個塊有4個細(xì)胞單元,每個細(xì)胞單元的HOG特征向量長度是9,則最終的HOG特征描述符大小就是105×4×9 = 3780維

OpenCV項目實戰(zhàn)---人臉檢測

 

對于塊的梯度直方圖向量的歸一化,ND等人使用了不同方法,并對結(jié)果進(jìn)行了比較,假設(shè)V是未歸一化的向量,是一個很小的必要的常數(shù),下式是定義的范數(shù)的函數(shù)表達(dá)式:

L1范數(shù):

OpenCV項目實戰(zhàn)---人臉檢測

 

L2范數(shù):

OpenCV項目實戰(zhàn)---人臉檢測

 

歸一化計算公式為:

L2常規(guī):

OpenCV項目實戰(zhàn)---人臉檢測

 

L1常規(guī):

OpenCV項目實戰(zhàn)---人臉檢測

 

L1平方根:

OpenCV項目實戰(zhàn)---人臉檢測

 

ND等人指出,用L1常規(guī)方法進(jìn)行向量歸一化比用L2常規(guī)和L1平方根方法而得到的檢測效果降低5%。

OpenCV項目實戰(zhàn)---人臉檢測

 

來源:六月的日記 作者:小胖鴨

End

 

聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)習(xí)、交流之目的。文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。

分享到:
標(biāo)簽:OpenCV
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定