基於 Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017) 論文的模型壓縮。
目前有很多的開源實現,基於各種方法對YOLOv3進行裁剪和壓縮,例如:
等等...
數據集
收費卡口的車輛車輪數據,2266訓練集,530驗證集。
原理
對於一個訓練好的模型,會發現部分卷積核權重很小,因此相應的激活也會很小,這部分卷積核的貢獻其實是很小的,裁剪這些卷積核後再微調是可以恢復到之前的精度,這是在未作任何限制情況下,如果對權重做某些限制,如L1正則,那麼訓練的參數會比較稀疏,更加利於裁剪。論文給出,在BN層的Scale層其實相當於對激活的一個線性變換,那麼Scale層的Gamma做一個L1
正則,會學習到比較稀疏的Gamma,這部分Gamma會導致卷積通過BN的Scale層後輸出很小,這樣的通道是可以裁剪掉的,這就是論文的核心思想。詳細原理參考相關論文。
裁剪流程
稀疏訓練->裁剪->微調
其中最關鍵的當屬稀疏訓練。
實驗過程記錄
Metric | mAP | Parameters | Inference | Model Size/M | Parameters Decrease |
---|---|---|---|---|---|
orignal YOLOv3 | 0.899230 | 61529119 | 0.0170 | 246.5 | 0 |
pruned | 0.899493 | 589799 | 0.0074 | 2.4 | 99.04% |
可以看到,極限壓縮YOLOv3的大小僅僅2.4M,參數雖然少依然可以獲得良好的性能,一方面是因爲我們的檢測任務相對單一和簡單,類別比較少,原始的YOLOv3模型龐大,能夠處理更多的複雜(COCO等)的檢測任務,對於簡單任務是不需要那麼多參數的,實際測試發現,壓縮後的模型在大多數任務上依然有很好的表現,但是在極端場景下的檢測相對不那麼魯棒,魚與熊掌不可兼得。
壓縮後的模型實測效果如下: