0
雷鋒網(wǎng)按:本文上接看一遍你也會做!用英偉達(dá) DIGITS 進(jìn)行圖像分割(上)。已閱讀的小伙伴兒可直接跳到教程部分。
7 月 8 日,英偉達(dá)深度學(xué)習(xí)學(xué)院 DLI 線下訓(xùn)練營即將來到深圳,主題是圖像分類、目標(biāo)檢測與圖像分割的零基礎(chǔ)開發(fā)入門。
雖然是全球范圍內(nèi)頂級的 AI 培訓(xùn)項(xiàng)目,但 DLI 進(jìn)入中國的時(shí)間太晚,中文網(wǎng)頁也才上線沒多久,導(dǎo)致國內(nèi)開發(fā)者只知英偉達(dá)的顯卡,卻不知道英偉達(dá)有線上、線下的 AI 技術(shù)培訓(xùn)。此前雷鋒網(wǎng)曾撰文介紹過 DLI,詳情戳這里。
閑話少說,本期深圳 DLI 訓(xùn)練營主要用到 DIGITS 和 TensorFlow 兩個(gè)工具。TensorFlow 大家都知道,不必介紹。但對 DIGITS 就很陌生了,它是什么呢?
DIGITS 是英偉達(dá)為普及深度學(xué)習(xí)開發(fā)的圖形化操作界面,簡單易用,旨在幫助初學(xué)者跨越入門障礙,迅速上手。因此,DLI 的入門培訓(xùn)均建議學(xué)員從 DIGITS 起步。
說白了, DIGITS 就是一個(gè)新手工具。但由于 DLI 剛剛進(jìn)入中國,關(guān)于 DIGITS 的教程和信息并不充足,為初學(xué)者帶來信息鴻溝。 因此,雷鋒網(wǎng)對這篇英偉達(dá)博客發(fā)布的官方教程進(jìn)行了編譯。該教程指導(dǎo)讀者用 DIGITS 5 和 Caffe 進(jìn)行圖像分割,它脫胎于 DLI 的線上實(shí)驗(yàn)室(online labs)培訓(xùn)課。后者收費(fèi)且只用英文授課,并不對非會員開放。但大家能從這篇教程對其了解一個(gè)大概。
更重要的,7 月 8 日深圳的 DLI 線下訓(xùn)練營,三場主要培訓(xùn)分別是用 DIGITS 進(jìn)行圖像分類,用 DIGITS 目標(biāo)檢測,以及用 TensorFlow 進(jìn)行圖像分割(了解詳情請點(diǎn)此)。雖然前兩場的內(nèi)容與本教程并不一致,最后一場的難度比本文高出許多,而且用的是 TensorFlow 而非 Caffe,但這篇教程與 DLI 付費(fèi)培訓(xùn)的內(nèi)容已十分接近。
感謝三位童鞋朱婷、彭艷蕾與馬曉培編譯本文花費(fèi)的心血。
前一節(jié)展示了如何設(shè)計(jì)一個(gè)FCN ,來預(yù)測每個(gè)窗口的某個(gè)類的概率分布。顯然,窗口的數(shù)量取決于輸入圖像的大小、窗口的大小和掃描輸入圖像時(shí)窗口之間的步長。理想情況下,一個(gè)圖像分割模型將生成圖像中所有像素的概率分布。在實(shí)踐中如何做到呢?這里將使用FCN paper上的一個(gè)方法。
當(dāng)輸入圖像遍歷卷積化的 Alexnet 的連續(xù)層時(shí),像素?cái)?shù)據(jù)的輸入被高效地壓縮成一組粗化的、更高級的特性表征。圖像分割的目的是篡改這些粗化的特征來重建細(xì)分類,對輸入中的每個(gè)像素都是如此。事實(shí)證明,這在解卷積層中很容易實(shí)現(xiàn)。這些層執(zhí)行與卷積層相反的操作:給定了卷積輸出,一個(gè)解卷積層會將輸入生成輸出,從而給出過濾器的定義。記住,卷積中的跨層(或池化層)定義了處理輸入時(shí)窗口的滑動距離,以此來衡量下游輸出。相反,解卷積層的步幅是衡量上游取樣的輸出。若選擇步幅為4,那么輸出將是4倍大!
下一個(gè)問題是:給定模型中的最終卷積層,需要對其激活做多大幅度的升采樣,才能使輸出與輸入圖像的大小相同?我需要仔細(xì)檢查每層并寫下它的縮放因子。一旦每一層都這樣處理,我只需將縮放因子相乘并匯總。讓我們看看第一個(gè)卷積Alexnet層。
conv1的步幅是4,因此縮放因子是1/4。所有層都重復(fù)這樣做,我確定了總縮放因子在模型中是1/32,如Table 2中概述那樣。這樣,解卷積層的步幅就是32了。
出于嚴(yán)謹(jǐn),我不得不說,“在所有的空間維度上,一個(gè)步幅為S的卷積層,產(chǎn)生的輸出都是輸入的1 / S”這句話并不是完全正確的。在實(shí)踐中,向輸入加入填充P > 0將會增加激活數(shù)。相反,使用大小為 K > 1的核(kernels)將會減少輸入端的激活數(shù)。在此限制下,如果你為卷積層提供了一個(gè)無限長的輸入,輸入/輸出大小的比例在所有的(空間)維度上實(shí)際是1 / S?,F(xiàn)實(shí)中,每一個(gè)卷積(池)層的輸出被偏移了(P -(k - 1)/ 2)/ S。
例如,考慮conv1:因?yàn)檫@一層在兩側(cè)各有100像素的填充,它的輸出比無填充的更大。通過上面的公式,我們可以計(jì)算出輸出的每一側(cè)在理論上有23.75個(gè)額外像素。隨著添加更多層,這會累積起來。通過向后運(yùn)行圖,可以計(jì)算所有層的累計(jì)抵消。L1與L2層的組合(i.e. 在Caffe術(shù)語中,L2是L1的底層,L1、L2 又分別抵消 O1、O2) 會抵消O2 / F + O1,這里F是L2的累積縮放因子。
參考表2對那些計(jì)算的匯總
表2:卷積化的Alexnet中,遍布連續(xù)層的縮放因子和抵消補(bǔ)償。* 對反卷積層來說縮放因子等于步幅,抵消等于(k - 1)/ 2 p。
表2表明,通過所有conv1到upscore的層時(shí),神經(jīng)網(wǎng)絡(luò)的輸出被18個(gè)像素根據(jù)輸入做了相應(yīng)移動。最后一個(gè)分割模型中的技巧,是一個(gè)修剪網(wǎng)絡(luò)輸出、移除每個(gè)邊界上額外的18像素的層。這很容易在Caffe 的 Crop layer 中實(shí)現(xiàn),下面的清單中對這些做了定義。
你可能會注意到,這個(gè)版本的Alexnet的內(nèi)邊距(padding)比你經(jīng)常在conv1層遇到的多一點(diǎn)。這背后有兩個(gè)原因:一個(gè)原因是,產(chǎn)生了更大的初始化偏移,以補(bǔ)償連續(xù)層沒有吃進(jìn)圖像的缺失。然而,主要的原因是網(wǎng)絡(luò)以最佳方式處理輸入圖像的邊界 ,以命中網(wǎng)絡(luò)可接受域的中心,大概就是這樣。
現(xiàn)在,我有了從FCN paper復(fù)制FCN FCN-Alexnet模型所需的一切。我們可以放松一下,欣賞一些SYNTHIA數(shù)據(jù)集里的圖像。
SYNTHIA 數(shù)據(jù)集
SYNTHIA數(shù)據(jù)集最初發(fā)表在paper [5]。
SYNTHIA數(shù)據(jù)集的樣本圖像見圖9。這些圖像展示了用不同的對象類合成的城市場景,比如不同條件下的建筑物、道路、車輛和行人, 如晝夜。有趣的是,圖片看起來特真實(shí)以致于有時(shí)候人們會被它們吸引:嗯,第一張圖片上那個(gè)在路中間看報(bào)紙的人有點(diǎn)反常,這么干很危險(xiǎn)。
在 DIGITS 5.0 中,創(chuàng)建一個(gè)圖像分割數(shù)據(jù)集十分簡單,只需要選中輸入和真實(shí)樣本圖像文件夾,點(diǎn)擊“Create”按鍵。DIGITS 支持多種標(biāo)簽格式,比如畫板圖片(它的標(biāo)簽圖像中的像素值是彩色畫板的指數(shù))和 RGB 圖片(每種顏色指示一個(gè)類)。
在 DIGITS 中創(chuàng)建數(shù)據(jù)集之后,你可以探索數(shù)據(jù)庫在視覺上檢查它們的內(nèi)容,見圖10。
在DIGITS里訓(xùn)練模型,有數(shù)據(jù)集和對神經(jīng)網(wǎng)絡(luò)的描述就夠了。如果你覺得用卷積Alexnet太復(fù)雜太耗時(shí)的話,別煩惱:DIGITS 5.0版有一個(gè)模型商店,而且就像你能想象的那樣,F(xiàn)CN-Alexnet可以從這個(gè)模型商店里下載!
但如果你決定要走一條更難的路,去創(chuàng)造自己的模型描述,就可能要找一個(gè)合適的權(quán)重初始值方案,比如說Kaiming方法(另名MSRA),是目前最前沿的修正流線性單元形式。這個(gè)在Caffe里很容易實(shí)現(xiàn),只要加上一個(gè)權(quán)重過濾器 { type: "msra" }指向你的參數(shù)層就好了。如果在DIGITS里用這種方法訓(xùn)練模型,很有可能得到像圖11的曲線。從圖中可以看出,結(jié)果并不盡如人意。驗(yàn)證集的準(zhǔn)確程度在35%的時(shí)候達(dá)到最高(意思是說只有在驗(yàn)證數(shù)據(jù)集里35%的像素被準(zhǔn)確地標(biāo)記出來)。訓(xùn)練損失跟驗(yàn)證損失一致,意味著這個(gè)網(wǎng)絡(luò)(模型)對訓(xùn)練數(shù)據(jù)集欠擬合。
圖11: 用Synthia數(shù)據(jù)訓(xùn)練FCN-Alexnet網(wǎng)絡(luò)(模型),在DIGITS里面利用隨機(jī)權(quán)重初始值方法得到的訓(xùn)練集/驗(yàn)證集的損失和準(zhǔn)確率:藍(lán)線--訓(xùn)練集的損失走勢,綠線--驗(yàn)證集的損失走勢,黃線--模型結(jié)果在驗(yàn)證集里的準(zhǔn)確率
你可以在一個(gè)樣例圖片上試試運(yùn)氣,讓DIGITS幫你完成圖片分割的可視化。你會發(fā)現(xiàn)網(wǎng)絡(luò)(模型)會不分青紅皂白的把所有元素都?xì)w類成“建筑物”,就像圖12所示。原來在SYNTHIA數(shù)據(jù)中,“建筑物”是最具代表性的目標(biāo)類別,而網(wǎng)絡(luò)(模型)只是懶洋洋地進(jìn)行了學(xué)習(xí)并把所有圖片元素都標(biāo)記成了“建筑物”才達(dá)到了35%的準(zhǔn)確率。那么,一般可接受的處理這種網(wǎng)絡(luò)(模型)在訓(xùn)練集里欠擬合的方法都有哪些呢?
拉長訓(xùn)練時(shí)間:只觀察損失曲線的走勢,訓(xùn)練過程貌似達(dá)到了最高,然而這很可能沒什么幫助。網(wǎng)絡(luò)(模型)很有可能進(jìn)入了局域最小值而且不能從中脫離出來。
提高學(xué)習(xí)率同時(shí)減少每批量的大?。哼@樣做可以鼓勵陷入局域最小值不能自拔的網(wǎng)絡(luò)(模型)去探索周圍環(huán)境之外的區(qū)域,盡管這樣會增大網(wǎng)絡(luò)(模型)發(fā)散的風(fēng)險(xiǎn)。
增加模型大?。哼@種方法可以加大模型的表現(xiàn)力。
還有一種方法我發(fā)現(xiàn)在計(jì)算機(jī)視覺中應(yīng)用得非常好:轉(zhuǎn)化學(xué)習(xí)。更多請繼續(xù)往下讀。
圖12:圖片分割可視化的樣本展示:網(wǎng)絡(luò)(模型)把所有元素都?xì)w類成了“建筑物”。此樣本是利用隨機(jī)權(quán)重初始值的方法,在DIGITS里用Synthia數(shù)據(jù)訓(xùn)練FCN-Alexnet網(wǎng)絡(luò)(模型)得到的。
你不用非得從隨機(jī)初始化權(quán)重開始,來訓(xùn)練一個(gè)模型。很多情況下,重新利用網(wǎng)絡(luò)(模型)訓(xùn)練另外一組數(shù)據(jù)中的得到的認(rèn)知,會很有幫助。這種方法在計(jì)算機(jī)視覺里通過CNN網(wǎng)絡(luò)(模型)尤其奏效,因?yàn)楹芏嗟图壍奶卣鳎ň€路,拐角,形狀,紋理)可以馬上應(yīng)用在任意數(shù)據(jù)中。由于圖片分割是在像素水平下做分類分析,從類似ILSVRC2012這樣的圖片分類數(shù)據(jù)集里做遷移學(xué)習(xí)十分合理。利用Caffe這樣做就變得相當(dāng)簡單---當(dāng)然需要設(shè)立一個(gè)或兩個(gè)陷阱!
記得在Alexnet的fc6模型中(圖8),權(quán)重的形狀是4096×9216。在FCN-Alexnet的conv6模型中,權(quán)重的形狀是4096x256x6x6。這其實(shí)是一樣的權(quán)重值,但是由于形狀不同,Caffe不能自動把權(quán)重轉(zhuǎn)交到FCN-Alexnet模型里。這個(gè)任務(wù)可以交給“net surgery(網(wǎng)絡(luò)手術(shù))”腳本來履行,腳本例子可以在Github網(wǎng)站里的DIGITS知識庫找到。網(wǎng)絡(luò)手術(shù)腳本的功能在于把參數(shù)從全連接層移植到對應(yīng)的卷積層里。然而,你會發(fā)現(xiàn)從公共的DIGITS模型商店里下載提前訓(xùn)練好的模型會更簡單一些。圖13展示了模型商店的界面:在“FCN-Alexnet”旁邊,點(diǎn)擊“導(dǎo)入”,DIGITS就會下載提前訓(xùn)練好的模型。
圖13:DIGITS模型商店
你可能會有另外一個(gè)顧慮,那就是怎樣初始化早先加入到該文本的升采樣層呢?別忘了,此升采樣層并不是原始Alexnet模型中的一部分。在FCN那篇論文中,作者建議隨機(jī)初始化對應(yīng)的權(quán)重,然后讓網(wǎng)絡(luò)(模型)學(xué)習(xí)它們。該篇論文的作者后來意識到,初始化這些權(quán)重其實(shí)很簡單,通過做雙線性插值,讓升采樣層充當(dāng)放大鏡就可以了。在Caffe里,這種方法可以通過加上一個(gè)權(quán)重過濾器 { type: "bilinear" }指向升采樣層來實(shí)現(xiàn)。
利用一個(gè)提前訓(xùn)練好的FCN-Alexnet模型,你會注意到,在檢測圖14這種個(gè)別圖像的時(shí)候,準(zhǔn)確率會快速超過90%。檢測到9個(gè)不同的類別,圖形分割結(jié)果會變得更有說服力。但你還是會有點(diǎn)失望,因?yàn)槲矬w輪廓仍然非常模糊。請繼續(xù)往下讀本文的最后一個(gè)章節(jié):如何進(jìn)一步提高分割模型的精確性和準(zhǔn)確性。
圖14:圖片分割可視化的樣本展示。此樣本是利用一個(gè)提前訓(xùn)練好的ILSVRC2012-Alexnet模型,在DIGITS里用Synthia數(shù)據(jù)訓(xùn)練FCN-Alexnet網(wǎng)絡(luò)(模型)得到的。
之前加進(jìn)FCN-Alexnet的升采樣層,把conv7的輸出值擴(kuò)大了32倍。在實(shí)際應(yīng)用中,這意著對于每個(gè)32×32的像素塊,神經(jīng)網(wǎng)絡(luò)會做一次預(yù)測。這也就解釋了為啥目標(biāo)物體輪廓會那么模糊。那篇FCN文章介紹了另外一個(gè)非常棒的主意來解決上面的局限:跳過那些被加入的連接層,直接把pool3和pool4的輸出值重新定向到網(wǎng)絡(luò)的輸出值上。由于那些匯總層(pool3, pool4)位于網(wǎng)絡(luò)的靠后方向,它們就可以在低水平的特征上運(yùn)作,從而能夠抓到更細(xì)致的細(xì)節(jié)。
在一個(gè)叫做FCN-8s的網(wǎng)絡(luò)結(jié)構(gòu)中,那篇FCN文章介紹了一個(gè)基于VGG-16的網(wǎng)絡(luò),利用這個(gè)網(wǎng)絡(luò),最后輸出結(jié)果可以是pool3的總和采樣層×8,可以是pool4的采樣層×2,還可以是conv7的采樣層×4,如圖15所示。這就引導(dǎo)出一種網(wǎng)絡(luò),能夠在更細(xì)分的紋路生成預(yù)測,向下到8×8的像素塊。
圖15: FCN-8s跳過連接層的演示圖。來源:FCN文獻(xiàn)
為了方便使用,用戶可以在公共的DIGITS模型商店里下載一個(gè)提前訓(xùn)練好的FCN-8s。(你肯定不想自己動手卷積VGG-16)如果你用DIGITS在SYTHIA數(shù)據(jù)上訓(xùn)練FCN-8s,你會發(fā)現(xiàn)僅僅經(jīng)過幾個(gè)epoch(時(shí)期),驗(yàn)證集的準(zhǔn)確率就能超越95%。更重要的是,當(dāng)你在一個(gè)樣本圖片上做實(shí)驗(yàn),觀察DIGITS的高超圖片分割可視化的時(shí)候,你會看到更為清晰的物體輪廓,像圖16中那樣。
圖16: 圖片分割可視化的樣本展示。此樣本是利用DIGITS在Synthia數(shù)據(jù)上訓(xùn)練FCN-8s網(wǎng)絡(luò)(模型)得到的。
讀過本文之后,怎樣開始做圖片分割,你應(yīng)該心里有譜了。DIGITS 5會在12月份的第一個(gè)星期發(fā)布。訪問DIGITS網(wǎng)站繼續(xù)學(xué)習(xí),注冊NVIDIA Developer program賬號,以便下載版本可用時(shí)及時(shí)收到通知。
DIGITS在GitHub上是一個(gè)可共享的開源項(xiàng)目。如果你想上手實(shí)踐圖片分割技術(shù),請直接訪問DIGITS GitHub項(xiàng)目網(wǎng)頁,以便得到源代碼。
[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
相關(guān)文章:
看一遍你也會做!用英偉達(dá) DIGITS 進(jìn)行圖像分割(上)
你聽說過英偉達(dá)深度學(xué)習(xí)學(xué)院 DLI 嗎?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。