TorchVision 的 MobileNetV3 实现你需要知道的一切
共 6607字,需浏览 14分钟
·
2021-06-21 14:51
在 TorchVision v0.9 中,我们发布了一系列适用于移动设备的新模型,可用于分类、对象检测和语义分割。在本文中,我们将深入研究模型的代码,分享重要的实现细节,解释我们如何配置和训练它们,并强调我们在调整过程中所做的重要权衡。我们的目标是披露通常在原始论文和模型存储库中未记录的技术细节。
网络架构
MobileNetV3 架构的实现与原始论文密切相关。它是可定制的,并为构建分类、对象检测和语义分割主干提供不同的配置。它被设计为遵循与 MobileNetV2 类似的结构,并且两者共享共同的构建块。
现成的,我们提供了论文中描述的两种变体:Large和Small。两者都是使用相同的代码构建的,唯一的区别在于它们的配置描述了块的数量、大小、激活函数等。
配置参数
尽管可以编写自定义 InvertedResidual 设置并将其直接传递给 MobileNetV3 类,但对于大多数应用程序,我们可以通过将参数传递给模型构建方法来调整现有配置。一些关键的配置参数如下:
该
width_mult
参数是影响模型通道数的乘数。默认值为 1,通过增加或减少它可以改变所有卷积的过滤器数量,包括第一层和最后一层的过滤器。该实现确保过滤器的数量始终是8的倍数。这是一个硬件优化技巧,可以更快地向量化操作。该
reduced_tail
参数将网络最后一个块上的通道数减半。这个版本被一些对象检测和语义分割模型使用。这是一种速度优化,在MobileNetV3 论文中有所描述,据报道可将延迟减少 15%,而不会对准确性产生显着的负面影响。该
dilated
参数影响模型的最后 3 个InvertedResidual 块,并将它们的正常深度卷积转换为 Atrous Convolutions。这用于控制这些块的输出步幅,并对语义分割模型的准确性产生显着的积极影响。
实施细则
下面我们提供有关该架构一些值得注意的实现细节的附加信息。该MobileNetV3类是负责建网出提供配置。以下是该类的一些实现细节:
最后一个卷积块将最后一个 InvertedResidual 块的输出扩展了6 倍。该实现与论文中描述的 Large 和 Small 配置一致,可以适应 multiplier 参数的不同值。
与 MobileNetV2 等其他模型类似,在分类器的最后一个线性层之前放置了一个 dropout 层。
该InvertedResidual类是网络的主要组成部分。以下是该块的一些值得注意的实现细节以及来自论文图 4 的可视化:
如果输入通道和扩展通道相同,则没有扩展步骤。这发生在网络的第一个卷积块上。
即使扩展通道与输出通道相同,也始终存在投影步骤。
depthwise 块的激活方法放置在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 倍加速的用户:
模型 | 帐户@1 | 加速度@5 | CPU 推断(秒) | # 参数 (M) |
---|---|---|---|---|
MobileNetV3-Large | 74.042 | 91.340 | 0.0411 | 5.48 |
MobileNetV3-小 | 67.668 | 87.402 | 0.0165 | 2.54 |
量化的 MobileNetV3-Large | 73.004 | 90.858 | 0.0162 | 2.96 |
移动网络V2 | 71.880 | 90.290 | 0.0608 | 3.50 |
ResNet50 | 76.150 | 92.870 | 0.2545 | 25.56 |
ResNet18 | 69.760 | 89.080 | 0.1032 | 11.69 |
请注意,推理时间是在 CPU 上测量的。它们不是绝对的基准,但它们允许模型之间的相对比较。
培训流程
所有预训练模型的宽度乘数都配置为 1,具有完整的尾部,未膨胀,并安装在 ImageNet 上。Large 和 Small 变体都使用相同的超参数和脚本进行训练,这些超参数和脚本可以在我们的参考文件夹中找到。下面我们提供有关培训过程中最显着方面的详细信息。
实现快速稳定的训练
正确配置 RMSProp对于实现具有数值稳定性的快速训练至关重要。该论文的作者在他们的实验和运行中使用了 TensorFlow,他们报告说与默认值相比使用了相当高 rmsprop_epsilon
的值。通常,此超参数采用较小的值,因为它用于避免零分母,但在此特定模型中,选择正确的值对于避免损失中的数值不稳定性似乎很重要。
另一个重要的细节是,尽管 PyTorch 和 TensorFlow 的 RMSProp 实现的行为通常相似,但在我们的设置中最显着的是 epsilon 超参数的处理方式存在一些差异。更具体地说,PyTorch 将 epsilon 添加到平方根计算之外,而 TensorFlow将其添加到 内。这个实现细节的结果是,在移植论文的超参数时需要调整epsilon值。可以使用公式进行合理的近似PyTorch_eps = sqrt(TF_eps)
。
通过调整超参数和改进我们的训练配方来提高我们的准确性
配置优化器实现快速稳定训练后,我们转而优化模型的准确率。有一些技术可以帮助我们实现这一目标。首先,为了避免过度拟合,我们使用 AutoAugment 算法扩充了数据,然后是 RandomErasing。此外,我们使用交叉验证调整了权重衰减等参数。我们还发现在训练结束后在不同时期检查点之间执行权重平均是有益的。最后,虽然未在我们发布的训练配方中使用,但我们发现使用标签平滑、随机深度和 LR 噪声注入将整体准确度提高了1.5 点以上。
图表和表格描述了用于提高 MobileNetV3 Large 变体准确性的最重要迭代的简化摘要。请注意,训练模型时完成的实际迭代次数要大得多,并且准确性的进步并不总是单调增加。另请注意,图表的 Y 轴从 70% 开始,而不是从 0% 开始,以使迭代之间的差异更加明显:
迭代 | 帐户@1 | 加速度@5 |
---|---|---|
使用“MobileNetV2 风格”超参数的基线 | 71.542 | 90.068 |
+ RMSProp 与默认 eps | 70.684 | 89.38 |
+ RMSProp 调整后的 eps 和 LR 方案 | 71.764 | 90.178 |
+ 数据增强和调整超参数 | 73.86 | 91.292 |
+ 检查点平均 | 74.028 | 91.382 |
+ 标签平滑和随机深度和 LR 噪声 | 75.536 | 92.368 |
请注意,一旦我们达到可接受的精度,我们就会在之前未用于训练或超参数调整的保持测试数据集上验证模型性能。此过程可帮助我们检测过拟合,并且始终在所有预训练模型发布之前执行。
量化
我们目前为MobileNetV3-Large 变体的 QNNPACK 后端提供量化权重,可提供 2.5 倍的加速。为了量化模型,使用了量化感知训练 (QAT)。用于训练模型的超参数和脚本可以在我们的参考文件夹中找到。
请注意,QAT 允许我们对量化的影响进行建模并调整权重,以便我们可以提高模型的准确性。与简单的训练后量化相比,这意味着准确度提高了 1.8 个点:
量化状态 | 帐户@1 | 加速度@5 |
---|---|---|
非量化 | 74.042 | 91.340 |
量化意识训练 | 73.004 | 90.858 |
训练后量化 | 71.160 | 89.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 模型的可行替代品:
模型 | 地图 | CPU 推断(秒) | # 参数 (M) |
---|---|---|---|
Faster R-CNN MobileNetV3-Large FPN(高分辨率) | 32.8 | 0.8409 | 19.39 |
Faster R-CNN MobileNetV3-Large 320 FPN(低分辨率) | 22.8 | 0.1679 | 19.39 |
更快的 R-CNN ResNet-50 FPN | 37.0 | 4.1514 | 41.76 |
RetinaNet ResNet-50 FPN | 36.4 | 4.8825 | 34.01 |
实施细则
检测器使用 FPN 风格的主干,从 MobileNetV3 模型的不同卷积中提取特征。默认情况下,预训练模型使用第 13 个 InvertedResidual 块的输出和池化层之前的卷积的输出,但实现支持使用更多阶段的输出。
从网络中提取的所有特征图的输出都被 FPN 块投影到256 个通道,因为这大大提高了网络的速度。FPN主干提供的这些特征图被FasterRCNN检测器用来提供不同尺度的box和class预测。
训练和调优过程
我们目前提供两种能够以不同分辨率进行目标检测的预训练模型。两个模型都使用相同的超参数和脚本在 COCO 数据集上进行训练,这些超参数和脚本可以在我们的参考文件夹中找到。
在高分辨率检测用的800-1333px图像的训练,而移动友好的低分辨率检测用的320-640px图像训练。我们提供两组单独的预训练权重的原因是,与将小图像传递给预训练的高分辨率模型相比,直接在较小的图像上训练检测器会导致精度提高 5 mAP。两个主干都使用适合 ImageNet 的权重进行初始化,并且在训练过程中对其权重的最后 3 个阶段进行了微调。
通过调整 RPN NMS 阈值,可以在移动友好模型上应用额外的速度优化。通过仅牺牲 0.2 mAP 的精度,我们能够将模型的 CPU 速度提高大约 45%。优化细节见下图:
调整状态 | 地图 | CPU 推断(秒) |
---|---|---|
前 | 23.0 | 0.2904 |
后 | 22.8 | 0.1679 |
下面我们提供了一些可视化 Faster R-CNN MobileNetV3-Large FPN 模型预测的示例:
语义分割
在本节中,我们将首先提供已发布的预训练模型的一些基准。然后我们将讨论如何将 MobileNetV3-Large 主干与LR- ASPP、DeepLabV3和FCN等分割头结合起来进行语义分割。我们还将解释网络是如何训练的,并为速度关键应用提出一些可选的优化技术。
基准
这是初始化预训练模型的方法:
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:
模型 | 米欧 | 全局像素加速 | CPU 推断(秒) | # 参数 (M) |
---|---|---|---|---|
LR-ASPP MobileNetV3-大 | 57.9 | 91.2 | 0.3278 | 3.22 |
DeepLabV3 MobileNetV3-Large | 60.3 | 91.2 | 0.5869 | 11.03 |
FCN MobileNetV3-Large(未发布) | 57.8 | 90.9 | 0.3702 | 5.05 |
DeepLabV3 ResNet50 | 66.4 | 92.4 | 6.3531 | 39.64 |
FCN ResNet50 | 60.5 | 91.4 | 5.0146 | 32.96 |
实施细则
在本节中,我们将讨论经过测试的分段头的重要实现细节。请注意,本节中描述的所有模型都使用扩张的 MobileNetV3-Large 主干。
LR-ASPP
LR-ASPP 是 MobileNetV3 论文的作者提出的 Reduced Atrous Spatial Pyramid Pooling 模型的 Lite 变体。与 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 点。可以在下表中找到此优化的详细数字:
低分辨率配置 | 千差万别 | 速度提升 | 米欧 | 全局像素加速 | CPU 推断(秒) |
---|---|---|---|---|---|
LR-ASPP MobileNetV3-大 | -2.1 | 65.26% | 55.8 | 90.3 | 0.1139 |
DeepLabV3 MobileNetV3-Large | -3.8 | 63.86% | 56.5 | 90.3 | 0.2121 |
FCN MobileNetV3-Large(未发布) | -3.0 | 57.57% | 54.8 | 90.1 | 0.1571 |
以下是一些可视化 LR-ASPP MobileNetV3-Large 模型预测的示例: