ssd网络结构_环境感知技术入门(十二) 详细解读SSD目标检测框架

in_channels = i
for v in cfg:
    if v == 'M':
        layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
    elif v == 'C':
        layers += [nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True)]
    else:
        conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
        if batch_norm:
            layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
        else:
            layers += [conv2d, nn.ReLU(inplace=True)]
        in_channels = v
pool5 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
conv6 = nn.Conv2d(512, 1024, kernel_size=3, padding=6, dilation=6)
conv7 = nn.Conv2d(1024, 1024, kernel_size=1)
layers += [pool5, conv6,
           nn.ReLU(inplace=True), conv7, nn.ReLU(inplace=True)]
return layers

调用

if name == “main”:
base = {

'300': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'C', 512, 512, 512, 'M',
        512, 512, 512],
'512': [],
}
vgg = nn.Sequential(*vgg(base['300'], 3))


**1.2 深度卷积层**


在VGG16基础上,SSD进一步增加4个深度卷积层(conv8 ~11)用于更高语意的特征提取, 从conv7到conv11卷积后的输出特征图尺寸依次为:19\*19, 10\*10, 5\*5, 3\*3, 1\*1




Extra layers added to VGG for feature scaling

def add_extras(cfg, i, batch_norm=False):
layers = []
in_channels = i
flag = False
for k, v in enumerate(cfg):
if in_channels != ‘S’:
if v == ‘S’:
layers += [nn.Conv2d(in_channels, cfg[k + 1],
kernel_size=(1, 3)[flag], stride=2, padding=1)]
else:
layers += [nn.Conv2d(in_channels, v, kernel_size=(1, 3)[flag])]
flag = not flag
in_channels = v
return layers

调用

if name == “main”:
extras = {

'300': [256, 'S', 512, 128, 'S', 256, 128, 256, 128, 256],
'512': [],
}
layers = add_extras(extras['300'], 1024)


### 1.3 边框特征提取网络 Multi-box Layers


SSD一共有6层多尺度提取的网络(第4、7、8、9、10、11六个卷积层得到的特征图),每层分别对 loc 和 conf 进行卷积,得到相应的输出。




def multibox(vgg, extra_layers, cfg, num_classes):
loc_layers = []
conf_layers = []
vgg_source = [21, -2]
for k, v in enumerate(vgg_source):
loc_layers += [nn.Conv2d(vgg[v].out_channels,
cfg[k] * 4, kernel_size=3, padding=1)]
conf_layers += [nn.Conv2d(vgg[v].out_channels,
cfg[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, cfg[k] * 4, kernel_size=3, padding=1)]
conf_layers += [nn.Conv2d(v.out_channels, cfg[k] * num_classes, kernel_size=3, padding=1)]
return vgg, extra_layers, (loc_layers, conf_layers)

调用

if name == “main”:
mbox = {

    '300': [4, 6, 6, 6, 4, 4],  # number of boxes per feature map location
    '512': [],
}
base_, extras_, head_ = multibox(vgg(base[str(size)], 3),
                                 add_extras(extras[str(size)], 1024),
                                 mbox[str(size)], num_classes)


**1.4 PriorBox 生成机制**


(1)SSD从Conv4\_3开始,一共提取了6个特征图,其大小分别为 (38,38), (19,19), (10,10), (5,5),(3,3), (1,1),但是每个特征图上设置的先验框数量不同。


(2)先验框的设置,包括尺度和长宽比两个方面。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:




![]()



其中:
m指特征图个数,但是为5,因为第一层(Conv4_3)是单独设置的;
Sk表示先验框大小相对于图片的比例;
Smin和Smax表示比例的最小值与最大值,paper里面取0.2和0.9。



**补充说明:**  
先验框的长宽比一般设置为:






### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/a5a42c9f992e388c7abb9424fada6144.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/eba653e62332eaa1ea91017506fbf938.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值