一、說明
fcn的開源代碼:https://github.com/shelhamer/fcn.berkeleyvision.org
論文地址:fully convolutional networks for semantic segmentation
其中,pascalcontext-fcn語義分割,算上背景,一共分割為60類。
pascalcontext-fcn全卷積神經網絡主要使用了三種技術:
1. 卷積化(Convolutional)
2. 上采樣(Upsample)
3. 跳躍結構(Skip Layer)
二、網絡結構概況
1、FCN-32s
通過前五段的卷積層,直接從第五個最大池化層通過32倍上采樣,得到和原圖高寬一致的多通道預測label;
2、FCN-16s
pool5通過兩倍上采樣,得到預測label,與pool4 的預測label求和,再進行16倍上采樣,得到和原圖高寬一致的多通道預測label;
3、FCN-8s
pool5通過兩倍上采樣,得到預測label,與pool4 的預測label求和,再將求和結果進行2倍上采樣,與pool3的預測label求和,最終進行8倍上采樣,得到和原圖高寬一致的多通道預測label。
4、訓練過程
使用vgg16初始化FCN-32s網絡結構;再將訓練好的FCN-32s去初始化FCN-16s;再將訓練好的FCN-16s去初始化FCN-8s。
三、各階段網絡結構
1、pascalcontext-fcn32s
原vgg16的最后三層全連接層,都改為卷積層,通過上采樣得到upscore,再進行crop得到和原圖寬高一致的預測label(score層)。
2、pascalcontext-fcn16s
將scrore_fr進行兩倍上采樣得到預測標簽upscore2;將pool4的預測s標簽core_pool4進行crop,得到和upscore2一樣尺寸的預測標簽score_pool4c;然后將upscore2與score_pool4c求和,得到fuse_pool4;再進行16倍上采樣,再crop,就得到預測標簽score。
3、pascalcontext-fcn8s
將fuse_pool4進行兩倍上采樣得到upscore_pool4;將pool3的預測標簽score_pool3進行crop(寬高與upscore_pool4一致),得到score_pool3c;將upscore_pool4與score_pool3c求和得到fuse_pool3;然后進行8倍上采樣,crop,得到預測標簽score。
四、其他說明
1、查看網絡結構的在線工具:http://ethereon.github.io/netscope/#/editor
2、pool4、pool3的上采樣,有進行了crop操作,會造成信息的損失,該網絡結構有一個巧妙的處理,在第一層卷積層四周添加pad為100,再進行卷積操作,即先擴展圖片,之后再進行crop。裁切
的區域也是補出來的區域,這樣就能無損地像素級分割。讀者可試着計算pad的最小值。
layer { name: "conv1_1" type: "Convolution" bottom: "data" top: "conv1_1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 64 pad: 100 kernel_size: 3 stride: 1 } }
end