目標檢測輕量化壓縮


目標檢測輕量化壓縮

目標檢測難點概述
目標檢測是計算機視覺中一個重要問題,在行人跟蹤、車牌識別、無人駕駛等領域都具有重要的研究價值。近年來,隨着深度學習對圖像分類准確度的大幅度提高,基於深度學習的目標檢測算法逐漸成為主流。
自 2014 年以來,目標檢測框架分為two-stage 和 one-stage 兩大類,前者以經典方法 Faster R-CNN 為代表,后者以 YOLO 和 SSD 為主要框架。近年來,兩類最深刻的idea:更好的基礎網絡 & 融合不同卷積層的特征疊加在經典方法上,產生了大量變體。
結合近兩年的計算機視覺會議的相關論文可以看出,對於目標檢測而言,目前主要存在以下幾個問題:

  • 對於小目標物體的檢測(如小於30像素的目標物體)、遮擋面積較大的目標以及區分圖像中與目標物體外形相似的非目標物體等問題需要在今后的研究中繼續加強。
  • 實時性檢測與處理。對於自動駕駛或汽車輔助駕駛等對實時處理能力要求較高的應用場景,進一步提高目標檢測的計算速度和准確度是至關重要的。
  • 提高小數據量訓練的檢測效果。目前遷移學習的實現策略是先在現有大數據中進行訓練,然后再將模型進行微調。雖然此方法能夠實現,但檢測精度和速度還有待進一步提高。
  • 目前基於深度學習的目標檢測所涉及的行業領域越來越多,很難獲取大量的監督數據或數據的標准成本過高,進而導致缺少用於網絡訓練的樣本數據。

近年來,許多學者在目標檢測難點方面已經做出許多成果,本文主要介紹秘籍一:模型加速之輕量化網絡。

 動機:

  目標:想要獲得一個實時的模型,且盡可能的准確。

  我們有一個大模型性能很好,但是很慢:

  

 

   我們有個小模型速度很快,但是性能很差:

  

 

   動機:面臨的挑戰

  1、由於容量和能力,小模型很難達到一個很好的性能。

  2、精確度和模型壓縮之間的差距還是很大

  3、物體檢測比分類要困難得多:

    a、 標簽的計算更加昂貴

    b、 類別不均衡

    c、多任務同時需要分類和回歸

  4、直接應用蒸餾在檢測模型上並不能很好的工作。

  背景,前人的工作:

  1、 大網絡的加速

    a、減少通道的數量 (訓練前)

    b、剪枝 (訓練后)

    c、low rank decomposition (低秩分解見下圖)

      HWS:高寬通道數。D越小越快,D越大總結信息能力越強。 resnet bottlenek 也是同樣的道理,FC層也可以分解

 

秘籍一. 模型加速之輕量化網絡


從模型設計時就采用一些輕量化的思想,例如采用深度可分離卷積、分組卷積等輕量卷積方式,減少卷積過程的計算量。此外,利用全局池化來取代全連接層,利用1×1卷積實現特征的通道降維,也可以降低模型的計算量,這兩點在眾多網絡中已經得到了應用。
對於輕量化的網絡設計,目前較為流行的有SqueezeNet、MobileNet及ShuffleNet等結構。其中,SqueezeNet采用了精心設計的壓縮再擴展的結構,MobileNet使用了效率更高的深度可分離卷積,而ShuffleNet提出了通道混洗的操作,進一步降低了模型的計算量。
下面將詳細介紹:

 

1.SqueezeNet:壓縮再擴展


