一、DetNet簡介
DetNet是一種基於深度可分離卷積的網路結構,用於目標檢測任務。它由南京大學和首都師範大學的研究團隊提出並於2018年發表在ECCV上。DetNet主要特點是結構簡單、計算代價低,同時具有良好的檢測性能。下面我們將從幾個方面對DetNet做介紹。
二、深度可分離卷積介紹
深度可分離卷積是一種輕量級卷積方式,是Google在2017年提出的。相比傳統的卷積方式,它分為深度可分離卷積和逐通道卷積兩部分。深度可分離卷積首先在通道上進行一維卷積,然後在空間上進行三維卷積,這樣可以大大減少計算量。而逐通道卷積,則是將多通道的輸入分別進行一維卷積,然後在通道維度上進行合併,此方法可以獲得更多的特徵信息。
三、DetNet網路結構
DetNet主要由深度可分離卷積構成,包含多個卷積層和池化層,其中每個卷積層後都加入了一個殘差模塊。在殘差模塊中,採用了兩個卷積層,分別進行1×1卷積和3×3卷積,並加入了批歸一化和ReLU激活函數。與ResNet網路不同的是,殘差模塊不是直接將輸入加到輸出上,而是利用一個特殊的通道注意力模塊。它可以自適應地修改特徵圖的通道權重,從而提高網路的檢測性能。
四、DetNet示例代碼
import torch
import torch.nn as nn
class DetNet(nn.Module):
def __init__(self):
super(DetNet, self).__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True)
)
self.res_layers = nn.Sequential(
ResidualBlock(512),
ResidualBlock(512),
ResidualBlock(512),
ResidualBlock(512),
ResidualBlock(512),
ResidualBlock(512)
)
self.se_layer = SE_Module(512)
def forward(self, x):
x = self.conv_layers(x)
x = self.res_layers(x)
x = self.se_layer(x)
return x
class ResidualBlock(nn.Module):
def __init__(self, in_channels):
super(ResidualBlock, self).__init__()
self.block = nn.Sequential(
nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(in_channels),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(in_channels)
)
def forward(self, x):
residual = x
x = self.block(x)
x += residual
x = nn.ReLU(inplace=True)(x)
return x
class SE_Module(nn.Module):
def __init__(self, channel):
super(SE_Module, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channel, channel // 16, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channel // 16, channel, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y.expand_as(x)
五、DetNet性能對比
DetNet在COCO檢測任務上與其他主流網路進行了測試,包括Faster R-CNN、R-FCN和SSD等等。結果顯示,DetNet的mAP值均高於其他網路。在計算複雜度上,DetNet比Faster R-CNN低一個數量級,比SSD低兩個數量級。這表明DetNet既有很高的檢測性能,又具有很好的輕量化性質。
原創文章,作者:WWFBM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/334079.html