如图所示,DetNet引入了一个新的Stage6,用于物体检测。Stage5与Stage6使用了DetNet提出的Bottleneck结构 。最大的特点就是使用了空洞数为2的3x3卷积取代了步长为2的3x3卷积。
Stage5与Stage6的每一个特征图尺寸都为原图的1/16,通道数都为256,而传统的Backbone通常是特征图尺寸递减,通道数递增。
在组成金字塔时,特征图大小完全相同,因此可以直接从右向左传递相加,避免了上一节的上采样操作。
代码:
from torch import nn
class DetBottleneck(nn.Module):
#初始化时extra为False时为Bottleneck A,为True时,则为Bottleneck B
def __init__(self,inplanes,planes,stride=1,extra=False):
super(DetBottleneck,self).__init__()
#构建连续3个卷积层的Bottleneck
self.bottleneck=nn.Sequential(
nn.Conv2d(inplanes,planes,1,bias=True),
nn.BatchNorm2d(planes),
nn.ReLU(inplace=True),
nn.Conv2d(planes,planes,kernel_size=3,stride=1,padding=2,dilation=2,bias=False),
nn.BatchNorm2d(planes),
nn.ReLU(inplace=True),
nn.BatchNorm2d(planes),
)
self.relu=nn.ReLU(inplace=True)
self.extra=extra
#Bottleneck B 的1x1卷积
if self.extra:
self.extra_conv=nn.Sequential(
nn.Conv2d(inplanes,planes,1,bias=False),
nn.BatchNorm2d(planes)
)
def forward(self,x):
#对于Bottleneck B来讲,需要对恒等映射增加卷积处理,与ResNet类似
if self.extra:
identity=self.extra_conv(x)
else:
identity=x
out=self.bottleneck(x)
out+=identity
out=self.relu(out)
return out