高性能、高适配,SSD 孪生兄弟出场即 C 位

2023-11-02

内容导读

PyTorch 1.9 同步更新了一些库,包括 TorchVision 中新增的 SSD 和 SSDlite 模型,与 SSD 相比,SSDlite 更适用于移动端 APP 开发。

SSD 全称 Single Shot MultiBox Detector,是一种用于目标检测的单次检测算法,每次可以检测多个物体。本文将重点讨论 SSD 的移动端友好型变体,即 SSDlite。

具体叙述过程为:

首先通过算法的主要组件,强调与原始 SSD 的不同之处;

然后讨论这个已发布的模型,是如何训练的;

最后为所有新上线的目标检测模型,提供详细的 Benchmark。

SSDlite 网络架构

SSDlite 是 SSD 的升级版,在 MobileNetV2 论文中首次发布,随后在 MobileNetV3 论文中被再次使用。因为这两篇论文的重点,是介绍新的 CNN 架构,所以 SSDlite 的大部分实现细节并没有提及。

我们的代码遵循了这两篇论文中的所有细节,并在必要时对官方实现方法进行了补充。

正如前文所说,SSD 是一系列模型,用户可以用不同的 backbone(如 VGG、MobileNetV3 等)和不同的 Head(如常规卷积、可分离卷积等)来进行配置。因此,在 SSDlite 中,许多 SSD 组件都是相同的。下面我们只讨论那些不同的部分。

分类和回归 Head 

根据 MobileNetV2 论文介绍,SSDlite 用可分离卷积取代了原始 Head 中使用的常规卷积。因此,我们的实现方法引入了使用 3x3 深度卷积和 1x1 投影的全新 Head。

由于 SSD 方法的其他所有组件都保持不变,因此要创建一个 SSDlite 模型,我们的实现方法是将 SSDlite Head 初始化,并直接将其传递给 SSD 构造函数。

Backbone 特征提取器 

我们的实现方法中引入了一个新的类来构建 MobileNet 特征提取器。根据 MobileNetV3 论文记叙,Backbone 会返回 Inverted Bottleneck 模块的扩展层输出,这个扩展层输出步长为 16,先于输出步长为 32 的池化。

此外,Backbone 的所有额外模块都被替换成轻量级模块了,这些轻量级模块用的是一个 1x1 Compression、一个步长为 2 的可分离 3x3 卷积,以及一个 1x1 扩展

最后,为了确保即使在使用小宽度乘数时,Head 也有充足的预测能力,所有卷积的最小深度尺寸由 min_depth 超参数控制。

SSDlite320 MobileNetV3-Large模型

本节讨论 SSDlite 预训练模型的配置,以及为了尽可能地复制论文结果而进行的训练过程
本节讨论 SSDlite 预训练模型的配置,以及为了尽可能地复制论文结果而进行的训练过程

训练过程 

此处讨论训练过程中最值得注意的细节。

1. 调整后的超参 

论文中并没有提供任何可用于模型训练的超参(如正则化、学习率和批尺寸等),依据官方 repo 配置文件中列出的参数,使用交叉验证法将其调整到最佳值。这使得基线 SSD 配置有了显著提升。

2. 数据增强 

与 SSD 相比,SSDlite 的主要区别在于,前者的 Backbone 权重只是后者的一小部分。因此在 SSDlite 中,数据增强更注重于使模型对不同大小的目标对象具有鲁棒性,而不是只关注过拟合。

SSDlite 只用了 SSD transformation 的一个子集,这样可以避免模型过度正则化。

3. LR Scheme 

由于要依赖数据增强,让模型对中小型目标物体具有鲁棒性,我们发现增加 epoch 数量对模型训练非常有益。具体来说,如果将 epoch 数量提高到 SSD 的 3 倍,就能够将精度提高至 4.2mAP point;如果使用 6 倍乘数,则可以提高至 4.9mAP。

