目標檢測中定位準確性的改進方法
常見的 Detector 中,(除 YOLO 系列有些許不同之外),通常的做法是通過 CNN 得到一個框的類別置信度(cls
)和回歸量(reg
)。首先對所有的框應用 reg
,然後去除掉所有 cls
分数小於設定閾值的,再對餘下的進行 NMS。NMS 的依據是高 cls
分数抑制低分数的。對於預測值的訓練,首先會對回歸後的框進行一次 GT 匹配,這樣就找到所有框和對應 GT 的真實偏差值 reg'
,計算 reg'
和 reg
之間的 SmoothL1 Loss 值,反向傳播,即可得到更準確的 reg
。
這個過程中可以看出兩個影響「位置」準確的地方:第一個是 NMS 時,更高 cls 分数的框不代表它的位置更接近於 GT,而需要的偏移越小顯然越容易預測準確(從 YOLOv2 引入 Anchors 也可以看出);第二個是 Smooth-L1 的值,不直接反應 IoU 的大小,即 SmoothL1 小不一定代表 IoU 更大。
下面針對這兩個問題介紹幾篇文章。
Table of Contents
- Acquisition of Localization Confidence for Accurate Object Detection (ECCV 2018)
- Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression (CVPR 2019)
- Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression (AAAI 2020)
- Questions
Acquisition of Localization Confidence for Accurate Object Detection (ECCV 2018)
Problems
上述第一個問題,帶來兩個後果:
- 如下圖(1),
cls
高的不代表定位更準確(黃色為 GT),所以需要得到一個與位置直接相關的指標在 NMS 中使用,這個指標最好就是 IoU 預測值。作者提出了 Loc Conf 即預測某一個 box 和對應 GT 之間當前的 IoU,具體見下文。
圖(2)表示 NMS 之前,一個 box 與其匹配到的 GT 之間的 IoU,與 Cls Conf(左)和 Loc Conf(右)之間的相關性。同樣可以看出,Cls Conf 與 IoU 之間的相關性較小。Pearson correlation coefficients 分別為 0.217; 0.617
。
圖(3)表示 NMS 之後剩下的正樣本 box 的数量,與(其匹配到的 GT 之間的※)IoU 之間的關係。No-NMS 表示 NMS 之前的数量,也就是這個 IoU 範圍下最多的 box 数量。圖中可以看出,以 Loc Conf 作為指標,NMS 留下的 box 中 IoU 大的数量增多,小的数量減少(總数量接近)。
※如果一個 GT 匹配到了多個預測 box,那麼只有與其 IoU 最高的被計作正樣本
- 以
cls
為指標,會使得回歸過程難以解釋。如下圖(4),由於缺少反應位置準確程度的預測,如果直接簡單地多次進行回歸(Regression-Based, Recursive/Cascade),位置反而會偏移更大。除了新的指標之外還需要探究一下使得 IoU 隨著迭代次数單調增加的方法。
回歸過程可以用以下公式描述:
Regression-Based 的方法即直接估計最佳的 c*
然後應用変換,作者提出了 Optimization-Based 的回歸方法,具體見下文。
圖(5)是 Optimization-Based 和 Regression-Based 的方法隨著迭代次数的增加 AP 的変化。對於 FPN,iter = 0
代表 RPN,iter = 1
表示的是 Head;對於 Cascade R-CNN,iter = 0, 1, 2
分別表示其 1st, 2nd and 3rd regression stages (H1, H2, H3)。可以看出,隨著迭代次数增加到一定程度後,AP 值在 Regression-Based 的方法中會下降。
IoU-Net
為解決上述兩個問題,作者提出了以 Loc Conf 為指標的 Optimization-Based 的網絡,稱作 IoU-Net。
網絡主要多出一支平行的 class-aware IoU 預測,有了這個分支,就可以得到一個 box 的 IoU(與匹配的 GT 之間的),這就跟得到 cls 分数是一樣的原理和操作。此外將 RoIAlign 換成了 PrRoI Pooling。Jittered RoIs 是訓練時需要用到的。
Loc Conf, IoU-guided NMS
按照上面的新分支,得到了 IoU 的預測值後,可以通過下面的算法進行 IoU-guided NMS。
1 | Algorithm 1: IoU-guided NMS. |
主要的改動在 line3, line8
,使用 IoU
代替 cls
作為排序指標,並且,對於一系列對於同一個物體的重複預測,留下的 box 的 cls
會取這一系列中最大值。
Refinement as an optimization procedure
這裡是一種與之前不同的更新 box 坐標的方法:
1 | Algorithm 2: Optimization-based bounding box refinement. |
line4
表示計算 通過 PrPool 採樣之後再通過 IoU 分支得到的 IoU
,計算關於 box{bj}
四個坐標的梯度。line6
是更新坐標的核心,scale()
是進行對之前得到的 grad{x0, y0, x1, y1}
進行一次調整,依據是所在的軸,例如對 ∇x
則在梯度上乘以 width(bj)
。注意第一次仍需要通過網絡得到的 B-B-Reg
進行一次通常的 Reg-Based 回歸。
Precise RoI Pooling (PrRoI Pooling)
RoIPooling 和 RoIAlign 在這裡的主要問題是它對於 box 的坐標不連續可導(box 的坐標不一定為整数),使用上面的新回歸方法相當於在 Pooling 层中需要額外計算一個對參数的梯度了(普通的 Pooling 层和 RoIPooling/RoIAlign 是不含參数的),所以作者提出了 PrRoI Pooling。
首先,需要得到一個連續取值的 feature map f(x,y)
:
然後可以通過積分除以面積得到 Pooling 值:
這樣,對任意一點的導数為(以 x1
為例):
下圖是三種 RoI Pooling 的對比。
Training, Inference and Results
訓練是 e2e 的,只是對於 IoU 分支,訓練使用的是通過 GT augmenting 得到的 Jittered RoIs,而不是 RPN 得到的 RoIs。生成方式是通過一些隨機參数從 GT 変換出一系列 box,然後去除與匹配到的 GT 之間的 IoU 小於 0.5
的,並且根據不同的 IoU 均勻地採樣。損失函数使用 Smooth-L1。
預測時,首先通過一般的結構部分得到 cls
和 reg
,然後進行一次正常的回歸,然後進行 IoU-guided NMS,剩下的 box 中 cls
分数前 100 的將使用 optimization-based regression 進行進一步地 regression。
簡略的實驗(單項增加 Soft-NMS/IoU-NMS/Refine)結果如下表(COCO trainval35k 訓練,minival5k 測試):
Method | Baseline | +Soft-NMS | +IoU-NMS | +Refine |
---|---|---|---|---|
FPN | 36.4 | 36.8 | 37.3 | 38.0 |
Cascade R-CNN | 40.6 | 40.9 | 40.7 | 41.4 |
Mask R-CNN | 37.5 | 37.9 | 38.1 | 39.2 |
聯合訓練後的最終結果為 ResNet-50:38.1
,ResNet-101:40.6
。
Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression (CVPR 2019)
開頭的第二個問題,從下面的圖中可以看出。
圖中黑色的框為預測的,綠色的為 GT。圖(a)是以 L2-norm 為距離指標,假設框是 xyxy 形式的。如果預測和 GT 的一個角(左下)之間的距離是固定的,那麼如果預測的 box 的對角,在一個以 GT 對角為圓心的圓周上,那麼所有預測框都會有相同的 L2 距離,但是他們的 IoU 卻有很大差別。圖(b)是以 L1-norm 為距離指標的三種情況。
此外,IoU 被設計成 scale invariant,而 l-norm 不是。所以有相同 IoU 的不同尺寸的 box 得到的 loss 也會不同。
直接使用 IoU 的問題:如果兩個框完全不相交,那麼 Iou = 0
,不能反應他們之間的距離,所以提出 Generalized IoU,计算方式如下:
1 | Algorithm 1: Generalized Intersection over Union. |
line1
裡 C ⊆ S
即相同的空間和形狀,如果原來是橢圓,則 C 也用橢圓包圍。原來是矩形 box,那麼 C 也是矩形。
GIoU 具有以下特性,所以可以作為 IoU 的一種替代:
與 IoU 相同,GIoU 作為距離時(例如
Loss(GIoU) = 1 - GIoU
),包含作為度量的所有属性,例如非負性,對稱性等;與 IoU 相同,GIoU 同樣具有尺度不変性;
GIoU 總是 IoU 的下界,即同樣的兩個框計算出的
GIoU(A,B) <= IoU(A,B)
,且 AB 形狀越相似距離越接近, GIoU 越接近於 IoU。所以 GIoU 是與 IoU 有強相關性的(特別是 IoU 較高時),下圖是隨機取 10K 個 box 計算得到的相關性圖;GIoU 具有對稱的範圍:
-1 <= GIoU(A,B) <= 1
。
上述特性使得使用 GIoU 作為 Loss 是一種理想的選擇。對於一些奇特的形狀,可能有些地方的導数需要單獨再看看,但是對於 2D Detection,所有的 box 的兩軸都是平行的,所以計算 IoU 和 GIoU 只需要用到 min, max
和一些 piece-wise linear 的函数,他們都是可導的(Algorithm 1 中每一步都可導),所以可直接用作為損失函数 Loss(GIoU) = 1 - GIoU
。對於 IoU,在所有沒有交疊的情況都是沒有梯度的,而 GIoU 對於任何情況都有梯度。
對於 IoU > 0
的情況,Loss(GIoU) = 1 - GIoU
顯然鼓勵 IoU 增大。對於 IoU = 0
的情況,
損失函数在鼓勵 IoU ≠ 0
。
簡略的實驗結果如下表(COCO trainval35k 訓練,minival5k 測試)。
Mask R-CNN with ResNet-50:
Loss | AP (IoU[.5 : .95]) | AP (GIoU[.5 : .95]) | AP75 (IoU) | AP75 (GIoU) |
---|---|---|---|---|
Smooth-L1 (Original) | 0.366 | 0.356 | 0.397 | 0.385 |
Loss IoU | 0.374 | 0.364 | 0.404 | 0.393 |
Loss GIoU | 0.376 | 0.366 | 0.405 | 0.395 |
YOLOv3 with Darknet-608:
Loss | AP (IoU[.5 : .95]) | AP (GIoU[.5 : .95]) | AP75 (IoU) | AP75 (GIoU) |
---|---|---|---|---|
MSE (Original) | 0.314 | 0.302 | 0.329 | 0.317 |
Loss IoU | 0.322 | 0.313 | 0.345 | 0.335 |
Loss GIoU | 0.335 | 0.325 | 0.359 | 0.348 |
可以看到對於 YOLO 這類位置準確度本來就較差的算法提升更加顯著。
Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression (AAAI 2020)
GIoU 嚴重依賴 IoU 項,它們的問題主要是收斂緩慢,回歸不精確。
- GIoU 會使得 box 先增大,使得有交疊出現,然後最大化交疊面積。
- 對於一個 box 包含另一個 box 的情況,GIoU 和 IoU 是相等的。
Distance-IoU DIoU,引入 normalize 後的中心點距離,直接減少這個距離,使得收斂加快和精確。Complete-IoU CIoU,考慮交疊面積、中心點距離和長寬比。此外,不僅可用作 Loss,DIoU 還可以用在 NMS,即同時考慮交疊面積比和中心點距離,使得遮擋的情況下的錯誤減少。
Simulation Experiment
使用模擬實驗來驗證有效性,共有七個不同長寬比(1:4, 1:3, ... , 4:1
)的單位面積的 target boxes(綠色),中心固定在 (10, 10)
。在半徑為 3
的面積內隨機選擇 5000 個點放置 Anchors,每組 Anchors 有七種不同的面積(0.5, 0.67, 0.75, 1, 1.33, 1.5 and 2
)+ 長寬比(1:4, 1:3, ... , 4:1
)組合,所以共 5000 × 7 × 7
個 Anchors。
應用梯度下降可以更新 Anchors 的位置:
其中 η
是 step,2 - IoU
是加速回歸的項,performance (error) 使用 l1-norm
表示。實驗結果如下圖。
下面的圖是在 final iteration T 的 error 可視化,坐標與上圖相同。可以看到 IoU Loss 在非交疊的情況下 error 都較大(由於 ∇B ≡ 0
所以 box 不會移動)。而 GIoU Loss 谷地較大表示其有效區域更大,但在水平和垂直方向上 error 較大(C − A ∪ B
在這兩個方向通常較小或為零,GIoU 退化為 IoU)。而 DIoU Loss 在各處的 error 都較小。
Distance-IoU and Complete-IoU
DIoU 直接減少兩個 box 中心點之間的距離:
其中 b
和 b^gt
表示兩個中心點,ρ
表示 Euclidean distance,c
表示 smallest enclosing box 的對角線長度。
DIoU 同樣有與 GIoU 類似的特點:
scale invariant
provide moving directions non-overlapping boxes
完全重合:
L{IoU} = L{GIoU} = L{DIoU} = 0
;相隔無限遠:L{GIoU} = L{DIoU} → 2
同時 DIoU 的額外優點是:直接 minimize 距離,收斂快。即使在包含、在水平垂直方向時,收斂都非常快。
在此基礎上,提出 CIoU,使得回歸過程更精確和迅速。CIoU 在 DIoU 的基礎上多了一項保持長寬比一致的項:
α
是正的 trade-off 項,4 / pi^2
使得長寬比損失限制在 [0, 1]
。
這裡有一點需要注意,對於 v
的導数
∂h
同理,只需替換最後一項的分子。w2 + h2 通常是一個很小的数,這會導致梯度很大,所以求梯度值時分母直接用 1
替代,這樣梯度方向相同但是数值減小。
NMS using DIoU
使用 DIoU 替換原始 NMS 中的 IoU,即 IoU - R{DIoU}
。表示如果兩個 box 的中心點較遠,那麼它們可能表示兩個物體。
Results
- YOLOv3 (Darknet-608) 在 VOC 07+12 訓練,07 test 測試。
Loss | AP (IoU[.5 : .95]) | AP (GIoU[.5 : .95]) | AP75 (IoU) | AP75 (GIoU) |
---|---|---|---|---|
Loss IoU | 46.57 | 45.82 | 49.82 | 48.76 |
Loss GIoU | 47.73 | 46.88 | 52.20 | 51.05 |
Loss DIoU | 48.10 | 47.38 | 52.82 | 51.88 |
Loss CIoU | 49.21 | 48.42 | 54.28 | 52.87 |
Loss CIoU with DIoU NMS | 49.32 | 48.54 | 54.74 | 53.30 |
- Faster R-CNN 在 COCO 17 train 上訓練,在 17 val 上測試。
Loss | AP | AP75 | APs | APm | APl |
---|---|---|---|---|---|
Loss IoU | 37.93 | 40.79 | 21.58 | 40.82 | 50.14 |
Loss GIoU | 38.02 | 41.11 | 21.45 | 41.06 | 50.21 |
Loss DIoU | 38.09 | 41.11 | 21.66 | 41.18 | 50.32 |
Loss CIoU | 38.65 | 41.96 | 21.32 | 41.83 | 51.51 |
Loss CIoU with DIoU NMS | 38.71 | 42.07 | 21.37 | 41.93 | 51.60 |
可以看到兩級網絡由於 Proposals 的存在,Regression 大部分在 error 圖中的谷地進行,所以提升較小,三者效果都很好。此外,對於小目標 APs
,DIoU 的效果是最好的,說明對於小目標長寬比並不是特別重要。
- DIoU-NMS 的效果,使用不同的 NMS 閾值,使用 Loss CIoU 在 VOC 上訓練(即上表最後一行)。
Questions
我有一個疑問,關於本文最前面的 reg 過程的描述中,有一步是將 Anchors/Proposals 加上預測出的 reg 值之後,與 GT 進行匹配,方法是計算出一個 Anchors/Proposals 與所有 GT 的最大 IoU 值,如果這個最大值大於一個設定的閾值(e.g 0.7
),那麼這個 Anchors/Proposals 為正樣本,且有最大 IoU 值的那個 GT 為匹配上的 GT。
問題在於,只有正樣本會有 reg loss,而負樣本沒有 reg loss。在 GIoU 和 DIoU 的文中,作者都提到了他們的一個好處是,當兩個 box 之間的 IoU 為零時,GIoU/DIoU 仍然能提供 reg 的梯度而使用普通的 IoU 不能。但是實際過程中,如果 IoU 為零的話,那這個 box 一定是負樣本,就根本沒有 reg loss。
就這個問題我 問了作者,然後我發現我確實忽略了一點,就是在 YOLO 系列中有不同的匹配方式。YOLO 中,中心點落在某一個 Grid 裡,那麼這個 Grid 負責預測這個物體,且 Grid 中的一個 IoU 最大的 Predictor 負責預測。由於總要分配一個 Predictor 預測一個 box,所以這個 IoU 並沒有限制,也就可以為零。
但是話說回來,我覺得這種情況會非常罕見。在 YOLOv2 引入 Anchors 之後,由於默認的 Anchors 面積總是大於 Grid,所以不可能出現中心點落在這個 Grid 內的 box 與 Anchors 的 IoU 為零。在 YOLOv1 中,只有初始值恰好使一個 Grid 內所有(兩個)Predictor 預測的 box 的長寬都很小,且對應 GT 的長寬也很小,且他們中心點在這個 Grid 內也足夠遠(大於 (w(GT)+w(Anchor)) / 2, (h(GT)+h(Anchor)) / 2
)才有可能出現這種情況。
其實我還有一個疑問,關於具體代碼的,我感覺裡面 Smooth-L1 loss 不是加在回歸值而是 bbox 坐標上的,這個可能需要跑一下代碼才知道。。