Pyramid Scene Parsing Network理解與復現

代碼:https://github.com/hszhao/PSPNet
論文:https://arxiv.org/abs/1612.01105
論文理解
文章針對的問題:在這裏插入圖片描述
(1)Mismatched Relationship
關係匹配不明確:很多分割場景中,單獨看某個目標很容易誤分割,需要將目標放在全圖中才能確定目標。比如,上圖第一行中水上面的目標,應該是boat,而不會是car。即需要結合上下文語境,才能分辨的出的目標。
(2)Confusion Categories
類別混淆:有的場景中,存在很多類別概念本身很模糊的目標,比如上圖第二行中,building和skyscraper ,兩者本身都屬於建築,但是,兩者類別還是不同,需要區別開。
(3)Inconspicuous Classes
類別不明確:這種情況,常常因爲位置關係,目標的類別也會不同,跟第一種問題相似,也需要結合上下文語境才能分別的出。比如上圖第三行,牀單,窗簾和枕頭,這三個不同的類別,外觀顏色特徵一樣,只是因爲位置不同而類別不同而已。
文章解決的辦法:
全局均值池化+特徵融合
網絡結構
在這裏插入圖片描述
(a)Input Image: batch_size X 3 X473 X 473
(b) Feature map :通過resnet提取圖像特徵,在提取特徵過程中,使用卷積過程中增加空洞卷積的過程(步長:8)。
© pyramid pooling module:文章精華。將通過resnet獲取得到的特徵(batch_size X 2048 X60 60),構建4(可調整)層特徵金字塔結構,每層的輸入特徵根據不同尺度的池化操作得到。第一層:使用60 X 60的ave pooling 得到batch_size X 2048 X1 X1的輸入,然後通過1 * 1的卷積,將Feature map 數減少到原來的1/4,成batch_size X 512X1 X1,最後上採樣到原來Feature map的尺寸大小,成batch_size X 512X60 X60;第二層:使用30X30的ave pooling 得到batch_size X 2048 X2X2的輸入,然後與第一層一樣;第三層:使用20X20的ave pooling 得到batch_size X 2048 X3X3的輸入,然後與第一層一樣;第四層:使用10X10的ave pooling 得到batch_size X 2048 X6X6的輸入,然後與第一層一樣。最後將這4層特徵金字塔(深層特徵)與resnet獲取的Feature map(淺層特徵),直接concat在一起,形成batch_size X 4096X60 X60的輸出。
(d) Final Prediction: 將 pyramid pooling module得到的輸出,進行1 * 1的卷積降維,然後上採樣到原圖大小。

intermediate supervision
在主幹網絡中,使用到了中間監督的方法。
在這裏插入圖片描述
論文復現:
環境:unbuntu14.04 ; cuda 10.0
Fintun pspnet101_VOC2012.caffemodel ,下載路徑:https://github.com/hszhao/PSPNet/tree/master/evaluation/model
用來做路面分割。

數據集格式(跟訓練segnet一樣,前一列是原圖路徑,大小爲473*473;後一列爲原圖對應的mask二值圖像路徑):
在這裏插入圖片描述
網絡選擇的pspnet101_VOC2012_train.prototxt,地址:https://github.com/hszhao/PSPNet/blob/master/evaluation/prototxt/pspnet101_VOC2012_473.prototxt
根據自己實際任務微調了下。
solver.prototxt

train_net: "/home1/PSPNet/PSPNet-master/models/road/trainNet/road2.prototxt"

iter_size: 4

lr_policy: "poly"
power: 0.9

base_lr: 1e-3

average_loss: 20
display: 20
momentum: 0.9
weight_decay: 0.0001

# imagenet
# max_iter: 150000
# PASCAL VOC
max_iter: 30000
# Cityscape
#max_iter: 90000

snapshot: 1000
snapshot_prefix: "/home1/PSPNet/PSPNet-master/models/road/model/road2"
solver_mode: GPU

訓練腳本命令:

#!/usr/bin/env sh
./build/tools/caffe train \
--weights="/home1/PSPNet/PSPNet-master/models/road/fintuModel/pspnet101_VOC2012.caffemodel" \
--solver=./models/road/solver_road.prototxt  -gpu 1,2 2>&1 | tee /home1/PSPNet/PSPNet-master/seg2.log

訓練過程特別耗內存資源,我在訓練時,同時用2塊12G的GPU,如果網絡中的骨幹網絡是resnet101,網絡中的batch_size只能設置1,設置2就內存溢出,或者loss一直86.7,,,不收斂,如果2塊12G的gpu,主幹網絡用resnet50,可以將batch_size設置成2.
下面是骨幹網絡是resnet101的pspnet與segnet測試對比:

在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述

下面是骨幹網絡是resnet101和骨幹網絡是resnet50的測試對比(骨幹網絡是resnet101的模型大小:257M;骨幹網絡是resnet50的模型大小:187M):

在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章