深入剖析MobileNet和它的變種
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
最近在看輕量級(jí)網(wǎng)絡(luò)的東西,發(fā)現(xiàn)這篇總結(jié)的非常的好,因此就翻譯過(guò)來(lái)!總結(jié)各種變種,同時(shí)原理圖非常的清晰,希望能給大家一些啟發(fā),如果覺(jué)得不錯(cuò)歡迎三連哈!
Introduction
在本文中,我概述了高效CNN模型(如MobileNet及其變體)中使用的組成部分(building blocks),并解釋了它們?nèi)绱烁咝У脑颉L貏e地,我提供了關(guān)于如何在空間和通道域進(jìn)行卷積的直觀說(shuō)明。
在解釋具體的高效CNN模型之前,我們先檢查一下高效CNN模型中使用的組成部分的計(jì)算量,看看卷積在空間和通道域中是如何進(jìn)行的。

假設(shè) H x W 為輸出feature map的空間大小,N為輸入通道數(shù),K x K為卷積核的大小,M為輸出通道數(shù),則標(biāo)準(zhǔn)卷積的計(jì)算量為 HWNK2M 。
這里重要的一點(diǎn)是,標(biāo)準(zhǔn)卷積的計(jì)算量與(1)輸出特征圖H x W的空間大小,(2)卷積核K的大小,(3)輸入輸出通道的數(shù)量N x M成正比。
當(dāng)在空間域和通道域進(jìn)行卷積時(shí),需要上述計(jì)算量。通過(guò)分解這個(gè)卷積,可以加速 CNNs,如下圖所示。
卷積
首先,我提供了一個(gè)直觀的解釋,關(guān)于空間和通道域的卷積是如何對(duì)進(jìn)行標(biāo)準(zhǔn)卷積的,它的計(jì)算量是HWNK2M 。
我連接輸入和輸出之間的線,以可視化輸入和輸出之間的依賴關(guān)系。直線數(shù)量大致表示空間和通道域中卷積的計(jì)算量。

例如,最常用的卷積——conv3x3,可以如上圖所示。我們可以看到,輸入和輸出在空間域是局部連接的,而在通道域是全連接的。

接下來(lái),如上所示用于改變通道數(shù)的conv1x1,或pointwise convolution。由于kernel的大小是1x1,所以這個(gè)卷積的計(jì)算代價(jià)是 HWNM,計(jì)算量比conv3x3降低了1/9。這種卷積被用來(lái)“混合”通道之間的信息。
分組卷積(Grouped Convolution)
分組卷積是卷積的一種變體,將輸入的feature map的通道分組,對(duì)每個(gè)分組的通道獨(dú)立地進(jìn)行卷積。
假設(shè) G 表示組數(shù),分組卷積的計(jì)算量為 HWNK2M/G,計(jì)算量變成標(biāo)準(zhǔn)卷積的1/G。

在conv3x3 而且 G=2的情況。我們可以看到,通道域中的連接數(shù)比標(biāo)準(zhǔn)卷積要小,說(shuō)明計(jì)算量更小。

在 conv3x3,G=3的情況下,連接變得更加稀疏。

在 conv1x1,G=2的情況下,conv1x1也可以被分組。這種類型的卷積被用于ShuffleNet中。

在 conv1x1,G=3的情況.
深度可分離卷積(Depthwise Convolution)
在深度卷積中,對(duì)每個(gè)輸入通道分別進(jìn)行卷積。它也可以定義為分組卷積的一種特殊情況,其中輸入和輸出通道數(shù)相同,G等于通道數(shù)。

如上所示,depthwise convolution 通過(guò)省略通道域中的卷積,大大降低了計(jì)算量。
Channel Shuffle
Channel shuffle是一種操作(層),它改變 ShuffleNet 中使用的通道的順序。這個(gè)操作是通過(guò)張量reshape和 transpose 來(lái)實(shí)現(xiàn)的。
更準(zhǔn)確地說(shuō),讓GN ' (=N) 表示輸入通道的數(shù)量,首先將輸入通道的維數(shù)reshape 為(G, N '),然后將(G, N ')轉(zhuǎn)置為(N ', G),最后將其flatten 成與輸入相同的形狀。這里G表示分組卷積的組數(shù),在ShuffleNet中與channel shuffle層一起使用。
雖然ShuffleNet的計(jì)算代價(jià)不能用乘加操作(MACs)的數(shù)量來(lái)定義,但應(yīng)該有一些開(kāi)銷。

G=2時(shí)的channel shuffle 情況。卷積不執(zhí)行,只是改變了通道的順序。

