您的位置:首頁>手機>正文

看一遍你也會做!用英偉達 DIGITS 進行圖像分割(下)

雷鋒網按:本文上接

看一遍你也會做!用英偉達 DIGITS 進行圖像分割(上)

。已閱讀的小夥伴兒可直接跳到教程部分。

DIGITS 是什麼?

7 月 8 日,

英偉達深度學習學院 DLI

 線下訓練營即將來到深圳,主題是圖像分類、目標檢測與圖像分割的零基礎開發入門。

雖然是全球範圍內頂級的 AI 培訓項目,但 DLI 進入中國的時間太晚,

中文網頁

也才上線沒多久,導致國內開發者只知英偉達的顯卡,卻不知道英偉達有線上、線下的 AI 技術培訓。此前雷鋒網曾撰文介紹過 DLI,詳情戳

這裡

閒話少說,本期深圳 DLI 訓練營主要用到 DIGITS 和 TensorFlow 兩個工具。TensorFlow 大家都知道,不必介紹。但對 DIGITS 就很陌生了,它是什麼呢?

DIGITS 是英偉達為普及深度學習開發的圖形化操作介面,簡單易用,旨在幫助初學者跨越入門障礙,迅速上手。因此,DLI 的入門培訓均要求學員從 DIGITS 起步。 

說白了, DIGITS 就是一個新手工具。但由於 DLI 剛剛進入中國,關於 DIGITS 的教程和資訊並不充足,為初學者帶來資訊鴻溝。 因此,雷鋒網對這篇

英偉達博客

發佈的官方教程進行了編譯。該教程指導讀者用 DIGITS 5 和 Caffe 進行圖像分割,它脫胎於 DLI 的

線上實驗室(online labs)

培訓課。後者收費且只用英文授課,並不對非會員開放。但大家能從這篇教程對其瞭解一個大概。

更重要的,7 月 8 日深圳的 DLI 線下訓練營,三場主要培訓分別是用 DIGITS 進行圖像分類,用 DIGITS 目標檢測,以及用 TensorFlow 進行圖像分割(瞭解詳情請

點此

)。雖然前兩場的內容與本教程並不一致,最後一場的難度比本文高出許多,而且用的是 TensorFlow 而非 Caffe,但這篇教程與 DLI 付費培訓的內容已十分接近。

感謝三位童鞋朱婷、彭豔蕾與馬曉培編譯本文花費的心血。

教程:用 DIGITS 5 進行圖像分割(下)

基於FCN的圖像分割

前一節展示了如何設計一個FCN ,來預測每個視窗的某個類的概率分佈。顯然,視窗的數量取決於輸入圖像的大小、視窗的大小和掃描輸入圖像時視窗之間的步長。理想情況下,一個圖像分割模型將生成圖像中所有圖元的概率分佈。在實踐中如何做到呢?這裡將使用FCN paper上的一個方法。

當輸入圖像遍歷卷積化的 Alexnet 的連續層時,圖元資料的輸入被高效地壓縮成一組粗化的、更高級的特性表徵。圖像分割的目的是篡改這些粗化的特徵來重建細分類,對輸入中的每個圖元都是如此。事實證明,這在解卷積層中很容易實現。這些層執行與卷積層相反的操作:給定了卷積輸出,一個解卷積層會將輸入生成輸出,從而給出篩檢程式的定義。記住,卷積中的跨層(或池化層)定義了處理輸入時視窗的滑動距離,以此來衡量下游輸出。相反,解卷積層的步幅是衡量上游取樣的輸出。若選擇步幅為4,那麼輸出將是4倍大!

下一個問題是:給定模型中的最終卷積層,需要對其啟動做多大幅度的升採樣,才能使輸出與輸入圖像的大小相同?我需要仔細檢查每層並寫下它的縮放因數。一旦每一層都這樣處理,我只需將縮放因數相乘並匯總。讓我們看看第一個卷積Alexnet層。

