Task 7 FCN_3

1. 了解tensorflow的API

為了更好更高效地進(jìn)行數(shù)據(jù)分析,我學(xué)習(xí)了如何使用tf.summary觀察訓(xùn)練過程,用tf.records制作和讀取訓(xùn)練集,以及用tf.dataset按批讀取數(shù)據(jù)。

2. 訓(xùn)練心得

2.1. 背景

第一次做MIT Scene Parsing Benchmark的比賽數(shù)據(jù)集時,由于經(jīng)驗不足,栽了很多跟頭。先是圖像讀取的代碼總是出錯,沒法正確運行。

好不容易能跑起來,準(zhǔn)確率又很低:像素準(zhǔn)確率有50左右,但miou只有20。

由于任務(wù)要求用FCN-8s,優(yōu)化不能改變網(wǎng)絡(luò)模型,學(xué)習(xí)率又從1e-4一直調(diào)到了1e-6都沒改善,最終確定優(yōu)化的方向在于圖像處理的方式

我主要研究了兩個樣例代碼,分別是FCN.tensorflow以及semantic-segmentation-pytorch??偨Y(jié)出來圖像處理的方式有以下幾種。

2.2 圖像的按批處理

圖像的按批處理方式有3種:

  1. 一張一張?zhí)幚?/li>
  2. 按一小批處理(SGD)
  3. 全部一起處理(不可能,因為圖像集太大)

第一種方式的處理速度快,收斂也快,但因為每批只有一張圖,參數(shù)會反復(fù)跳動,導(dǎo)致無法達(dá)到最佳值。

第二種方式處理稍慢,但收斂結(jié)果會比第一種好些,因為參數(shù)反復(fù)無常的次數(shù)會少些。最開始我參考的FCN.tensorflow的代碼就是使用每批兩張圖的。

2.3 圖像的讀取處理

  1. 全部縮小到統(tǒng)一比例,比如224*224
  2. 全部放大到統(tǒng)一比例,只要能夠被32整除(以便通過卷積和逆卷積后正確恢復(fù)圖像比例)

第一種就是FCN.tensorflow的做法。它對所有圖片都縮放到224 * 224(很多圖片的尺寸都大于224 * 224),這樣雖然簡單快捷,但在處理較小物體時會表現(xiàn)得很差,因為縮小圖片會丟失細(xì)節(jié)。

第二種就是semantic-segmentation-pytorch的做法。它對每一批的圖片都會放大到統(tǒng)一的尺寸,做法如下:

  1. 得到這一批圖片的最大的長和寬,比如(512, 702)。

  2. 讓最大長和最大寬都能被32整除,以便能順利通過卷積層和逆卷積層,并正確保持圖像比例,因為FCN-8s的卷積層全部通過時,圖像連續(xù)5次縮小一半,相當(dāng)于被縮小了2^5 = 32倍,如果尺寸不是32的倍數(shù),在恢復(fù)時可能出現(xiàn)尺寸無法匹配的情況。

    尺寸無法匹配的意思就是:比如某圖片在最后一層卷積層前尺寸是(31, 31),經(jīng)過卷積層(padding="SAME", strides=[2, 2])縮小變成(16, 16),再放大就變成(32, 32)了。由于skip-architecture,(31, 31)要與(32, 32)相加,就出現(xiàn)了尺寸不同的情況。

    所以,(512, 702)的尺寸中,512可以整除32,而702不能整除。經(jīng)過計算得到比702大的最近能夠整除32的數(shù)為704,所以最終尺寸確定為(512, 704)

2.4 圖像的縮放處理

圖像的縮放方式很關(guān)鍵,自己寫的時候因為這里疏忽,導(dǎo)致訓(xùn)練結(jié)果基本作廢,那就是:對于annotation的縮放方式必須使用"nearest",對image的縮放則應(yīng)該使用"bilinear"(別的也可以)。

代碼中也就是這兩句

image = misc.imresize(image, [resize_height, resize_width], interp="bilinear")
annotation = misc.imresize(annotation, [resize_height, resize_width], interp="nearest")

為什么annotation的縮放方式必須使用"nearest"?因為annotation標(biāo)記了每個像素的確切分類,是整數(shù)值。如果使用"bilinear"縮放,會使縮放結(jié)果出現(xiàn)很多本來沒有的值。比如原本圖像只有2,5兩個分類,像素點的值都是2到5,由于"bilinear"縮放,使得填充的點出現(xiàn)了3點幾,4點幾的值,但原圖片根本沒有3和4這兩個分類,而且3.幾不是整數(shù),不能表示一個分類。這就扭曲了圖片原本的含義了。

2.4 圖像處理的選用

最終我選擇了按批處理,每批2張圖的方式,對image使用"nearest"縮放,對annotation使用"bilinear"縮放,且尺寸統(tǒng)一放大,以便保留小物體的細(xì)節(jié)。

3. 指標(biāo)理解:mean_iou

參考:深度學(xué)習(xí)中IU、IoU(Intersection over Union)的概念理解以及python程序?qū)崿F(xiàn)
iou就是Intersection over Union,mean就是各個類別的平均iou。
比如,一個物體類別的實際區(qū)域和預(yù)測區(qū)域可能如下:

image.png

那么iou就是預(yù)測與實際的重疊部分 / 預(yù)測與實際的合并區(qū)域:


對每個類別,都如此計算iou,最后取平均即可。

4. 訓(xùn)練結(jié)果

對100張validation的圖片進(jìn)行了測試,并計算了4項指標(biāo):
以下四項分別是pixel_acc, mean_acc, mean_iou, weighted_iou:

這是部分的預(yù)測結(jié)果:






相關(guān)閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容