【蜂口 | AI人工智慧】影像分割要點梳理——龍鵬的一站式caffe工程實踐連載(九)

絵飛的魚發表於2018-09-27

知識引入

經過前面的系列學習,這一次終於來到了本次分享的最後一篇,我們將在這一次的分享中給大家總結一下整個的專案,包括專案的背景以及專案中使用的一些關鍵的技術,具體來說將包含以下內容。

任務與技術應用

首先我們將回顧一下我們這個任務以及它的應用背景。我們將回顧其中使用的一些關鍵的技術,影像分割是我們這個任務中使用的關鍵技術,影像分割在整個計算機視覺中,它是一個難度比較適中的技術,它廣泛應用於美顏直播等領域,同時在自動駕駛以及一些其他的摳背景的一些任務之中,也起到了非常大的作用。

Caffe 的使用

第二個是caffe的使用。這一塊也是我們非常重要的一個內容,現在有非常多的開源框架可以選擇。對於初入行深度學習的人來說,很多人並不會選擇caffe這樣的一個框架去進行學習,而是選擇 tensorflow 或者pytorch這樣一些框架。但是我仍然建議大家從caffe開始學習,因為caffe包含了一套非常優秀的c++程式碼,方便大家進行閱讀。同時caffe的使用,其實對於簡單任務來說,相對於Tensorflow,pytorch來說會更加的簡便。我們從caffe的環境配置,到caffe的一些關鍵程式碼的閱讀,一個新的分割資料層的設計,以及caffe的訓練和測試都進行完整的闡述。 聽完我們這一套分享之後,大家可以提升對於框架的掌握能力。

網路的設計

第三個是網路的設計, 分割 網路的設計也是我們這個系列分享的核心內容。透過這一系列的分享,我們熟悉了分割網路的基礎結構,對分割中的卷積與反摺積進行了比較詳細的闡述。同時在設計一個移動端比較最佳化的模型中,我們介紹了一些簡單的最佳化技巧。

示例演示

影像分割任務在美容美顏直播行業中使用的非常廣泛,下面我們看一個實際的例子,給大家呈現一個完整的視覺體驗。

https://mp.weixin.qq.com/s/8uOB2DDQPCLLit39VP6sEA

此處由於編輯器限制,請根據連結移步到公眾號文章中觀看,謝謝

這是來自於face APP的美妝的應用。我們現在看到的是口紅的應用,可以看到,我們可以替換不同的口紅顏色,以及對顏色的幅度進行選擇。其次看到的是美髮的 應用 ,可以看到我們可以對頭髮的顏色進行更改。在剛才的影片測試中,我們可以看到演算法的魯棒性還是不錯的。對於不同的姿態,不同的距離以及在複雜的背景光照下,能夠取得比較好的結果。當然影像分割技術不僅僅只是適用於美顏、直播這樣的一些應用之中,他還有其他非常非常多非常廣泛的應用。我們給大家展示一個比較酷的demo,這個程式碼中我們可以看到,用影像分割技術,對通用的物體,包括人、動物、交通工具等等進行的分割。一個非常魯棒的影像分割模型,是影片理解中的一個非常關鍵的步驟。相信經過我們這次的一個系列的分享,大家會對影像分割任務提升不少的興趣。

Caffe框架分析

首先,我們來說一下為什麼要使用caffe。現在有非常多的開源框架可以選擇,從 github 上面的 的數量來說,caffe已經不是第一 第一是 tensorflow 。那為什麼還要選擇caffe,而不是選擇tensorflow 前面的分享 我簡單地跟大家說過 提過這是我個人的習慣,另外一個是因為他確實有一些優點,包括首先caffe它是一套純 C++ 程式碼的框架,它的整個的設計思想以及他的程式碼都非常的優雅,非常的簡潔。 我們推薦大家從這樣的一個框架開始學習,可以增進自己的C++的基礎。第二個是caffe包含了很多的需要自定義的東西,這些自定義的層都可以強制我們去提升我們真正的一些水平,包括程式碼的水平以及數學公式的推導水平。最後對一些簡單的任務來說,caffe其實更加簡單,它將資料網路的配置以及訓練和測試過程完整地進行了一個比較好的分離。我們的網路的配置跟資料是透過一個txt的檔案進行配置,而模型的訓練可以透過不同的介面,非常的靈活,同時多 GPU 的訓練也非常的靈活,這就是我們選擇caffe的原因。

使用Caffe 注意事項

caffe的使用過程中需要哪些比較注意的地方?

首先:當然是我們要能夠正確地使用caffe,我們需要安裝它的一系列的編譯環境,相對tensorflow 直接使用 pip 命令進行安裝。caffe的安裝會稍微的複雜一些,這是我們需要注意的一個地方。

