TorchVision での MobileNetV3 の実装の詳細をマスターするための 1 つの記事

一連のモバイル フレンドリー モデルが TorchVision v0.9 に追加されました。これを使用して、分類、ターゲット検出、セマンティック セグメンテーションなどのタスクを処理できます。
この記事では、これらのモデルのコードを詳しく掘り下げ、注目すべき実装の詳細を共有し、これらのモデルの構成とトレーニング原則を説明し、モデル最適化プロセス中に関係者によって行われた重要なトレードオフを解釈します。
この記事の目的は、元の論文やデータベースには記載されていないモデルの技術的な詳細を提示することです。
ネットワークアーキテクチャ
MobileNetV3 アーキテクチャの実装は、元の論文の設定に厳密に従っています。ユーザーのカスタマイズをサポートし、分類、ターゲット検出、セマンティック セグメンテーション バックボーンを構築するためのさまざまな構成を提供します。その構造設計は MobileNetV2 に似ており、どちらも同じ構成要素を共有しています。
箱から出してすぐに使用できます。公式には、Large と Small の 2 つのバリエーションが提供されています。どちらも同じコードで構築されており、唯一の違いは構成 (モジュールの数、サイズ、アクティベーション関数など) です。
設定パラメータ
ユーザーは InvertedResidual 設定をカスタマイズして、それを MobileNetV3 クラスに直接渡すことができますが、ほとんどのアプリケーションでは、開発者は、モデル構築メソッドにパラメータを渡すことで、既存の構成を調整できます。いくつかの主要な構成パラメータは次のとおりです。
* width_mult このパラメーターは、モデル パイプラインの数を決定する乗数です。デフォルト値は 1 です。デフォルト値を調整することで、最初のレイヤーと最後のレイヤーを含む畳み込みフィルターの数を変更できます。実装するときは、その数を確認してください。フィルタの数は 8 です。これは、演算のベクトル化プロセスを高速化するハードウェア最適化のトリックです。
* 削減された尾 このパラメーターは主に実行速度の最適化に使用され、ネットワークの最後のモジュールのパイプの数が半分に減ります。このバージョンは、オブジェクト検出およびセマンティック セグメンテーション モデルでよく使用されます。 MobileNetV3 関連の論文の説明によると、reduce_tail パラメータを使用すると、精度に影響を与えることなく 15% の遅延を削減できるとのことです。
* 拡張した パラメーターは主にモデルの最後の 3 つの InvertedResidual モジュールに影響します。これらのモジュールの Depthwise 畳み込みは、モジュールの出力ステップ サイズを制御し、セマンティック セグメンテーション モデルの精度を向上させるために使用される Atrous 畳み込みに変換できます。
実装の詳細
MobileNetV3 クラスは、提供された構成からネットワークを構築する役割を果たします。実装の詳細は次のとおりです。
* 最後の畳み込みモジュールは、最後の InvertedResidual モジュールの出力を 6 倍に拡張します。この実装では、さまざまな乗算器パラメータに対応できます。
* MobileNetV2 モデルと同様に、分類子の最後の線形層の前にドロップアウト層があります。
InvertedResidual クラスはネットワークの主要な構成要素であり、注意が必要な実装の詳細は次のとおりです。
※入力管と拡張管が同じ場合は拡張工程は不要です。これは、ネットワークの最初の畳み込みモジュールで発生します。
* Expanded パイプラインが出力チャンネルと同じである場合でも、Projection ステップは常に必要です。
* 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)

図に示すように、ユーザーが約 6 倍の速度向上と引き換えに多少の精度を犠牲にする場合、そうすれば、MobileNetV3-Large が ResNet50 の代替となることができます。
ここでの推論時間は CPU 上で測定されることに注意してください。
トレーニングプロセス
すべての事前トレーニング済みモデルは、幅乗数 1 と完全な尾を持つ非拡張モデルとして構成され、ImageNet に適合しました。 Large バリアントと Small バリアントはどちらも、同じハイパーパラメータとスクリプトを使用してトレーニングされます。
高速かつ安定したモデルトレーニング
RMSProp を正しく構成することは、トレーニング プロセスを高速化し、数値の安定性を確保するために重要です。論文の著者は実験で TensorFlow を使用しており、動作時にデフォルト値と比較してかなり高い値を使用しました。 rmsprop_epsilon 。
通常、このハイパーパラメータは分母がゼロになることを避けるために使用されるため、小さな値になりますが、この特定のモデルでは、損失における数値の不安定性を回避するには、正しい値を選択することが重要です。
もう 1 つの重要な詳細は、PyTorch と TensorFlow の RMSProp 実装は通常同様に動作しますが、この設定では 2 つのフレームワークがイプシロン ハイパーパラメーターを処理する方法の違いに注意することが重要です。
具体的には、PyTorch は平方根計算に加えてイプシロンを追加しますが、TensorFlow は内部にイプシロンを追加します。これにより、ユーザーはこの記事のハイパーパラメータを移植するときにイプシロン値を調整できるようになります。次の式を使用できます。 PyTorch_eps=sqrt(TF_eps) 合理的な近似値を計算します。
ハイパーパラメータを調整し、トレーニング プロセスを改善することで、モデルの精度を向上させます。
高速で安定したトレーニングを実現するようにオプティマイザーを構成したら、モデルの精度の最適化を開始できます。ユーザーがこれを達成するのに役立つテクニックがあります。
まず、過学習を避けるために、AutoAugment と RandomErasing を使用してデータを強化できます。さらに、交差検証法を使用して重みの減衰などのパラメーターを調整し、トレーニング後に異なるエポック チェックポイントの重みを平均することも非常に重要です。最後に、ラベル スムージング、ランダム深度、LR ノイズ挿入などの方法を使用すると、全体の精度を少なくとも 1.5% 向上させることができます。


