一文掌握 MobileNetV3 在 TorchVision 中的實現細節

TorchVision v0.9 中新增了一系列移動端友好的模型,可用於處理分類、目標檢測、語義分割等任務。後端

本文將深刻探索這些模型的代碼,分享值得注意的實現細節,解釋這些模型的配置和訓練原理,並解讀模型優化過程當中官方作出的重要權衡。網絡

本文的目標是展現模型中沒在原始論文和資料庫中記載的技術細節。架構

網絡架構

MobileNetV3 架構的實現嚴格遵照了原始論文中的設定,支持用戶自定義,爲構建分類、目標檢測和語義分割 Backbone 提供了不一樣的配置。 它的結構設計與 MobileNetV2 相似,二者共用相同的構建模塊。框架

開箱即用。 官方提供了兩種變體:Large 和 Small。兩者是用相同的代碼構建的,惟一的區別是配置(模塊的數量、大小、激活函數等)不一樣。dom

配置參數

儘管用戶能夠自定義 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 模塊架構示意圖
MobileNetV3 模塊架構示意圖優化

分類

此處將講解預訓練模型的基準及配置、訓練和量化細節。spa

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 上測量得出的。

訓練過程

將全部預訓練模型都配置爲寬度乘數爲 一、具備 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。

與論文中使用的 49x49 的 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

相關文章
相關標籤/搜索