我读SSD

SSD是一种高效的目标检测算法,它结合了YOLO的速度优势和Faster R-CNN的准确性。该文详细介绍了SSD的工作原理,包括其金字塔模型、卷积检测方法以及训练策略等内容。

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

背景

论文地址:SSD: Single Shot MultiBox Detector
代码地址:GitHub
视频:Video
这篇文章发表于 ECCV 2016,在 YOLO 的 grid cell 之上做了一些工作,结合 Faster R-CNN 的 anchor,使用卷积方式对每幅图只计算一次就能够得到最终检测结果。速度比 YOLO 快,且精度高于 Faster R-CNN。

现状

  • 在 R-CNN 提出之前的一堆通过滑动窗口+特征方式做目标检测,以 DPM 为代表
  • 在 YOLO 之前一堆通过定位+分类方式,对每个 proposal 进行分类,R-CNN 系列为代表
  • R-FCN 也提取 proposal,但是对所有的 proposal 统一做一次 pooling 计算,去除了上面对每个 proposal 有子网络速度慢的缺点
  • YOLO 提出来对图片画格子方法,对每个格子进行检测

贡献

  • 速度提升:300x300 的输入尺寸,速度可以达到 58 fps
  • 精度提升:500x500 的输入尺寸,精读可达 75.1%
  • 输入可调:输入图片的尺寸可以自定义,尺寸大的话精度高但速度慢,尺寸小速度快精度低

方法

一句话概括就是去除了 YOLO 网络中的全连接层,改为卷积层,加入金字塔模型,与此同时修改了每个 cell 贡献的 bounding-box 个数(anchor)。下面分别介绍这几个优化的操作方法。
这里写图片描述

金字塔模型

YOLO 和本文都使用了一个 feature map 的概念,feature map 是指基础网络(如 VGG-16)的最后一个卷积层输出。YOLO 只对一个 feature map 获取信息,而本文中对基础网络产生的 feature map 后接继续卷积层,产生另外一个 feature map,后面再加卷积层又有一个 feature map,这样每个 feature map 都可以产生预测值,由此加入了多尺度的概念。

卷积检测(主要贡献点)

YOLO 中对 feature map 产生预测使用的是全连接层,参数较多,本文改为使用卷积产生预测,卷积核一般是 3×3×p ,其中

  • 3 是经验值
  • p=k×(#Classes+4) ,k 就是 anchor 的个数

再看一眼 YOLO 的格式是 k×5+#Classes ,与 YOLO 的不同之处在于每个 bounding box 可以有不同的分类,并且舍弃了是否是 object 这一项的预测。

网格对应的默认边框以及长宽比例

文中的 Default Boxes 困扰了我很久,其实作用就是为了获取网格对应的训练真值。可能是因为人工标注的真值没办法与上面的 k 个 bbox 对应,所以作者新建 k 个 default box 作为训练时的真值。每个 default box 的长宽比例保持固定。

训练方法

默认边框与标注真值的匹配方法

YOLO 中使用物体中心点落入网格当中进行匹配,SSD 改为计算 IoU 的方式。

  1. 每个 ground truth 的边框与最大 IoU 的 default box 边框匹配
  2. 每个 default box 边框随机挑选一个的 IoU 大于 0.5 的 ground truth 匹配

损失函数

L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))

等号右面的第一项为 softmax 的损失函数,第二项和 Faster R-CNN 一样

默认边框长啥样

在金字塔模型中,每个 feature map 有不同的尺寸,假设有 m 层金字塔。Default box 与输入图片比例为 sk

sk=smin+smaxsminm1(k1),k[1,m]

其中 smin=0.2,smax=0.95 表示 default box 的边长最小占整幅图片的 20%,最大占 95%。Default box 边长的长款比例为 ar{1,2,3,12,13} ,并且对长宽比是 1 的增加一个 sk=sksk+1 。所以每个网格对应 6 个 default boxes。于是我们有

  • 边框中心为 (i+0.5|fk|,j+0.5|fk|) |fk| 为第 k 层 feature map 的尺寸, i,j[0,|fk|]
  • 边框边长为 (wak=skar,hak=skar)

这里写图片描述
上图 a)是手动标注的真值边框,b)c)为不同的 feature map,网格对应固定个数的 default boxes 作为训练时的真值,因为 IoU 阈值,所以只有个别的 default box 被认为是包括物体。

负样例挑选

上面会产生过多的负样本,影响网络的分布。所以对负样本的可信度(how)排序,挑选 top N,使得正负样本接近 1:3。

训练数据集扩展

全部原始图像 + 随机采样 + 采样

实验

  • 使用 VGG16 作为基础模型,fc6 & fc7 转为卷积层,也是用洞洞算法
  • learning rate = 0.001
  • momentum = 0.9
  • weight decay = 0.0005
  • batch size = 32
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

结论

  • 训练数据 augmentation 很有必要,表 2 中显示能提升 6.7% mAP
  • 金字塔模型很 OK
  • default box 的长宽比例越多越好
  • atrous 算法又快又好
### SSD偏差的技术定义 SSD偏差指的是在固态硬盘运行过程中,某些物理页面被频繁地取,而其他页面几乎从未被访问的现象。这种情况可能导致部分页面的磨损程度低于平均水平,同时也会影响系统的整体性能和资源利用率[^1]。 ### 导致SSD偏差的原因 #### 1. 应用程序行为 一些应用程序倾向于反复取相同的数据块或文件片段,例如数据库索引、操作系统核心组件等。这类重复性的取活动会集中在一个较小范围内的逻辑地址上,进而造成对应的物理页面成为热数据区域[^2]。 #### 2. 缺乏有效的数据分布策略 如果没有合理的设计来分散用户的请求到不同的存储单元之间,则很容易形成局部热点问题。即使存在一定的负载均衡措施,但如果这些措施不够精细或者适应性强的话,仍然难以完全消除此类现象的发生概率[^3]。 ### 解决SSD偏差的方法 #### 1. 数据条带化(Data Striping) 通过将单一对象分割成多个小片并分别放置于不同通道下的颗粒之中,可以有效分摊每次访问所带来的负担。这种方法不仅适用于写入操作也同样适合应用于减轻取压力方面的工作当中[^4]。 ```python def data_striping(data_blocks, num_channels): striped_data = [[] for _ in range(num_channels)] for i, block in enumerate(data_blocks): channel_index = i % num_channels striped_data[channel_index].append(block) return striped_data ``` #### 2. 动态重定位(Dynamic Remapping) 当监测发现某个特定位置持续遭受过高频率的查询时,可以通过修改映射关系把该位置上的内容迁移到另一个相对冷清的地方去保存起来。如此一来既能保护原址免受过度损耗又能提升整个设备的服务质量水平[^5]。 ```python def dynamic_remap(frequent_read_pages, available_cold_pages): remapped_pages = {} for page in frequent_read_pages: new_location = select_random_cold_page(available_cold_pages) remapped_pages[page] = new_location move_data(page, new_location) return remapped_pages ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值