YOLACT (You Only Look At CoefficienTs) 是首個能夠實現 real-time 的實例檢測模型,主要思想是在 one-stage 物件檢測演算法直接添加 mask 分支,目前已有 YOLACT、YOLACT++。此外,為了能在邊緣設備上實行 real-time inference 而有了 YolactEdge。本文將要來介紹 YOLACT 系列的模型~
YOLACT (ICCV 2019)
📝 Paper: https://arxiv.org/abs/1904.02689
🔖 Github: https://github.com/dbolya/yolact
YOLACT backbone 採用 RetinaNet,由 Resnet、FPN 所組成,接著會分成兩個併行的分支 Prediction Head、Protonet。
Prediction Head
- 與 RetinaNet detection 部分類似但更精簡 (RetinaNet 有兩個 FCN subnet,而 YOLACT 只有一個)。
- 其輸入是 FPN 的 P3~P7,輸出改為三項: class, bndBox, Mask Coefficients,其中 Mask Coefficients 用於對 prototype mask (Protonet 輸出,原型 mask) 進行加權。
- 此外,為了更好地和 prototype mask 融合,會先對 Mask Coefficients 進行 tanh,使其值更加穩定。
Protonet
- 用於預測質量更高的 prototype mask,為了能更好的預測小物體。
- 其輸入是採用 FPN 的 P3,輸出 mask 維度為 138x138x32 (k 預設為 32)。
最後 Prediction Head 的輸出會先經過 NMS (這邊的 NMS 是指 Fast NMS),然後與 Protonet 輸出進行線性組合,也就是下圖的 Assembly,公式我已放在圖中,其中 P 為 Protonet、C 為 Coefficients。
接下來講一下 Prediction Head 中 Mask Coefficients 的輸出維度 (W x H x ka),其中的 k, a 分別是什麼。
- k 為 Mask Coefficients 和 Protonet 的輸出 channel 維度,由於每個 Mask Coefficients 會對應一個 prototype mask,因此兩者的 k 值一樣,k 預設為 32 (作者嘗試過 [8, 16, 32, 64, 128, 256] 的值,其中 32 效果最好)
- a 是指 P3~P7 層 feature map 的 Anchor 的總數量
→ 在 FPN 的 input feature map (P3~P7) 中每個 pixel 會生成 3 個 Anchor,每個 Anchor 面積都是相同尺寸,分別為 [24, 48, 96, 192, 384],其長寬比 (aspect ratios) 會根據 1:1、1:2、2:1 比例調整。
→ 在各個 Pi 層的 feature map 中 ai 值為 Wi x Hi x 3,將這些 ai 加總會得到 a 值 (a = a3 + a4 + a5 + a6 + a7)
Fast NMS
除了這樣的架構外,還提出了 Fast NMS,使用矩陣運算的方式能夠達到比 NMS 更快的速度。其作法如下:
Step 1. 對每一類別的 confidence score 取 top n 個 bndBox 降序排列,接著互相計算 IOU
Step 2. 將對角矩陣進行上三角化,即把對角元素與下三角設置為 0。因為對角元素是 bndBox 對本身進行計算 (IOU=1),而下三角元素與其對應的上三角值相同 IOU(A,B)=IOU(B,A)
Step 3. 接著去除重疊的候選框,檢查目前對角矩陣每一列的最大值,是否超過 threshold,若有則將其刪除
→ 由於對角矩陣是依照 confidence score 的高低順序排列後計算得來的,因此若有除了對角線外的值之元素大於閾值,則表示該元素與比他更高 IOU 的框重疊。
由下圖可知採用 Fast NMS 能實現比 NMS 快 11.8 ms 的速度,並且只降低 0.1 mAP。
Loss funtion
YOLACT 的 loss funtion 為 classification loss、box regression loss、mask loss的總和,權重分別為 1、1.5、6.125。
- classification loss 和 box regression loss 採用與 SSD 一樣的方式
- mask loss 為預測 mask 和 grouth truth mask 之間 pixel-wise 的 Binary Cross-Entropy
下圖為 YOLACT 的整體模型架構
為了讓小物體分割效果更好,進行 Assembly 後的 mask 會先根據 bounding box 截取出來再經過 threshold 得到最後的預測。
Result
由下圖可以看到 YOLACT 的預測結果 AP 雖然沒有比 two-stage 方法高,但 FPS 卻快非常多
YOLACT++ (2019)
📝 Paper: https://arxiv.org/abs/1912.06218
為了在保持 real-time inference 的情況下增加準確率 (33.5fps/ 29.8mAP → 34.1mAP),以 YOLACT 為基礎做了三項改進:
加入 Fast Mask Re-scoring Network 分支
該分支用於預測輸入 mask 與 ground truth mask 的 IOU,是借鑑 Mask Scoring R-CNN 的方法來對 mask 質量進行打分。網路架構為 6 個卷積層 + ReLU 以及 global pooling layer,其輸入是 YOLACT 經過 Crop 步驟所輸出的 mask,輸出則是對每一個類別的 IOU,最後再將其與對應類別的 class confidence 相乘得到最終的 mask score。
📚 YOLACT++ 與 Mask Scoring R-CNN 的差異?
- 輸入是使用整個 mask 進行預測,不足的部分以 0 填充
- 沒有使用全連接層,因此僅增加 1.2 ms 的計算時間
backbone 引入 Deformable Convolution with Intervals
Deformable Convolutional Network (DCN,可變卷積) 為在卷積層上添加位移變量,該變量會根據數據的情況進行學習。
下圖 (a) 為普通的卷積;(b)、(c)、(d) 都是可變卷積,其中 (b) 是將每一個 sample point 都加上 offset,排列成不規則形狀;(c) 能夠達到尺寸變換的效果;(d) 則是達到旋轉變化的效果。
Deformable Convolutional 能透過 offset 來提升網路對於不同尺寸、角度、比例的目標物檢測能力,因此若將網路全都替換成 DCN 可以提升 1.8 mAP。但由於考量到準確率和速度之間的 trade-off,只採用替換最後 3 個 ResNet stages,並且 block 間隔為 3 (Intervals=3),可提升 1.6 mAP、耗時增加 2.8 ms。
優化 Prediction Head 的 Anchor 設計
作者嘗試了兩種策略來選擇 FPN 的 input feature map (P3~P7) 中 Anchor 的 hyper-parameters
1. 保持 Anchor 面積,但再增加長寬比 (aspect ratios) 的數量
原長寬比為 [ 1:1、1:2、2:1 ] → 更改為 [ 1:1、1:2、2:1、1:3、3:1 ]
2. 保持長寬比,但將 Anchor 面積比例增加三倍
原本: P3~P7 各個的 Anchor 面積都相同 → 更改為 [1x, 2^(1/3)x, 2^(2/3)x] 種 Anchor 面積
第一種策略會將 Anchor 的總數增加為原來的 5/3 倍,而第二種策略則會增加為原來的 3 倍。
Result
由下圖可以看到 YOLACT++ 能夠在與 YOLACT 相同的推論速度上,達到更好的預測結果。
YolactEdge (2020)
📝 Paper: https://arxiv.org/abs/2012.12259
🔖 Github: https://github.com/haotian-liu/yolact_edge
YolactEdge 是首個能在邊緣設備上實行 real-time inference 的實例分割模型,在 Jetson AGX Xavier 上可以達到 30.8 FPS (Image resolution: 550x550,backbone: ResNet-101)。
基於 YOLACT 進行兩項改進:
- TensorRT 優化
- 針對 video 預測進行加速
TensorRT 優化
關於 TensorRT 的介紹可參考: TensorRT 介紹與安裝教學
由下表可知將模型進行優化能夠大幅提升推論速度,其中在 backbone 及 FPN 上使用 INT8 可以獲得最高的 FPS,且 mAP 只降低 0.1
優化為 INT8 通常都會讓準確度下降,因此會再進行校正 (calibration),以下為使用多少資料進行校正後的結果。
針對 video 預測進行加速
這部分是利用 video 的時間冗餘 (Temporal Redundancy) 進行 frame 估計,以降低計算量。概念為讓前一個 frame 去估計下一個 frame 的特徵,如此一來就不用對每個 frame 進行預測以減少計算量。
從 table2 中可以發現 YOLACT 計算集中在 backbone,其中 C4 的計算量最大,佔了 66.2%
因此若直接將前一個 frame 的 P4、P5 層特徵做變換 (transform) 得到當前的 non-key frame W4、W5 層,就可以省略灰色部分 C4、C5 層的計算。
作者也有對其他層的轉換進行實驗
transform 的作法是採用 FeatFlowNet 來預測 flow map,該 flow map 表示前後 frame 之間的變換關係。接著通過 inverse warping 轉換特徵,最後藉由雙線性插值得到 pixel value。
inverse warping 為 x+δx,其中 δx 為 flow map: M_x(I_k, I_n)
I_k 指前一個 frame,稱為 Keyframes;I_n 指當前 frame,稱為 Non-keyframes
FeatFlowNet 是由 FlowNetS 改進而來的,網路架構更改為 backbone C3 層的特徵以及少量的 convolution layer,能達到更快的速度,推論結果如下圖 (d)。
此外,在輸入模型前將 channels 減少到 1/4,能夠增加約 13 FPS,且 AP 只降低 0.1 mAP。但如果再降至 1/8,FPS 不會大幅增加,在訓練時也不能很好地收斂,結果如下圖 (c)。