我要彻底搞懂SSD网络结构(2)特征提取网络

本文代码全部由大神Bubbliiiing的开源代码,使用pytorch版本的,并从各种地方寻找资料,主要是Bubbliiiing大兄弟的!

主干网络特征提取

主要说的是VGG的前半部分
https://blog.csdn.net/qq_43656233/article/details/107588402

代码实现

接上篇文章最后的输出结果是19×19×1024,Bubbliiiing大神直接的把网络变化写进了注释里。

def add_extras(i, batch_norm=False):
    # Extra layers added to VGG for feature scaling
    layers = []
    in_channels = i

    # Block 6
    # 19,19,1024 -> 10,10,512
    layers += [nn.Conv2d(in_channels, 256, kernel_size=1, stride=1)]
    layers += [nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1)]

    # Block 7
    # 10,10,512 -> 5,5,256
    layers += [nn.Conv2d(512, 128, kernel_size=1, stride=1)]
    layers += [nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1)]

    # Block 8
    # 5,5,256 -> 3,3,256
    layers += [nn.Conv2d(256, 128, kernel_size=1, stride=1)]
    layers += [nn.Conv2d(128, 256, kernel_size=3, stride=1)]
    
    # Block 9
    # 3,3,256 -> 1,1,256
    layers += [nn.Conv2d(256, 128, kernel_size=1, stride=1)]
    layers += [nn.Conv2d(128, 256, kernel_size=3, stride=1)]

    return layers

现在可以上这一张图了:
在这里插入图片描述
从输入的是300×300×3,到最后的1×1×256,就是上面的SDD网络的第一行。

从特征获取预测结果

这个题目是大神取的,不是我取的。
这里对上面的每一步的卷积结果进行提取,并对这6个结果进行新的卷积,以预测不同大小的各种状况。
最新的两次卷积分别是:对每一步的结果特征层,首先进行一个num_priors x 4的卷积,再进行一次num_priors x num_classes的卷积。其中num_priors分别是4 6 6 6 4 4,对应着每一阶段的网络拥有的先验框。
这样每一步的网络就可以得到如下表:(表依旧是大神的)
这里38×38×512为例,图像被分为38×38的小格子,每一个小格子拥有4个先验框去预测所有的物体种类,对这一层进行卷积,4×4=16,所以由原先的38×38×512变为38×38×16。
第二次卷积,VOC数据集共有20个分类,但这里乘了21,我还没明白过来是为什么,但好像就需要这么做。。。

特征从38×38×16变为38×38×84(84=4×21) 。
后面的6个特征曾进行相同的操作,即完成了特征提取网络的搭建。
在这里插入图片描述

代码实现

mbox = [4, 6, 6, 6, 4, 4] # 对应6个先验框

def get_ssd(phase,num_classes):

    vgg, extra_layers = add_vgg(3), add_extras(1024)

    loc_layers = []
    conf_layers = []
    vgg_source = [21, -2]
    for k, v in enumerate(vgg_source):
        loc_layers += [nn.Conv2d(vgg[v].out_channels,
                                 mbox[k] * 4, kernel_size=3, padding=1)]
        conf_layers += [nn.Conv2d(vgg[v].out_channels,
                        mbox[k] * num_classes, kernel_size=3, padding=1)]
                        
    for k, v in enumerate(extra_layers[1::2], 2):
        loc_layers += [nn.Conv2d(v.out_channels, mbox[k]
                                 * 4, kernel_size=3, padding=1)]
        conf_layers += [nn.Conv2d(v.out_channels, mbox[k]
                                  * num_classes, kernel_size=3, padding=1)]

    SSD_MODEL = SSD(phase, vgg, extra_layers, (loc_layers, conf_layers), num_classes)
    return SSD_MODEL
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值