這種情況下打亂的通道數(shù) G=3
Efficient Models
下面,對(duì)于高效的CNN模型,我將直觀地說(shuō)明為什么它們是高效的,以及如何在空間和通道域進(jìn)行卷積。
ResNet (Bottleneck Version)
ResNet 中使用的帶有bottleneck 架構(gòu)的殘差單元是與其他模型進(jìn)行進(jìn)一步比較的良好起點(diǎn)。

如上所示,具有bottleneck架構(gòu)的殘差單元由conv1x1、conv3x3、conv1x1組成。第一個(gè)conv1x1減小了輸入通道的維數(shù),降低了隨后的conv3x3的計(jì)算量。最后的conv1x1恢復(fù)輸出通道的維數(shù)。
ResNeXt
ResNeXt是一個(gè)高效的CNN模型,可以看作是ResNet的一個(gè)特例,將conv3x3替換為成組的conv3x3。通過(guò)使用有效的分組conv,與ResNet相比,conv1x1的通道減少率變得適中,從而在相同的計(jì)算代價(jià)下獲得更好的精度。

MobileNet (Separable Conv)
MobileNet是一個(gè)可分離卷積模塊的堆疊,由depthwise conv和conv1x1 (pointwise conv)組成。

可分離卷積在空間域和通道域獨(dú)立執(zhí)行卷積。這種卷積分解顯著降低了計(jì)算量,從 HWNK2M 降低到HWNK2 (depthwise) + HWNM (conv1x1), HWN(K2 + M) 。一般情況下,M>>K(如K=3和M≥32),減小率約為1/8-1/9。
這里重要的一點(diǎn)是,計(jì)算量的bottleneck現(xiàn)在是conv1x1!
ShuffleNet
ShuffleNet的動(dòng)機(jī)是如上所述,conv1x1是可分離卷積的瓶頸。雖然conv1x1已經(jīng)是有效的,似乎沒(méi)有改進(jìn)的空間,分組conv1x1可以用于此目的!

上圖說(shuō)明了用于ShuffleNet的模塊。這里重要的building block是channel shuffle層,它在分組卷積中對(duì)通多在組間的順序進(jìn)行“shuffles”。如果沒(méi)有channel shuffle,分組卷積的輸出在組之間就不會(huì)被利用,導(dǎo)致精度下降。
MobileNet-v2
MobileNet-v2采用類似ResNet中帶有bottleneck架構(gòu)殘差單元的模塊架構(gòu);用深度可分離卷積(depthwise convolution)代替conv3x3,是殘差單元的改進(jìn)版本。

從上面可以看到,與標(biāo)準(zhǔn)的 bottleneck 架構(gòu)相反,第一個(gè)conv1x1增加了通道維度,然后執(zhí)行depthwise conv,最后一個(gè)conv1x1減少了通道維度。

通過(guò)如上所述對(duì)building blocks 進(jìn)行重新排序,并將其與MobileNet-v1(可分離的conv)進(jìn)行比較,我們可以看到這個(gè)體系結(jié)構(gòu)是如何工作的(這種重新排序不會(huì)改變整個(gè)模型體系結(jié)構(gòu),因?yàn)镸obileNet-v2是這個(gè)模塊的堆疊)。
也就是說(shuō),上述模塊可以看作是可分離卷積的一個(gè)改進(jìn)版本,其中可分離卷積中的單個(gè)conv1x1被分解為兩個(gè)conv1x1。讓T表示通道維數(shù)的擴(kuò)展因子,兩個(gè) conv1x1 的計(jì)算量為 2HWN2/T ,而可分離卷積下的conv1x1的計(jì)算量為 HWN2。在[5]中,使用T = 6,將 conv1x1 的計(jì)算成本降低了3倍(一般為T(mén)/2)。
FD-MobileNet
最后,介紹 Fast-Downsampling MobileNet (FD-MobileNet)[10]。在這個(gè)模型中,與MobileNet相比,下采樣在較早的層中執(zhí)行。這個(gè)簡(jiǎn)單的技巧可以降低總的計(jì)算成本。其原因在于傳統(tǒng)的向下采樣策略和可分離變量的計(jì)算代價(jià)。
從VGGNet開(kāi)始,許多模型采用相同的下采樣策略:執(zhí)行向下采樣,然后將后續(xù)層的通道數(shù)增加一倍。對(duì)于標(biāo)準(zhǔn)卷積,下采樣后計(jì)算量不變,因?yàn)楦鶕?jù)定義得 HWNK2M 。而對(duì)于可分離變量,下采樣后其計(jì)算量減小;由 HWN(K2 + M) 降為 H/2 W/2 2N(K2 + 2M) = HWN(K2/2 + M)。當(dāng)M不是很大時(shí)(即較早的層),這是相對(duì)占優(yōu)勢(shì)的。
下面是對(duì)全文的總結(jié)

好消息!
小白學(xué)視覺(jué)知識(shí)星球
開(kāi)始面向外開(kāi)放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

