以下内容转自原文链接:https://blog.csdn.net/weixin_45074568/article/details/114596493
DetNet主要解决的问题
1.主要着眼点是分辨率,从大目标和小目标分别阐述保持分辨率的重要性,因此DetNet也是从保持分辨率着手,解决多尺度物体的识别问题。
2.网络在较深层处容易导致大目标的边界不明确使精确定位困难
3.下采样会导致小目标的消失,只要能避开下采样就能防止物体目标丢失,但是这种方法又会导致抽象能力不够。
3.DetNet是如何设计的?
保持分辨率有两个麻烦的问题:(1)内存消耗大,计算大(2)下采样减少导致高层的抽象特征不足以很好地进行分类任务,因此设计的时候会考虑时间和高层特征两点。
一、原理
下图为DetNet和FPN,分类backbone网络结构的对比,可以看到DetNet backbone中第一个16x后尺寸不变了,也就是说保持了分辨率。
具体实现细节如下:
(1)采用ResNet50为backbone,改进设计了DetNet-59
(2)对bottlenecks进行了改进,传统的其实不止是C,也包含AB,即将AB的膨胀卷积换成普通卷积。点击详细了解膨胀卷积
(3)为了减少分辨率保持带来的时间和内存成本的消耗,通道数固定为256
(4)DetNet可以加入FPN结构,方法类似。
二、A和B模块的代码如下:
from torch import nn import torch class DetBottleneck(nn.Module): #初始化时,extras为false时为Bottleneck A ,为true时为 B def __init__(self,inplanes,planes,stride=1,extra=False): super(DetBottleneck,self).__init__() #1.构建3个卷积层的Bottleneck self.bottelneck=nn.Sequential( #1.构建1X1的卷积 nn.Conv2d(planes,planes,1,bias=False), nn.BatchNorm2d(planes), nn.ReLU(inplace=True), #2.构建3X3的空洞卷积 nn.Conv2d(planes,planes,kernel_size=3,stride=1,padding=2,dilation=2,bias=False), nn.BatchNorm2d(planes), nn.ReLU(inplace=True), # 3.构建1X1的卷积 nn.Conv2d(planes, planes, 1, bias=False), nn.BatchNorm2d(planes) ) #2.激活函数 self.relu=nn.ReLU(inplace=True) #3.构建B的1X1的卷积 self.extra=extra if self.extra: self.extra_conv=nn.Sequential( nn.Conv2d(inplanes, planes, 1, bias=False), nn.BatchNorm2d(planes) ) def forward(self,x): #如果extra=True,选择B,否则选择A if self.extra: identity=self.extra_conv(x) else: identity=x out=self.bottelneck(x) out+=identity out=self.relu(out) return out if __name__ == '__main__': bottleneck_b=DetBottleneck(1024,256,1,True) bottleneck_a = DetBottleneck(1024, 256, 1, False) print(bottleneck_b) print((bottleneck_a)) input=torch.randn(1,1024,14,14) #outputa=bottleneck_a(input) outputb = bottleneck_b(input) print(outputb.shape)