ASPP - 空洞空间金字塔池化
文章目錄
- 1 空洞卷積
- 1.1 空洞卷積的理解
- 1.1.1 一維
- 1.1.2 二維
- 1.2 空洞卷積的優劣
- 2. ASPP
- 3. 代碼
1 空洞卷積
1.1 空洞卷積的理解
1.1.1 一維
(a) 正常卷積:輸入特征 Input feature,kernel = 3,stride = 1,pad = 1,輸出特征 Output feature。
(b) 空洞卷積:與圖 (a) 不同之處在于 pad = 2,同時引入一個 rate = 2(表示卷積核中參數間間隔的超參)。
??還可通過下圖進一步理解普通卷積與空洞卷積的區別,其中 hole size 即為上圖中的 rate。
1.1.2 二維
正常卷積:藍色為輸入,綠色為輸出,移動的陰影為卷積核(kernel = 2, stride = 1,pad = 0);
空洞卷積:藍色為輸入,綠色為輸出,移動的陰影為卷積核(kernel = 3, stride = 1, pad = 0, rate = 1);
??以上演示動圖來源于此,對理解卷積操作有很大的幫助。在實際中,空洞卷積一般有兩種實現方式:(1)卷積核填充 0;(2)輸入等間隔采樣。
1.2 空洞卷積的優劣
??一般認為圖片中相鄰的像素點存在信息冗余,故而空洞卷積具備以下兩個優勢:
(1) 擴大感受野:傳統的下采樣雖可增加感受野,但會降低空間分辨率。而使用空洞卷積能夠在擴大感受野的同時,保證分辨率。這十分適用于檢測、分割任務中,感受野的增大可檢測、分割大的目標,高分辨率則可精確定位目標。
(2) 捕獲多尺度上下文信息:空洞卷積中參數 dilation rate 表明在卷積核中填充 (dilation rate-1) 個 0。設置不同 dilation rate 給網絡帶來不同的感受野,即獲取了多尺度信息。
??空洞卷積得到的某一層的結果中,鄰近的像素是從相互獨立的子集中卷積得到的,相互之間缺少依賴,故而空洞卷積也存在不足:
(1) 局部信息丟失:由于空洞卷積的計算方式類似于棋盤格式,某一層得到的卷積結果,來自上一層的獨立的集合,沒有相互依賴,因此該層的卷積結果之間沒有相關性,即局部信息丟失;
(2) 遠距離獲取的信息沒有相關性:由于空洞卷積稀疏的采樣輸入信號,使得遠距離卷積得到的信息之間沒有相關性。
2. ASPP
??上圖即為 ASPP 模塊示意:對 Input Feature Map 以不同采樣率的空洞卷積并行采樣;然后將得到的結果 concat 到一起,擴大通道數;最后通過 1×11 \times 11×1 的卷積將通道數降低到預期的數值。相當于以多個比例捕捉圖像的上下文。
??上圖為添加 ASPP 模塊后的網絡結構,將 Block3 的輸出輸入到 ASPP,經過多尺度的空洞卷積采樣后經過池化操作,然后由 1×11 \times 11×1 卷積將通道數降低至預期值。
3. 代碼
??一個沒有 BN 層的 PyTorch 實現的 ASPP 代碼(DeepLabv3 的 ASPP 中加入了 BN 層)如下:
#without bn version class ASPP(nn.Module):def __init__(self, in_channel=512, depth=256):super(ASPP,self).__init__()self.mean = nn.AdaptiveAvgPool2d((1, 1)) #(1,1)means ouput_dimself.conv = nn.Conv2d(in_channel, depth, 1, 1)self.atrous_block1 = nn.Conv2d(in_channel, depth, 1, 1)self.atrous_block6 = nn.Conv2d(in_channel, depth, 3, 1, padding=6, dilation=6)self.atrous_block12 = nn.Conv2d(in_channel, depth, 3, 1, padding=12, dilation=12)self.atrous_block18 = nn.Conv2d(in_channel, depth, 3, 1, padding=18, dilation=18)self.conv_1x1_output = nn.Conv2d(depth * 5, depth, 1, 1)def forward(self, x):size = x.shape[2:]image_features = self.mean(x)image_features = self.conv(image_features)image_features = F.upsample(image_features, size=size, mode='bilinear')atrous_block1 = self.atrous_block1(x)atrous_block6 = self.atrous_block6(x)atrous_block12 = self.atrous_block12(x)atrous_block18 = self.atrous_block18(x)net = self.conv_1x1_output(torch.cat([image_features, atrous_block1, atrous_block6,atrous_block12, atrous_block18], dim=1))return net【參考】
總結
以上是生活随笔為你收集整理的ASPP - 空洞空间金字塔池化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国诺贝尔物理学奖所有获得者名单(转)
- 下一篇: word怎么让页码在指定页面从1开始