跳转到主要内容
博客

关于 TorchVision 的 MobileNetV3 实现,你需要知道的一切

作者: 2021 年 5 月 26 日2024 年 11 月 16 日暂无评论

在 TorchVision v0.9 中,我们发布了一系列新的移动友好模型,可用于分类、目标检测和语义分割。在本文中,我们将深入探讨模型的代码,分享重要的实现细节,解释我们如何配置和训练它们,并强调在调优过程中所做的重要权衡。我们的目标是披露在原始论文和模型库中通常没有记录的技术细节。

网络架构

MobileNetV3 架构的实现严格遵循原始论文。它可定制,并提供不同的配置来构建分类、目标检测和语义分割骨干网络。它的设计与 MobileNetV2 结构相似,两者共享通用构建块

开箱即用,我们提供了论文中描述的两种变体:大型小型。两者都使用相同的代码构建,唯一的区别是它们的配置,描述了块的数量、大小、激活函数等。

配置参数

尽管可以直接编写自定义 InvertedResidual 设置并将其传递给 MobileNetV3 类,但对于大多数应用程序,我们可以通过向模型构建方法传递参数来调整现有配置。一些关键的配置参数如下:

  • width_mult 参数是一个乘数,它影响模型的通道数。默认值为 1,通过增加或减少它,可以改变所有卷积的滤波器数量,包括第一层和最后一层的滤波器。实现确保滤波器数量始终是8 的倍数。这是一种硬件优化技巧,可以加快操作的矢量化速度。
  • reduced_tail 参数将网络最后几个块的通道数减半。此版本用于某些目标检测和语义分割模型。这是一种速度优化,在MobileNetV3 论文中有所描述,据报道,它可将延迟降低 15%,而对精度没有显著的负面影响。
  • dilated 参数影响模型最后 3 个InvertedResidual 块,并将其正常深度卷积转换为空洞卷积。这用于控制这些块的输出步幅,并对语义分割模型的精度产生显著的积极影响

实施细节

下面我们提供有关架构的一些重要实现细节的附加信息。MobileNetV3 类负责根据提供的配置构建网络。以下是该类的一些实现细节:

  • 最后一个卷积块将最后一个 InvertedResidual 块的输出扩展了 6 倍。该实现与论文中描述的大型和小型配置保持一致,并且可以适应乘数参数的不同值。
  • 与 MobileNetV2 等其他模型类似,在分类器的最终线性层之前放置一个 Dropout 层。

InvertedResidual 类是网络的主要构建块。以下是该块的一些重要实现细节及其可视化,这来自于论文中的图 4:

  • 如果输入通道和扩展通道相同,则没有扩展步骤。这发生在网络的第一个卷积块中。
  • 即使扩展通道与输出通道相同,也始终存在投影步骤
  • 深度可分离卷积块的激活方法放置在 Squeeze-and-Excite 层之前,因为这会略微提高精度。

分类

在本节中,我们提供预训练模型的基准,并详细介绍它们如何配置、训练和量化。

基准测试

以下是初始化预训练模型的方法:

large = torchvision.models.mobilenet_v3_large(pretrained=True, width_mult=1.0,  reduced_tail=False, dilated=False)
small = torchvision.models.mobilenet_v3_small(pretrained=True)
quantized = torchvision.models.quantization.mobilenet_v3_large(pretrained=True)

下面是新模型与选定旧模型之间的详细基准。正如我们所看到的,MobileNetV3-Large 是 ResNet50 的一个可行替代方案,适用于那些愿意牺牲一点精度以换取大约 6 倍速度提升的用户。

模型Acc@1Acc@5CPU 推理(秒)参数数量(百万)
MobileNetV3-Large74.04291.3400.04115.48
MobileNetV3-Small67.66887.4020.01652.54
量化 MobileNetV3-Large73.00490.8580.01622.96
MobileNetV271.88090.2900.06083.50
ResNet5076.15092.8700.254525.56
ResNet1869.76089.0800.103211.69

请注意,推理时间是在 CPU 上测量的。它们不是绝对基准,但它们允许模型之间的相对比较。

训练过程

所有预训练模型均配置了宽度乘数 1,具有完整尾部,非膨胀,并在 ImageNet 上拟合。大型和小型变体均使用相同的超参数和脚本进行训练,这些脚本可在我们的参考文件夹中找到。下面我们提供训练过程最值得注意的方面的详细信息。

实现快速稳定的训练

正确配置 RMSProp对于实现具有数值稳定性的快速训练至关重要。论文作者在他们的实验中使用了 TensorFlow,在他们的运行中,他们报告使用的rmsprop_epsilon相当高,与默认值相比。通常,此超参数取小值,因为它用于避免零分母,但在该特定模型中,选择正确的值对于避免损失中的数值不稳定性似乎很重要。