第二、caffe的使用有很多地方都需要我們自己去修改原始碼。在我們這個任務中,我們只是定義了一個新的分割資料層,但其實假如我們的任務有不同的一個loss,也就是不同地最佳化目標,這個最佳化目標,又沒有在caffe官方 中進 行實現,那麼我們就必須自己去實現。當我們實現一個新的loss的時候,它就需要進行反向的 求導 。caffe是不支援反向求導的,所以我們需要自己去推,自己推公式,自己寫程式碼,並且驗證我們的梯度反向傳導是正確的。 這個是對水平要求比較高的一個地方,也是很多人放棄使用caffe的主要原因。因 為tensorflow,pytorch 這樣的平臺都支援自動的求導。那麼caffe現在仍然處於一個什麼樣的地位呢?至少就筆者而言, 筆者 以前在360AI研究院,現在在深度學習實驗室,我們在移動端的模型的部署,仍然使用的是caffe的框架。 tensorflow 和pytorch並不適用於當前在手機端一個模型的部署,所以caffe的地位不容置疑。基本上一個優秀的工程師必須掌握caffe的框架,那caffe的後續發展如何?現在在github上面,caffe已經不再進行更新,caffe的版本也已經從最初的caffe1到了caffe2,由Facebook官方進行維持,它整個程式碼已經完整地併入了pytorch 。所以我們如果想繼續深入地學習caffe的話,我們可以去看pytorch 的原始碼

為什麼選擇mobilenet

mobile let是由google提出的一個適用於移動端部署的模型,它實際上就是將時空的卷積進行了分離,將空間的卷積進行了分離,它核心的思想就是分組 卷積 。相比效能幾乎相當的vgg 系列 來說,mobilelet它的計算量大大的下降,模型的大小也大大的下降。同時mobilenet的設計非常的簡單,非常的優雅,它就是不斷的透過depthwise加p oint wise 這樣的block進行串聯。 所以我們選擇這樣的一個模型來給大家 介紹,這是 一個非常簡單優雅,但是效率又非常高的一個模型,非常適合大家開始學習。

如何選擇一些相關的引數

我們如何選擇一些相關的引數?這其中引數就包括我們如何選擇我們的網路輸入尺寸,如何決定我們的網路深度,如何決定我們的stride的大小?下面我們簡單地各自介紹一下網路輸入尺寸,也就是我們用於訓練的圖片的大小。在我們的這個分享之中,我們選擇的是160×160。為什麼我們要選擇160×160這樣的一個尺度?為什麼不是100×100或者200×200?首先我們是對大量的人臉圖片進行了一個統計,發現嘴唇的這個尺度基本上在100×100這樣的一個尺度。如果我們使用100×100這樣的一個尺度去做訓練的話,由於這個尺度比較小,導致我們恢復出來的時候,分割的mask邊緣不是非常的精細,所以我們在儘可能的減小這個網路輸入尺寸的情況下,去選擇一個更大的網路輸入尺寸。經過我們不斷的嘗試,我們發現160這樣一個尺度比較好,這就是我們選擇這個尺寸的原因,當然你也可以去設計其他的一個尺寸輸入。第二個網路深度,網路的深度是決定模型效能的一個因素。網路越淺,一般來說同樣的模型網路越淺,它的計算量會越小。

網路的深度也是需要我們去不斷的進行實驗的探索。第三個是stride。主要就是說我們的 解析度 到底會降多少倍?我們從160到最後的feature   map的大小,它到底會降多少倍?我們的任務之中是32×32,也就是最後的 feature map 降為了5×5,為什麼不是3×3或者7×7?有兩個原因,第一個如果是3×3這樣的一個尺度的話,那他太小, 這樣 一個 feature  map 在進行恢復解析度的過程中,無法恢復到這一個比較好的細節。那為什麼不是7×7或者10×10?就是考慮到計算量的因素。當我們從一個比較大的解析度開始恢復的時候,我們計算量也會比較大。總結一句,這三個引數實際上都是經過實驗驗證,它不一定是最優的,但目前看來它是一個比較優的引數。第三個如何高效地對網路進行壓縮?這其實是一個學科比較大的研究方向。mobilenet的提出就是研究這樣一個問題,如果 高效 的對網路進行壓縮,我們前面提到的一個簡單的技術也就是互補卷積。當然它還有很多像 shufflene 的這樣的一些最佳化的技巧,甚至包括量化網路等最佳化技巧。

結束語

我們在這次的分享之中無法給大家詳細的闡述,我推薦大家去閱讀我的知乎上面的兩篇文章,一個是 如何finetune一個小模型到移動端”, 另一個是“為了壓榨CNN模型,這幾年大家都幹什麼?”,大家可以從中獲得一些啟發。

免費領取技術大咖分享課,加蜂口V信: fengkou-IT 
感謝您的閱讀,更多精彩請持續關注蜂口微信小程式!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31553577/viewspace-2215072/,如需轉載,請註明出處,否則將追究法律責任。

相關文章