epoch 过渡增加则会适得其反,降低训练速度和准确度。尽管如此,根据论文中的模型配置,作者似乎使用了相当于 16 倍的乘数。

4. 权重初始化 & Input Scaling & ReLU6 

一系列优化使得我们的实现方法与官方非常接近,而且缩小了准确性上的差距。这些优化方法是从头开始训练 Backbone,而不是从 ImageNet 开始进行初始化。此外这些优化方法也调整了我们的权重初始化方案,改变了 Input Scaling,并用 ReLU6 替换了所有添加在 SSDlite Head 中的标准 ReLU。

注意,由于我们是从随机权重中训练模型,我们还应用了论文中描述的速度优化法,即在 Backbone 中使用 reduced tail。

5. 实现方法的差异 

将上面的实现方法与官方 repo 中的实现方法对比,我们发现了一些差异。

大部分差异都非常细微,且与如何初始化权重(例如高斯分布 VS 截断正态分布)、如何参数化 LR Scheduling(如较小 VS 较大的 Warmup 率,较短 VS 较长的训练时长)有关。

已知最显著的差异在于计算分类损失的方式。即官方 repo 中 MobileNetV3 Backbone SSDlite 的实现,没有用到 SSD Multibox loss,而是使用 RetinaNet 的 focal loss。

由于 TorchVision 已经提供了 RetinaNet 的完整实现,我们决定用 normal Multi-box SSD loss 实现 SSDlite。

关键精确度的提升  

复制论文中的代码无法保证准确率,尤其是在不知道完整的训练过程和实施细节的情况下。通常这个过程会涉及到大量的回溯,因为我们需要从中找到那些对准确率有重大影响的实施细节和参数中。

下面我们将尝试把那些在基线基础上,提高准确率的重要的迭代过程可视化:

图片

图片

以上介绍的优化顺序是准确的,尽管在某些情况下有点理想化。例如,虽然在调整超参阶段测试了不同的调度器,但并没有为准确率带来明显改进,因此我们保留了基线中使用的 MultiStepLR。

后续测试不同 LR Scheme 时,我们发现改用 CosineAnnealingLR 需要的配置更少、效果更佳。

综上所述,即使我们使用的是一个正确的实现方法、一系列来自同族模型的最佳超参,通过优化训练过程以及调整实现方法,也总是能在某种程度上提升准确率。

诚然,以上是一个相当极端的案例,准确率翻了一番,但在很多情况下,仍然有大量的优化空间可以帮助我们大幅提升准确率。

Benchmark

初始化两个预训练模型:

ssdlite = torchvision.models.detection.ssdlite320_mobilenet_v3_large(pretrained=True)
ssd = torchvision.models.detection.ssd300_vgg16(pretrained=True)

新旧模型之间的 Benchmark 对比:

图片

SSDlite320 MobileNetV3-Large 模型是迄今为止最快和体量最小的模型,因此它非常适用于移动 APP 的开发。

虽然它的准确率不及预训练的低分辨率 Faster R-CNN 模型,但 SSDlite 框架高度可调,用户可以通过引入带更多卷积的更重量级的 Head 来提高准确率。

另一方面,SSD300 VGG16 模型运行速度相当慢,而且准确率较低。这主要是因为它的 VGG16 Backbone。虽然 VGG 架构非常有影响力,但现如今已经有些过时了。

因为这个特定模型具有历史意义和研究价值,所以才在把它放在 TorchVision 里了。如果你想要使用高分辨率检测器,我们还是建议你要么把 SSD 和其他 Backbone 结合使用,要么使用某个 Faster R-CNN 预训练模型。