另一个重要的细节是,尽管 PyTorch 和 TensorFlow 的 RMSProp 实现通常表现相似,但在我们的设置中,存在一些差异,最显著的是 epsilon 超参数的处理方式。更具体地说,PyTorch 在平方根计算之外添加 epsilon,而 TensorFlow 在平方根计算之内添加 epsilon。此实现细节的结果是,在移植论文的超参数时需要调整 epsilon 值。一个合理的近似值可以通过公式PyTorch_eps = sqrt(TF_eps)获得。

通过调整超参数和改进训练配方来提高我们的精度

在配置优化器以实现快速稳定的训练后,我们转而优化模型的精度。有一些技术帮助我们实现了这一点。首先,为了避免过拟合,我们使用 AutoAugment 算法对数据进行了增强,然后是 RandomErasing。此外,我们通过交叉验证调整了诸如权重衰减之类的参数。我们还发现,在训练结束时对不同 epoch 检查点进行权重平均是有益的。最后,尽管我们发布的训练配方中未使用,但我们发现使用标签平滑、随机深度和 LR 噪声注入可以将整体精度提高 1.5 个百分点以上。

图表和表格描绘了改进 MobileNetV3 Large 变体精度的最重要迭代的简化摘要。请注意,训练模型时实际进行的迭代次数要大得多,并且精度的提高并非总是单调递增的。另请注意,图表的 Y 轴从 70% 开始而不是从 0% 开始,以使迭代之间的差异更明显。

迭代Acc@1Acc@5
基线与“MobileNetV2 风格”超参数71.54290.068
+ RMSProp,默认 eps70.68489.38
+ RMSProp,调整后的 eps 和 LR 方案71.76490.178
+ 数据增强和调整后的超参数73.8691.292
+ 检查点平均74.02891.382
+ 标签平滑 & 随机深度 & LR 噪声75.53692.368

请注意,一旦我们达到可接受的精度,我们就会在尚未用于训练或超参数调整的保留测试数据集上验证模型性能。此过程有助于我们检测过拟合,并且在所有预训练模型发布之前都会执行此过程。

量化

我们目前为MobileNetV3-Large 变体的 QNNPACK 后端提供量化权重,其速度提升 2.5 倍。为了量化模型,使用了量化感知训练 (QAT)。用于训练模型的超参数和脚本可在我们的参考文件夹中找到。

请注意,QAT 允许我们模拟量化效果并调整权重,从而提高模型精度。与简单的训练后量化相比,这转化为精度提高了 1.8 个百分点。

量化状态Acc@1Acc@5
未量化74.04291.340
量化感知训练73.00490.858
训练后量化71.16089.834

目标检测

在本节中,我们将首先提供已发布模型的基准,然后讨论如何在特征金字塔网络中使用 MobileNetV3-Large 骨干网络与 FasterRCNN 检测器执行目标检测。我们还将解释如何训练和调优网络以及我们必须做出的任何权衡。我们不会涵盖如何将其与 SSDlite 一起使用的详细信息,因为这将在未来的文章中讨论。

基准测试

以下是模型的初始化方式

high_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_fpn(pretrained=True) 
low_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn(pretrained=True)

以下是新模型与所选旧模型之间的一些基准。正如我们所看到的,对于那些愿意牺牲几个精度点以换取 5 倍加速的用户来说,具有 MobileNetV3-Large FPN 骨干的高分辨率 Faster R-CNN 似乎是等效 ResNet50 模型的可行替代方案。

模型mAPCPU 推理(秒)参数数量(百万)
Faster R-CNN MobileNetV3-Large FPN(高分辨率)32.80.840919.39
Faster R-CNN MobileNetV3-Large 320 FPN(低分辨率)22.80.167919.39
Faster R-CNN ResNet-50 FPN37.04.151441.76
RetinaNet ResNet-50 FPN36.44.882534.01

实施细节

检测器使用 FPN 风格的骨干网络,该网络从 MobileNetV3 模型的不同卷积中提取特征。默认情况下,预训练模型使用第 13 个 InvertedResidual 块的输出以及池化层之前的卷积输出,但该实现支持使用更多阶段的输出。

从网络中提取的所有特征图都通过 FPN 块将其输出投影到256 个通道,因为这大大提高了网络的运行速度。FPN 骨干网络提供的这些特征图由 FasterRCNN 检测器用于在不同尺度上提供边界框和类别预测。

训练与调优过程

我们目前提供两个能够进行目标检测的预训练模型,分辨率不同。这两个模型都使用相同的超参数和脚本在 COCO 数据集上进行训练,这些脚本可以在我们的参考文件夹中找到。

高分辨率检测器使用 800-1333 像素的图像进行训练,而移动友好的低分辨率检测器使用 320-640 像素的图像进行训练。我们提供两组独立的预训练权重的原因是,直接在较小的图像上训练检测器比将较小的图像传递给预训练的高分辨率模型可提高 5 mAP 的精度。两个骨干网络都使用在 ImageNet 上拟合的权重进行初始化,并且它们的权重中的最后 3 个阶段在训练过程中进行了微调。

