【论文快读】SSD(2015)

标题:SSD: Single Shot MultiBox Detector
作者:Liu Wei等
链接:https://arxiv.org/abs/1512.02325
摘要:
在这里插入图片描述
本文的核心内容:

  1. 在推断过程中,SSD减少了重采样的操作。相比于YOLOv1,SSD更快更精确;相比于Faster RCNN,SSD精确度相同,速度明显更快。
  2. 在feature map上使用小卷积核,生成bounding box和类别打分。
  3. 在不同放大尺度下的feature map上生成预测,从而提高精度。
  4. 端到端训练,对低分辨率的图片效果也很好。
模型

根据 https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py ,vgg16有13个卷积层,以 224 × 224 224\times224 224×224的图片作为输入,每个卷积层的输出feature map的shape如下:
在这里插入图片描述

图来自 https://blog.csdn.net/CoderPai/article/details/81070350

将输入换做本文中的 300 × 300 300\times300 300×300,则上图中最后一个卷积层中 14 × 14 14\times14 14×14的feature map相应变成 19 × 19 19\times19 19×19,增加一些卷积层(extra feature layer),直到降采样为 1 × 1 1\times1 1×1,这也就解释了论文中的模型图:
在这里插入图片描述
然而这个图和作者给出的代码之间有两个个区别:一是这里用conv6和conv7代替vgg的全连接层,然而代码中采用了和后面相似的两层结构conv6_1、conv6_2和conv7_1、conv7_2。二是文中添加层的通道数和代码也不一样。这两个问题还需要明确一下。
在分析检测机制之前,需要明确几个概念:

feature map cell/location:不同于yolo中的grid cell,文中会提到 m × n m\times n m×n,这里指的是各feature map的size,所以论文图中会提到每个类有8732( = 38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4 =38\times 38\times 4+19\times 19\times 6+10\times 10\times 6+5\times 5\times 6+3\times 3\times 4+1\times 1\times 4 =38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4)个defaul box
default box:在每个cell处选取的候选框,类比于anchor
feature layer:卷积层
jaccard overlap:交并比,IoU

这样我们就能明白这段话了:
在这里插入图片描述
得到的default box通过阈值筛选后,使用非极大抑制得到一个最优的bounding box。

训练过程
  1. 匹配机制
    首先,作者尝试了用IoU(jaccard overlap)最大的default box匹配ground truth;后来简化为设置threshold,对于每个default box,如果和某个gt的IoU达到threshold,则保留该gb,从而实现重叠预测。
  2. loss
    SSD的loss由定位loss和置信loss两部分组成。
    定位loss中,对于每个匹配到gt的db,用相应的 c x , c y , w , h cx, cy, w, h cx,cy,w,h分别计算 s m o o t h L 1 smooth_{L1} smoothL1
    在这里插入图片描述
    置信loss是个多分类下的softmax:
    在这里插入图片描述
  3. 类别不平衡的解决
    由于db中只有很小一部分会和gt进行匹配,所以positive和negtive会出现大量的不平衡。所以在训练过程中选取negtive的db中置信loss最高的一些,从而保证 p o s : n e g pos:neg pos:neg 1 : 3 1:3 1:3
  4. 跨层提取和数据增强比较常见,这里不再展开。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Namespace(命名空间)是一种在编程中用来区分各种不同命名元素的机制。它可以将不同的程序元素(变量、函数、类等)进行分组,使得它们在同一个命名空间下能够互相区分。在不同的命名空间中,可以定义具有相同名称的元素,而不会产生冲突。 namespace可以理解为速了解命名空间的意思。在当前广泛使用的编程语言中,命名空间是一种非常常见的概念,如C++中的命名空间、Python中的模块和包、Java中的包等。通过速了解命名空间,我们可以更好地进行模块化的开发,避免命名冲突,提升代码的可性、可维护性和可重用性。 了解命名空间的重要性在于,它可以分隔不同模块之间的代码,使得每个模块可以独立开发和测试。在大型项目中,各个模块的开发往往由不同的开发人员负责,通过使用命名空间,可以避免不同模块中的命名冲突,同时也方便了代码的组织和管理。 在编程中,通过使用命名空间,我们可以更好地控制程序的作用域,避免全局变量的滥用。命名空间可以使得变量和函数的作用范围被限制在一个特定的范围内,有利于代码的结构化和模块化。 总而言之,命名空间是指通过了解命名空间的概念和使用方法,可以更好地进行模块化开发,提升代码的可性和可维护性。同时,对于从事软件开发的人来说,掌握命名空间的概念也是非常重要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值