設定された精度が達成されると、モデルのパフォーマンスが検証セットで検証されることに注意してください。このプロセスは、過学習の検出に役立ちます。
定量化する
MobileNetV3-Large バリアントの QNNPACK バックエンドには量子化重みが提供され、実行速度が 2.5 倍向上します。モデルを定量化するには、ここでは定量的認識トレーニング (QAT) が使用されます。
QAT を使用すると、定量化の効果をモデル化し、モデルの精度を向上させるために重みを調整できることに注意してください。単純なトレーニング モデルの定量化結果と比較すると、精度は 1.8% 向上しています。

ターゲットの検出
このセクションでは、最初に公開されたモデルのベンチマークを示し、次に MobileNetV3-Large Backbone がオブジェクト検出のためにフィーチャ ピラミッド ネットワークの 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 バックボーンを備えた高解像度の高速 R-CNN。同等の ResNet50 モデルを置き換えることができます。
実装の詳細
検出器は FPN スタイルのバックボーンを使用し、MobileNetV3 モデルのさまざまな畳み込みから特徴を抽出できます。デフォルトでは、事前トレーニングされたモデルは、13 番目の InvertedResidual モジュールの出力と、プーリング層の前の畳み込みの出力を使用します。この実装では、より多くの出力ステージの使用もサポートされています。
ネットワークから抽出されたすべての特徴マップの出力は、FPN モジュールによって 256 のパイプラインに投影されます。これにより、ネットワーク速度が大幅に向上します。FPN バックボーンによって提供されるこれらの特徴マップは、さまざまなサイズのボックスとクラスの予測を提供するために FasterRCNN 検出器によって使用されます。
トレーニングと調整のプロセス
現在、公式は、異なる解像度でターゲット検出を実行できる 2 つの事前トレーニング済みモデルを提供しています。どちらのモデルも、同じハイパーパラメーターとスクリプトを使用して COCO データセットでトレーニングされました。
高解像度検出器は 800 ~ 1333 ピクセルの画像でトレーニングされ、モバイル対応の低解像度検出器は 320 ~ 640 ピクセルの画像でトレーニングされます。
事前トレーニングされた重みの 2 つの独立したセットを提供する理由は、小さい画像上で検出器を直接トレーニングする方が、事前トレーニングされた高解像度モデルに小さい画像を渡すより効果が低いためです。精度が 5 mAP 増加します。
どちらのバックボーンの初期化でも ImageNet の重みが使用され、重みの最後の 3 段階はトレーニング プロセス中に微調整されます。
RPN NMS のしきい値を調整することで、モバイル対応モデルでさらなる速度の最適化を実行できます。0.2 mAP の精度を犠牲にすると、モデルの CPU 速度が約 45% 向上します。最適化の詳細は次のとおりです。


セマンティックセグメンテーション
このセクションでは、まず公開されている事前トレーニング モデルのベンチマークをいくつか示し、次に 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 のパフォーマンスを上回っています。
実装の詳細
このセクションでは、テストされたスプリット ヘッドの重要な実装の詳細について説明します。このセクションで説明するすべてのモデルは、拡張された MobileNetV3-Large バックボーンを使用することに注意してください。
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 に劣るため、ここでは考慮しません。事前トレーニングされた重みは、コードを少し変更するだけで引き続き使用できます。
トレーニングと調整のプロセス
セマンティック セグメンテーションに使用できる 2 つの MobileNetV3 事前トレーニング モデルを次に示します。LR-ASPP と DeepLabV3。これらのモデルのバックボーンは ImageNet の重みで初期化され、エンドツーエンドでトレーニングされます。
どちらのアーキテクチャも、同じスクリプトと同様のハイパーパラメータを使用して COCO データセットでトレーニングされました。
通常、画像は推論中に 520 ピクセルにサイズ変更されます。オプションの速度の最適化では、高解像度の事前トレーニングされた重みを使用して低解像度のモデル構成を構築し、推論サイズを 320 ピクセルに削減します。これにより、数 mIoU ポイントが犠牲になりますが、CPU 実行時間は約 60% 増加します。


上記は、今回の号でまとめた MobileNetV3 の実装の詳細です。モデルについてさらに理解していただければ幸いです。