国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種基于卷積定理的人臉驗證加速方法與流程

      文檔序號:12064286閱讀:554來源:國知局
      一種基于卷積定理的人臉驗證加速方法與流程

      本發(fā)明屬于計算機視覺中的人臉驗證領(lǐng)域,涉及一種人臉驗證的加速方法,尤其涉及一種基于卷積定理的人臉驗證加速方法。



      背景技術(shù):

      隨著社會的發(fā)展,人們對安全性與便利性的要求日益增加,人臉驗證技術(shù)在近幾十年有了長足的發(fā)展,其具有直接、友好、方便等優(yōu)點,可應用在登陸驗證、身份識別等許多場景,從而得到了廣泛的關(guān)注與研究。人臉驗證的目標為判斷兩張人臉圖片中的人臉是否為同一個人,主要由人臉圖像預處理、特征提取、特征度量等三部分組成。在深度學習提出之后,特別是在卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural networks,CNN)應用在圖像識別領(lǐng)域取得巨大成功后,研究人員意識到CNN在提取圖像特征方面的優(yōu)勢。許多研究人員將CNN應用于人臉驗證系統(tǒng),用于提取人臉特征,實驗表明人臉驗證的正確率有很大的提高,可靠性明顯提升。目前,主流的人臉驗證系統(tǒng)都已采用CNN技術(shù)。

      但是為了提高正確率,人臉驗證系統(tǒng)采用的CNN模型的層數(shù)不斷加深,參數(shù)不斷增多,這些復雜的CNN模型導致的主要問題是計算負擔很大。為此,研究人員采用GPU并行計算設(shè)備計算CNN,來加快人臉驗證系統(tǒng)的運行速度。這種方法只是將卷積計算并行化,并未本質(zhì)上改變卷積的計算方式。很多人臉驗證系統(tǒng)在采用GPU計算后,仍達不到實時性要求或難以處理海量的人臉數(shù)據(jù)。因此,在采用GPU計算設(shè)備的基礎(chǔ)上,進一步提出方法加快人臉驗證的計算速度是很有必要的。



      技術(shù)實現(xiàn)要素:

      針對人臉驗證系統(tǒng)計算負擔大,運行速度慢的問題,本發(fā)明的目的在于提供了一種基于卷積定理進行人臉驗證加速的實現(xiàn)方案。在此基礎(chǔ)上,人臉驗證系統(tǒng)的運行速度明顯提高,對海量數(shù)據(jù)的處理能力得以提升。

      為實現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下。在使用GPU并行計算平臺的基礎(chǔ)上,對滿足加速條件的卷積層,采用卷積定理方法替換常規(guī)卷積計算方法進行卷積計算。卷積定理表明,空域中的卷積等價于頻域中的乘積。通過將耗時的卷積計算轉(zhuǎn)化為頻域中的乘積計算,能夠顯著減少計算量,加快CNN的計算速度,從而提升人臉驗證的速度。

      描述本方法所用符號如下:

      本方法流程如圖1所示,包括六個步驟:

      步驟1:由卷積層輸入?yún)?shù)判斷是否滿足加速條件。

      首先根據(jù)卷積層的輸入?yún)?shù),判斷是否滿足卷積定理的加速條件。標準的卷積計算方法是采用多重循環(huán)嵌套進行計算,其時間復雜度Cstd約為Cstd≈M2P2,整個卷積層的時間復雜度Cstd_layer約為Cstd_layer≈KLCstd。卷積定理算法流程中,快速傅里葉變換(Fast Fourier Transformation,F(xiàn)FT)的時間復雜度CFFT約為頻域乘積求和的時間復雜度Cmul約為Cmul≈4M2。卷積定理的時間復雜度Cconv約為Cconv≈3CFFT+Cmul。整個卷積層采用卷積定理的時間復雜度Cconv_layer約為Cconv_layer≈KCFFT+LCFFT+KLCmul。通過Cstd_layer和Cconv_layer的對比得出,Cconv_layer與卷積核尺寸P無關(guān),并且當滿足K+L<<KL時,采用卷積定理計算卷積能顯著減少計算量。

      步驟2:輸入圖像和卷積核尺寸擴充。

      為了應用卷積定理計算卷積,首先要將輸入圖像和卷積核擴充至相同尺寸。為了避免因為周期性問題而導致的混淆錯誤,輸入圖像的擴充尺寸M′要求滿足M′≥M+P-1。擴充后在原數(shù)據(jù)右下方補零填充,如圖2所示。卷積運算中的數(shù)據(jù)都是由四維構(gòu)成的,四維數(shù)據(jù)的尺寸以下標大寫字母形式的表示,輸入圖像具體表示為xS*K*M*M。在以下文字敘述中,為敘述簡潔,數(shù)據(jù)不列出下標。輸入圖像簡寫為x,x′表示尺寸擴充后的輸入圖像。輸入圖像尺寸擴充操作表示為:

      卷積核具體表示為wL*K*P*P,簡寫為w,w′表示尺寸擴充后的卷積核,尺寸擴充操作為:

      輸入圖像和卷積核延拓后尺寸相同,即M+Q=P+Q′。

      步驟3:輸入圖像和卷積核傅里葉變換。

      利用傅里葉變換將圖像從空域變換至頻域。根據(jù)Hermitian對稱性,傅里葉變換后的數(shù)據(jù)存在一半的冗余,因此只需存儲和計算一半數(shù)據(jù)。用x″表示頻域中的輸入圖像,輸入圖像的傅里葉變換表示如下:

      用w″表示頻域中的卷積核。卷積核的傅里葉變換表示如下:

      步驟4:頻域乘積求和計算。

      頻域的乘積求和公式定義為:

      其中,out表示頻域乘積求和計算結(jié)果,s表示S張輸入圖像中第s張,l表示L個卷積核個第l個,k表示K個輸入圖像通道中第k個,m,n表示二維頻域中的像素位置。

      對于頻域中乘積求和計算,直接方法是采用循環(huán)嵌套來計算,但無疑效率較低。為了充分利用GPU的并行計算能力,本方法將循環(huán)嵌套轉(zhuǎn)換為矩陣相乘形式來完成頻域中乘積求和計算。

      若要采用矩陣乘積完成計算,首先要將輸入圖像和卷積核由主通道存儲重排列為主像素存儲,完成批量矩陣相乘,之后將運算結(jié)果反重排列。

      步驟4.1:輸入圖像和卷積核重排列。

      x″′表示重排列后的輸入圖像,輸入圖像的重排列操作表示為:

      w″′表示重排列后的卷積核,卷積核的重排列操作表示為:

      步驟4.2:批量矩陣乘積計算。

      在完成數(shù)據(jù)重排列后,將x″′的(m,n)處后兩維(s,k)視為一個大小為(S,K)的矩陣,w″′的(m,n)處后兩維(l,k)視為另一個大小為(L,K)的矩陣,進行矩陣相乘。如此便完成了(m,n)像素位置處的頻域乘積求和計算。矩陣乘積運算批量進行(M+Q)*((M+Q)/2+1)次,便完成全部數(shù)據(jù)的頻域乘積求和運算。out代表矩陣乘積計算后的結(jié)果,表示如下:

      步驟4.3:計算結(jié)果反重排。

      out′為out反重排的結(jié)果,反重排列操作表示為:

      步驟5:計算結(jié)果傅里葉反變換。

      對out′進行傅里葉反變換前,先根據(jù)Hermitian對稱性填充另一半數(shù)據(jù),然后再做傅里葉反變換,out″為out′傅里葉反變換的結(jié)果,得到:

      步驟6:計算結(jié)果邊界裁剪。

      由于在進行傅里葉變換前,將輸入圖像和卷積核的尺寸都進行擴充,所以需要對計算結(jié)果的右下方進行裁剪。根據(jù)卷積的定義,應保留尺寸為M-P+1,即:

      out″′即為卷積運算的最終結(jié)果。

      本發(fā)明具有如下有益效果。

      1、本發(fā)明提出的加速方法具有無精度損失的優(yōu)點,不會影響人臉驗證的正確率。

      2、本發(fā)明方法可直接運行在通用GPU計算設(shè)備,不需要額外的硬件設(shè)備。

      附圖說明

      圖1方法流程圖

      圖2輸入圖像補零填充示意圖

      圖3輸入圖像的數(shù)據(jù)重排列示意圖

      圖4輸入圖像與卷積核矩陣乘積計算示意圖

      具體實施方式

      以下將結(jié)合附圖和實施例對本發(fā)明作進一步詳細說明。本發(fā)明中,以GPU作為計算平臺,采用CUDA作為GPU并行計算框架,選取Caffe作為CNN框架。

      具體實施步驟如下:

      步驟1:由卷積層輸入?yún)?shù)判斷是否滿足加速條件。

      當K、L都大于100或P大于5時,本方法能取得加速效果。

      步驟2:輸入圖像和卷積核尺寸擴充。

      采用CUDA_KERNEL_LOOP并行循環(huán),新建N個線程,每個線程處理圖像中的一個像素點的擴充操作,N個線程并行進行擴充操作。

      對輸入圖像和卷積核的尺寸進行擴充,需要額外的緩存空間。每個卷積層的參數(shù)不相同,需要的緩存空間大小因此也不相同。為避免消耗過多內(nèi)存,在初始化時離線計算出各卷積層需要的緩存空間,一次性分配其中的最大值。在運行時各卷積層共用這一塊緩存區(qū)域,而不再為它們單獨分配緩存,以此節(jié)省內(nèi)存。

      步驟3:輸入圖像和卷積核傅里葉變換。

      采用CUDA提供的cuFFT庫來實現(xiàn)傅里葉變換。在初始化時,對各個卷積層,使用cufftPlanMany函數(shù)來創(chuàng)建傅里葉變換計劃,它能夠同時指定多個傅里葉變換。cufftPlanMany函數(shù)需要指定數(shù)據(jù)的內(nèi)存格式,以便確定每個傅里葉變換所需數(shù)據(jù)的輸入輸出位置。對于二維傅里葉變換,其輸入和輸出數(shù)據(jù)的內(nèi)存格式分別為:

      input[b*idist+(x*inembed[1]+y)*istride] (12)

      output[b*odist+(x*onembed[1]+y)*ostride] (13)

      其中,x,y為二維數(shù)據(jù)中的坐標,b為數(shù)據(jù)序號,idist為兩個數(shù)據(jù)之間的距離,inembed為二維數(shù)據(jù)的尺寸,istride為跨度。輸出數(shù)據(jù)output同理。

      在運行時,調(diào)用cufftExecR2C函數(shù),它根據(jù)傅里葉變換計劃來完成傅里葉變換。訓練完畢的CNN卷積核的數(shù)值將不再改變。因此預先進行各卷積層的卷積核尺寸擴充和傅里葉變換計算,并將結(jié)果保存起來留待測試時使用,從而節(jié)約計算時間。

      步驟4:頻域乘積求和計算。

      采用cuBLAS矩陣計算庫,完成數(shù)據(jù)的重排列和矩陣乘法計算。

      步驟4.1:輸入圖像和卷積核重排列。

      為了用cuBLAS庫來實現(xiàn)矩陣相乘,在將在同一像素位置處的{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}組成一個矩陣時,需要在內(nèi)存中連續(xù)存儲。但在完成傅里葉變換后,x″是以行為主存儲的,即在內(nèi)存中依次按(s,k,m,n)的次序存儲,先存儲第0幅圖像第0通道的各個傅里葉系數(shù)值,之后存儲第0幅圖像第1通道的各個傅里葉系數(shù)值,依次類推;因此,在內(nèi)存中{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}并不連續(xù)存儲,需要先將數(shù)據(jù)重新排列,使其轉(zhuǎn)換為在內(nèi)存中以(m,n,s,k)的次序來存儲,從而{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}變?yōu)檫B續(xù)存儲。

      數(shù)據(jù)重排列通過矩陣轉(zhuǎn)置來實現(xiàn)。x″中,將x″的四維數(shù)組視為一個矩陣,前兩維(s,k)和后兩維(m,n)分別作為矩陣的行和列。將x″進行矩陣轉(zhuǎn)置后得到x″′,則x″′的每行(m,n)對應于該像素位置處的{x"s,k|s=0,1,2....S-1;k=0,1,2,....K-1}集合。由于在以行為主存儲時矩陣中每行的數(shù)據(jù)是連續(xù)存儲的,因此{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}將連續(xù)存儲。上述數(shù)據(jù)重新排列如圖3所示。

      使用cublasCgeam函數(shù)來完成矩陣轉(zhuǎn)置,矩陣轉(zhuǎn)置執(zhí)行的操作為:

      C=αopA(A)+βopB(B) (14)

      其中,op代表是否轉(zhuǎn)置操作。參數(shù)設(shè)置為:α=1,β=0,opA=T,即可得到轉(zhuǎn)置操作:C=AT。設(shè)置A=x″,C=x″′時,實現(xiàn)了輸入圖像數(shù)據(jù)的重排列。設(shè)置A=w″,C=w″′時,實現(xiàn)卷積核數(shù)據(jù)的重排列。

      步驟4.2:批量矩陣乘積。

      當只考察單個像素位置(m,n)時,如果把在(m,n)處的所有輸入圖像和所有通道的F(xs,k)(即x"s,k)值組成一個矩陣A,其行數(shù)和列數(shù)分別為S和K,再把(m,n)處的所有卷積核和所有通道的w"l,k值組成另一個矩陣B,其行數(shù)和列數(shù)分別為L和K,則用矩陣乘積A*BT就能夠一次性求出所有S個輸入圖像和所有L個卷積核在(m,n)處的卷積結(jié)果,如圖4所示。矩陣乘法通過GPU上的cuBLAS計算庫來實現(xiàn),且不同像素位置處的矩陣乘積計算成批進行,從而完成頻域中的乘積求和計算。

      CUDA中提供cublasCgemmBatched函數(shù)來批量完成多個矩陣相乘計算,與循環(huán)調(diào)用矩陣相乘相比,效率更高。

      cublasCgemmBatched函數(shù)執(zhí)行的運算為:

      C[i]=α(opA(A[i])*opB(B[i]))+βC[i],i∈[0,batchCount-1] (15)

      其中,i為批序號,batchCount為批量計算數(shù)量。令A為輸入圖像矩陣,B為卷積核矩陣,C為運算結(jié)果矩陣,batchCount設(shè)置為像素的數(shù)目,即:(M+Q)*((M+Q)/2+1)。參數(shù)設(shè)置為α=1,β=0,opA=N,opB=T,即矩陣A不轉(zhuǎn)置,B轉(zhuǎn)置。

      cublasCgemmBatched函數(shù)要求指定每批數(shù)據(jù)中A[i],B[i],C[i]等的起始地址。輸入圖像中,若x″′為輸入圖像數(shù)組的起始地址,則各批數(shù)據(jù)的起始地址為:

      步驟4.3:計算結(jié)果反重排。

      計算結(jié)果反重排實現(xiàn)方式與4.1中類似,設(shè)置參數(shù)為A=out,C=out′完成反重排操作。

      步驟5:計算結(jié)果傅里葉反變換。

      實現(xiàn)方式與步驟3中類似,調(diào)用cufftExecC2R函數(shù)完成傅里葉反變換操作。

      步驟6:計算結(jié)果邊界裁剪。

      新建一塊尺寸為(M-P+1)*(M-P+1)的內(nèi)存空間,用以存放最終運算結(jié)果。采用CUDA_KERNEL_LOOP并行循環(huán),新建N個線程,N個線程并行處理,將out″中應保留的數(shù)據(jù)拷貝至最終運算結(jié)果的內(nèi)存空間。

      下面給出本發(fā)明的一個測試結(jié)果。選取Xiang Wu等人提出的“l(fā)ightened modelA”人臉驗證CNN模型進行試驗,實驗環(huán)境如下。GPU型號為GTX 860M,CUDA 7.0版本,每批輸入圖像的數(shù)量為8,共輸入1000批人臉圖像進行試驗。結(jié)果為:

      從以上實驗可以看出,本發(fā)明方法相較于常規(guī)卷積計算方法能取得明顯加速效果。

      當前第1頁1 2 3 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1