乐趣区

关于人工智能:一文掌握-MobileNetV3-在-TorchVision-中的实现细节

TorchVision v0.9 中新增了一系列挪动端敌对的模型,可用于解决分类、指标检测、语义宰割等工作。

本文将深刻摸索这些模型的代码,分享值得注意的实现细节,解释这些模型的配置和训练原理,并解读模型优化过程中官网做出的重要衡量。

本文的指标是展现模型中没在原始论文和资料库中记录的技术细节。

网络架构

MobileNetV3 架构的实现严格遵守了原始论文中的设定,反对用户自定义,为构建分类、指标检测和语义宰割 Backbone 提供了不同的配置。 它的结构设计与 MobileNetV2 相似,两者共用雷同的构建模块。

开箱即用。 官网提供了两种变体:Large 和 Small。二者是用雷同的代码构建的,惟一的区别是配置(模块的数量、大小、激活函数等)不同。

配置参数

只管用户能够自定义 InvertedResidual 设置,并间接传递给 MobileNetV3 类,但对于大多数利用而言,开发者能够通过向模型构建办法传递参数,来调整已有配置。 一些要害的配置参数如下:

  • width_mult 参数是一个乘数,决定模型管道的数量,默认值是 1,通过调节默认值能够扭转卷积过滤器的数量,包含第一层和最初一层,实现时要确保过滤器的数量是 8 的倍数。这是一个硬件优化技巧,能够放慢操作的向量化过程。
  • reduced_tail 参数次要用于运行速度优化,它使得网络最初一个模块的管道数量减半。该版本常被用于指标检测和语义宰割模型。依据 MobileNetV3 相干论文形容,应用 reduced_tail 参数能够在不影响准确性的前提下,缩小 15% 的提早。
  • dilated 参数次要影响模型最初 3 个 InvertedResidual 模块,能够将这些模块的 Depthwise 卷积转换成 Atrous 卷积,用于管制模块的输入步长,并进步语义宰割模型的准确性。

实现细节

MobileNetV3 类负责从提供的配置中构建一个网络,实现细节如下:

  • 最初一个卷积模块将最初一个 InvertedResidual 模块的输入扩充了 6 倍。该实现办法能够适应不同的乘数参数。
  • 与 MobileNetV2 模型相似,分类器最初一个 Linear 层之前,存在一个 Dropout 层。

InvertedResidual 类是该网络的次要构建模块,须要留神的实现细节如下:

  • 如果输出管道和扩大管道雷同,则无需 Expansion 步骤。这产生在网络的第一个卷积模块上。
  • 即便 Expanded 管道与输入通道雷同,也总是须要 Projection 步骤。
  • Depthwise 模块的激活优先于 Squeeze-and-Excite 层,能够在肯定水平上进步准确率。


MobileNetV3 模块架构示意图

分类

此处将解说预训练模型的基准及配置、训练和量化细节。

Benchmarks

初始化预训练模型:

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)


新旧模型具体 benchmark 比照

如图所示,如果用户违心就义一点准确性,来换取大概 6 倍的速度减少,则 MobileNetV3-Large 能够成为 ResNet50 的替代品。

留神,此处的推理时长是在 CPU 上测量得出的。

训练过程

将所有预训练模型都配置为宽度乘数为 1、具备 full tails 的 non-dilated 模型,并在 ImageNet 上拟合。Large 和 Small 变体都是用雷同的超参和脚本训练的。

疾速和稳固的模型训练

正确配置 RMSProp 对于放慢训练过程和保障数值稳定性至关重要。论文作者在试验中用的是 TensorFlow,运行过程中应用了与默认值相比,相当高的 rmsprop_epsilon

通常状况下,这个超参数是用来防止零分母呈现的,因而它的值很小,但在这个特定模型中,抉择正确的数值对防止损失中的数值不稳固很重要。

另一个重要细节是,只管 PyTorch 和 TensorFlow 的 RMSProp 实现通常体现类似,但在此处的设置中,须要留神两个框架在解决 epsilon 超参数时的区别。

具体来说,PyTorch 在平方根计算之外增加了 epsilon,而 TensorFlow 是在外面增加了 epsilon。这使得用户在移植本文的超参数时,须要调整 epsilon 值,能够用公式 PyTorch_eps=sqrt(TF_eps) 来计算正当近似值。

通过调整超参数和改良训练过程,来进步模型准确度

配置优化器,实现疾速和稳固的训练后,就能够着手于优化模型的准确性了。有一些技术能够帮忙用户实现这一指标。

首先,为了防止过拟合,能够应用 AutoAugment 和 RandomErasing 来加强数据 。此外,用穿插验证法来调整权值衰减等参数,训练完结后对不同 epoch 检查点进行权重均匀,也意义重大。最初,用 Label Smoothing、随机深度和 LR noise injection 等办法,也能使总体准确率进步至多 1.5%。

进步 MobileNetV3-Large 准确率的要害迭代


MobileNetV2-style 超参基线

留神,一旦达到设定的准确度,将在验证集上验证模型性能。这个过程有助于检测过拟合。

量化

为 MobileNetV3-Large 变体的 QNNPACK 后端提供了量化权重,使得运行速度进步了 2.5 倍。为了量化模型,这里应用了量化感知训练 (QAT)。

