深度學習目標檢測部署套路

轉載:https://www.jianshu.com/p/64481a936007

 

深度學習視覺目標檢測


整體思路

一、先搭建視覺目標檢測算法

二、根據實際的硬件平臺和實現效果來優化算法。

深度學習

一般將深度學分爲五個部分,網絡結構、非線性單元、損失函數、求解器、超參數。

  • 網絡結構

    卷積、池化、全連接

    卷積(深度可分離卷積、空洞卷積、反捲積)

    backbone(vgg、resnet、mobileNet)

    framework(SSD、YOLO)

  • 非線性

    如果沒有非線性單元,不管多少層的神經網絡都是簡單的線性疊加。只有加入了非線性單元,才能以任意精度去擬合任意曲線。

    sigmoid
    f(x)=\frac{1}{1+e^{-x}}

    sigmoid函數圖像

     

    sigmoid導數
    \phi(x) = \frac{e^{-x}}{(1+e^{-x})^{2}}

    sigmoid導數圖像

     

sigmoid也叫做logistic函數,輸出範圍是(0,1),激活函數計算的時候計算量⼤大,反向傳播求誤差梯度的時候有除法。根據其導數圖像來看,當x過大或者過⼩的時候,導數曲線的斜率趨近於0,也就是容易易造成“梯度消失了”

tanh
f(x)=tanh(x)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

tanh函數圖像

 

雙曲正切函數,相比sigmoid,由於tanh是0均值的,所以在實際應用中會比sigmoid好一些
導數

 

tanh導數圖像

ReLU
f(x)=max(0,x)
x負半軸值爲0,正半軸輸出等於輸⼊。這樣的非線性單元計算量少,求導簡單,還有一定的稀疏性,可以緩解一定過擬合。但是正因爲其具有稀疏性,如果學習率設置的過大,會導致“神經元死亡”,這些神經元的梯度一直爲0,再繼續訓練都不會更新其權值。

ReLU函數圖像

 

所以後面又有了PReLU,LReLU等一系列的變體

PReLU
y_i=max(0,x_i)+\alpha\times min(0,x_i)

PReLU函數圖像

 

加入了一個α變量,此變量在訓練中學習得到。當α爲固定的非零較小數的時候等價於LeakyReLU,當α爲0的時候,等價於ReLU。

  • 損失函數

    L2損失-常用來做迴歸問題

    交叉熵損失-常用來做分類問題

    FocalLoss-用來解決訓練樣本中類別不平衡和分類難度差異的問題

    迴歸和分類的區別

    迴歸輸出值是連續的,分類輸出值是離散的。例如區分一個瓜是西瓜還是南瓜,這就是分類問題。一個西瓜的甜度,0是一點都不甜,1是甜度最大,對西瓜做甜度值迴歸,得到的0.8分甜,這就是迴歸問題。

    如果是細粒度分類,那就需要在損失函數中做文章了。例如車型識別、人臉識別。如果有一個目標是奧迪車,我想知道是奧迪Q3還是Q5或者是其他車型。這個時候就需要修改常規的損失函數。

  • 求解器

    SGD,小批量隨機梯度下降
    Momentum,動量法
    Adadelta,對學習率進⾏行行⾃自適應約束
    RMSprop,Adadelta的⼀一種發展,對於有預訓練模型的訓練,原始權值會改變比較小
    對於稀疏數據,儘量量使⽤用學習率⾃自適應的優化⽅方法
    SGD通常訓練收斂的時間會⽐比較⻓長,但是如果能夠設置好初始化和學習率,訓練效果會好⼀一些。
    如果需要更更快的收斂,並且⽹網絡很複雜很深的情況,使⽤用學習率⾃自適應算法會好⼀一些
    Adadelta,RMSprop在相似的情況下表現差不不多

  • 超參數

    學習率

    如果學習率設置較小,那麼訓練收斂速度會比較慢,如果學習率設置較高,訓練也許會陷入局部極小值震盪,難以收斂。

    batch_size

    batch_size越大,對顯存佔用越多。在顯存可用範圍內儘量使用大的batch_size


訓練模型評估

性能評估

計算mAP

多類別物體檢測中,每一個類別都可以根據recall和precision繪製一條曲線,AP就是該曲線下下的面積,mAP就是多類別的平均值

時間評估

計算一次前向推理的時間

推理加速

如果算法的推理時間太長,不能達到實際的應用環境的要求,就需要對模型進行推理加速處理,也稱爲模型壓縮。例如訓練了一個複雜度比較高的網絡,其檢測性能還不錯,想部署在tx2平臺上,然後部署的時候發現根本運行不了實時速度,這個時候就需要對訓練的這個模型進行壓縮。

模型壓縮能夠有效降低參數冗餘,從而減少存儲佔用、通信帶寬和計算複雜度,有助於深度學習的應用部署,可以有效地降低其內存消耗和時間消耗。但是模型壓縮之後肯定是會影響模型性能的,我們只能在精度下降程度在可接受範圍內做模型壓縮。

模型壓縮分爲以下幾類:

1、結構或非結構剪枝

在網絡結構上修改,降低其計算量,比較具有代表性的方法有

  • deep compression

    《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》” ICLR2016最佳論文 韓鬆

  • channel pruning

    《Channel Pruning for Accelerating Very Deep Neural Networks》

  • network slimming

    《Learning Efficient Convolutional Networks through Network Slimming》

網絡剪枝的典型過程包括三步:1)訓練一個大的過參數化模型,2)根據某個標準修剪訓練好的模型,3)微調修剪後的模型,以恢復損失的性能。