conv1的步幅是4,因此縮放因數是1/4。所有層都重複這樣做,我確定了總縮放因數在模型中是1/32,如Table 2中概述那樣。這樣,解卷積層的步幅就是32了。

出於嚴謹,我不得不說,“在所有的空間維度上,一個步幅為S的卷積層,產生的輸出都是輸入的1 / S”這句話並不是完全正確的。在實踐中,向輸入加入填充P > 0將會增加啟動數。相反,使用大小為 K > 1的核(kernels)將會減少輸入端的啟動數。在此限制下,如果你為卷積層提供了一個無限長的輸入,輸入/輸出大小的比例在所有的(空間)維度上實際是1 / S。現實中,每一個卷積(池)層的輸出被偏移了(P -(k - 1)/ 2)/ S。 

例如,考慮conv1:因為這一層在兩側各有100圖元的填充,它的輸出比無填充的更大。通過上面的公式,我們可以計算出輸出的每一側在理論上有23.75個額外圖元。隨著添加更多層,這會累積起來。通過向後運行圖,可以計算所有層的累計抵消。L1與L2層的組合(i.e. 在Caffe術語中,L2是L1的底層,L1、L2 又分別抵消 O1、O2) 會抵消O2 / F + O1,這裡F是L2的累積縮放因數。

參考表2對那些計算的匯總

表2:卷積化的Alexnet中,遍佈連續層的縮放因數和抵消補償。* 對反卷積層來說縮放因數等於步幅,抵消等於(k - 1)/ 2 p。

表2表明,通過所有conv1到upscore的層時,神經網路的輸出被18個圖元根據輸入做了相應移動。最後一個分割模型中的技巧,是一個修剪網路輸出、移除每個邊界上額外的18圖元的層。這很容易在Caffe 的 Crop layer 中實現,下面的清單中對這些做了定義。

你可能會注意到,這個版本的Alexnet的內邊距(padding)比你經常在conv1層遇到的多一點。這背後有兩個原因:一個原因是,產生了更大的初始化偏移,以補償連續層沒有吃進圖像的缺失。然而,主要的原因是網路以最佳方式處理輸入圖像的邊界 ,以命中網路可接受域的中心,大概就是這樣。

現在,我有了從FCN paper複製FCN FCN-Alexnet模型所需的一切。我們可以放鬆一下,欣賞一些SYNTHIA資料集裡的圖像。

SYNTHIA 資料集

SYNTHIA資料集最初發表在paper [5]。

SYNTHIA資料集的樣本圖像見圖9。這些圖像展示了用不同的物件類合成的城市場景,比如不同條件下的建築物、道路、車輛和行人, 如晝夜。有趣的是,圖片看起來特真實以致於有時候人們會被它們吸引:嗯,第一張圖片上那個在路中間看報紙的人有點反常,這麼幹很危險。

在 DIGITS 5.0 中,創建一個圖像分割資料集十分簡單,只需要選中輸入和真實樣本影像檔夾,點擊“Create”按鍵。DIGITS 支援多種標籤格式,比如畫板圖片(它的標籤圖像中的圖元值是彩色畫板的指數)和 RGB 圖片(每種顏色指示一個類)。

在 DIGITS 中創建資料集之後,你可以探索資料庫在視覺上檢查它們的內容,見圖10。

訓練模型

在DIGITS裡訓練模型,有資料集和對神經網路的描述就夠了。如果你覺得用卷積Alexnet太複雜太耗時的話,別煩惱:DIGITS 5.0版有一個模型商店,而且就像你能想像的那樣,FCN-Alexnet可以從這個模型商店裡下載!

