文章目錄
一、簡介
PSPNet官方地址
PSPNet論文地址
PSPNet代碼PyTorch地址
PSPNet代碼Caffe地址
《Pyramid Scene Parsing Network》簡稱PSPNet是2016年ImageNet場景解析討戰賽第一名使用的結構,其旨在解決之前的語義分割網絡FCN存在的無法有效使用全局場景不同類編之間關係信息的缺陷,希望通過提取不同維度的特徵信息,增強特徵的表現能力,能夠將圖像的上下文信息應用於最終的分類中去。
文章的主要三個貢獻:
- 提出了PSPNet網絡結構能夠更好的提取上下文信息;
- 開發了一種有效優化深度殘差網絡的優化策略(輔助分支在Googlenet中就有應用過,算是創新嗎?)
- 構建了場景解析和語義分割的實用框架:PyTorch
二、所面對的問題及其解決方向
之前的語義分割網絡使用全卷積和空洞卷積的FCN來對像素進行分類,但是並沒有有效地利用圖像中的上下文信息。因此,作者提出提升性能的兩個方向:
- 在深度網絡中,深層特徵包含更多的語義信息而底層特徵包含更多的空間位置信息,因此結合這兩者的特徵能夠有效提升網絡的性能;
- 之前的工作都是使用CRF(條件隨機場)進行圖像後處理,也有使用端到端的網絡進行學習的結構,因此作者認爲通過結構預測在複雜條件下還是有大的空間提取更有效地信息。
在具體的任務中使用FCN作爲基線所面對的具體的問題及其解決方向:
- 類別失配。無法有效利用圖像的上下文信息,類別錯分。例如在下面的圖像中第一行是一個湖畔,一般來說湖畔有車的概率小於有船的概率,而FCN將船錯分成了車。這點可以通過利用圖像的上下文信息解決;
- 類別混淆。外形相似的類別錯分。如下圖中的第二行中的玻璃大廈,因爲玻璃的反光使得其的外形有點兒變化網絡錯分。這點可以通過引入類別間的相互關係解決。
- 小目標無法識別的問題。如下圖中的第三行中的枕頭,FCN直接就沒有檢測到。利用多尺度特徵解決。
三、結構
1、Pyramid Pooling Module
Pyramid Pooling Module模塊(下面簡稱PPM)是作者根據上面所提到的問題所提出的模塊,能夠多尺度的融合低層和高層的信息,增強特徵,提升模型的表現力。
一般來說網絡越深感受野越大(resceptive field),但是理論上的感受野和實際網絡中的感受野還是有差距的(實際的感受野小於理論的感受野),這使得網絡無法有效的融合全局特徵信息,作者提出的PPM就解決了這個問題。(論文中說的,沒搞懂爲什麼)
GAP(Global Average Pooling,全劇平均池化)能夠有效的融合全局上下文信息,但是其對信息的融合和提取能力有限,而且簡單的使用GAP將信息壓縮爲一個通道很容易損失很多有用的信息,因此將不同感受野的特徵和子區域的特徵融合可以增強特徵表徵能力。
上圖是PPM模型的結構,PPM的輸入是圖像經過特徵提取網絡比如Resnet50進行特徵提取得到固定大小的特徵圖,然後分成兩個分支,一個分支分爲多個子區域進行GAP,再通過上採樣到和另一個分支相同的尺寸,最後將兩個分支融合。
關於中間的子區域作者選擇不同的子區域進行了實驗,最終選擇了(11,22,33,66)(具體的結果在實驗部分),並且在每個子區域之後都使用一個1*1卷估計網絡對該區域進行通道融合,如果金字塔級別是N,即子區域的個數,這裏是4,則通道縮減爲原來的,這樣既可以保障能能夠提取足夠的特徵,融合更多的信息,而且參數量也不會有過多的增加。
PPM模塊如下所示,bins是所指定的子區域的大小,網絡中設置爲(1,2,3,6)。
class PPM(nn.Module):
def __init__(self, in_dim, reduction_dim, bins, BatchNorm):
super(PPM, self).__init__()
self.features = []
for bin in bins:
self.features.append(nn.Sequential(
nn.AdaptiveAvgPool2d(bin),
nn.Conv2d(in_dim, reduction_dim, kernel_size=1, bias=False),
BatchNorm(reduction_dim),
nn.ReLU(inplace=True)
))
self.features = nn.ModuleList(self.features)
def forward(self, x):
x_size = x.size()
out = [x]
for f in self.features:
out.append(F.interpolate(f(x), x_size[2:], mode='bilinear', align_corners=True))
return torch.cat(out, 1)
2、網絡結構
網絡結構如同上面的圖片所示,只是將原來的AGAP替代成了PPM模塊沒有過多可說的。
3、Deep Supervision for ResNet-Based FCN
這個小節的名字是照搬原文的,我覺得就是在resnet中的res4b22後面加了一個輔助分支採用softmax損失進行輔助訓練,很像googlenet中的輔助分支。在Resnet中GAP替換成了之前的backbone比較常用的全連接層,雖然性能上去了但是不好訓練,我認爲這裏使用輔助分支應該是爲了解決這個問題。
另外需要輔助分支的結構並未出現在論文中,從代碼中我們可以看到輔助分支的結構如下,就是兩層卷積而已:
self.aux = nn.Sequential(
nn.Conv2d(1024, 256, kernel_size=3, padding=1, bias=False),
BatchNorm(256),
nn.ReLU(inplace=True),
nn.Dropout2d(p=dropout),
nn.Conv2d(256, classes, kernel_size=1)
)
四、實驗
作者的實驗設置主要在ImageNet scene parsing challenge 2016,PASCAL VOC 2012 語義分割數據集 和城市場景理解Cityscapes三個數據集上進行實驗。實驗結果我只貼出了所有實驗結果的圖片,表格和圖像數據一目瞭然無需過多的解釋。
1、實驗設置
參數或策略 | 值或方式 |
---|---|
基礎學習率 | 0.01 |
學習率更新方式 | , power=0.9 |
權重衰減 | momentum=0.9,weight decay=0.0001 |
數據增強策略 | 隨機鏡像,隨機縮放0.5或2倍,隨機旋轉-10或者10度,隨機高斯模糊 |
迭代次數 | ImageNet=150K,VOC=30K,Cityscapes=90K |
2、ImageNet Scene Parsing Challenge 2016
3、PASCAL VOC 2012
4、Cityscapes