江 航,董蘭芳
(中國科學技術大學 計算機科學與技術學院,合肥 230027)
人臉檢測是計算機視覺領域的基礎問題之一,它也是許多人臉相關工作的起始步驟,例如人臉對齊、人臉識別、表情識別等.同時近年來卷積神經(jīng)網(wǎng)絡也在圖像處理領域取得了巨大的突破,人臉檢測這一經(jīng)典的圖像處理問題也成功地應用在人們的日常生活中.
最早的人臉檢測方法主要是通過設計魯棒的特征然后利用這些特征來訓練分類器以達到人臉檢測的目的.例如經(jīng)典的Viola-Jones人臉檢測器[1],就是通過設計haar特征,然后利用adaboost方法來訓練分類器的.欒方軍等人[16]在Viola-Jones人臉檢測器基礎上提出一種多種特征融合的adaboost快速訓練人臉分類器.DPM[2]來進行人臉檢測在當時也取得了很好的效果,該方法是先計算梯度直方圖,然后使用SVM來訓練得到物體的梯度模型.這些方法非常依賴設計的特征而且該方法僅僅考慮圖像局部的情況,使得整個檢測器的結果并不是最優(yōu)的.任克強等人[14]為彌補上述算法易陷入局部最優(yōu)的不足,結合人工魚群算法和粒子群優(yōu)化算法來尋找最優(yōu)特性.盡管這類方法在人臉檢測上并不能獲得很好的效果但是卻可以在CPU上實時的運行.
另一種方法是基于卷積神經(jīng)網(wǎng)絡的人臉檢測.最開始Vaillant[3]等訓練一個基于滑動窗口的方法的卷積神經(jīng)網(wǎng)絡人臉檢測器.CascadeCNN[4]將卷積神經(jīng)網(wǎng)絡級聯(lián)起來的結構檢測人臉,前面的簡單網(wǎng)絡拒絕絕大部分非人臉區(qū)域,將難以分辨的交由下一級更復雜的網(wǎng)絡.MTCNN[5]提出一個多任務級聯(lián)網(wǎng)絡框架同時進行人臉檢測和人臉特征點定位.這些基于卷積神經(jīng)網(wǎng)絡的方法雖然比早期手工設計特征方法效果更好,但是它們的速度會隨著圖像中人臉數(shù)目增加而急劇下降.目前目標檢測主要可以分為以Faster-RCNN[6]為代表的二階段框架和以YOLO[8]、SSD[7]為代表的一階段框架.一些人臉檢測器把人臉檢測當成目標檢測的一種,把目標檢測的方法應用到人臉檢測上面來.雖然這些基于目標檢測的方法在公開數(shù)據(jù)集上取得了當前最好的效果,但是這些框架太消耗計算資源,無法在CPU上面實時運行.
本文借鑒了Faster-RCNN的區(qū)域建議網(wǎng)絡和SSD的多尺度檢測機制,提出了可以在CPU上實時運行并且有著很高精度的人臉檢測器.首先本文提出了一個只含有卷積層的輕量型卷積網(wǎng)絡,并且可以進行端到端的訓練和識別.這個十分有效且輕量的網(wǎng)絡結構如圖1所示.除此之外本文為了解決淺層特征圖上anchor密度小的問題,對低密度層特征圖上的anchor進行稠密化處理;對相鄰兩個特征圖進行融合從而加強當前特征圖的檢測效果;修改人臉分類損失函數(shù),使其更關注比較難分類的樣本,否則梯度可能在大量簡單樣本的影響下無法達到全局最優(yōu)的結果.實驗表明,本文提出的方法可以在CPU上實時運行,并且保持很高的準確率.
圖1 整體框架結構圖Fig.1 General framework structure
本文采用的是基于CNN的端到端的人臉檢測框架,具體結構如圖1所示,整個檢測算法如算法1所示.
算法1.人臉檢測算法
輸入:待檢測人臉圖片
輸出:返回一個個人臉框(中心坐標與寬高)
1)圖片預處理,將圖片調整到640*640并且將圖片像素調整到0-1之間;
2)將預處理圖片輸入基礎網(wǎng)絡(2.1詳細介紹);
3)將步驟2得到的特征圖按照連接層(2.2詳細介紹)依次融合到一起;
4)將步驟3得到的特征圖經(jīng)過檢測層(2.3詳細介紹)給出預測;
5)根據(jù)步驟4輸出,得到人臉的置信度以及該位置人臉相對于anchor的偏移;
6)將步驟5中的置信度返回,并且根據(jù)該位置anchor得到人臉中心坐標與寬高.
7)對步驟6中返回人臉做nms(非極大值抑制),消除重疊人臉框.
基礎網(wǎng)絡的詳細結構如表1所示.首先通過一個7*7的卷積核來獲得較大感受野,同時設置步長為2來縮小卷積后特征圖的大小從而加快運行時的速度.Wenling Shang[9]等人指出網(wǎng)絡的前面部分,網(wǎng)絡傾向于同時捕獲正負相位的信息,但Relu激活函數(shù)會抹掉負響應,造成卷積核存在冗余.根據(jù)這個結論設置第一個卷積層激活函數(shù)為CRelu,就是將原始特征圖與取反后的特征圖分別通過Relu,最后連接到一起.
在隨后的特征圖上為了減少網(wǎng)絡的參數(shù)提高網(wǎng)絡傳播速度,設計了一種瓶頸的網(wǎng)絡結構.先通過1*1的卷積核來降低傳入特征圖通道數(shù)(本文設置大小減為原來1/2倍),接著通過一個3*3的卷積核來增大感受野同時減小特征圖的寬高(本文設置大小減半),最后再通過1*1卷積核來提升特征圖通道數(shù)(本文設置大小增大原來4倍).通過文中這個結構可以達到VGG[10]特征圖寬高減半、通道數(shù)加倍的效果.
可以簡單說明一下網(wǎng)絡參數(shù)的縮小效果,假設一個W*H*C的特征圖如果通過傳統(tǒng)的3*3卷積核來增加通道數(shù)需要2C組3*3*C的卷積核,也即需要18*C*C個參數(shù).如果通過本文的瓶頸式結構先通過1*1降維需要C/2組1*1*C,再通過3*3擴大感受野需要C/2組3*3*C/2,最后通過1*1升維需要2C組1*1*C/2,共需要15/4*C*C.綜上所述改進后結構參數(shù)量是原始量的5/24倍.所以本文極大減少了基礎網(wǎng)絡的參數(shù)量.(表1中Conv2_1-Conv7每個卷積操作后面都跟有一個Batch Normalization層和一個激活層,表1中 未畫出,這兩個層不會帶來額外的參數(shù).)
表1 基礎網(wǎng)絡結構
Table 1 Structure of base network
各層名稱每層的操作Conv1Convolutionmaps:16,k:7*7,s:2,p:3BatchNormalizationCReluConv2_1Convolutionmaps:16,k:1*1,s:1,p:0Convolutionmaps:16,k:3*3,s:2,p:1Convolutionmaps:64,k:1*1,s:1,p:0Conv2_2Convolutionmaps:16,k:1*1,s:1,p:0Convolutionmaps:16,k:3*3,s:1,p:1Convolutionmaps:64,k:1*1,s:1,p:0Conv3_1Convolutionmaps:32,k:1*1,s:1,p:0Convolutionmaps:32,k:3*3,s:2,p:1Convolutionmaps:128,k:1*1,s:1,p:0Conv3_2Convolutionmaps:32,k:1*1,s:1,p:0Convolutionmaps:32,k:3*3,s:1,p:1Convolutionmaps:128,k:1*1,s:1,p:0Conv4_1Convolutionmaps:64,k:1*1,s:1,p:0Convolutionmaps:64,k:3*3,s:2,p:1Convolutionmaps:256,k:1*1,s:1,p:0Conv4_2Convolutionmaps:64,k:1*1,s:1,p:0Convolutionmaps:64,k:3*3,s:1,p:1Convolutionmaps:256,k:1*1,s:1,p:0Conv5Convolutionmaps:128,k:1*1,s:1,p:0Convolutionmaps:256,k:3*3,s:2,p:1Conv6Convolutionmaps:128,k:1*1,s:1,p:0Convolutionmaps:256,k:3*3,s:2,p:1Conv7Convolutionmaps:128,k:1*1,s:1,p:0Convolutionmaps:256,k:3*3,s:2,p:1
本節(jié)將對本文提出的基礎網(wǎng)絡與近年提出的輕量型模型SqueezeNet[17]、MobileNet[18]、ShuffleNet[19]、Xception[20]的網(wǎng)絡架構進行對比分析.
SqueezeNet[17]核心架構在于Fire模塊,Fire模塊有兩層組成,一層是壓縮層,壓縮層是通過1*1卷積核降低輸入卷積特征圖的維度;另一層是擴展層,擴展層有兩個分支,分別通過1*1和3*3的卷積核的卷積層,然后將得到的特征圖拼接起來.Fire模塊詳細結構如圖2所示,N>A.
圖2 Fire模塊示意圖Fig.2 Fire module schematic
Fire模塊核心思想是通過1*1降低輸入特征圖通道數(shù)來減少網(wǎng)絡模型的參數(shù)量.然后通過擴展層3*3分支卷積核來提取特征,另一個1*1分支卷積核是為了對原有特征圖進行信息整合,最后,將兩個分支拼接起來組成輸出特征圖.
圖3 深度卷積示意圖Fig.3 Depthwise convolutional schematic
MobileNet[18]主要使用深度卷積來代替標準卷積來降低模型參數(shù)量.所謂深度卷積,也就每個卷積核只對輸入特征的一個通道卷積,這樣就會大大減少參數(shù)量.因為如果只使用深度卷積就會造成特征圖之間信息不流暢,所以MobileNet在深度卷積后面還接上一層逐點卷積用于特征層之間交換信息.圖3、圖4展示了分組卷積和逐點卷積詳細結構.
圖4 逐點卷積示意圖Fig.4 Pointwise convolutional schematic
ShuffleNet[19]也是利用深度卷積的方式來減少網(wǎng)絡模型的參數(shù)量,只是該模型并沒有使用逐點卷積來改善組間信息不流暢的問題,而是使用打亂通道的方式.打亂通道詳細結構如圖5所示.
Xception[20]也是使用深度卷積來降低網(wǎng)絡中的參數(shù)量,與MobileNet不同的是,Xception將逐點卷積放在深度卷積前面來達到改善組間信息不流暢的問題.
本文的模型是采用1*1卷積核降低輸入特征圖通道數(shù),然后采用3*3卷積核提取卷積特征圖特征,最后在使用1*1卷積核提升通道數(shù).
表2對比了相關網(wǎng)絡輕量化的技巧,本文選用1*1卷積核降低輸入特征圖維度的技巧來減少網(wǎng)絡模型的參數(shù)量.而并沒有在中間3*3卷積核處使用分組卷積,是因為相較于標準卷級,分組卷積會造成一定的信息損失.
圖5 打亂通道示意圖Fig.5 Channel shuffle schematic
由于低層卷積特征圖的語義信息比較少,但是目標位置準確;高層的卷積特征圖語義信息比較豐富,但是目標位置比較粗略.所以本文設計了連接層這一結構,將相鄰兩個卷積特征圖進行融合,在融合后的卷積特征圖上檢測人臉.
表2 網(wǎng)絡輕量化技巧對比
Table 2 Comparison of network lightweight skills
網(wǎng)絡名稱輕量化技巧SqueezeNet1*1卷積核MobileNet深度卷積ShuffleNet深度卷積Xception深度卷積Ours1*1卷積核
與FPN[11]使用一個自底向上的線路,接著一個自頂向下的線路,然后橫向連接的結構不同,本文采用將相鄰兩層的卷積特征圖進行融合(如圖1所示).這是由于高層的特征圖已經(jīng)丟失了太多細節(jié)融合意義不大,同時只使用相鄰兩層也會減少計算量.
圖6 連接層示意圖Fig.6 Connection layer schematic
連接層的具體操作如圖6所示,將高層特征圖2倍上采樣然后與底層特征圖相加,再通過一個3*3的卷積操作.通過3*3的卷積層主要是為了消除上采樣后的混疊效應.然后在融合后的特征圖上檢測人臉.
為了使生成的特征圖包含特征更豐富,借鑒了GoogleNet[12]的優(yōu)良局部拓撲結構網(wǎng)絡,就是對輸入特征圖并行的執(zhí)行多個卷積運算或者池化操作,并將所有輸出結果連接到一起形成一個新的特征圖.因為不同的卷積運算與池化操作可以獲得輸入特征圖的不同信息,并行處理這些運算并結合所有結果將獲得更好的圖像表征.詳細結構如圖7所示,檢測層共有三個分支,一個分支通過1*1的卷積核,降低輸入特征圖維度,一個分支通過一個3*3的卷積核,一個分支通過兩個3*3的卷積核,然后將三個分支連接到一起,形成最后用于檢測的特征圖.這樣形成的特征圖上由于每個分支的感受野不同,相當于經(jīng)過了不同的卷積運算,生成特征圖包含了更多的信息.
圖7 檢測層示意圖Fig.7 Detection layer schematic
如圖1所示,從Conv4_2、Conv5、Conv6、Conv7經(jīng)過連接層和檢測層共生成大小為40*40*256、20*20*256、10*10*256、5*5*256的4種特征圖.淺層特征圖感受野較小適合檢測小的人臉尺寸,較深的特征圖感受野較大更適合檢測比較大的人臉尺寸.對每層特征圖設置了1:1的默認anchor,這是因為人臉比例接近正方形.每層檢測的人臉尺寸如表3所示.
表3 每層檢測人臉框尺寸
Table 3 Each layer detects face size
檢測層名稱設置anchor大小Conv4_216*16Conv532*3264*64Conv6128*128256*256Conv7512*512
每一層的anchor密度為該層anchor的長或寬除以該層總步長,例如Conv4_2層的總步長為16,其anchor長為16,故該層anchor密度為1.同理Conv7層的anchor密度為4,Conv5由于檢測兩種尺寸的anchor需要分別計算,anchor尺寸為32*32密度為1,anchor尺寸為64*64密度為2,Conv6由于檢測兩種尺寸的anchor需要分別計算,anchor尺寸為128*128密度為2,anchor尺寸為256*256密度為4.
顯然每層的anchor密度并不相同,為了保證每層的anchor密度相同,需要對anchor進行稠密化.只有當每層anchor密度相同時,單位像素人臉才會對應相同的anchor數(shù)目,當提高低密度層的anchor數(shù)目也會提高該層人臉召回率.
根據(jù)上面的計算,需要將每層anchor密度保持為4,因為最大的anchor密度就是4,向最大密度對齊.同時為了使一層的anchor密度提高n倍,需要將n*n(長和寬方向都需要擴大n倍)個anchor均勻分布在原始的anchor中心.圖8展示了anchor密度增大2倍的過程,黑點代表原始特征圖上一個特征點,正方形框代表以特征點為中心的anchor.
圖8 anchor稠密化舉例Fig.8 Examples of anchor densification
因此conv4_2特征圖上對于16*16的anchor需要擴大4倍,conv5特征圖上對于32*32的anchor需要擴大4倍,對于64*64的anchor需要擴大2倍,conv6特征圖上對于128*128的anchor需要擴大2倍,對于256*256的anchor需要擴大1倍,conv7特征圖上對于512*512的anchor需要擴大1倍.在每層特征圖上設置anchor后,每個anchor需要預測6個變量,其中2個是該anchor的類別即是否為人臉,另外4個是該anchor位置偏移(只有anchor類別是人臉時,這4個變量才有意義.)如表4所示.
表4 每層預測變量維度
Table 4 Predictor dimension per layer
檢測層名稱 卷積操作 預測變量維度Conv4_23*3*(2+4)*1640*40*(2+4)*16Conv53*3*(2+4)*2020*20*(2+4)*20Conv63*3*(2+4)*510*10*(2+4)*5Conv73*3*(2+4)*15*5*(2+4)*1
在損失層需要分別計算人臉分類損失和人臉位置損失.首先來介紹分類損失,檢測層設置的anchor與人臉標簽框計算iou(anchor的面積與人臉標簽的面積的交集除以anchor的面積與人臉標簽框的面積的并集).如果iou大于0.35,就記為正樣本,即該anchor負責回歸人臉標簽框;如果iou小于0.35,就記為負樣本;如果一個人臉標簽框與所有anchor的iou都小于0.35,就找出與該人臉標簽框最大iou對應的anchor記為正樣本負責回歸該人臉標簽框.
常用的用來計算分類損失為二分類損失如公式(1)所示,其中yi為標簽即上文所述的正負樣本,hθ(x)為網(wǎng)絡最后一層激活函數(shù)的輸出,在0-1之間.對于正樣本而言,輸出概率越大損失越小.對于負樣本而言,輸出概率越小則損失越小.此時的損失函數(shù)在大量易分類樣本的迭代過程中下降比較緩慢并且可能無法優(yōu)化至全局最優(yōu).改進后的新分類損失如公式(2)所示,首先在原有的基礎上加了一個平方因子,減少容易分類樣本的損失,使得更關注于困難的、易錯分的樣本.例如對于正類樣本而言,預測結果為0.99應屬于簡單易分類正樣本,需要降低此類樣本的損失值,而預測結果為0.6屬于較難區(qū)分的正樣本,需要相對增大此類樣本的損失值,添加一個平方因子剛好達到了這樣的效果.對于負類樣本而言也因如此,預測0.1的結果應當相比于預測0.4的樣本損失值要小很多.對于預測概率為0.5時,損失只減少為原來的0.25倍.綜上所述,改進后的新分類損失函數(shù)減少了簡單易分類樣本的影響,更關注困難樣本.
-yilog(hθ(x))-(1-yi)log(1-hθ(x))
(1)
(2)
對于人臉位置損失,只有標為正樣本的anchor才需要計算位置損失,對于負樣本計算位置損失沒有任何意義.公式(3)-公式(6)是將人臉標簽框歸一化,其中x,y, w,h是人臉標簽框的中心坐標與寬高,xa,ya,wa,ha是對應的anchor的中心坐標與寬高。再根據(jù)公式(7)smoothL1計算標簽與預測值之間的損失,采用smoothL1原因是該函數(shù)對離群點更加魯棒。位置損失函數(shù)如公式(8)所示,其中px,py,pw,ph是網(wǎng)絡預測的位置偏.
tx=(x-xa)/wa
(3)
ty=(y-ya)/ha
(4)
tw=log(w/wa)
(5)
th=log(h/ha)
(6)
(7)
(8)
結合分類損失函數(shù)與位置損失函數(shù),整體損失函如公式(9)所示.
(9)
訓練數(shù)據(jù)集:采用公開數(shù)據(jù)集WIDER FACE[13]的12880人臉標注圖像作為訓練集.
數(shù)據(jù)增強:對訓練圖像主要進行隨機裁剪、隨機翻轉、隨機改變圖像亮度、對比度、飽和度等數(shù)據(jù)增強策略.這樣即可以擴大數(shù)據(jù)集,同時使訓練出來的模型更加魯棒.
困難負樣本挖掘:經(jīng)過anchor匹配策略后,絕大多數(shù)anchor是負樣本,正樣本會被淹沒在負樣本中.為了解決這個問題,對負樣本的loss值進行排序,取最大loss值對應的負樣本,并且將負樣本數(shù)目最大值控制在正樣本數(shù)目的3倍.
其他訓練細節(jié):實驗基于Pytorch框架,此次實驗基于GTX 1080.模型中所有參數(shù)隨機使用” Xavier ”方法初始化.采用”Adam”方法優(yōu)化參數(shù),weight_decay=0.0004,學習率初始化為0.001,總共訓練了300個epoch,在epoch為200,250學習率變?yōu)樵瓉淼?.1倍.
在檢測階段,模型會輸出很多的預測框,設置置信度為0.1來過濾掉置信度小于0.1的預測結果,接著再對剩余的預測框執(zhí)行nms(非極大值抑制)操作來去除重疊框,設置重疊閾值為0.35,然后將剩余的結果作為最終預測結果.
在公開數(shù)據(jù)集FDDB[15]上使用上段所述的方法進行檢測并將檢測結果與其他公開方法進行比較.比較結果如表4所示.
從表4中可以看出本文的方法有著很高的精度,不僅相較Faster-RCNN這種大模型(整體模型大小約333M)只有一點差距,而且相比于傳統(tǒng)的VJ[1]檢測器以及以滑窗方法為基礎的檢測器CasCNN[4]、MTCNN[5]也有較大提升.除此之外,本文的方法在CPU(i7-2600@3.4GHz)檢測一張圖片只需要0.15秒,訓練好的模型大小只有17.6M(本文使用的測試圖片中,正臉數(shù)超過10).Faster-RCNN無法在CPU環(huán)境下實時檢測,故沒有列出檢測時間,但是Faster-RCNN在GPU(Tesla K40c)檢測一張圖片也需要0.38秒.
為了分析本文提出方法的有效性,在FDDB[15]上做了對比試驗.在對比實驗中,只是修改了某個特定的設置,實驗中其他參數(shù)保持不變.對比實驗結果如表5所示.
表5 不同方法的對比實驗
Table 5 Comparison experiment of different methods
檢測方法檢測精度檢測時間(s)VJ[1]68.5%0.10CasCNN[4]85.6%0.17MTCNN[5]95.1%0.12Faster-RCNN[6]96.1%-Ours95.9%0.15
表6 技巧對比實驗
Table 6 Tips comparison experiment
技巧使用與否新分類損失使用否否否Anchor稠密化使用使用否否連接層使用使用使用否精度95.9%95.3%94.4%93.4%
從表6看,新分類損失函數(shù)、Anchor稠密化、連接層這些創(chuàng)新點都是行之有效,都給實驗結果的精度帶來了不同程度的提升.新分類損失函數(shù)主要是模型在訓練過程中更加關注樣本中比較難以區(qū)分的部分,Anchor稠密化主要增加anchor數(shù)目來提高了人臉召回率,連接層則使當前層特征更加魯棒.
本文提出一個端到端的、快速的、精確的人臉檢測方法.首先為了提高運行速度對提取特征的基礎網(wǎng)絡進行輕量化,然后為了加強每層的特征表達對相鄰特征層進行融合,最后為了提高人臉召回率對anchor做了稠密化處理和對分類損失函數(shù)進行修改.實驗結果表明本文在減小基礎網(wǎng)絡參數(shù)的情況下仍然有著很高的準確率.本文對于小尺寸人臉不是很魯棒,下一步工作將關注小尺寸人臉的檢測工作.