1. 程式人生 > >神經網路的設計

神經網路的設計

網路的設計

幾種卷積的介紹

  • Spital Convolution
  • Depthwise Convolution
  • Deformable Convolution
  • Dilated Convolution

網路的幾個常用Block

  • Inception
  • Bottleneck
  • Residual Connection
  • Inverted Residual Block
  • Dense Connection
  • SE
  • Nasnet系列

###########################

MTCNN優化和另類用法

MTCNN是目前應用十分廣泛的基於級聯的特定目標檢測器,也是少數能在傳統硬體上落地的檢測器,當然其優勢不光光僅僅用於人臉檢測這個任務。在人臉這個任務上,在少數人臉<5個人臉的情況下。其效能是第一梯隊的水準。而且有著極大的優化空間(加上一些trick可以輕易的優化到極快的速度移動端 minSize60 60fps 1080p mt.)。而且其Alignment的準確率和精度也相對相對比較高,在工業界的人臉識別工作中,往往都採用MTCNN的點位來進行對齊。

人臉跟蹤是一項很重要的任務,cascade based檢測模型,在人臉基數增大的同時,往往速度上容易爆炸,在工程應用中往往需要極致的速度。在有些效率比較低的ARM板子上,一些correlation filter tracker都不能取得很好的時效性。

MTCNN的多工特性為我們權衡這個問題提供的特別巧妙的方法。

MTCNN的優化

MTCNN (Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks)是Kaipeng Zhang在2016年提出的Face Detector,也是基於Cascade CNN來改進的Face Detector。文章認為人臉檢測任務中的 face bounding box regression 和 landmark 任務存在潛在關係,可以提高人臉檢測效果。由於其多工和全卷積的特性其速度要比Cascade CNN要快不少。由於MTCNN訓練的Pipeline比較繁瑣,需要一定的經驗和除錯,後繼有人又提出了把Cascade pipeline聯合起來訓練的(Facecraft 和 xxx 兩篇文章 都來自於商湯)。後來還有加Anchor 的做法 如 Anchor CNN 本文不再贅述。本文主要是從工程角度在FDDB下降不是特別多的情況下來改進和為了人臉識別而檢測人臉的目的來加速MTCNN。

基本原理

MTCNN基本原理是使用全卷積的P-Net在多尺度的待檢影象上生成候選框,接著通過R-Net和O-Net來過濾。

MTCNN的結構

20180630104620968

我們可以看到其網路結構和Cascade CNN基本是一致的。由於文章的發表時間是2016年。一些較為modern的網路設計trick在當時也沒有被提出。所以我們改進的空間還是有的。我們做了一些實驗,也發現了MTCNN速度的瓶頸在哪。

主要是以下幾點

  • 圖片越大Pnet耗時也就越大。
  • 人臉越多Onet和Rnet耗時越大。
  • 噪點比較多的夜晚影象會導致Pnet誤檢測增多。

針對第一和第二個問題,我們選擇優化網路結構,使之精度下降不太多的情況下,儘可能的減少計算量,第一個我們想到的是Mobilenet系列中的Depthwise卷積。

Depthwise卷積

6014825-cd2480acc62515a0

Depthwise卷積最初來源於Xception。其思路比較直接,先是對輸入圖的每個通道進行卷積,然後再由1x1卷積將他們合併起來,大量實驗證明的這個操作基本可以等同於普通的Sptial卷積。並且在IO效率和效能不變的情況下,計算量降低9倍。我們可以利用這個思路替換Pnet和Rnet和Onet中的卷積操作使之速度有著大幅度提升。

但是有時候即使加了Depthwise卷積在某些嵌入式環境下,效果仍然不是很好,達不到良好的效果。我們發現Depthwise卷積80-90%的計算量基本都被後面的1x1卷積佔據了。這時我們想是否也可以把1x1卷積也用類似於Depthwise的分組卷積來替代,但是一旦把後面1x1卷積分組,組與組之間的資訊就無法相互交流了,於是shuffle-channel的出現很好的解決了這個問題。

shuffle-channel

6014825-59f0c95736fa2d9f

shuffle-channel來源於曠世的ShuffleNet。雖然這篇文章宣稱的精度難以復現。但其shuffle-channel的思想是非常值得借鑑的。shuffle-channel的原理將特徵的通道平均分到不同組裡面。是之每個組卷積的時候能得到其他組的資訊。起到了一個組之間通訊的作用。

我們做了一些實驗來證明了本文論述的結果

sets-1 sets-2
MTCNN 21fps 11fps
MTCNN-dw 131fps 101fps
MTCNN-shuffle 220fps 135fps

其中 sets-1 資料集均為一張人臉,sets-2資料集為2-4張人臉的普通監控場景。測試框架是caffe。環境為Macbook 2015 r15 2.2GHZ 的結果。

在Pnet檢測前使用中值濾波

我們注意到在某些監控場景的夜晚圖片,會有大量噪點的出現,我們知道由於CNN的不穩定性,所以導致了Pnet產生了大量的誤檢選區,為了減少這些噪點的出現,我們可以在Pnet檢測之前,使用一次中值濾波來做個快速的去噪,總體實驗下來有著不錯的效果,每次inference時間也會更加的穩定。

框架的加速

我們將caffe版本的MTCNN inference改成opencv dnn,在普通的opencv dnn backend下取得了差不多近四倍的加速。

MTCNN的並行

大家都知道Cascade架構都難以並行,使得在某些檢測任務上,在GPU上的提升並不大,我們的做法是類似於FaceCraft的來將MTCNN的pipeline寫進計算圖,並且使用TVM來優化整個計算圖。