深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计-ICCV 2015
基于Mutil-Scale CNN的圖片語義分割、法向量估計
原文地址:http://blog.csdn.net/hjimce/article/details/50443995
作者:hjimce
一、相關(guān)理論
? ?2016年的第一篇博文,新的奮斗征程。本篇博文主要講解2015年ICCV的一篇paper:《Predicting?Depth,?Surface?Normals?and?Semantic?Labels?with?a?Common?Multi-Scale?Convolutional?Architecture》,文獻(xiàn)的主頁:http://www.cs.nyu.edu/~deigen/dnl/。一開始看到這篇文獻(xiàn)的名字,有點被嚇到了,我以為作者要采用mutil-task多任務(wù)特征學(xué)習(xí)的方法,用于估計單幅圖像的深度、法向量、語義分割三個任務(wù)。還以為paper即將采用跟文獻(xiàn)《Facial?Landmark?Detection?by?Deep?Multi-task?Learning》一樣的思想,進(jìn)行提高精度,最后仔細(xì)通讀全文才知道,其實這三個任務(wù)是獨立的,不是傳說中的“多任務(wù)特征學(xué)習(xí)”,終于松了一口氣(因為之前看《機(jī)器學(xué)習(xí)及其應(yīng)用2015》這本書的第一章的時候,講到了“魯邦多任務(wù)特征學(xué)習(xí)”,覺得好難,看不懂,所以就對多任務(wù)特征學(xué)習(xí)有點害怕)。這篇paper的思想其實很簡單,說白了就是在文獻(xiàn)《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》的基礎(chǔ)上,改一改,精度稍微提高了一點點,就這樣。
? ?基于多尺度的語義分割在FCN網(wǎng)絡(luò)中,早有耳聞,所以如果學(xué)過paper:《Fully Convolutional Networks for Semantic Segmentation?》 ,在學(xué)習(xí)這篇文獻(xiàn)的網(wǎng)絡(luò)架構(gòu)時會比較輕松。對于三維法向量估計,這個需要懂一點點三維圖像學(xué)的知識,一般只有搞到三維圖像的人才會去在意這篇paper的法向量估計算法,不然二維視覺很少用到,因為我以前曾經(jīng)搞過三維,所以對于三維的一些知識比較了解。還有另外一個是深度估計,深度估計基本上沒變,都是繼承了文獻(xiàn)《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》的方法。所以總得來說我感覺這篇文獻(xiàn)的創(chuàng)新點不是很明顯,新的知識點很少,我們學(xué)起來也會比較輕松。
學(xué)習(xí)建議:要學(xué)習(xí)這篇paper,我個人感覺還是先要學(xué)《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》,學(xué)了這篇文獻(xiàn),那么接著就非常容易了。
二、網(wǎng)絡(luò)架構(gòu)
網(wǎng)格結(jié)構(gòu)方面與文獻(xiàn)《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》基本相似,可以說是在這篇paper的基礎(chǔ)上做的修改,區(qū)別在于:
(1)采用了更深層的網(wǎng)絡(luò);
(2)增加了第三個尺度的網(wǎng)絡(luò),使得我們的輸出是更高分辨率的圖片(之前的paper輸出大小是55*77,現(xiàn)在最后網(wǎng)絡(luò)的輸出大小是109*147);
(3)與之前的思路有點不同,之前采用的方式是,先訓(xùn)練scale1,訓(xùn)練完成后,以scale?1的輸出作為scale?2的輸入。現(xiàn)在所采用的方式是:scale 1和scale 2聯(lián)合訓(xùn)練,最后固定這兩個尺度CNN,在訓(xùn)練scale 3。
我們先大體看一下網(wǎng)絡(luò)的總體架構(gòu):
網(wǎng)絡(luò)分成三個尺度的CNN模型,scale 1的輸入是原始圖片;scale 2 的輸入是原始圖片和scale 1的輸出;同樣,scale 3 的輸入是scale 2的輸出和原始圖片。可能網(wǎng)絡(luò)的結(jié)構(gòu),看起來有點龐大,其實不然,這個相比于前面的博文《基于DCNN的人臉特征點定位》簡單多了。
?1、Scale?1?網(wǎng)絡(luò)架構(gòu)
網(wǎng)絡(luò)的輸入:原始圖片,輸入圖片大小為?三通道彩色圖片;
網(wǎng)絡(luò)的輸出:19*14大小的圖片;
下面是網(wǎng)絡(luò)第一個尺度的相關(guān)參數(shù),這個和文獻(xiàn)《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》一樣,基本上是Alexnet。
本尺度的CNN不在細(xì)講,如果不知道怎么架構(gòu),可以好好閱讀文獻(xiàn):《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》。
2、Scale?2?網(wǎng)絡(luò)架構(gòu)
(1)第一層網(wǎng)絡(luò)
輸入:原始圖片304*228(輸入320*240后,訓(xùn)練的時候,采用random?crop到304*208),經(jīng)過卷積后,得到74*55大小的圖片。相關(guān)參數(shù)如下:
[python]?view plaincopy
也就是特征圖個數(shù)為96,卷積的stride大小為2。池化采用重疊池化,池化stride大小為2。這樣卷積步的stride=2,池化步的stride=2,圖片的大小就縮小為原來的1/4(具體計算不再詳解,因為這些計算是非常基礎(chǔ)的東西了)。
(2)第二層網(wǎng)絡(luò)。輸入:除了第一層得到的特征圖之外,還有scale?1的輸出(把scale1的輸出圖片由19*14,放大4倍,然后進(jìn)行邊界處理,得到74*55的圖片)。
3、Scale?3?網(wǎng)絡(luò)結(jié)構(gòu)
個人感覺多加了這個尺度的網(wǎng)絡(luò),僅僅只是為了獲得更高分辨率的輸出。
(1)第一層網(wǎng)絡(luò)。與scale?2一樣,第一層網(wǎng)絡(luò)的輸入是原始圖片,然后進(jìn)行卷積池化,因為我們scale?3要得到更大分辨率的結(jié)果,于是作者就把池化的stride選擇為1,具體代碼如下:
[python]?view plaincopy
這樣經(jīng)過這一層的操作,我們可以得到147*109的圖片。
(2)第二層網(wǎng)絡(luò)。輸入第一層的特征圖,還有scale?2的輸出圖,在進(jìn)行卷積池化。相關(guān)參數(shù)如下:
[python]?view plaincopy(3)第三層網(wǎng)絡(luò)。后面都差不多,大同小異,具體就不在詳解了,看一下網(wǎng)絡(luò)的相關(guān)配置參數(shù):
[python]?view plaincopy(4)第四層網(wǎng)絡(luò)
[python]?view plaincopy
四、損失函數(shù)構(gòu)建
我覺得文獻(xiàn)的提出算法,如何構(gòu)造損失函數(shù)也是一大創(chuàng)新點,所以我們還是要好好閱讀對于深度、法向量、語義分割這些損失函數(shù)是怎么構(gòu)建的。
(1)深度估計損失函數(shù)
這個與之前的那篇paper的構(gòu)造方法相同,也是采用作者所提出的縮放不變損失函數(shù),同時后面又加了一項elementwise?L2:
?
其中D和D*分別表示網(wǎng)絡(luò)深度預(yù)測值、實際的深度值。然后d=D-D*。
(2)法矢估計損失函數(shù)
因為法向量是三維的,因此我們每層scale的輸出,就不應(yīng)該是一個單通道圖片了,而應(yīng)該改為3通道,用于分別預(yù)測一個三維向量的(x,y,z)值。同時我們要知道法向量指的是長度為1的歸一化向量,因此在輸出三維V向量后,我們還需要把它歸一化,然后接著才能定義計算損失函數(shù):
?
因為預(yù)測值N和真實值N*向量的模長都為1,所以其實上面的損失函數(shù)說白了就是以兩個向量的角度差,作為距離度量。
真實的法向量的獲取方法:可能是沒有訓(xùn)練數(shù)據(jù)的原因,所以文獻(xiàn)法向量訓(xùn)練數(shù)據(jù)的獲取方法,是通過每個像素點的深度值,獲得三維空間中每個像素點的位置,也就是相當(dāng)于點云。然后采用最小二乘平面擬合,擬合出每個點鄰域范圍內(nèi)平面,以平面的法向量作為每個像素點的法矢(這個因為我之前搞過三維的重建、點云處理,所以對于三維點云法向量的求取會比較熟悉,如果沒有接觸過三維圖形學(xué)的,可以跳過不看,或者可以學(xué)一學(xué)我的博客:?http://blog.csdn.net/hjimce/article/category/5570255?關(guān)于三維圖形學(xué)的知識,可以直接看點云重建)
(3)語義分割損失函數(shù)
因為語義分割,就相當(dāng)于給每個像素點做分類,也就是相當(dāng)于一個多分類問題,所以自然而然采用softmax,損失函數(shù)采用交叉熵:
?
其中:
?
這個是softmax的相關(guān)知識了,不熟悉的趕緊補(bǔ)一下。不然后面遇到CNN圖片分類,就要抓狂了,softmax是基礎(chǔ)知識。
五、網(wǎng)絡(luò)訓(xùn)練
(1)訓(xùn)練流程
訓(xùn)練方法采用的都是隨機(jī)梯度下降法,首先我們訓(xùn)練把scale?1和scale?2?聯(lián)合起來訓(xùn)練,也就是說我們在訓(xùn)練scale?2的時候,scale1的參數(shù)也是要更新的,這個與另外一篇paper:《Depth?Map?Prediction?from?a?Single?Image?using?a?Multi-Scale?Deep?Network》的訓(xùn)練方法不同。然后scale?3的訓(xùn)練和前面兩個尺度的訓(xùn)練是分開的,我們先訓(xùn)練完了scale?1、scale?2,訓(xùn)練完畢后,固定這兩個尺度的參數(shù),然后繼續(xù)訓(xùn)練scale?3(換一種說法就是訓(xùn)練scale?3的時候,scale?1\2的參數(shù)是不更新的)。
(2)訓(xùn)練參數(shù)
具體的訓(xùn)練參數(shù),還是參考作者給的代碼中的conf網(wǎng)絡(luò)配置文件,里面可以看到每層的學(xué)習(xí)率,以及其它的一些相關(guān)參數(shù)。參數(shù)初始化:除了scale?1前面幾層卷積層是用了Alexnet訓(xùn)練好的參數(shù),作為初始值。其它的全部采用隨機(jī)初始化的方法。Batch?size大小選擇32。
參考文獻(xiàn):
1、《Predicting?Depth,?Surface?Normals?and?Semantic?Labels?with?a?Common?Multi-Scale?Convolutional?Architecture》
2、http://www.cs.nyu.edu/~deigen/dnl/
3、《Depth?map?prediction?from?a?single?image?using?a?multi-scale?deep?network》
**********************作者:hjimce ? 時間:2016.1.1 ?聯(lián)系QQ:1393852684 ? 地址:http://blog.csdn.net/hjimce? ?原創(chuàng)文章,版權(quán)所有,轉(zhuǎn)載請保留本行信息(不允許刪除)
總結(jié)
以上是生活随笔為你收集整理的深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计-ICCV 2015的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(二十四)矩阵分解之基于k-me
- 下一篇: 深度学习(二十六)Network In