使用這類的方法時間消耗降低非常明顯,但是性能也會隨之降低。

今年10月,《Rethinking the Value of Network Pruning》這篇文章直接指出了“模型剪枝”是個“僞科學”。

一般來說,剪枝過程背後有兩個共識:一,大家都認爲首先訓練一個大的過參數化模型很重要(Luo et al., 2017),因爲這樣會提供高性能模型(更強的表徵和優化能力),而人們可以安全地刪除冗餘參數而不會對準確率造成顯著損傷。因此,這種觀點很普遍,人們認爲該方法比從頭開始直接訓練更小的網絡(一種常用的基線方法)更優秀。二,剪枝後的架構和相關的權重被認爲是獲得最終高效模型的關鍵。因此大多現有的剪枝技術選擇微調剪枝後的模型,而不是從頭開始訓練它。剪枝後保留下來的權重通常被視爲至關重要,因爲準確地選擇一組重要的權重並不容易。

在本研究中,我們認爲上面提到的兩種觀點都未必正確。針對多個數據集及多個網絡架構,我們對當前最優剪枝算法進行了大量實證評估,得出了兩個令人驚訝的觀察結果。首先,對於具備預定義目標網絡架構的剪枝算法,從隨機初始化直接訓練小目標模型能實現與使用經典三步流程相同的性能。在這種情況下,我們不需要從訓練大規模模型開始,而是可以直接從頭訓練剪枝後模型。其次,對於沒有預定義目標網絡的剪枝算法,從頭開始訓練剪枝後的模型也可以實現與微調相當甚至更好的性能。

這一觀察結果表明,對於這些剪枝算法而言,重要的是獲得的網絡架構而不是保留的權重,儘管這些目標架構還是需要訓練大模型才能獲得。我們的結果和文獻中結果的矛盾之處在於超參數的選擇、數據增強策略和評估基線模型的計算力限制。

2、量化

  • fp16
  • INT8

3、其他優化方法

  • 知識蒸餾

    蒸餾模型採用的是遷移學習,通過採用預先訓練好的複雜模型的輸出作爲監督信號去訓練另外一個簡單的網絡。我們一般認爲越是複雜的網絡具有越好的描述能力,就可以解決更復雜的問題。把複雜的模型稱爲teacher,簡單的模型稱爲stuent,讓teacher學好之後,利用teacher的輸出來指導student的學習。這裏面student的網絡結構比較簡單,經過teacher的指導訓練比自己重頭訓練效果要好。

  • 網絡結構簡化

    mobileNet

    shuffleNet

    這一類的優化方法中就是對計算量比較大的卷積操作進行優化,例如mobileNet中主要的優化方法就是採用depthWise(深度可分離卷積)來代替Conv(傳統卷積)。

  • 權重矩陣低秩分解

  • tensorRT加速

    • TensorRT內部同時實現了網絡結構優化和量化

    • 實現INT8和FP16計算,減少推理計算量

    • 解析網絡模型將網絡中無用的輸出層消除以減小計算

    • 對網絡結構垂直整合,將目前主流神經網絡的conv、BN、Relu三個層融合爲了一個層

    • 對網絡結構水平組合,將輸入爲相同張量和執行相同操作的層融合一起

選取最適合的網絡結構

我們的硬件平臺是TX2,這款運算芯片包含有6核CPU(4個A57+2丹佛核心)加上PASCAL架構的256核GPU。

決定一個目標檢測算法分爲兩部分

第一部分算法框架,例如SSD,YOLO,FasterRCNN等

第二部分主幹網絡,主幹網絡決定整體的計算量,例如VGG,resnet,mobileNet等

所以結合這兩部分,可以衍生出很多種檢測算法,例如VGG16-SSD,resnet101-SSD,resnet-FasterRCNN,mobileNet-SSD,mobileNet-YOLO等等

VGG網絡常見的有16層和19層,以大運算量爲主

resnet常見的有101,50,20,可把握程度比較高

mobileNet,分爲兩個版本V1和V2

限於tx2平臺計算力的要求,不可能選擇VGG網絡,vgg-ssd在tx2上只能跑到6幀左右。

所以第一次嘗試使用mobileNet-SSD,在tx2上運行大概35幀左右,檢測精度還算不多。

第二次使用resnet20-SSD,在tx2上運行大概32幀左右,精度也還不錯,比mobileNet稍微好一點。

tensorRT加速

算法 caffe時間 tensorRT時間
mobileNet-SSD 30ms 20ms
resnet20-SSD 32ms 13ms

mobileNet在tensorRT的優化下效果沒有resnet的優化效果明顯

原因:

因爲CPU的卷積實現通常會用到im2col,也就是把feature map和卷積核排列成可以用矩陣相乘的形式,然後就會發現depth wise 1*1的卷積實現可以不⽤進行內存的重排,然後直接通過矩陣乘法得到結果,矩陣的乘法在CPU上優化已經很到位了,計算的並行程度很高,核心越多,速度越快。

mobileNet基於流線型架構在tensorRT網絡結構可優化空間不太大,而resnet中的殘差塊在網絡結構優化的空間會比較大。

所以mobileNet在tx2這種GPU平臺上的性價比不高,更加適合於手機等以CPU爲主的移動設備

最新算法的跟進
two stage

two stage 算法

 

one stage

 

                                                                                                   one stage算法

                                                                                          對比幾種算法




鏈接:https://www.jianshu.com/p/64481a936007
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章