但如果你決定要走一條更難的路,去創造自己的模型描述,就可能要找一個合適的權重初始值方案,比如說Kaiming方法(另名MSRA),是目前最前沿的修正流線性單元形式。這個在Caffe裡很容易實現,只要加上一個權重篩檢程式 { type: "msra" }指向你的參數層就好了。如果在DIGITS裡用這種方法訓練模型,很有可能得到像圖11的曲線。從圖中可以看出,結果並不盡如人意。驗證集的準確程度在35%的時候達到最高(意思是說只有在驗證資料集裡35%的圖元被準確地標記出來)。訓練損失跟驗證損失一致,意味著這個網路(模型)對訓練資料集欠擬合。

圖11: 用Synthia資料訓練FCN-Alexnet網路(模型),在DIGITS裡面利用隨機權重初始值方法得到的訓練集/驗證集的損失和準確率:藍線--訓練集的損失走勢,綠線--驗證集的損失走勢,黃線--模型結果在驗證集裡的準確率

你可以在一個樣例圖片上試試運氣,讓DIGITS幫你完成圖片分割的視覺化。你會發現網路(模型)會不分青紅皂白的把所有元素都歸類成“建築物”,就像圖12所示。原來在SYNTHIA資料中,“建築物”是最具代表性的目標類別,而網路(模型)只是懶洋洋地進行了學習並把所有圖片元素都標記成了“建築物”才達到了35%的準確率。那麼,一般可接受的處理這種網路(模型)在訓練集裡欠擬合的方法都有哪些呢?

拉長訓練時間:只觀察損失曲線的走勢,訓練過程貌似達到了最高,然而這很可能沒什麼幫助。網路(模型)很有可能進入了局域最小值而且不能從中脫離出來。

提高學習率同時減少每批量的大小:這樣做可以鼓勵陷入局域最小值不能自拔的網路(模型)去探索周圍環境之外的區域,儘管這樣會增大網路(模型)發散的風險。

增加模型大小:這種方法可以加大模型的表現力。

還有一種方法我發現在電腦視覺中應用得非常好:轉化學習。更多請繼續往下讀。

圖12:圖片分割視覺化的樣本展示:網路(模型)把所有元素都歸類成了“建築物”。此樣本是利用隨機權重初始值的方法,在DIGITS裡用Synthia資料訓練FCN-Alexnet網路(模型)得到的。

遷移學習

你不用非得從隨機初始化權重開始,來訓練一個模型。很多情況下,重新利用網路(模型)訓練另外一組資料中的得到的認知,會很有幫助。這種方法在電腦視覺裡通過CNN網路(模型)尤其奏效,因為很多低級的特徵(線路,拐角,形狀,紋理)可以馬上應用在任意資料中。由於圖片分割是在圖元水準下做分類分析,從類似ILSVRC2012這樣的圖片分類資料集裡做遷移學習十分合理。利用Caffe這樣做就變得相當簡單---當然需要設立一個或兩個陷阱!

記得在Alexnet的fc6模型中(圖8),權重的形狀是4096×9216。在FCN-Alexnet的conv6模型中,權重的形狀是4096x256x6x6。這其實是一樣的權重值,但是由於形狀不同,Caffe不能自動把權重轉交到FCN-Alexnet模型裡。這個任務可以交給“net surgery(網路手術)”腳本來履行,腳本例子可以在Github網站裡的DIGITS知識庫找到。網路手術腳本的功能在於把參數從全連接層移植到對應的卷積層裡。然而,你會發現從公共的DIGITS模型商店裡下載提前訓練好的模型會更簡單一些。圖13展示了模型商店的介面:在“FCN-Alexnet”旁邊,點擊“導入”,DIGITS就會下載提前訓練好的模型。

圖13:DIGITS模型商店

你可能會有另外一個顧慮,那就是怎樣初始化早先加入到該文本的升採樣層呢?別忘了,此升採樣層並不是原始Alexnet模型中的一部分。在FCN那篇論文中,作者建議隨機初始化對應的權重,然後讓網路(模型)學習它們。該篇論文的作者後來意識到,初始化這些權重其實很簡單,通過做雙線性插值,讓升採樣層充當放大鏡就可以了。在Caffe裡,這種方法可以通過加上一個權重篩檢程式 { type: "bilinear" }指向升採樣層來實現。