参考:PyTorch Blog

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高性能、高适配,SSD 孪生兄弟出场即 C 位 的相关文章

  • torch.unique() 中的参数“dim”如何工作?

    我试图提取矩阵每一行中的唯一值并将它们返回到同一个矩阵中 重复值设置为 0 例如 我想转换 torch Tensor 1 2 3 4 3 3 4 1 6 3 5 3 5 4 to torch Tensor 1 2 3 4 0 0 0 1 6
  • PyTorch 中的截断反向传播(代码检查)

    我正在尝试在 PyTorch 中实现随时间截断的反向传播 对于以下简单情况K1 K2 我下面有一个实现可以产生合理的输出 但我只是想确保它是正确的 当我在网上查找 TBTT 的 PyTorch 示例时 它们在分离隐藏状态 将梯度归零以及这些
  • PyTorch:tensor.cuda()和tensor.to(torch.device(“cuda:0”))之间有什么区别?

    在 PyTorch 中 以下两种将张量 或模型 发送到 GPU 的方法有什么区别 Setup X np array 1 3 2 3 2 3 5 6 1 2 3 4 X model X torch DoubleTensor X Method
  • 无法使用 torch.Tensor 创建张量

    我试图创建一个张量 如下所示 import torch t torch tensor 2 3 我收到以下错误 类型错误回溯 最近调用 最后 在 gt 1 a torch tensor 2 3 类型错误 tensor 需要 1 个位置参数 但
  • pytorch - “conv1d”在哪里实现?

    我想看看 conv1d 模块是如何实现的https pytorch org docs stable modules torch nn modules conv html Conv1d https pytorch org docs stabl
  • Pytorch 数据加载器:错误的文件描述符和 EOF > 0

    问题描述 在使用由自定义数据集制作的 Pytorch 数据加载器进行神经网络训练期间 我遇到了奇怪的行为 数据加载器设置为workers 4 pin memory False 大多数时候 训练都顺利完成 有时 训练会随机停止 并出现以下错误
  • PyTorch - 参数不变

    为了了解 pytorch 的工作原理 我尝试对多元正态分布中的一些参数进行最大似然估计 然而 它似乎不适用于任何协方差相关的参数 所以我的问题是 为什么这段代码不起作用 import torch def make covariance ma
  • 如何使用 torch.stack?

    我该如何使用torch stack将两个张量与形状堆叠a shape 2 3 4 and b shape 2 3 没有就地操作 堆叠需要相同数量的维度 一种方法是松开并堆叠 例如 a size 2 3 4 b size 2 3 b torc
  • 通过 Conda 安装 PyTorch

    目标 使用 pytorch 和 torchvision 创建 conda 环境 Anaconda 导航器 1 8 3 python 3 6 MacOS 10 13 4 我尝试过的 在Navigator中 创建了一个新环境 尝试安装 pyto
  • 我可以使用逻辑索引或索引列表对张量进行切片吗?

    我正在尝试使用列上的逻辑索引对 PyTorch 张量进行切片 我想要与索引向量中的 1 值相对应的列 切片和逻辑索引都是可能的 但是它们可以一起吗 如果是这样 怎么办 我的尝试不断抛出无用的错误 类型错误 使用 ByteTensor 类型的
  • torch-1.1.0-cp37-cp37m-win_amd64.whl 在此平台上不受支持的滚轮

    我在开发 RNN 时需要使用 pyTorch 每当我尝试安装它时 我都会收到一条错误消息 指出 torch 1 1 0 cp37 cp37m win amd32 whl 在此平台上不受支持 pip3安装https download pyto
  • 在非单一维度 1 处,张量 a (2) 的大小必须与张量 b (39) 的大小匹配

    这是我第一次从事文本分类工作 我正在使用 CamemBert 进行二进制文本分类 使用 fast bert 库 该库主要受到 fastai 的启发 当我运行下面的代码时 from fast bert data cls import Bert
  • 为什么 pytorch matmul 在 cpu 和 gpu 上执行时得到不同的结果?

    我试图找出 numpy pytorch gpu cpu float16 float32 数字之间的舍入差异 而我发现的内容让我感到困惑 基本版本是 a torch rand 3 4 dtype torch float32 b torch r
  • BatchNorm 动量约定 PyTorch

    Is the 批归一化动量约定 http pytorch org docs master modules torch nn modules batchnorm html 默认 0 1 与其他库一样正确 例如Tensorflow默认情况下似乎
  • 如何更新 PyTorch 中神经网络的参数?

    假设我想将神经网络的所有参数相乘PyTorch 继承自的类的实例torch nn Module http pytorch org docs master nn html torch nn Module by 0 9 我该怎么做呢 Let n
  • 如何有效地对一个数组中某个值在另一个数组中的位置出现的次数求和

    我正在寻找一种有效的 for 循环 避免解决方案来解决我遇到的数组相关问题 我想使用一个巨大的一维数组 A gt size 250 000 用于一维索引的 0 到 40 之间的值 以及用于第二维索引的具有 0 到 9995 之间的值的相同大
  • 如何使用Python计算多类分割任务的dice系数?

    我想知道如何计算多类分割的骰子系数 这是计算二元分割任务的骰子系数的脚本 如何循环每个类并计算每个类的骰子 先感谢您 import numpy def dice coeff im1 im2 empty score 1 0 im1 numpy
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • pytorch 的 IDE 自动完成

    我正在使用 Visual Studio 代码 最近尝试了风筝 这两者似乎都没有 pytorch 的自动完成功能 这些工具可以吗 如果没有 有人可以推荐一个可以的编辑器吗 谢谢你 使用Pycharmhttps www jetbrains co
  • 在 Pytorch 中估计高斯模型的混合

    我实际上想估计一个以高斯混合作为基本分布的归一化流 所以我有点被火炬困住了 但是 您可以通过估计 torch 中高斯模型的混合来在代码中重现我的错误 我的代码如下 import numpy as np import matplotlib p