隨着網絡結構的逐漸加深,模型的性能有了大幅度提升,但這也增加了網絡參數與前向計算的時間。SqueezeNet從網絡結構優化的角度出發,使用了如下3點策略來減少網絡參數,提升網絡性能:
1)使用1×1卷積來替代部分的3×3卷積,可以將參數減少為原來的1/9。
2)減少輸入通道的數量,這一點也是通過1×1卷積來實現,通道數量的減少可以使后續卷積核的數量也相應地減少。
3) 將降采樣后置。在減少通道數之后,使用多個尺寸的卷積核進行計算,以保留更多的信息,提升分類的准確率。
基於以上3點,SqueezeNet提出了基礎模塊 Fire Module。圖中輸入特征尺寸為H×W,通道數為M,依次經過一個Squeeze層與Expand層,然后進行融合處理。

      

 

         SqueezeNet層:首先使用1×1卷積進行降維,特征圖的尺寸不變,這里的S1小於M,達到了壓縮的目的。

  • Expand層:並行地使用1×1卷積與3×3卷積獲得不同感受野的特征圖,類似Inception模塊,達到擴展的目的。
  • Concat合並:對得到的兩個特征圖進行通道拼接,作為最終輸出。·模塊中的S1、e1與e2都是可調的超參,Fire Module默認e1=e2=4×S1。激活函數使用了ReLU函數。

基於Fire Module, SqueezeNet的網絡結構如下圖所示。

 

 輸入圖像首先送入Conv 1,得到通道數為96的特征圖,然后依次使用8個Fire Module,通道數也逐漸增加。圖中橫線上的值代表了通道數。最后一個卷積為Conv 10,輸入通道數為N的特征圖,N代表需要物體的類別數。

SqueezeNet是一個精心設計的輕量化網絡,使用常見的模型壓縮技術,如SVD、剪枝和量化等,可以進一步壓縮該模型的大小。例如,使用Deep Compresion技術對其進行壓縮時,在幾乎不損失性能的前提下,模型大小可以壓縮到0.5MB。
基於其輕量化的特性,SqueezeNet可以廣泛地應用到移動端,促進了目標檢測技術在移動端的部署與應用。

 

2 MobileNet:深度可分離

2.1 MobileNet V1
標准卷積在卷積時,同時考慮了圖像的區域與通道信息,那么為什么不能分開考慮區域與通道呢?
基於此想法,誕生了深度可分離卷積(Depthwise Separable Convolution),將卷積的過程分為逐通道卷積與逐點1×1卷積兩步。

 

 逐通道卷積有如下幾個特點:

 

1.卷積核參數量少。卷積核參數量為Ci×3×3,遠少於標准卷積Ci×3×3×Co的數量。
2.通道之間相互獨立,沒有各通道間的特征融合,這也是逐通道卷積的核心思想,輸出特征的每一個點只對應輸入特征一個通道上的3×3大小的特征,而不是標准卷積中Ci×3×3大小。
3.由於只在通道間進行卷積,導致輸入與輸出特征圖的通道數相同,無法改變通道數。
由於逐通道卷積通道間缺少特征的融合,並且通道數無法改變,因此后續還需要繼續連接一個逐點的1×1的卷積,一方面可以融合不同通道間的特征,同時也可以改變特征圖的通道數。
MobileNet v1整體的網絡是由上述深度可分離卷積基本單元組成的。與VGGNet類似,也是一個逐層堆疊式網絡。

 

 圖中的Dw代表一個深度分解卷積,其后需要跟一個1×1卷積,s2代表步長為2的卷積,可以縮小特征圖尺寸,起到與Pooling層一樣的作用。

可以看到網絡最后利用一個全局平均池化層,送入到全連接與Softmax進行分類預測。如果用於目標檢測,只需要在之前的特征圖上進行特征提取即可。
在基本的結構之外,MobileNet v1還設置了兩個超參數,用來控制模型的大小與計算量,具體如下:
1. 寬度乘子:用於控制特征圖的通道數,記做α,當α<1時,模型會變得更薄,可以將計算量減少為原來的α2。
2. 分辨率乘子:用於控制特征圖的尺寸,記做ρ,在相應的特征圖上應用該乘子,也可以有效降低每一層的計算量。

總體上,MobileNet v1利用深度可分離的結構犧牲了較小的精度,帶來了計算量與網絡層參數的大幅降低,從而也減小了模型的大小,方便應用於移動端。

