7.DetNet(本人看其他原理和代码时觉得思路清晰就抄了过来)

以下内容转自原文链接: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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值