随机推荐

  • response.sendRedirect(url)中的url问题

    servlet实现跳转页面时 对于重定向response sendRedirect url 对于参数url 一直引用的是本地上的html而且使用的是绝对路径 但是这个不能实现重定向 后来了解到这个url应该是指向在任何服务器上的项目的url
  • 【Tensorflow2.0】7、全流程model.fit模型训练方法

    文章目录 第一种方法直接用keras的fit方法 以fashion mnist为例 配置超参数 选择指定显卡及自动调用显存 准备数据 使用tf data来准备训练集和测试集 准备模型定义 开始定义模型 用functional方法 打印模型结
  • SoapUI 5.2.1测试接口

    俗话说 好记性不如烂笔头 今天我们就来介绍下SopaUI如何测试接口 首先我们新建一个WebService public class WebService System Web Services WebService WebMethod p
  • 双指针实现链表反转

    题目 定义一个函数 输入一个链表的头节点 反转该链表并输出反转后链表的头节点 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL 输出 5 gt 4 gt 3 gt 2 gt 1 gt NULL 代码实现 Definit
  • 华为OD机试 -查找两个字符串a,b中的最长公共子串(C++ & Java & JS & Python)

    描述 查找两个字符串a b中的最长公共子串 若有多个 输出在较短串中最先出现的那个 注 子串的定义 将一个字符串删去前缀和后缀 也可以不删 形成的字符串 请和 子序列 的概念分开 数据范围 字符串长度1 300 1 length 300 进
  • hadoop 2.6遇到的DataNode无法启动问题

    一 问题描述 当我们多次格式化文件系统 hadoop namenode format 时 会出现DataNode无法启动 多次启动中发现有NameNode节点 并没有DataNode节点 如图所示 二 查看问题 回头看启动过程 注意如下 l
  • php在远程获取图片生成文件为空文件

    之前遇到一个很坑爹的问题 就是去获取远程图片的文件流生成本地文件时 发现生成的是空白文件 说明只是创建了文件 没把文件流写进去 之前一直以为是网站设置了权限什么的东西 最后百度了下发现了原来是php ini的openssl没开启 解决方法就
  • 由于电脑出现msvcr110.dll提示错误的解决方法

    最近 我在尝试运行一款新的软件时 突然遇到了一个错误提示 提示说缺少msvcr110 dll文件 导致软件无法启动 在使用电脑过程中 我们常常会遇到一些系统文件丢失的问题 其中 msvcr110 dll是Windows操作系统中的一个重要的
  • 读书笔记-视觉综述翻译_数据集介绍

    4 数据集介绍 4 1 计算机视觉 4 1 1 目标识别 诸如ImageNet 160 PASCAL VOC和Microsoft COCO之类的大规模公开可用数据集的出现 推动了新颖的计算机视觉算法 特别是深度学习技术 的发展 用于对象等识
  • 解决c++错误:redefinition of class xxx

    错误类型 redefinition of class xxx 错误点 一般出现错误 redefinition of class xxx 同时也会有错误 previous definition of class xxx 解决方法 一般来说出错
  • 【机器学习实战】7、利用 AdaBoost 元算法提高分类性能

    文章目录 7 1 集成方法 7 1 1 bagging 自举汇聚法 7 1 2 随机森林 Random Forest RF 7 1 3 boosting 提升方法 7 1 4 Bagging Boosting二者之间的区别 7 1 5 总结
  • 基于STM32的机器学习(手势识别)

    第一次写博客 希望能给研究单片机AI的同仁一个好的启示 如有不当 多多指正 STM32自从2019年开始发布AI库以来 网络上关于怎么移植到单片机的资料少得可怜 能找到的也仅仅是新建工程的博客 对我有较大启示的是ST官方的几篇文章 我将对我
  • Compile error in arch/x86/kernel/entry_64.S

    编译kernel 2 6 38提示错误 Compile error in arch x86 kernel entry 64 S arch x86 kernel entry 64 S 1544 Error size expression fo
  • C++ primer plus 第六版课后作业和题——第二章第三题

    题目 编写一个C 程序 它要求使用3个自定义函数 包括main 函数 并生成下面的输出 Three blind mice Three blind mice See how they run See how they run 其中一个函数要调
  • 3. redis cluster集群运维与核心原理剖析

    分布式缓存技术Redis 1 Redis集群方案比较 2 Redis高可用集群搭建 3 Java操作redis集群 4 Redis集群原理分析 5 Reid高可用集群之水平扩展 本文是按照自己的理解进行笔记总结 如有不正确的地方 还望大佬多
  • Sublime Text 使用介绍、全套快捷键及插件推荐

    开篇 如果说Notepad 是一款不错Code神器 那么Sublime Text应当称得上是神器滴哥 Sublime Text最大的优点就是跨平台 Mac和Windows均可完美使用 其次是强大的插件支持 几乎无所不能 开始使用Sublim
  • stm32毕设 STM32的环境质量监测系统(源码+原理图+论文)

    文章目录 0 前言 1 设计架构 功能设计 2 原理图 3 软件设计 4 实现效果 5 相关代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟
  • 计算机视觉与机器学习之学习记录一(环境配置与安装+笔记分享)

    一 Pytorch及CUDA安装注意事项 依据参考资料 3 通过NVIDA控制面板查看计算机使用的GPU驱动程序版本 依据参考资料 2 及计算机GPU驱动程序版本 查阅显卡驱动对应的CUDA版本 依据参考资料 3 分别下载对应版本的CUDA
  • python中prompt的意思_python中的prompt是什么意思,怎么用

    查看 5468 回复 9 已解决 python中的prompt是什么意思 怎么用 当前离线UID日志 相册 贡献 荣誉 积分 电梯直达 发表于 2019 5 26 22 08 12
  • 高性能、高适配,SSD 孪生兄弟出场即 C 位

    内容导读 PyTorch 1 9 同步更新了一些库 包括 TorchVision 中新增的 SSD 和 SSDlite 模型 与 SSD 相比 SSDlite 更适用于移动端 APP 开发 SSD 全称 Single Shot MultiB