但MobileNet v1也有其自身結構帶來的缺陷,主要有以下兩點:
1. 模型結構較為復古,采用了與VGGNet類似的卷積簡單堆疊,沒有采用殘差、特征融合等先進的結構。
2. 深度分解卷積中各通道相互獨立,卷積核維度較小,輸出特征中只有較少的輸入特征,再加上ReLU激活函數,使得輸出很容易變為0,難以恢復正常訓練,因此在訓練時部分卷積核容易被訓練廢掉

 2.2 MobileNet V2

針對以上MobileNet  V1的缺點,2018年誕生的MobileNet v2吸收了殘差網絡的思想,主要從兩個方面改善了網絡結構,提升了MobileNet的檢測精度。

首先,MobileNet V2利用殘差結構取代了原始的卷積堆疊方式,提出了一個Inverted ResidualBlock結構。

 

 依據卷積的步長,該結構可分為兩種情形,在步長為1時使用了殘差連接,融合的方式為逐元素相加。

 

 

 相比於MobileNet V1與原始的殘差結構,這里有兩點不同: 1. Inverted Residual Block結構

與 residuals block 相反,通常使用的 residuals block 是先經過 1×1 的卷積,降低 feature map 通道數,然后再通過3×3 卷積,最后重新經過 1×1 卷積將 feature map 通道數擴張回去,MobileNetV2 采用的方式是先對采用先升維,再降維的方法,這樣做的理由是 MobileNetV2 將residuals block 的 bottleneck 替換為了 Depthwise Convolutions,因其參數少,提取的特征就會相對的少,如果再進行壓縮的話,能提取的特征就更少了,因此MobileNetV2 就執行了擴張→卷積特征提取→壓縮的過程。 2. 去掉ReLU6
深度可分離卷積得到的特征對應於低維空間,特征較少,如果后續接線性映射則能夠保留大部分特征,而如果接非線性映射如ReLU,則會破壞特征,造成特征的損耗,從而使得模型效果變差。
針對此問題,MobileNetV2直接去掉了每一個Block中最后的ReLU6層,減少了特征的損耗,獲得了更好的檢測效果。

 

 

 總體上,MobileNet V2在原結構的基礎上進行了簡單的修改,通過較少的計算量即可獲得較高的精度,非常適合於移動端的部署。

 

主要特點

 

  • 擴張(1x1 conv) -> 抽取特征(3x3 depthwise)-> 壓縮(1x1 conv)
  • 當且僅當輸入輸出具有相同的通道數時,才進行殘余連接
  • 在最后“壓縮”完以后,沒有接ReLU激活,作者認為這樣會引起較大的信息損失
  • 該結構在輸入和輸出處保持緊湊的表示,同時在內部擴展到更高維的特征空間,以增加非線性每通道變換的表現力。

 

2.3 MobileNet V3

 

整體來說MobileNetV3有兩大創新點:

1. 互補搜索技術組合:由資源受限的NAS執行模塊級搜索,NetAdapt執行局部搜索。
資源受限的NAS(platform-aware NAS):計算和參數量受限的前提下搜索網絡的各個模塊,所以稱之為模塊級的搜索(Block-wise Search)。
NetAdapt:用於對各個模塊確定之后網絡層的微調。 對於模型結構的探索和優化來說,網絡搜索是強大的工具。研究人員首先使用了神經網絡搜索功能來構建全局的網絡結構,隨后利用了NetAdapt算法來對每層的核數量進行優化。
對於全局的網絡結構搜索,研究人員使用了與Mnasnet中相同的,基於RNN的控制器和分級的搜索空間,並針對特定的硬件平台進行精度-延時平衡優化,在目標延時(~80ms)范圍內進行搜索。隨后利用NetAdapt方法來對每一層按照序列的方式進行調優。在盡量優化模型延時的同時保持精度,減小擴充層和每一層中瓶頸的大小。
2.  網絡結構改進:將最后一步的平均池化層前移並移除最后一個卷積層,引入h-swish激活函數。
h-swish激活函數,計算公式如下: 

  

