2017上半年的工作總結
滾滾長江東逝水,浪花淘盡了英雄,也洗滌了菜鳥。
入職一年有餘,藉著公司半年度總結的功夫,先在這裡打個草稿。
上半年的工作主要分為兩個方面:1.人臉檢測+特徵點定位;2.演算法效能的優化(包括精度和速度)。
人臉檢測方面:這個課題一度被認為已經解決,但受人臉解析度、姿態、光照、表情、遮擋等因素影響,還是存在較大的漏檢率。傳統方法中,Adaboost算是比較優秀的。當前主流的方法是通用目標檢測中的R-CNN等這類演算法,而Cascade CNN 則是另一個類別的檢測演算法,它將傳統的滑動視窗方法與深度學習相結合,其效果也不遜於R-CNN。
具體R-CNN演算法詳解可參見
論文:Rich feature hierarchies for accurate object detection and semantic segmentation
github:
特徵點定位方面:從ASM/AAM 到ESR 再到當前比較流行的 Cascade shape regression 深度學習方法,該課題同人臉檢測一塊作為人臉識別的前端演算法,也經歷了很長一段發展史。2016年,該領域引入了RNN迴圈神經網路,對Cascade Shape regression 中 stage-by-stage refine 的策略進行建模,在300W這樣的資料集上取得了比較大的進步。另外,為解決大姿態下定位精度的問題,密西根州立大學的 Xiaoming liu團隊採用深度改進後的3DMM方法對人臉進行三維建模,然後將建模後的人臉三維資訊與二維影象相結合,再做形狀迴歸,該方法顯著優於已有方法的定位精度。
可以看出,人臉檢測和特徵點定位方面都採用了Cascade CNN 的網路思路,那是不是可以結合起來同時訓練呢?沒錯,去年的一篇 Joint Face Detection and Alignment using Multi-task Cascased Convolutional Networks 驗證了這個想法,其大致思路為:將整個任務分為三個網路,第一個網路剔除大部分的人臉負樣本,同時得到人臉的大致區域和特徵點的大致位置,後面兩個網路則不斷對前面的結果進行refine,最後輸出人臉boxs和landmarks。代價函式為三個任務的loss總和,賦予不同的權重因子以便有所側重。
不出意外的採用了這種多工的網路結構,歷時兩個月,總算有所交代。考慮到model的大小和後續優化及部署,前半個月主要在caffe和mxnet之間進行權衡,後面就是準備資料集,搭建網路,調整超引數等。需要注意的是,訓練資料集的準備真的太重要了,稍有不慎得到的model就是各種天馬行空的結果。當然超引數的調整也是一個體力活,從引數初始化到學習率、學習勢、引數正則化及召回率的閾值設定等,無一不是令人頭大的問題。另外,訓練技巧也是需要具備的,比如資料的歸一化、擴充(映象、旋轉、打亂)、網路結構的簡化(dropout)、訓練日誌的列印儲存等。
演算法效能的優化:深度學習雖然高效,但其速度也是不可迴避的問題,故其想從實驗室走出來還需要進行一系列的改造。針對這個課題,Google又站了出來,推出了MobileNet網路結構,對傳統convolution操作進行因式分解,將其拆分為兩個操作depthwise 和pointwise。當然,MobileNet 也不算是橫空出世,其前面還有很多長輩。詳細理論參見其論文:MobileNet:Efficient Convolutional Neural Networks for Mobile vision applications。 如果你用的是tensorflow,那麼你很幸運,google已經幫你實現了。如果是caffe or mxnet,那麼你還得從c++原始碼開始,自己寫操作,涉及到很多知識框架和矩陣運算的細節及硬體指令集加速手段。
注意,在消化這篇論文之前,有必要先了解下傳統卷積運算的計算細節,可以參考caffe中的convolution和tensorflow中的depthwise_conv2d_native。當然,知乎這裡寫連結內容和論文High Performance Convolutional Neural Networks for Document Processing也可作為參考資料。