关于pytorch:高性能高适配SSD-孪生兄弟出场即-C-位

54次阅读

共计 2972 个字符,预计需要花费 8 分钟才能阅读完成。

内容导读

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 中应用的惯例卷积。 因而,咱们的实现办法引入了应用 3×3 深度卷积和 1×1 投影的全新 Head。

因为 SSD 办法的其余所有组件都放弃不变,因而要创立一个 SSDlite 模型, 咱们的实现办法是将 SSDlite Head 初始化,并间接将其传递给 SSD 构造函数。

Backbone 特征提取器 

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

此外,Backbone 的所有额定模块都被替换成轻量级模块了, 这些轻量级模块用的是一个 1×1 Compression、一个步长为 2 的可拆散 3×3 卷积,以及一个 1×1 扩大

最初,为了确保即便在应用小宽度乘数时,Head 也有短缺的预测能力, 所有卷积的最小深度尺寸由 min_depth 超参数管制。

SSDlite320 MobileNetV3-Large 模型


本节探讨 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

正文完
 0