作者發現swish激活函數能夠有效提高網絡的精度,然而,swish的計算量太大了。作者提出h-swish(hard version of swish)如下所示。

 

 以下是平滑版本的Sigmoid/Swish和Hard版本的Sigmoid/Swish對比。

 

 MobileNetV3是綜合了以下三種模型的思想:

MobileNetV1的深度可分離卷積(depthwise separable convolutions)、MobileNetV2的具有線性瓶頸的逆殘差結構(the inverted residual with linear bottleneck)和MnasNet的基於squeeze and excitation結構的輕量級注意力模型
綜合了以上三種結構的優點設計出了高效的MobileNetV3模塊。
       

 

 

             
主要特點

 swish非線性激活

  • Squeeze and Excitation思想
  • 為了減輕計算swish中傳統sigmoid的代價,提出了hard sigmoid

3 ShuffleNet:通道混洗

3.1 ShuffleNet V1

為了降低計算量,當前先進的卷積網絡通常在3×3卷積之前增加一個1×1卷積,用於通道間的信息流通與降維。然而在ResNeXt、MobileNet等高性能的網絡中,1×1卷積卻占用了大量的計算資源。

2017年的ShuffleNet v1從優化網絡結構的角度出發,利用組卷積與通道混洗(ChannelShuffle)的操作有效降低了1×1逐點卷積的計算量,是一個極為高效的輕量化網絡。而2018年的ShuffleNet v2則在ShuffleNet v1版本的基礎上實現了更為優越的性能。
當前先進的輕量化網絡大都使用深度可分離卷積或者組卷積,以降低網絡的計算量,但這兩種操作都無法改變特征的通道數,因此還需要使用1×1卷積。
總體來講,逐點的1×1卷積有如下兩點特性:
1. 可以促進通道之間信息的融合,改變通道至指定維度。
2. 輕量化網絡中1×1卷積占據了大量的計算,並且致使通道之間充滿約束,一定程度上降低了模型的精度
為了進一步降低計算量,ShuffleNet提出了通道混洗的操作,通過通道混洗也可以完成通道之間信息的融合。
如果沒有逐點的1×1卷積或者通道混洗,最終輸出的特征僅由一部分輸入通道的特征計算得出,這種操作阻礙了信息的流通,進而降低了特征的表達能力。
因此,我們希望在一個組卷積之后,能夠將特征圖之間的通道信息進行融合,類似於下圖中b的操作,將每一個組的特征分散到不同的組之后,再進行下一個組卷積,這樣輸出的特征就能夠包含每一個組的特征,而通道混洗恰好可以實現這個過程。

 

 通道混洗可以通過幾個常規的張量操作巧妙地實現,主要有三個步驟:

  • Reshape:首先將輸入通道一個維度Reshape成兩個維度,一個是卷積組數,一個是每個卷積組包含的通道數。
  • Transpose:將擴展出的兩維進行置換。
  • Flatten:將置換后的通道Flatten平展后即可完成最后的通道混洗。


ShuffleNet基本結構單元

 

 a圖是一個帶有深度可分離卷積的殘差模塊,這里的1×1是逐點的卷積。相比深度可分離卷積,1×1計算量較大。 b圖則是基本的ShuffleNet基本單元,可以看到1×1卷積采用的是組卷積,然后進行通道的混洗,這兩步可以取代1×1的逐點卷積,並且大大降低了計算量。3×3卷積仍然采用深度可分離的方式。 c圖是帶有降采樣的ShuffleNet單元,在旁路中使用了步長為2的3×3平均池化進行降采樣,在主路中3×3卷積步長為2實現降采樣。另外,由於降采樣時通常要伴有通道數的增加,ShuffleNet直接將兩分支拼接在一起來實現了通道數的增加,而不是常規的逐點相加。 得益於組卷積與通道混洗,ShuffleNet的基本單元可以很高效地進行計算。

