騰訊馮牮:基於卷積神經網路在手機端實現文檔檢測
2017 年 10 月 17 日至 19 日,由 InfoQ 舉辦的 QCon 全球軟體開發大會將在上海寶華萬豪酒店舉辦,大會吸引了來自世界各地的技術專家及開發者。本文採訪了 QCon 大會的參會講師,來自騰訊的 iOS 高級開發工程師馮牮,本次大會他的演講題目為《基於卷積神經網路在手機端實現文檔檢測》。
在手機端運行模型並不容易,手機端計算能力有限,在技術方案中還需要權衡考慮多種因素,比如 TensorFlow 靜態庫的裁剪,模型大小的控制。首先,馮牮老師為我們介紹了利用卷積神經網路在手機端實現文檔檢測的流程。
在用神經網路技術解決實際業務問題的時候,通常要做的事情都是準備樣本數據,選擇網路結構,網路參數調優,這幾件事情很有可能都是需要重複很多遍的,會經歷各種失敗,也正是因為有這些失敗,才會促使開發者去進一步的思考,去尋找能取得更好結果的最優方案。
馮牮表示,在做這套文件檢測方案的時候,也是符合這種基本的套路的,只不過在完整的技術方案裡面,還包含了一部分用 OpenCV 實現的演算法,這部分演算法也是配合著神經網路部分一步一步優化出來的。有一些比較關鍵的技術節點,按照時間先後順序,簡單記錄一下,大致如下:
A:初始版本 HED + 公開通用樣本集 + findContours API;
B:公開樣本圖片集是通用意義上的邊緣檢測線,效果不夠好,所以採用人工合成的思路,分別收集前景圖和背景圖,用 OpenCV 粘貼合成,模擬旋轉、平移和透視變換;
C:HED 網路的輸入圖片的尺寸是 224 * 224, 提升到 256 * 256 有助於得到更高精度的邊緣檢測線,但是訓練難度大增,檢測效果不升反降,為了改善這一點,先使用少量樣本圖片訓練網路,當 HED 網路開始收斂,並且每一個尺度的輸出 image 都開始對最終結果產生貢獻後,才使用完整的訓練樣本集合繼續訓練網路;
D:findContours 過於理想化,針對 HED 的邊緣檢測效果,把邊緣線段延長到整個圖片區域,在此基礎上尋找四邊形的頂點;
E:OpenCV 並沒有圖層的概念,在旋轉和透視變換等需要插值的時候,會在邊緣區域直接用黑色像素進行插值,為了降低這種黑色像素干擾,只能使用精讀最低的插值演算法,這就使得合成的樣本圖片的清晰度也很低,為了改善這一點,把 OpenCV 替換成了 iOS 上的 UIView,也就是利用 OpenGL 來合成訓練樣本,提高了圖片的清晰度;
F:改進了 cost 函數,得到了更細的邊緣檢測線,降低了整體誤差;
G:在訓練樣本集中添加了 1200 張人工標註的真實圖片;
H:結合測試和體驗用戶的反饋信息,對一些識別率低的場景進行分析,刻意合成了一批這類場景的樣本圖片,比如雜亂背景、A4 紙白色背景等,最終總共合成了 80000 多張訓練樣本圖片;
I:在對低識別率場景的分析過程中發現,之前 D 步驟中設計的數學模型對其中一種場景很容易誤判,所以重新設計了這部分的數學模型,不再把邊緣線段延長到整個圖片區域,另外在對四邊形進行合理性判斷的時候,重新設計了一組過濾策略。
這其中的 B、C、E、G、H,是對訓練樣本的優化,C 和 F 是對 HED 網路的優化,D 和 I 是對數學模型的優化,從這裡也能看出來,訓練樣本的重要性是很高的。
VGG 與 HED 神經網路演算法在馮牮的訓練過程中,主要使用了兩種神經網路演算法:VGG 與 HED。
這兩個神經網路演算法,馮牮覺得是很難可以『簡單』介紹清楚的:「我並不是說 VGG 和 HED 網路很難,其實正好相反,這兩個網路結構,在卷積神經網路大家族裡面其實反而是兩個最簡單最基礎的網路結構了。」
馮牮解釋說:比如 VGG,作為一個分類網路,和 ResNet、Inception model 這些新的分類網路相比,它的結構就是很簡單的,因為它的層和層之間的關係很簡潔,前一層的輸出就是後一層的輸入,HED 網路就是以 VGG 為基礎,把其中一些卷積層的輸出單獨取了出來,再通過某些策略融合到一起,就得到了最終的輸出。想學習 VGG 和 HED 的話,最好的資料還是第一手的論文和認可度比較高的參考代碼。
然而一開始的時候,馮牮是想要仿照 face alignment 的思路,用一個端到端的神經網路結構直接擬合得到 4 個點的坐標,訓練網路的時候雖然可以收斂,但是得到的結果是不可用的,網路計算出來的 4 個點的坐標是趨向於四個固定位置的。後來他也嘗試用 YOLO 網路做過對象檢測,用 FCN 網路做過圖像切割,但是結果都很不理想,要麼就是檢測精度太低,要麼就是計算量太大做不到實時檢測。最終馮牮選用了 HED 網路,其實也就是前面提到的這幾個原因,既要保證一定的精度也要保證實時計算的運行速度。
如何選擇深度學習框架在選擇深度學習框架這一點上,馮牮有自己的一些想法,他認為:對於初學者來說,在挑選框架的時候,不需要糾結太多問題,選一個工業界主流的框架就可以了,TensorFlow、MXNet、Caffe2 這些都是可以的,這些主流的框架,配套的開發文檔、demo 程序等等都是比較齊全的。而且,重點要學習的還是神經網路的各種演算法,框架只是實現這些演算法的一種手段。
「當然,TensorFlow 官方就支持手機端,這是我選擇 TensorFlow 的原因之一。」馮牮補充說。
蘋果於今年推出了自家的移動端深度學習框架 CoreML,馮牮表示,雖然沒有嘗試使用過 CoreML,但是就他看來,這是一種技術趨勢,框架只是工具,只是一種實現手段,工具之間可能會多少有一些差異,但是神經網路結構與工具無關,同一個演算法,用不同的框架也是都可以實現出來的。
CoreML 和 TensorFlow 相比,最明顯的優勢就是它是 iOS 平台原生支持的,有硬體加速,運算速度快,系統整合度高。但是 CoreML 只是做前向運算的工具,馮牮表示,在用反向傳播演算法訓練網路的時候,還是要用 TensorFlow 或其他框架的。
除了 TensorFlow 之外,馮牮還給希望嘗試移動端深度學習訓練的開發者們推薦了一些其他框架,MXNet 和 Caffe2 都是官方支持 mobile 端的,有興趣的同學也可以從這兩個框架入門學習。
進一步交流在此次 QCon 上海站設置的《未來移動技術架構》話題上,除了騰訊的 iOS 高級開發工程師馮牮帶來的《基於卷積神經網路在手機端實現文檔檢測》之外,還有《阿里移動應用高可用性保障探索與實踐》、《京東商城無線端運營後台(通天塔)架構演變》、《美團點評移動端底層架構實踐》等諸多內容。
※可參考的才是有價值的:中小型研發團隊架構落地實踐18篇,含案例、代碼
※如何在技術面試中打動面試官?寫給校招的你
※大數據篩選下的三十篇技術好文,送給太想進步的你!
※Facebook認慫React專利,但問題依舊沒有解決?
※Spring技術佈道師眼中的微服務:事件驅動型微服務詳解
TAG:InfoQ |