【pytorch】目标检测:实现DetNet的block:Detneck 对照网络结构图手动编写

89 篇文章 11 订阅
65 篇文章 3 订阅

DetNet模块,引入了空洞卷积,在增大感受野的同时,保持了特征图尺寸大小不变。DetNet在保持网络结构中前4个stage与ResNet一致,新增第5及第6个stage专用于检测,主要区别在于,以空洞卷积替换了原有的resnet卷积中的3x3部分,整体不改变输出特征图的大小。
在这里插入图片描述
如上图,DetNet的block有两种模式,当block输入通道等于block输出通道的图A,以及带有shortcut,输入通道不等于输出通道的图B。下面来实现图B所示网络结构模块:

import os.path
from typing import Iterator
import numpy as np
import torch
import cv2
from PIL import Image
from torch.utils.data import Dataset, DataLoader, Subset, random_split
import re
from functools import reduce
from torch.utils.tensorboard import SummaryWriter as Writer
from torchvision import transforms, datasets
import torchvision as tv
from torch import nn
import torch.nn.functional as F
import time
# python中lambda只能跟表达式
cnnWithReluAndBn = lambda indim, outdim, ksize, padding, dilation=1,hasRelu=True: \
    nn.Sequential(nn.Conv2d(indim, outdim, kernel_size=ksize, padding=padding,dilation=dilation), nn.BatchNorm2d(outdim), nn.ReLU(True)) \
        if hasRelu else nn.Sequential(nn.Conv2d(indim, outdim, kernel_size=ksize, padding=padding,dilation=dilation),nn.BatchNorm2d(outdim))

class myCustomerDetneck(nn.Module):
    #inchannel,outchannel为输入及输出的通道数:
    def __init__(self,inchannel,outchanel,hasShortCutCnn=False):
        super().__init__()
        self.mainBranch=[]
        self.shortCut=[]
        #构造主干网络,根据空洞卷积特征图大小计算公式,其等价于一个卷积核大小为3+(3-1)*(2-1)=5的普通卷积,其特征图大小为:s-5+2*2+1=s,输出特征图大小不改变。
        self.mainBranch=nn.Sequential(cnnWithReluAndBn(inchannel,outchanel,1,0),cnnWithReluAndBn(outchanel,outchanel,3,2,dilation=2),
                                      cnnWithReluAndBn(outchanel,outchanel,1,0,hasRelu=False))
        self.shortCutCnn=None
        #如果shortcut上包含普通卷积,则普通卷积是一个1X1调节输出通道数的卷积
        if hasShortCutCnn:
            self.shortCutCnn=cnnWithReluAndBn(inchannel,outchanel,1,0,hasRelu=False)
    def forward(self,x):
        x1 = self.mainBranch(x)
        if self.shortCut is not None:
             return nn.ReLU(False)(x1 + self.shortCutCnn(x))
        else:
             return nn.ReLU(False)(x1 + x)

#进行实际测试:
myNet=myCustomerDetneck(3,16,True)
k = torch.rand(1, 3, 56, 56)
print(myNet(k).shape)

输出结果为:

torch.Size([1, 16, 56, 56])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值