<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          YOLObile:面向移動設備的「實時目標檢測」算法

          共 3892字,需瀏覽 8分鐘

           ·

          2021-03-27 14:52


          作者提出了一種通過從壓縮、編譯兩個角度,在保證模型準確率的基礎上,減小模型的大小,并提升模型在移動設備端的運行速度。
          通過所提出的YOLObile framework,將YOLOv4壓縮了14倍,準確率保持在49.0mAP,在Samsung Galaxy S20上使用GPU,推理速度為17FPS;使用所提出的CPU-GPU合作機制,推理速度可以提升至19FPS,是原始的YOLOv4的5倍。目前代碼已經(jīng)開源。

          1. DNN model pruning



          這篇文章主要的工作是模型裁剪和推理加速策略,所以在介紹這篇文章的工作之前,先介紹目前主流的三種剪枝策略:Unstructured pruning,Structured pruning和Pattern-based pruning。

          1.1 Unstructured pruning

          所謂非結構性剪枝允許在權重矩陣的任意位置進行裁剪。其優(yōu)點主要有:
          • 在搜尋最優(yōu)的剪枝結構上有更好的靈活性
          • 可以達到很高的模型壓縮率和極低的精度丟失
          如下圖所示:
          可以看出,Unstructured pruning方法得到的權重分布很不規(guī)則,所以在計算前向的時候,通常需要額外的非零權值的索引。這對于那些可以并行運算的設備(GPU)很不友好,所以不太適合用于DNN推理加速,甚至有可能導致速度下降。

          1.2 Structured pruning

          結構性剪枝如上圖(b)所示,主要從卷積核個數(shù)(filters)和通道數(shù)(channels)上進行剪枝,因而得到的權重矩陣仍然是規(guī)則的。這對于支持并行運算的硬件非常友好,有助于提升推理速度。
          但是由于這種裁剪方式過于粗糙(直接剪掉一個或者多個卷積核或者減去所有卷積核中同一個或多個位置的通道的權重),所以精度丟失非常嚴重。

          1.3 Pattern-based pruning

          Pattern-based pruning可以看作是一種fine-grained結構性剪枝,比結構性剪枝更加靈活。如下圖所示:
          主要包括兩個部分:kennel pattern prune和connectivity prune。這里為了方便說明,定義一個卷積層參數(shù)為,每個卷積核(kernel)大小為,卷積核個數(shù)為。kennel pattern prune指的是對于每一個卷積核,裁去每個通道(channel)上固定位置的參數(shù),如上圖黃色背景框內灰色的部分;
          每個卷積核可以采用不同的裁剪模式(pattern),但是要保證剩余的每個通道的參數(shù)數(shù)量是固定的,如上圖的剩余的紅色、黃色、綠色和紫色方塊數(shù)量都是4。
          而connectivity prune指的是直接裁去整個卷積核。這樣做的好處是可以保證裁剪后的參數(shù)分布都是規(guī)則的,也比structured pruning更加靈活,精度丟失的也會相對少一些。
          但是kennel pattern prune只針對3x3卷積核,限制了pattern-based pruning的應用場景。

          2. Motivation



          基于目前SOTA的目標檢測算法,精度高的,模型比較大,在移動設備上會有很高的時延;而那些在移動設備端可以快速運行的輕量級算法又犧牲了算法精度。
          三種主流的剪枝算法Unstructured pruning可以保證精度,但是不能保證速度,Structured pruning可以保證速度,但是無法保證精度;Pattern-based pruning可以一定程度上同時保證速度和精度,但是應用場景有限。
          基于此,這篇文章的主要工作可以總結為以下兩點:
          • 提出一種剪枝策略,可以同時保證速度和精度,并且可以推廣到任意layer(pattern-based pruning只能應用在3x3卷積層)
          • 提出一種更高效的計算加速策略

          3. Method


          3.1 Block-punched pruning

          Block-punched pruning是這篇文章提出的一種以同時保證速度和精度,并且可以推廣到任意layer的剪枝策略。主要內容如下圖所示:
          將一個layer的參數(shù)(以卷積層為例)分成參數(shù)相等的blocks,每個block包含m個連續(xù)的filter和n個連續(xù)的channel。對block中的所有channel,裁剪去相同位置的參數(shù)。
          與pattern-based pruning不同的地方在于,pattern-based pruning對于整個filter進行相同模式的裁剪,而Block-punched pruning對于一個block進行相同模式的裁剪,比pattern-based pruning更加精細,而且可以推廣到任意layer(不局限于3x3layer)。
          Block-punched pruning特點是:block size會極大的影響模型的精度和在硬件上的運行速度。
          • block size越小,精度丟失越少,但是推理速度也會變慢
          • block size越大,精度丟失越嚴重,但是推理速度變快
          所以選擇一個合理的block size非常重要。這里作者給出了兩個建議:
          • 對于block中channel的數(shù)量:與設備中CPU/GPU的vector registers的長度一致
          • 對于block中的filter的數(shù)量:在保證目標推理速度的前提下,選擇最少的filter數(shù)量

          3.2 Reweight regularization pruning algorithm

          這里講的是如何具體的實現(xiàn)剪枝。這篇文章采用了一種reweighted group Lasso^[1]^方法,其基本原理是:**減小大權重的懲罰項,增大小權重的懲罰項。**假設是i-th卷積層的參數(shù),于是該問題可以有以下的目標函數(shù)來解決:


          從公式可以看出,利用參數(shù)F范數(shù)(Lasso一般采用L1范數(shù))的平方的倒數(shù)作為加權值,權值越大,懲罰項的加權值越小。最后需要剪去的參數(shù)是那些逼近于0 的參數(shù)。

          3.3 CPU-GPU合作機制

          這里提出了一種更高效的計算加速策略,可以綜合利用GPU和CPU。目前的一些推理加速框架如TFLite和MNN只能支持在移動GPU或CPU上順序執(zhí)行DNN推理,這可能造成計算資源的浪費。
          一些網(wǎng)絡如YOLOv4有分不同的分支,如果這些分支可以同時分別運行在GPU和CPU上,就可以提高推理效率和速度。
          所以剩下的問題就是確定哪些分支需要執(zhí)行在GPU上,哪些分支需要執(zhí)行在CPU上。通常GPU比較適合處理一些高并行的數(shù)據(jù),如有大量的卷積層。還是以YOLOv4的cross-stage partial為例子:
          定義branch1和branch2在GPU上的耗時為,在CPU上的耗時分別,branch1卷積層多適合GPU運算,如果采用GPU和CPU并行運算,那么最終的處理時間取決于最大耗時,定義數(shù)據(jù)拷貝到CPU上的耗時為,則GPU和CPU并行運算耗時為:


          如果只采用GPU進行串行運算,即先計算branch1,再計算branch2,則耗時為兩者之和:


          通過可以確定branch2在哪個設備上運行。因為每個branch的執(zhí)行是獨立的,所以可以通過Greedy Algorithm(貪心算法)來確定網(wǎng)絡中每一個分支的執(zhí)行的位置(GPU or CPU)。
          對于那些低計算密度的操作如pixel-wise add和pixel-wise multiply操作,移動設備上CPU和GPU的運算效率差不多。所以對于non-convolution的分支,在CPU還是在GPU上運算,取決于總耗時。
          如上圖(b)所示,三個YOLO head的運算都是non-convolution的,所以三個分支運算在哪個分支的可能性有8種,假設前兩個運行在CPU上,最后一個分支運行在GPU上,那么總的運行時間為:


          采用上述的方案分別確定每個conv branch和non-conv branch運行的位置,最小化總的推理時間。
          YOLObile提供了每一層的CPU和GPU代碼,為實現(xiàn)上述的計算提供了可行性。

          4. Results




          最終的實驗結果表明,文章所提出的壓縮剪枝和加速方案可以在提升推理速度的同時,還能保持較高的準確率。

          參考文獻

          [1] EJ Candès, Wakin M B , Boyd S P . Enhancing Sparsity by Reweighted 1 Minimization[J]. Journal of Fourier Analysis & Applications, 2008, 14(5-6):877-905.
          [2] 論文原文:https://arxiv.org/abs/2009.05697
          [3] 代碼:https://github.com/nightsnack/YOLObile

          ?------------------------------------------------


          歡迎微信搜索并關注「目標檢測與深度學習」,不被垃圾信息干擾,只分享有價值知識!


          10000+人已加入目標檢測與深度學習

                 

                 



          敬正在努力的我們! 

          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  蜜桃精品在线观看 | 国内无码 | 国产精品成人精品久久久 | 男人天堂TV | 欧美成人性爱在线观看 |