# MobileNetV2 論文閱讀 Paper: https://arxiv.org/pdf/1801.04381.pdf ## Introduction MobileNetV2基於V1中的Depthwise Separable Conv加入Inverted residual的架構,設計了一新的架構:inverted residual with linear bottleneck。除此之外,文中也提到如何利用MobileNetV2於其他影像應用,其中物件偵測的應用上,文中提出SSDLite作為偵測的head,而在語意分割的應用上,文中參考DeepLab3架構並提出Mobile DeepLabv3。 ## Preliminaries, discussion and intuition 文中有稍微提一下Depthwise Separable Conv,但這裡就不贅述了。 ### Linear Bottlenecks ![](https://i.imgur.com/nKbj0St.png) 文中提到一個特別的詞:manifold of interest,其意義為對於一組輸入影像,每組經由激活函數的層會形成"manifold of interest",而其可以被embed至低維的子空間中。換句話說,當我們查看某個卷積層的channel時,這些值中編碼的信息實際上位於某些manifold中,而這些manifold是可以被嵌入至低維的子空間中的,也就是說,manifold of interest是對網路來說$有用的資訊$,因此如果可以將這些資訊embed至一個低維的子空間中,可以讓模型更輕量,同時又維持模型的performance。 而直覺上來說,如MobileNetV1中使用width multiplier降低維度,如果能維持manifold的大小,是不會降低準確率的,然而因為網路中每層最後都是使用ReLU進行運算,而因ReLU在低維空間中容易丟失訊息(輸入負值,輸出為0),因此會使得manifold of interest在經過ReLU之後的資訊遭到丟失。 圖2(c)(d)的結構是相等的(顏色紋路相同的block可重疊),從(c)來看的話,與(b)相同,一樣是在一開始有一個depthwise conv,而後有一個pointwise conv,但不同的是(b)的pointwise con是將通道數增加,(c)則是將通道數減少,其是為了將“manifold of interest” embed 至一個低維度的子空間,而之後再使用另外一個pointwise conv將通道數增加,也就是(d)的最一開始;對於(d)則是先使用一個depthwise conv增加通道數,再接一個depthwise conv,之後接一個pointwise conv減少通道數,而最後的輸出為manifold of interest。 ![](https://i.imgur.com/SaPnnFS.png) Figure 1顯示在低維激活空間(層)中(n=2,3,5)時資訊會丟失;反之在高維激活空間(層)時(n=15,30),manifold較不會崩塌。 * 總結來說,manifold of interest 應位於高維激活空間中的低維子空間中: 1. 若mainfold of interest在經過ReLU後的值不為0,則代表其為線性轉換。 2. ReLU可以保留完整的資訊,但僅限於輸入的manifold位於輸入空間(高維的層)的低維的子空間中。 由以上總結可以知道:假設manifold of interest 在低維度,可以加入linear bottleneck層來捕捉manifold中的重要資訊。而在實驗中可得知使用線性層會比非線性層好,因線性轉換比較不會破壞原本的資訊,因此文中將最後一層的ReLU拿掉(如圖2(d)中最後一層pointwise conv後面為線性輸出)。 ### Inverted residuals ![](https://i.imgur.com/4oxWaVc.png) Inverted residuals的功能與傳統的residual相同,都是為了能夠更好的回傳梯度以及特徵重用,不過MobileNetV2中選擇將shortcut連接在linear bottleneck之間,主要是因為作者相信bottleneck含有重要的資訊,即manifold of interest。 #### Run time and parameter count for bottleneck convolution ![](https://i.imgur.com/A5AAxyB.png) 文中所應用的架構如Table 1,對於一個大小為$h*w$的block來說,其所需要的運算量為:![](https://i.imgur.com/qB7Ha6Y.png),其中$t$為expansion factor(如圖2(d)中輸入通道數與拓展後通道數的比率);$k$為kernel size;$d'$為輸入通道數;$d''$為輸出通道數,相比於V1多了一個$1*1$的卷積,然而因為這樣的設計(保留重要資訊)可以使用更少輸入及輸入通道數,因此在Tabel 3的比較中,MobileNetV2所需資源比V1少很多。 ![](https://i.imgur.com/7BrXRG2.png) ## Model Architecture 上一節講述了bottleneck及residual的架構,而文中所使用到的bottleneck residual block(如圖3(b))的詳細架構可以參閱Table 1: ![](https://i.imgur.com/R3w3KpV.png) 首先假設輸入是$h*w*k$會先經由pointwise conv及ReLU6,之後經由depthwise conv及ReLU6,最後在經過一個pointwise conv,最後得到$(h/s)*(w/s)*k'$,其中$s$為stride;$k'$為輸出通道數。 Tabel 2中表示的則是MobileNetV2的整個架構,首先會經過一個全卷積層,之後經過7層bottleneck層,其中第一層的expansion factor為1其他均為6。 ![](https://i.imgur.com/jmkMCzD.png) 文中提到作者經過實驗發現expansion factor介於5-10間有最好的結果,而文中則是將其除第一層外都設為6。 ## Experiments ### ImageNet classification * Optimizer: RMSProp * Decay, momentum: 0.9 * Weight decay: 0.00004 * Lr: 0.045 * Lr decay: 0.98 per epoch * Batch size: 96 文中比較MobileNetV1, ShuffleNet與NASNet-A,結果如下圖: ![](https://i.imgur.com/p96Nhy8.png) ### Object Detection 在物件偵測的應用上面,文中將SSD進行修改,以depthwise separable conv取代傳統的卷積層,並命名為SSDLite,在Table 5中可以看到SSDLite節省了非常多運算量。 ![](https://i.imgur.com/Tpgs7Lb.png) ![](https://i.imgur.com/NmU0sOR.png) 從上表的實驗結果可以知道,MobileNetV2+SSDLite的運算量少了其他架構好幾倍,而mAP也沒有掉太多,甚至比YOLOv2高。 ### Semantic Segmentation 文中採用DeepLabV3作為上採樣的head,並討論了ASPP架構、Multi-scale輸入與output_stride大小的結果,如下圖所示: ![](https://i.imgur.com/fVbkkgq.png) 而由實驗結果得知: 1. MF(多尺度與左右翻轉輸入)會增加非常多運算量,因此不適合用在邊緣裝置上。 2. 使用output_stride=16比8更有效率。 3. 在MobileNetV2的倒數第二層加上DeepLabV3的head會比在最後一層上加入會更有效率,大約可以少2.5倍的運算量,且獲得的結果差不多。 4. DeepLabV3中的ASPP雖然效果不錯,但是運算量非常大,因此將ASPP移除可以減少許多運算量,而mIOU卻也不會掉太多。 ## Conclusion 文中提出的inverted residual with linear bottleneck架構可以節省非常多的運算量,且此種backbone可以應用於不同的任務中,如文中提到的detection, segmentation,而且都可以獲得SOTA的結果同時又維持非常少的運算量,此架構相較傳統殘差卷積層運算量較少,又可以在不同任務中取得不凡的結果,因此此架構可能是未來非常重要的研究項目。