ShuffleNet V1整體結構

 

 關於ShuffleNet V1的整體結構,有以下3點需要注意: 

 g代表組卷積的組數,以控制卷積連接的稀疏性。組數越多,計算量越少,因此在相同的計算資源,可以使用更多的卷積核以獲取更多的通道數。

  ShuffleNet在3個階段內使用了其特殊的基本單元,這3個階段的第一個Block的步長為2以完成降采樣,下一個階段的通道數是上一個的兩倍。

   深度可分離卷積雖然可以有效降低計算量,但其存儲訪問效率較差,因此第一個卷積並沒有使用ShuffleNet基本單元,而是只在后續3個階段使用。

總體上,ShuffleNet提出了一個巧妙的通道混洗模塊,在幾乎不影響准確率的前提下,進一步地降低了計算量,性能優於ResNet和Xception等網絡,因此也更適合部署在移動設備上。

3.2 ShuffleNet V2

在2018年,曠視的團隊進一步升級了ShuffleNet,提出了新的版本ShuffleNet v2。

 相比於ShuffleNet v1, ShuffleNet v2進一步分析了影響模型速度的因素,提出了新的規則,並基於此規則,改善了原版本的不足。 原有的一些輕量化方法在衡量模型性能時,通常使用浮點運算量FLOP(s Floating PointOperations)作為主要指標。FLOPs是指模型在進行一次前向傳播時所需的浮點計算次數,其單位為FLOP,可以用來衡量模型的復雜度。
然而,通過一系列實驗發現ShuffleNet v2僅僅依賴FLOPs是有問題的,FLOPs近似的網絡會存在不同的速度,還有另外兩個重要的指標:內存訪問時間(Memory Access Cost, MAC)與網絡的並行度。 以此作為出發點,ShuffleNet v2做了大量的實驗,分析影響網絡運行速度的原因,提出了建立高性能網絡的4個基本規則: (1)卷積層的輸入特征與輸出特征通道數相等時,MAC最小,此時模型速度最快。
(2)過多的組卷積會增加MAC,導致模型的速度變慢。
(3)網絡的碎片化會降低可並行度,這表明模型中分支數量越少,模型速度會越快。
(4)逐元素(Element Wise)操作雖然FLOPs值較低,但其MAC較高,因此也應當盡可能減少逐元素操作
以這4個規則為基礎,可以看出ShuffleNet v1有3點違反了此規則: 

  • 在Bottleneck中使用了1×1組卷積與1×1的逐點卷積,導致輸入輸出通道數不同,違背了規則1與規則2。
  • 整體網絡中使用了大量的組卷積,造成了太多的分組,違背了規則3。
  • 網絡中存在大量的逐點相加操作,違背了規則4。


針對v1的問題,ShuffleNet v2提出了一種新的網絡基本單元,具體如下圖所示。圖a與圖b為v1版本的基礎結構,圖c與圖d是v2提出的新結構。

 

 ShuffleNet v2的基本單元有如下3點新特性: 1.  提出了一種新的Channel Split操作,將輸入特征分成兩部分,一部分進行真正的深度可分離計算,將計算結果與另一部分進行通道Concat,最后進行通道的混洗操作,完成信息的互通。 2. 整個過程沒有使用到1×1組卷積,也避免了逐點相加的操作

3. 在需要降采樣與通道翻倍時,ShuffleNet v2去掉了Channel Split操作,這樣最后Concat時通道數會翻倍。
與ShuffleNet v1相比,ShuffleNet v2在全局平均池化之前增加了一個1×1卷積來融合特征。依據輸出特征的通道數多少,ShuffleNet v2也給出了多種配置,相應的模型精度、大小也會有所區別。

 

 

 

總體上,ShuffleNet V2模型從更直接影響模型運行速度的角度出發,在速度與精度的平衡上達到了當前的最佳水平,非常適合於移動端模型的應用。

總結

 

SqueezeNet精心設計了一個壓縮再擴展的模塊,有效降低了卷積計算量;

MobileNet 系列則發揮了深度可分離卷積的優勢,提升了卷積計算的效率。
ShuffleNet系列更進一步,在分組卷積的思想上提出了通道混洗操作,避免了大量1×1卷積的操作,可謂經典。
通常情況下,將這幾種輕量化網絡應用到檢測框架中,在速度上均可以得到不同程度的提升。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM