PP-YOLO
PP-YOLOv2
目錄
PP-YOLOv2的改進點
數據增強?:+ MixUp
Backbone?:換R50 + Better Pre-Train + dcn
Neck?:+ SPP +?CoordConv + DropBlock + PAN + MISH
Loss?:+ IoU Loss + IoU Aware Loss
其他?:+ Large Batch Size + Grid Sensitive + EMA + Matrix NMS + Large Input Size
PP-YOLO Tiny
優化方法 - Backbone 的選擇
優化方法 - head 優化(Neck + Head)
優化方法 - 后訓練量化
(黑色為PP-YOLOv1版本添加的內容,紅色為 PP-YOLOv2 版本新添加的內容)
數據增強
PP-YOLO 沒有探究各種復雜的 backbone 和數據增廣手段,也不是靠 NAS 暴力搜索得到一個結構。模型在 ResNet 骨干網絡系列,僅靠 mixup,通過合理的 tricks 組合,提升模型性能。(NAS 是給定一個搜索空間的候選神經網絡結構集合,用某種策略從中搜索出最優網絡結構。)
MixUp(ICLR2018)
背后的直覺:平滑了數據集
影響:增加精度,不減少速度
補充:
當訓練集中的圖片比較少時,容易造成網絡的過擬合。為了避免這種情況,一般要經過圖像處理,人為地去增加些圖片數據,這樣就會增加可用圖片的數目,減少過擬合的可能性。
可以通過像素級的剪裁(Crop)、旋轉(Rotation)、反轉(Flip)、色調(Hue)、飽和度(Saturation)、曝光量(Exposure)、寬高比(Aspect)來做數據增強。另外還可以在圖片級數據增強,比如 MixUp、CurMix、Mosaic、Blur。
Mixup(2017):在一張狗的圖片中,疊加一只貓的圖片,經過兩幅圖片的加權運算可以看到圖片上既有狗又有貓。
Cutout(2017):將圖片中某一塊區域,填充為某種顏色。
CutMix(2019):將圖片某一塊區域剪裁掉,然后用另外一幅圖像來填充剪裁區域。
Mosaic 數據增強(2020):它把 4 幅圖片拼成一幅圖,YOLOv5 中數據增強就是采用 Mosaic 方法,該方法由 YOLOv5 作者提出。YOLOv5 在訓練過程中,將4幅小圖拼成一幅大圖,4幅小圖在拼接時做了隨機的處理,所以4幅小圖的大小形狀是不一樣的。
Backbone
DarkNet53 -> ResNet50 + Better PreTrain(ResNet 是比較成熟的 backbone,并且優化過。)
增加 DCN(可變形卷積 2017)(通用的漲點方式,加一點點,PP-YOLO 僅加一層)
背后的直覺:參與計算的點應該集中在物體上
影響:漲點但掉速度
補充
什么是可變形卷積?
可變形卷積指卷積核在每個元素上增加了一個參數方向參數,這樣卷積核就能在訓練過程中擴展到很大的范圍。
(a)傳統的標準卷積核,尺寸為3x3(圖中綠色的點);
(b)可變形卷積,通過在圖(a)的基礎上給每個卷積核的參數添加一個方向向量(圖b中的淺藍色箭頭),使卷積核變為任意形狀;
(c)和(d)是可變形卷積的特殊形式。
為什么要可變形卷積?
卷積核的目的是為了提取輸入物的特征。傳統的卷積核通常是固定尺寸、固定大小的。這種卷積核存在的最大問題就是,對于未知的變化適應性差,泛化能力差。
- 卷積單元對輸入的特征圖在固定的位置進行采樣;
- 池化層不斷減小著特征圖的尺寸;
- RoI 池化層產生空間位置受限的 RoI。
網絡內部缺乏能夠解決這些問題的模塊,這會產生顯著的問題,同一 CNN 層的激活單元的感受野尺寸都相同,這對于編碼位置信息的淺層神經網絡并不可取,因為不同的位置可能對應有不同尺度或者不同形變的物體,這些層需要能夠自動調整尺度或者感受野的方法。再比如,目標檢測雖然效果很好但是都依賴于基于特征提取的邊界框,這并不是最優的方法,尤其是對于非網格狀的物體而言。
因此,希望卷積核可以根據實際情況調整本身的形狀,更好的提取輸入的特征。
Neck
增加 SPP(2015)
背后的直覺:獲得不同的感受野
影響:加一點點參數,漲性能
增加 CoordConv(2018)
背后的直覺:Conv 做不好 one-hot 轉坐標這種任務所以把坐標信息傳進去
影響:加一點點參數,漲性能
它在輸入特征圖,添加了兩個通道,一個表征 i 坐標,一個表征 j 坐標。這兩個通道帶有坐標信息,從而允許網絡學習完全平移不變性和變化平移相關度。
為了平衡帶來的額外參數和 FLOPS,PP-YOLO 只替換掉 FPN 的1x1卷積層以及 detection head 的第一層卷積。
傳統卷積具備平移不變性,這使得其在應對分類等任務時可以更好的學習本質特征。不過,當需要感知位置信息時,傳統卷積有點力不從心。為了使得卷積能夠感知空間信息,作者在輸入 feature map 后面增加了兩個 coordinate 通道,分別表示原始輸入的 x 和 y 坐標,然后再進行傳統卷積,從而使得卷積過程可以感知 feature map 的空間信息,該方法稱之為CoordConv。使用了 CoordConv 之后,能夠使得網絡可以根據不同任務需求學習平移不變性或者一定程度的平移依賴性。(平移不變性意味著系統產生完全相同的響應(輸出),不管它的輸入是如何平移的 。)
+ DropBlock(2018)
Dropout 被廣泛的使用作為一種正則化技術在全連接層中,但在卷積層中卻收效甚微。作者認為卷積層中的激活單元(特征圖上元素)在空間中是相關的,所有盡管 Dropout 可以進行信息丟失,但信息仍然可以通過卷積網絡流通。
作者提出了 DropBlock,一種結構化的 Dropout 形式,特征圖上的鄰域單元被一起丟棄,這樣可以提高準確率。大量的實驗表明,DropBlock 在正則化的卷積網絡中性能優于 Dropout。
DropBlock 是谷歌提的一個漲點神器,但是適用范圍不大。在 PP-YOLO 模型中發現給 BackBone 直接加 DropBlock 會帶來精度下降,于是只在檢測頭部分添加。
+ PAN
背后的直覺:增強 Neck 部分的特征融合能力
影響:掉速度,漲性能
FPN 層自頂向下傳達強語義特征(高層語義是經過特征提取后得到的特征信息,它的感受野較大,提取的特征抽象,有利于物體的分類,但會丟失細節信息,不利于精確分割。高層語義特征是抽象的特征。),而特征金字塔則自底向上傳達強定位特征,兩兩聯手,從不同的主干層對不同的檢測層進行參數聚合。FPN+PAN 借鑒的是 18 年 CVPR 的 PANet,當時主要應用于圖像分割領域,但 Alexey 將其拆分應用到 Yolov4 中,進一步提高特征提取的能力。
使用 MISH
背后的直覺:處處平滑,<0部分也應該有值
影響:漲性能,幾乎不掉速度
Mish Activation Function?已有研究 YOLOv4 與 YOLOv5 表明:Mish 對于改進目標檢測器的性能非常有效。由于百度已經有了一個非常強有力的預訓練骨干模型(82.4% top1 精度),為保持骨干結構不變,僅將 Mish 用到了 Neck 部分。
Loss
+ IoU Loss
背后的直覺:定位時,x,y,w,h 的 loss 應該一同計算
影響:漲性能,不掉速度
+ IoU Aware Loss
背后的直覺:直接預測 IoU?
影響:漲性能,輕微掉速度
其他
+ Large Batch Size
+ Grid Sensitive
背后的直覺:Sigmoid 后 0,1 很難出,需要調整一下
影響:漲性能,不掉速度
預測時,定位的物體中心點 x,y,首先經過 sigmoid,再加上 grid 的 Cx,Cy。若物體的中心在 grid 的交點處,sigmoid 需要出 0 或 1 才能夠很準,但 sigmoid 出 0/1 比較困難。
原始 YOLOv3 對應中間點的調整公式:其中 σ 表示 sigmoid 函數。
由于 sigmoid 函數兩端趨于平滑,中心點很難根據公式調節到網格上面,因此改進公式為:α 設為 1.05,能幫助中心點回歸到網格線上。
?
+ 指數滑動平均EMA,直接作用于指數 W 上
背后的直覺:平均一下更容易到最優解
影響:漲性能,不掉速度
在訓練參數更新上也做了滑動平均策略。
滑動平均可以使模型在測試數據上更健壯。對神經網絡邊的權重 weights 使用滑動平均,得到對應的影子變量 shadow_weights。在訓練過程仍然使用原來不帶滑動平均的權重 weights,之后在測試過程中使用 shadow_weights 來代替 weights 作為神經網絡邊的權重,這樣在測試數據上效果更好。因為 shadow_weights 的更新更加平滑,對于隨機梯度下降而言,更平滑的更新說明不會偏離最優點很遠;對于梯度下降 batch gradient decent,我感覺影子變量作用不大,因為梯度下降的方向已經是最優的了,loss 一定減小;對于 mini-batch gradient decent,可以嘗試滑動平均,畢竟 mini-batch gradient decent 對參數的更新也存在抖動。
+ Matrix NMS
背后的直覺:Soft NMS 的并行處理版本
影響:漲性能,加速度
非極大值抑制問題,解決同一個物體有多于一個候選框輸出的問題,用于過濾掉重疊的候選框。
- 算法輸入:包含各框的位置坐標,以及置信度得分
- 算法步驟:設定 IOU 閾值;對種類進行循環;對同一種類類別而言,將所有邊框按照置信度進行排序,取得分最高的邊框并保存,使其與其余邊框計算 IOU,去掉計算結果中大于閾值的結果;未處理的邊框中繼續選一個類別得分最高的,直到處理完所有的邊框為止。保留下來的候選框即為檢測結果。
存在問題:
- 強制去掉得分較低的邊框,影響召回率。
- IOU 閾值難以人為確定。
- 得分高的邊框位置不一定更優。
- 速度有點慢
Soft NMS:對于得分小于閾值的邊框,不再直接舍棄,而是降低其得分,設其原本得分為S:S = S ×(1 - IOUs),其實是對于 IOU 中較小的一部分框,其1-IOU較大,得分衰減不會很厲害。
+ Large Input Size
大 Batch 還是大 Input size?
背后的直覺:大 Batch 穩定訓練,大 Input size 對小物體好
影響:漲性能,不影響速度
PPYOLO 總結
PPYOLO 實際上是 YOLOv3 的一個魔改增強版本,在 YOLOv3 的基礎上,嘗試了非常多的小改進方法,最終拿到了這樣的結果。PP-YOLOv2 在同等速度下,精度超越 YOLOv5!
PP-YOLO Tiny
模型設計和優化(PP-YOLO Tiny 選擇第一種大類)
- 網絡結構
- 小型高性價比 Backbone
- Head 優化(減小個數,小型化設計,不同 head 特征復用等)
- 深度可分離卷積
- 數據增強
- Image Mixup / Mosaic
- Random Crop
- Auto Augment
- 訓練策略
- IoU Loss
- EMA
- Sync Batch norm
- 調整正負樣本 assign 方式
模型壓縮
- 卷積通道裁剪
- Uniform
- Sensitive
- FPGM
- 知識蒸餾
- L2 Loss
- Soft Label
- FSP
- 量化
- 在線量化
- 離線量化
- PACT
- 搜索
- NAS?
優化方法 - Backbone 的選擇
Mobilenet V3 是 Google 使用模型搜索的方法搜索出來高性價比的模型,繼承了?Mobilenet V1 和Mobilenet V2 模型的特點。
0.5x 指將原來的模型縮小了一半,即將所有的 channel 數×0.5。
目標檢測領域使用圖像分類作為 backbone 時,一般都會將 fc 層排除掉
優化方法 - head 優化(Neck + Head)
| 模型 | 輸入尺寸 | GFLOPs |
| YOLOv3- MobileNetV3 | 608×608 | 17.7 |
| 512×512 | 12.6 | |
| 416×416 | 8.3 | |
| 320×320 | 4.9 | |
| 特征變小,影響召回率 | ||
| 提升召回率 |
|
|
| 優化方法 | 效果 | |
| 數據增強 | Image Mixup | 增強背景信息,平滑數據集,提高抗干擾能力 |
| 模型特征 | SPP | 多尺度特征 |
| DropBlock | 隨機丟棄特征快,減小過擬合 | |
| 后處理 | Grid Sensitive | 中心坐標回歸上的 label smooth,減小過擬合 |
| 損失優化 | IoU Loss | -IoU 加入 loss 中,提升定位精度 |
| 訓練優化 | Sync Batch Norm | 卡間同步均值和方差 |
| EMA | 歷史梯度平滑,訓練更加穩定 | |
| Larger Batch Size | 8 × 32,訓練更加穩定 | |
服務器端效果好,而移動端不適用:
- Coord Conv
- 增加兩個通道表示 x,y 坐標,獲取全局信息
- 移動端 CPU 計算,通道數為 8 的倍數性能最優
- Matrix NMS
- GPU 并行計算各預測框間的 IoU
- 移動端 CPU 無法發揮并行計算優勢,計算量增大
- IoU Aware
- 學習預測框和真實框間的 IoU,調整預測排序
- 新增很多細粒度算子,移動端速度影響較大
優化方法 - 后訓練量化
模型已經訓練好,權重已經存儲下來,它是 float32 的權重。通過一個算法,把 float32 映射到 int8 上,讓存儲的權重以 int8 的形式來存儲。在加載 int8 的權重的進行預測時,通過映射函數,將其加載回 float32 的權重。
對精度基本沒有損失,壓縮了模型體積。
卷積通道裁剪:裁剪冗余通道、減小模型大小、降低 FLOPs,提升預測速度、邊裁剪邊訓練。
知識蒸餾:精度高模型 – teacher、teacher 學習到的預測結果指導student、提升模型精度、不影響 FLOPs 和預測速度。
知識蒸餾是模型壓縮的一種常用的方法,不同于模型壓縮中的剪枝和量化,知識蒸餾是通過構建一個輕量化的小模型,利用性能更好的大模型的監督信息,來訓練這個小模型,以期達到更好的性能和精度。最早是由 Hinton 在 2015年 首次提出并應用在分類任務上面,這個大模型我們稱之為 teacher(教師模型),小模型我們稱之為Student(學生模型)。來自Teacher 模型輸出的監督信息稱之為 knowledge(知識),而 student 學習遷移來自 teacher 的監督信息的過程稱之為 Distillation(蒸餾)。
YOLOv3 剪裁+蒸餾
- ?PaddleDetection 提供一鍵式剪裁 + 蒸餾腳本
- ?YOLOv3-MobileNetV1 剪裁67% FLOPs,精度基本無損,移動端加速 2.3 倍,GPU 加速 60%
- ?YOLOv3-ResNet50vd-DCN 剪裁 43% FLOPs,精度提升 0.6,GPU加速20%
| 模型 | 數據集 | 策略 | mAP | FLOPs | Tesla P4推理時延 | 高通855 推理時延 |
| YOLOv3-MobileNetV1 | COCO | — | 29.3 | — | — | 321.35 ms |
| YOLOv3-MobileNetV1 | COCO | 剪裁+ YOLOv3-ResNet34蒸餾 | 29.0 | -67.56% | — | 139.71ms |
| YOLOv3-MobileNetV1 | VOC | — | 76.2 | — | 16.55ms | 289.87ms |
| YOLOv3-MobileNetV1 | VOC | 剪裁+ YOLOv3-ResNet34蒸餾 | 78.8 | -69.57% | 10.06ms | 123.41ms |
| YOLOv3-ResNet50vd-DCN | COCO | — | 39.1 | — | 35.20ms | — |
| YOLOv3-ResNet50vd-DCN | COCO | 剪裁+ YOLOv3-ResNet34蒸餾 | 39.7 | -43.69% | 29.13ms | — |
YOLOv3-MobileNetV3 剪裁+蒸餾
????????–MobileNetV3,精度速度更優的骨干網絡
????????–剪裁:更優的剪裁方式FPGM,減少模型大小和計算量
????????–蒸餾:精度更高的YOLOv3-ResNet34作為teacher模型
????????–PaddleDetection提供了一鍵式剪裁+蒸餾腳本及教程
| Backbone | 策略 | 剪裁率 | mAP | 320×320 推理時延 |
| MobileNetv3 | baseline | - | 27.1 | 319ms |
| MobileNetv3 | 剪裁+蒸餾 | 50%,75%,87.5% | 25.9 | 107ms |
| MobileNetv3 | 剪裁+蒸餾 | 75%,75%,87.5% | 24.6 | 89ms |
| 注:剪裁率為 YOLOv3 模型 head 部分三個輸出分支對應的剪裁率 | ||||
移動端模型庫
–低端算力:SSDLite模型 + 量化
–中端算力:兼顧速度和精度的YOLOv3壓縮模型
–高端算力:高精度的Cascade Faster RCNN模型
| 模型 | 主干網絡 | 模型大小 | COCO mAP | 推理時延 (曉龍845) |
| SSDLite | MobileNetV3 small | 11M | 16.6 | 41ms |
| MobileNetV3 large | 21M | 22.8 | 92ms | |
| SSDLite+量化 | MobileNetV3 small | 2.8M | 16.1 | 34ms |
| MobileNetV3 large | 5.3M | 22.7 | 80ms | |
| YOLOv3+剪裁+蒸餾 | MobileNetV3 large | 28MB | 25.9 | 107ms |
| MobileNetV3 large | 16MB | 24.6 | 89ms | |
| Cascade Faster-RCNN | MobileNetV3 large | 15MB | 25.0 | 87ms |
| MobileNetV3 large | 15MB | 30.2 | 351ms |
總結