SSD目标检测算法中default box在ssd_pascal.py的设置

本文详细解析了SSD目标检测模型中default boxes的生成过程,包括各特征层的选取、不同尺度与长宽比的设置原理及作用,帮助理解SSD如何在不同尺度上检测物体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ssd_pascal.py中对default boxes(prior boxes)的设置由如下代码完成:

# parameters for generating priors.
# minimum dimension of input image
min_dim = 300
# conv4_3 ==> 38 x 38
# fc7 ==> 19 x 19
# conv6_2 ==> 10 x 10
# conv7_2 ==> 5 x 5
# conv8_2 ==> 3 x 3
# conv9_2 ==> 1 x 1
mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2']
# in percent %
min_ratio = 20
max_ratio = 90
step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2)))
min_sizes = []
max_sizes = []
for ratio in xrange(min_ratio, max_ratio + 1, step):
  min_sizes.append(min_dim * ratio / 100.)
  max_sizes.append(min_dim * (ratio + step) / 100.)
min_sizes = [min_dim * 10 / 100.] + min_sizes
max_sizes = [min_dim * 20 / 100.] + max_sizes

steps = [8, 16, 32, 64, 100, 300]
aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]]
# L2 normalize conv4_3.
normalizations = [20, -1, -1, -1, -1, -1]
# variance used to encode/decode prior bboxes. prior_variance实际上是一种bounding regression中的权重
if code_type == P.PriorBox.CENTER_SIZE:
  prior_variance = [0.1, 0.1, 0.2, 0.2]
else:
  prior_variance = [0.1]

mbox_source_layers即产生box的层,一共有6个,可看成6个feature map,尺度分别为38*38,3*3,1*1,19*19,10*10,5*5


现在重点看box的大小是怎么设置的,box比例为 

aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] 


第一个[2]即有[1,2,1/2]三个比例,其中1对应最大和最小的正方形尺度,所以此map上的box有4个尺度 

[2, 3]即有[1,2,1/2,3,1/3],同样1对应最大和最小的正方形尺度,所以此map上的box有6个尺度 

ssd中,对于6个feature map,每个map中box的ratios:38*38,3*3,1*1map都是4个,19*19,10*10,5*5都是6个  


steps = [8, 16, 32, 64, 100, 300]又是什么?

steps其实是box映射回原图的比例因子,即default box在feature map上的尺度乘以steps中的值,则对应到输入的原图上的尺度,这里原图是300×300。

为什么映射回原图,看我之前一篇http://blog.youkuaiyun.com/tigerda/article/details/78527870 中anchor部分

### SSD目标检测算法原理 SSD(Single Shot MultiBox Detector)是一种高效的目标检测算法,能够一次性完成对象分类和位置回归的任务。该网络结构基于深度学习框架构建,在处理过程中采用多尺度特征图进行目标检测。 输入图像尺寸被设定为固定的300×300像素大小[^1]。随后,利用预训练好的VGG16作为基础网络来抽取原始图片中的深层语义信息;接着通过额外增加的几个卷积层继续加深网络层次并增强表达能力。此部分操作有助于捕捉更加抽象复杂的模式表示形式[^4]。 对于最终得到的不同分辨率级别的特征映射,则会分别在其上面施加一系列小型卷积核以预测对应于预先设置好默认框(default boxes)内的物体类别概率以及调整后的精确坐标值。值得注意的是,默认框具有多种形状比例(aspect ratios),从而使得模型可以更好地适应各种形态的对象实例。 此外,相比于其他同类方法如YOLO, SSD不仅实现了更高的识别率而且保持了较快的速度优势。特别是在面对大规模数据集测试时表现尤为突出——能够在PASCAL VOC、COCO等多个公开评测平台上取得优异成绩。 然而需要注意的一点是,由于采用了相对靠前几层(conv4_3)来进行小物件定位工作,因此可能会因为这些早期阶段所携带的有效视觉线索较少而导致性能有所下降[^3]。 ```python import torch.nn as nn class SSD(nn.Module): def __init__(self): super(SSD, self).__init__() # 基础网络,例如vgg16 self.base_net = ... # 额外卷积层 self.extra_layers = ... # 检测头,负责输出类别得分和边框偏移量 self.loc_heads = ... self.cls_heads = ... def forward(self, x): sources = list() # 存储不同尺度的特征图 # 经过base net获取初步特征 for k in range(len(self.base_net)): x = self.base_net[k](x) # 添加到sources列表中... # 使用extra layers获得更多的特征金字塔 for layer in self.extra_layers: x = F.relu(layer(x), inplace=True) sources.append(x) loc_preds = [] cls_preds = [] # 对每一个source应用loc_head和cls_head for source in sources: loc_pred = self.loc_heads(source).permute(0, 2, 3, 1).contiguous() cls_pred = self.cls_heads(source).permute(0, 2, 3, 1).contiguous() loc_preds.append(loc_pred.view(loc_pred.size(0), -1)) cls_preds.append(cls_pred.view(cls_pred.size(0), -1)) return torch.cat(loc_preds, dim=1), torch.cat(cls_preds, dim=1) ssd_model = SSD().cuda() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值