利用一個提前訓練好的FCN-Alexnet模型,你會注意到,在檢測圖14這種個別圖像的時候,準確率會快速超過90%。檢測到9個不同的類別,圖形分割結果會變得更有說服力。但你還是會有點失望,因為物體輪廓仍然非常模糊。請繼續往下讀本文的最後一個章節:如何進一步提高分割模型的精確性和準確性。

圖14:圖片分割視覺化的樣本展示。此樣本是利用一個提前訓練好的ILSVRC2012-Alexnet模型,在DIGITS裡用Synthia資料訓練FCN-Alexnet網路(模型)得到的。

啟用細化分割

之前加進FCN-Alexnet的升採樣層,把conv7的輸出值擴大了32倍。在實際應用中,這意著對於每個32×32的區塊,神經網路會做一次預測。這也就解釋了為啥目標物體輪廓會那麼模糊。那篇FCN文章介紹了另外一個非常棒的主意來解決上面的局限:跳過那些被加入的連接層,直接把pool3和pool4的輸出值重新定向到網路的輸出值上。由於那些匯總層(pool3, pool4)位於網路的靠後方向,它們就可以在低水準的特徵上運作,從而能夠抓到更細緻的細節。

在一個叫做FCN-8s的網路結構中,那篇FCN文章介紹了一個基於VGG-16的網路,利用這個網路,最後輸出結果可以是pool3的總和採樣層×8,可以是pool4的採樣層×2,還可以是conv7的採樣層×4,如圖15所示。這就引導出一種網路,能夠在更細分的紋路生成預測,向下到8×8的區塊。

圖15: FCN-8s跳過連接層的演示圖。來源:FCN文獻

為了方便使用,用戶可以在公共的DIGITS模型商店裡下載一個提前訓練好的FCN-8s。(你肯定不想自己動手卷積VGG-16)如果你用DIGITS在SYTHIA資料上訓練FCN-8s,你會發現僅僅經過幾個epoch(時期),驗證集的準確率就能超越95%。更重要的是,當你在一個樣本圖片上做實驗,觀察DIGITS的高超圖片分割視覺化的時候,你會看到更為清晰的物體輪廓,像圖16中那樣。

圖16: 圖片分割視覺化的樣本展示。此樣本是利用DIGITS在Synthia資料上訓練FCN-8s網路(模型)得到的。

現在該你了

讀過本文之後,怎樣開始做圖片分割,你應該心裡有譜了。DIGITS 5會在12月份的第一個星期發佈。訪問DIGITS網站繼續學習,註冊NVIDIA Developer program帳號,以便下載版本可用時及時收到通知。

DIGITS在GitHub上是一個可共用的開源項目。如果你想上手實踐圖片分割技術,請直接訪問DIGITS GitHub專案網頁,以便得到原始程式碼。

論文索引

[1] Krizhevsky, A., Sutskever, I. and Hinton, G. E. “ImageNet Classification with Deep Convolutional Neural Networks”. NIPS Proceedings. NIPS 2012: Neural Information Processing Systems, Lake Tahoe, Nevada. 2012.

[2] Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich. “Going Deeper With Convolutions”. CVPR 2015.

[3] Simonyan, Karen, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv technical report arXiv:1409.1556. 2014.

[4] Long, Jonathan, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition 2015: 3431-3440.

[5] Ros, German, Laura Sellart, Joanna Materzynska, David Vazquez, and Antonio M. Lopez; “The SYNTHIA Dataset: A large collection of synthetic images for semantic segmentation of urban scenes.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition 2016: 3234-3243.

[6] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun “Delving deep into rectifiers: Surpassing human-level performance on imagenet classification.” Proceedings of the IEEE International Conference on Computer Vision 2015: 1026-1034.

via 

nvidia

喜欢就按个赞吧!!!
点击关闭提示