可以通过调整 RPN NMS 阈值来对移动友好型模型进行额外的速度优化。通过仅牺牲 0.2 mAP 的精度,我们将模型的 CPU 速度提高了大约 45%。优化的详细信息如下所示:

调优状态mAPCPU 推理(秒)
之前23.00.2904
之后22.80.1679

下面我们提供了一些 Faster R-CNN MobileNetV3-Large FPN 模型预测的可视化示例:

语义分割

在本节中,我们将首先提供已发布的预训练模型的一些基准。然后,我们将讨论如何将 MobileNetV3-Large 骨干网络与分割头(例如LR-ASPPDeepLabV3FCN)结合起来进行语义分割。我们还将解释网络的训练方式,并提出一些可选的优化技术,以用于对速度要求高的应用程序。

基准测试

这是初始化预训练模型的方法

lraspp = torchvision.models.segmentation.lraspp_mobilenet_v3_large(pretrained=True) 
deeplabv3 = torchvision.models.segmentation.deeplabv3_mobilenet_v3_large(pretrained=True)

以下是新模型与选定现有模型之间的详细基准。正如我们所看到的,对于大多数应用而言,带有 MobileNetV3-Large 骨干的 DeepLabV3 是 FCN 和 ResNet50 的可行替代品,因为它以 8.5 倍的速度提升实现了相似的精度。我们还观察到 LR-ASPP 网络在所有指标上都超越了等效的 FCN。

模型mIoU全局像素精度CPU 推理(秒)参数数量(百万)
LR-ASPP MobileNetV3-Large57.991.20.32783.22
DeepLabV3 MobileNetV3-Large60.391.20.586911.03
FCN MobileNetV3-Large(未发布)57.890.90.37025.05
DeepLabV3 ResNet5066.492.46.353139.64
FCN ResNet5060.591.45.014632.96

实施细节

在本节中,我们将讨论已测试分割头的重要实现细节。请注意,本节中描述的所有模型都使用膨胀的 MobileNetV3-Large 骨干网络。

LR-ASPP

LR-ASPP 是 MobileNetV3 论文作者提出的精简空洞空间金字塔池化模型的精简变体。与 TorchVision 中的其他分割模型不同,它不使用辅助损失。相反,它使用低级和高级特征,输出步长分别为 8 和 16。

与论文中使用的具有可变步长的 49x49 AveragePooling 层不同,我们的实现使用`AdaptiveAvgPool2d`层来处理全局特征。这是因为论文作者根据 Cityscapes 数据集定制了头部,而我们的重点是提供一个可在多个数据集上工作的通用实现。最后,我们的实现在返回输出之前始终进行双线性插值,以确保输入和输出图像的大小完全匹配。

DeepLabV3 & FCN

MobileNetV3 与 DeepLabV3 和 FCN 的结合与其它模型类似,这些方法的阶段估计与 LR-ASPP 相同。唯一值得注意的区别是,我们没有使用高级和低级特征,而是将正常损失附加到输出步长为 16 的特征图,并将辅助损失附加到输出步长为 8 的特征图上。

最后,我们应该指出,FCN 版本的模型没有发布,因为它在速度和精度方面都被 LR-ASPP 完全取代了。预训练权重仍然可用,并且只需对代码进行最少的更改即可使用。

训练与调优过程

我们目前提供两个能够进行语义分割的 MobileNetV3 预训练模型:LR-ASPP 和 DeepLabV3。这些模型的骨干网络均使用ImageNet 权重初始化并进行端到端训练。两种架构均在 COCO 数据集上使用相同脚本和相似超参数进行训练。它们的详细信息可在我们的参考文件夹中找到。

通常,在推理过程中,图像会被调整到 520 像素。一个可选的速度优化是通过使用高分辨率预训练权重并将其推理调整大小减少到 320 像素来构建模型的低分辨率配置。这将使 CPU 执行时间提高约 60%,同时牺牲几个 mIoU 点。此优化的详细数字可在下表中找到:

低分辨率配置mIoU 差异速度提升mIoU全局像素精度CPU 推理(秒)
LR-ASPP MobileNetV3-Large-2.165.26%55.890.30.1139
DeepLabV3 MobileNetV3-Large-3.863.86%56.590.30.2121
FCN MobileNetV3-Large(未发布)-3.057.57%54.890.10.1571

以下是 LR-ASPP MobileNetV3-Large 模型预测的可视化示例:

希望您觉得本文有趣。我们期待您的反馈,以了解这是否是您希望我们更频繁发布的内容类型。如果社区认为此类帖子有用,我们将很乐意发布更多涵盖新引入机器学习模型实现细节的文章。