留神,QAT 容许对量化的影响进行建模,并调整权重,以便进步模型准确度。与简略训练的模型量化后果相比,准确度进步了 1.8%:

指标检测

本局部将先提供已公布模型的基准,而后探讨 MobileNetV3-Large Backbone 是如何与 FasterRCNN 检测器一起被用于 Feature Pyramid Network,从而进行指标检测的。

此外还将解释该网络是如何训练和调整的,以及必须要权衡利弊的中央(本局部内容不波及如何与 SSDlite 一起应用的细节)。

Benchmarks

初始化模型:

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)


新旧模型之间的 benchmark 比照

能够看到,如果用户违心为了 5 倍快的训练速度,就义一点精度的话,带有 MobileNetV3-Large FPN backbone 的高分辨率 Faster R-CNN,能够代替等同 ResNet50 模型。

实现细节

检测器用的是 FPN-style backbone,它能够从 MobileNetV3 模型的不同卷积中提取特色。默认状况下,预训练模型应用的是第 13 个 InvertedResidual 模块的输入,和池化层之前的卷积的输入。该实现也反对应用更多阶段的输入。

所有从网络中提取的特色图,都由 FPN 模块将其输入投射到 256 个管道,这能够极大进步网络速度。这些由 FPN backbone 提供的特色图,将被 FasterRCNN 检测器用来提供不同规模的 box 和 class 预测。

训练和调优过程

目前官网提供了两种预训练模型,能在不同分辨率下进行指标检测。这两个模型都是在 COCO 数据集上,用雷同的超参数和脚本进行训练的。

高分辨率检测器是用 800-1333px 的图像进行训练的,而挪动端敌对的低分辨率检测器,则是用 320-640px 的图像进行训练的。

提供两套独立预训练权重的起因是,间接在较小的图像上训练检测器,与将小图像传递给预训练的高分辨率模型相比,会导致精度减少 5 mAP。

两个 backbone 初始化用的都是 ImageNet 上的权重,训练过程中还对其权重的最初三个阶段进行了微调。

通过调整 RPN NMS 的阈值,能够对挪动端敌对的模型进行额定的速度优化。 就义 0.2 mAP 的精度,就可能将模型的 CPU 速度进步约 45%。优化细节如下:


Faster R-CNN MobileNetV3-Large FPN 模型的预测示意图

语义宰割

本局部先提供了一些已颁布的预训练模型基准,而后将探讨 MobileNetV3-Large backbone 是如何与 LR-ASPP、DeepLabV3 和 FCN 等宰割 head 联合,进行语义宰割的。

此外还将解释网络的训练过程,并为速度要害利用提出一些备选优化技术。

Benchmarks

初始化预训练模型:

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


新旧模型之间的具体基准比照

如图可知,在大多数利用中,带有 MobileNetV3-Large backbone 的 DeepLabV3 是 FCN 与 ResNet50 的可行替代品,在保障相似准确度的前提下,运行速度晋升 8.5 倍。此外 LR-ASPP 网络在所有指标上的体现,都超过了同等条件下的 FCN。

实现细节

本局部将探讨已测试的宰割 head 的重要实现细节。留神,本节中形容的所有模型都应用扩张 MobileNetV3-Large backbone。

LR-ASPP

LR-ASPP 是 MobileNetV3 论文作者提出的 Reduced Atrous Spatial Pyramid Pooling 模型的精简版本。与 TorchVision 中的其余宰割模型不同,它不应用辅助损失,而是应用低级和高级特色,输入步长别离为 8 和 16。

与论文中应用的 49×49 的 AveragePooling 层和可变步长不同,此处是用 AdaptiveAvgPool2d 层来解决全局特色。

这能够为用户提供一个通用的实现办法,在多个数据集上跑通。 最初在返回输入之前,总会产生一个双线性插值,以确保输出和输入图像的尺寸齐全匹配。

DeepLabV3 & FCN

MobileNetV3 与 DeepLabV3 和 FCN 的组合与其余模型的组合十分类似,这些办法的阶段评估与 LR-ASPP 雷同。

须要留神的是,这里没有应用高级和低级特色,而是在输入跨度为 16 的特色图上附加失常损失,在输入跨度为 8 的特色图上附加辅助损失。

FCN 在速度和准确度方面都不迭 LR-ASPP,因而这里不作考量。预训练权重依然可用,只需对代码稍做批改。

训练和调优过程

这里提供了两个可用于语义宰割的 MobileNetV3 预训练模型:LR-ASPP 和 DeepLabV3。 这些模型的 backbone 是用 ImageNet 权重进行初始化的,并进行了端到端训练。

两个架构都是在 COCO 数据集上应用雷同脚本和相似超参进行训练的。

通常状况下,在推理过程中,图像的大小会被调整为 520 像素。一个可选的速度优化计划是,用高分辨率预训练权重,来构建低分辨率的模型配置,并将推理大小缩小到 320 像素。这会让 CPU 的执行工夫进步约 60%,同时就义几个 mIoU point。


优化后的具体数字


LR-ASPP MobileNetV3-Large 模型预测示例

以上就是本期汇总的 MobileNetV3 实现细节,心愿这些能让你对该模型有进一步的理解和意识。

参考:

MobileNetV3 论文

PyTorch Blog

退出移动版