1. 了解tensorflow的API
為了更好更高效地進行數(shù)據分析怕吴,我學習了如何使用tf.summary觀察訓練過程落塑,用tf.records制作和讀取訓練集坪创,以及用tf.dataset按批讀取數(shù)據褐望。
2. 訓練心得
2.1. 背景
第一次做MIT Scene Parsing Benchmark的比賽數(shù)據集時蜕琴,由于經驗不足注整,栽了很多跟頭能曾。先是圖像讀取的代碼總是出錯,沒法正確運行肿轨。
好不容易能跑起來寿冕,準確率又很低:像素準確率有50左右,但miou只有20椒袍。
由于任務要求用FCN-8s驼唱,優(yōu)化不能改變網絡模型,學習率又從1e-4一直調到了1e-6都沒改善驹暑,最終確定優(yōu)化的方向在于圖像處理的方式曙蒸。
我主要研究了兩個樣例代碼捌治,分別是FCN.tensorflow以及semantic-segmentation-pytorch∨撸總結出來圖像處理的方式有以下幾種肖油。
2.2 圖像的按批處理
圖像的按批處理方式有3種:
- 一張一張?zhí)幚?/li>
- 按一小批處理(SGD)
- 全部一起處理(不可能,因為圖像集太大)
第一種方式的處理速度快臂港,收斂也快森枪,但因為每批只有一張圖,參數(shù)會反復跳動审孽,導致無法達到最佳值县袱。
第二種方式處理稍慢,但收斂結果會比第一種好些佑力,因為參數(shù)反復無常的次數(shù)會少些式散。最開始我參考的FCN.tensorflow的代碼就是使用每批兩張圖的。
2.3 圖像的讀取處理
- 全部縮小到統(tǒng)一比例打颤,比如224*224
- 全部放大到統(tǒng)一比例暴拄,只要能夠被32整除(以便通過卷積和逆卷積后正確恢復圖像比例)
第一種就是FCN.tensorflow的做法。它對所有圖片都縮放到224 * 224(很多圖片的尺寸都大于224 * 224)编饺,這樣雖然簡單快捷乖篷,但在處理較小物體時會表現(xiàn)得很差,因為縮小圖片會丟失細節(jié)透且。
第二種就是semantic-segmentation-pytorch的做法撕蔼。它對每一批的圖片都會放大到統(tǒng)一的尺寸,做法如下:
得到這一批圖片的最大的長和寬秽誊,比如(512鲸沮, 702)。
-
讓最大長和最大寬都能被32整除锅论,以便能順利通過卷積層和逆卷積層讼溺,并正確保持圖像比例,因為FCN-8s的卷積層全部通過時棍厌,圖像連續(xù)5次縮小一半肾胯,相當于被縮小了2^5 = 32倍,如果尺寸不是32的倍數(shù)耘纱,在恢復時可能出現(xiàn)尺寸無法匹配的情況敬肚。
尺寸無法匹配的意思就是:比如某圖片在最后一層卷積層前尺寸是(31, 31)束析,經過卷積層(padding="SAME"艳馒, strides=[2, 2])縮小變成(16, 16),再放大就變成(32弄慰, 32)了第美。由于skip-architecture,(31陆爽, 31)要與(32什往, 32)相加,就出現(xiàn)了尺寸不同的情況慌闭。
所以别威,(512, 702)的尺寸中驴剔,512可以整除32省古,而702不能整除。經過計算得到比702大的最近能夠整除32的數(shù)為704丧失,所以最終尺寸確定為(512豺妓, 704)
2.4 圖像的縮放處理
圖像的縮放方式很關鍵,自己寫的時候因為這里疏忽布讹,導致訓練結果基本作廢琳拭,那就是:對于annotation的縮放方式必須使用"nearest",對image的縮放則應該使用"bilinear"(別的也可以)炒事。
代碼中也就是這兩句
image = misc.imresize(image, [resize_height, resize_width], interp="bilinear")
annotation = misc.imresize(annotation, [resize_height, resize_width], interp="nearest")
為什么annotation的縮放方式必須使用"nearest"臀栈?因為annotation標記了每個像素的確切分類蔫慧,是整數(shù)值挠乳。如果使用"bilinear"縮放,會使縮放結果出現(xiàn)很多本來沒有的值姑躲。比如原本圖像只有2睡扬,5兩個分類,像素點的值都是2到5黍析,由于"bilinear"縮放卖怜,使得填充的點出現(xiàn)了3點幾,4點幾的值阐枣,但原圖片根本沒有3和4這兩個分類马靠,而且3.幾不是整數(shù),不能表示一個分類蔼两。這就扭曲了圖片原本的含義了甩鳄。
2.4 圖像處理的選用
最終我選擇了按批處理,每批2張圖的方式额划,對image使用"nearest"縮放妙啃,對annotation使用"bilinear"縮放,且尺寸統(tǒng)一放大,以便保留小物體的細節(jié)揖赴。
3. 指標理解:mean_iou
參考:深度學習中IU馆匿、IoU(Intersection over Union)的概念理解以及python程序實現(xiàn)
iou就是Intersection over Union,mean就是各個類別的平均iou燥滑。
比如渐北,一個物體類別的實際區(qū)域和預測區(qū)域可能如下:
那么iou就是預測與實際的重疊部分 / 預測與實際的合并區(qū)域:
對每個類別,都如此計算iou铭拧,最后取平均即可腔稀。
4. 訓練結果
對100張validation的圖片進行了測試,并計算了4項指標:
以下四項分別是pixel_acc, mean_acc, mean_iou, weighted_iou:
這是部分的預測結果: