李剛
摘要:Emgu CV是.NET平臺(tái)下對(duì)OpenCV圖像處理庫(kù)的封裝,可以實(shí)現(xiàn)人臉識(shí)別的判斷。該文著重討論了在.NET下基于Emgu CV利用GPU加速技術(shù)實(shí)現(xiàn)了靜態(tài)圖像的人臉檢測(cè)、人臉識(shí)別、人臉比對(duì),以及視頻流中的人臉識(shí)別。該軟件獲得我校技術(shù)進(jìn)步二等獎(jiǎng),實(shí)驗(yàn)結(jié)果證明該程序運(yùn)行穩(wěn)定,結(jié)果可靠,識(shí)別速度快。
關(guān)鍵詞:EMGUCV,人臉檢測(cè),人臉識(shí)別
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)12-0185-03
Abstract: Emgu CV is OpenCV image processing library encapsulation on DotNet platform, used in face recognition method. This article emphatically introduced EmguCV graphics library applied in face detection, face match, and face recognition in image and in video, with the assist of GPU speeding technology. This implemented procedure was granted 2nd prize in the Advanced Technologies in Huaiyin Normal University. Long-running demos show the procedure worked stably, reliably and quickly.
Key words: EmguCV; Face Detection; Face Recognition
1 背景
人臉識(shí)別作為一種新興的生物特征識(shí)別技術(shù),識(shí)別精確度高,使用方便,識(shí)別速度快,不易仿冒,與虹膜識(shí)別、指紋掃描、掌形掃描等技術(shù)相比,人臉識(shí)別技術(shù)在應(yīng)用方面具有獨(dú)到的優(yōu)勢(shì),基礎(chǔ)資料易于獲得,成本低,易于推廣使用,企業(yè)用戶接受程度非常高。該文基于EmguCV圖像庫(kù)設(shè)計(jì)實(shí)現(xiàn)了人臉識(shí)別的檢測(cè)與識(shí)別、登錄認(rèn)證,以及在視頻流中的人臉識(shí)別方法。
2 實(shí)現(xiàn)方法
Emgu是一個(gè)跨平臺(tái)的、封裝OpenCV的圖像處理庫(kù),允許OpenCV函數(shù)調(diào)用。原生兼容的語言有C#、VB、C++、Python等等,交叉編譯器可以在Mono編譯并運(yùn)行在Windows、Linux、Mac OS X、iPhone、iPad和Android設(shè)備上。眾所周知,Mono的好處是,它可以被交叉編譯,因此能夠在任何平臺(tái)上運(yùn)行Mono支持,包括iOS、Android、Windows Phone、Mac OS X和Linux。Emgu完全由C#編寫,已經(jīng)花了很多的努力,有一個(gè)純C#實(shí)現(xiàn)自頭必須移植,而想要用C++實(shí)現(xiàn),增加一個(gè)頭文件就可以實(shí)現(xiàn)。當(dāng)然,Emgu可以支持幾個(gè)不同的語言,包括C#、VB.NET、C++和Python。Emgu cv的核心由四塊組成(如圖1所示),Emgu.Util.dll負(fù)責(zé).net的接口和封裝,Emgu.CV.dll負(fù)責(zé)圖像處理,Emgu.CV.Ul.dll負(fù)責(zé)UI初始化,Emgu CV.GPU.dll負(fù)責(zé)調(diào)用GPU進(jìn)行圖像處理。
2.1 調(diào)用GPU打開攝像頭
NVIDIA提供了調(diào)用GPU的CUDA核心的接口。在圖像處理的過程中可以借助GPU進(jìn)行加速,大大縮短了程序運(yùn)行所需要的時(shí)間。GPU有著比CPU更佳的圖形計(jì)算性能,CPU是通用運(yùn)算器,而GPU更適合于浮點(diǎn)數(shù)運(yùn)算。人臉識(shí)別算法使用了大量的浮點(diǎn)數(shù)運(yùn)算,GPU的運(yùn)算單元數(shù)量的優(yōu)勢(shì)會(huì)更加的明顯(如表1所示)。目前只有G80、G92、G94、G96、GT200、GF100、GF110、GK100、GK104、GK107平臺(tái)的NVidia顯卡才能使用CUDA,工具集的核心是一個(gè)C語言編譯器。G80中擁有128個(gè)單獨(dú)的ALU,因此非常適合并行計(jì)算,而且數(shù)值計(jì)算的速度遠(yuǎn)遠(yuǎn)優(yōu)于CPU。由于GPU的特點(diǎn)是處理密集型數(shù)據(jù)和并行數(shù)據(jù)計(jì)算,因此CUDA非常適合需要大規(guī)模并行計(jì)算的領(lǐng)域。目前CUDA除了可以用C語言開發(fā),也已經(jīng)提供FORTRAN的應(yīng)用接口,未來可以預(yù)計(jì)CUDA會(huì)支持C++、Java、Python等各類語言??蓮V泛應(yīng)用于圖形動(dòng)畫、科學(xué)計(jì)算、地質(zhì)、生物、物理模擬等領(lǐng)域。
2.2 人臉識(shí)別方法
Emgu CV提供了圖像與編程語言交互的接口,可以方便地把圖像轉(zhuǎn)換為位圖以及數(shù)據(jù)XML,便于采用多種算法來進(jìn)行識(shí)別。
1)人臉檢測(cè)
調(diào)用haarcascade_frontalface_default.xml圖形庫(kù)進(jìn)行識(shí)別,建立200棵樹,進(jìn)行人臉識(shí)別的時(shí)候,GPU進(jìn)行同步加速,起到加速識(shí)別的目的(如圖2)。
2)灰度化
計(jì)算機(jī)的灰度(Gray scale)數(shù)字圖像是每個(gè)像素只有一個(gè)采樣顏色的圖像。這類圖像通常顯示為從最暗黑色到最亮的白色的灰度,盡管理論上這個(gè)采樣可以任何顏色的不同深淺,甚至可以是不同亮度上的不同顏色。灰度圖像與黑白圖像不同,在計(jì)算機(jī)圖像領(lǐng)域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級(jí)的顏色深度。但是,在數(shù)字圖像領(lǐng)域之外,“黑白圖像”也表示“灰度圖像”,例如灰度的照片通常叫做“黑白照片”。在一些關(guān)于數(shù)字圖像的文章中單色圖像等同于灰度圖像,在另外一些文章中又等同于黑白圖像,通常情況下采用二值化法。二值化是圖像分割的一種方法。在二值化圖像的時(shí)候把大于某個(gè)臨界灰度值的像素灰度設(shè)為灰度極大值,把小于這個(gè)值的像素灰度設(shè)為灰度極小值,從而實(shí)現(xiàn)二值化。根據(jù)閾值選取的不同,二值化的算法分為固定閾值和自適應(yīng)閾值。 比較常用的二值化方法則有:雙峰法、P參數(shù)法、迭代法和OTSU法等。
3)直方圖算法
觀察一個(gè)灰度圖像,令[ni]表示灰度i出現(xiàn)的次數(shù),圖像中灰度為i 的像素的出現(xiàn)概率是[pxi=nii,i∈0,…L-1],[L]是圖像中所有的灰度數(shù),[n]是圖像中所有的像素?cái)?shù), [p]實(shí)際上是圖像的直方圖,歸一化到[0..1]。把[c] 作為對(duì)應(yīng)于[p] 的累計(jì)概率函數(shù), 定義為:[ci=j=0ipxj],[c] 是圖像的累計(jì)歸一化直方圖。再創(chuàng)建一個(gè)形式為 [y=Tx] 的變化,對(duì)于原始圖像中的每個(gè)值它就產(chǎn)生一個(gè) [y],這樣 [y] 的累計(jì)概率函數(shù)就可以在所有值范圍內(nèi)進(jìn)行線性化,轉(zhuǎn)換公式定義為:[yi=Txi=ci]。T將不同的等級(jí)映射到 [0..1] 域,為了將這些值映射回它們最初的域,需要在結(jié)果上應(yīng)用下面的簡(jiǎn)單變換:[y′i=yi?max-min+min]。上面描述了灰度圖像上使用直方圖均衡化的方法,但是通過將這種方法分別用于圖像RGB顏色值的紅色、綠色和藍(lán)色分量,從而也可以對(duì)彩色圖像進(jìn)行處理。 把彩色圖像轉(zhuǎn)換為灰度圖像,再利用直方圖算法進(jìn)行比對(duì),比較兩次識(shí)別的人臉是否相似,實(shí)現(xiàn)人臉識(shí)別的認(rèn)證登陸,如圖3所示。
4)近似算法
近似算法的常用設(shè)計(jì)方法有貪心法,線性規(guī)劃、半正定規(guī)劃的松弛和取整,隨機(jī)算法等,該文采用隨機(jī)算法。隨機(jī)化算法(randomized algorithm),是這樣一種算法,在算法中使用了隨機(jī)函數(shù),且隨機(jī)函數(shù)的返回值直接或間接的影響了算法的執(zhí)行流程或執(zhí)行結(jié)果,就是將算法在運(yùn)行的過程中的某一步或某幾步涉及一個(gè)隨機(jī)決策,或者說其中的一個(gè)決策依賴于某種隨機(jī)事件。利用隨機(jī)算法可以彌補(bǔ)攝像頭像素的不足,攝像頭普遍情況下只有130萬像素,分辨率為1280*720,轉(zhuǎn)換為灰度圖像之后進(jìn)行直方圖算法比對(duì)時(shí)可能會(huì)由于精度不夠而產(chǎn)生誤差,所以采用隨機(jī)算法進(jìn)行近似填充,提高圖像的分辨率。圖像的分辨率對(duì)于識(shí)別的正確率有不可忽視的影響,實(shí)驗(yàn)結(jié)果表明低分辨率情況下人臉識(shí)別的準(zhǔn)確率不足80%。
5)視頻流提取
視頻流(Video Stream)是視頻的組成形式。EMGUCV在視頻流中提取圖片的方法,以每秒30幀的視頻為例(如圖4所示),通常視頻由許多幀圖片組成,這就是為什么對(duì)視頻中的人臉進(jìn)行識(shí)別的時(shí)候需要提取視頻流的原因。例如,系統(tǒng)存儲(chǔ)傳入MPEG格式的視頻,同時(shí)創(chuàng)建一個(gè)查找表的邏輯塊地址(logic block address)的內(nèi)存位置存儲(chǔ)幀的視頻。系統(tǒng)采用硬件比較器快速比較MPEG流內(nèi)的幀起始位置,從而創(chuàng)建查找表。MPEG流支持快速隨機(jī)存取到MPEG流邏輯的開始位置,系統(tǒng)存儲(chǔ)查找表和相關(guān)的MPEG流在個(gè)人視頻錄像機(jī)(PVR)硬盤驅(qū)動(dòng)器。系統(tǒng)使用查表快速訪問的各個(gè)幀的起點(diǎn)。系統(tǒng)提供了MPEG幀的內(nèi)容給MPEG減壓器從而提供一個(gè)MPEG流。
2.3 開發(fā)應(yīng)用體會(huì)
假設(shè)視頻大小為720p(一般視頻的質(zhì)量),在當(dāng)前標(biāo)配的一般CPU和GPU性能下,則需要至少30MB的緩沖區(qū)空間進(jìn)行人臉比對(duì),否則將會(huì)容易造成緩沖區(qū)溢出,所以程序運(yùn)行時(shí)峰值內(nèi)存占用不宜超過100MB,這就需要為RAM不足的機(jī)器進(jìn)行優(yōu)化,以提高程序的健壯性與可移植性。
3 結(jié)束語
在當(dāng)今社會(huì)信息安全問題備受人們的關(guān)注。自身安全和個(gè)人隱私保護(hù)成為這個(gè)時(shí)代的熱門話題。基于密碼、個(gè)人識(shí)別碼、磁卡和鑰匙等傳統(tǒng)的安全措施已不能完全滿足社會(huì)要求。在這樣的背景下,人們把目光投向了生物特征識(shí)別技術(shù),來進(jìn)行身份的鑒別或確認(rèn)。人臉識(shí)別作為一種新興的生物特征識(shí)別技術(shù),與復(fù)雜的虹膜識(shí)別、指紋掃描、掌形掃描等技術(shù)相比,人臉識(shí)別精確度高,識(shí)別速度快,不易仿冒,在企業(yè)應(yīng)用與市場(chǎng)推廣方面具有獨(dú)到的優(yōu)勢(shì),基礎(chǔ)資料易于獲得,成本低,使用方便,易于推廣使用,企業(yè)用戶接受程度非常高。
參考文獻(xiàn):
[1] 王映輝. 人臉識(shí)別:原理、方法與技術(shù)[M]. 北京: 科學(xué)出版社, 2010.
[2] Randomized algorithm[EB/OL]. 維基百科, http://en.wikipedia.org/wiki/Randomized_algorithm.
[3] 沈理, 劉翼光, 熊志勇. 人臉識(shí)別原理及算法——?jiǎng)討B(tài)人臉識(shí)別系統(tǒng)研究[M]. 北京: 人民郵電出版社, 2014.
[4] Mark S Nixon. 特征提取與圖像處理 [M] 2版. 北京: 電子工業(yè)出版社, 2010.