♥ 第一印象
Rank & Sort Loss for Object Detection and Instance Segmentation 這篇文章算是我讀的 detection 文章裡面比較難理解的,原因可能在於:創新的點跟普通的也不太一樣;文章裡面比較多公式。但之前也有跟這方面的工作如 AP Loss、aLRPLoss 等。它們都是為了解決一個問題:單階段目標檢測器分類和迴歸在訓練和預測不一致的問題。那麼 Rank & Sort Loss 又在以上的工作進行了什麼改進呢?又解決了什麼問題呢?
關於訓練預測不一致的問題
簡單來說,就是在分類和迴歸在訓練的時候是分開的訓練,計算 loss 並進行反向優化。但是在預測的時候卻是用分類分數排序來進行 nms 後處理。這裡可能導致一種情況就是分類分數很高,但是迴歸不好(這個問題在 FCOS 中有闡述)。
之前的工作
常見的目標檢測網路一般會使用 nms 作為後處理,這時我們常常希望所有正樣本的得分排在負樣本前面,另外我們還希望位置預測更準確的框最後被留下來。之前的 AP Loss 和 aLRP Loss 由於需要附加的 head 來進行分類精度和位置精度綜合評價(其實就是為了消除分類和迴歸的不一致問題,如 FCOS 的 centerness、IoU head 之類的),確實在解決類別不均衡問題(正負樣本不均衡)等有著不錯的效果,但是需要更多的時間和資料增強來進行訓練。
Rank & Sort Loss
Rank & Sort Loss (RS Loss) 並沒有增加額外的輔助 head 來進行解決訓練和預測不一致的問題,僅通過 RS Loss 進行簡單訓練:
- 通過 Sort Loss 加上 Quality Focal Loss 的啟發(避免了增加額外的 head),使用 IoU 來作為分類 label,使得可以通過連續的數值 (IoU) 來作為標籤給預測框中的正樣本進行排序。
- 通過 Rank Loss 使得所有正樣本都能排序在負樣本之前,並且只選取了較高分數的負樣本進行計算,在不使用啟發式的取樣情況下解決了正負樣本不均衡的問題。
- 不需要進行多工的權重或係數調整。
由上圖可以看出,一般的標籤分配正樣本之間是沒有區分的,但是在 RS Loss 裡面正樣本全部大於負樣本,然後在正樣本之間也會有排序,排序的依據就是 Anchor 經過調整後跟 GT 的 IoU 值。
♠ 對基於 rank 的 loss 的回顧
由於基於排序的特性,它不是連續可微。因此,常常採用了誤差驅動的方式來進行反向傳播。以下來複習一下如何將誤差驅動優化融進反向傳播:
-
Loss 的定義
\(\mathcal{L} = \frac{1}{Z} \underset{i \in \mathcal{P}}{\sum} \ell(i)\) ,其中 \(Z\) 是用來歸一化的常數,\(\mathcal{P}\) 則是所有正樣本的集合,\(\ell(i)\) 是計算正樣本 \(i\) 的誤差項。
-
Loss 的計算
-
Step 1. 如上圖所示,誤差 \(x_{ij}\) 的值為樣本 \(i\) 與樣本 \(j\) 的預測概率值之差。
-
Step 2. 用每一對樣本的誤差值 \(x_{ij}\) 來計算這對樣本對樣本 \(i\) 產生的 loss 值,由下述公式計算得到:
\[L_{ij} = \begin{cases} \ell(i)p(j|i),\quad for\ i \ \in \mathcal{P},j \ \in \ \mathcal{N} \\ 0,\qquad \qquad \ otherwise, \end{cases} \]其中 \(p(j|i)\) 是 \(\ell(i)\) 分佈的概率
密度質量函式,\(\mathcal{N}\) 則是所選負樣本的集合。一般借鑑了感知學習(感知機)來進行誤差驅動,因此使用了階躍函式 \(H(x)\) 。對於第 \(i\) 個樣本,\(rank(i)=\underset{j \in \mathcal{P\cup N}}{\sum} H(x_{ij})\) 為該樣本在所有樣本的位次,\(rank^{+}(i)=\underset{j \in \mathcal{P}}{\sum} H(x_{ij})\) 為該樣本在所有正樣本中的位次,\(rank^{-}(i)=\underset{j \in \mathcal{N}}{\sum} H(x_{ij})\) 為該樣本在較大概率分數負樣本中的位次,這個位次真值應該為 0 ,否則將產生 loss (因為所有正樣本需要排在所有負樣本之前),對於 AP Loss 來說 \(\ell(i)\) 和 \(p(j|i)\) 可以分別表示為 \(\frac{rank^{-}(i)}{rank(i)}\) 和 \(\frac{H(x_{ij})}{rank^{-}(i)}\) 。其中可以推斷出 \(L_{ij}=\frac{H(x_{ij})}{rank(i)}\) 即樣本 \(j\) 對 \(i\) 產生的 loss,這裡只會在其概率分數大於樣本 \(i\) 時會產生 loss。 -
Step 3. 計算最終的 Loss,\(\mathcal{L}=\frac{1}{Z}\underset{i \in \mathcal{P}}{\sum} \ell(i)=\frac{1}{Z}\underset{i \in \mathcal{P}}{\sum} \underset{j \in \mathcal{N}}{\sum} L_{ij}\) 。
-
-
Loss 的優化
優化其實就是一個求梯度的過程,這裡我們可以使用鏈式求導法則,然而 \(L_{ij}\) 是不可微的,因此其梯度可以使用 \(\Delta x_{ij}\) ,我們可以結合上圖進行以下推導:
\[\begin{aligned} \frac{\partial \mathcal{L}}{\partial s_i} &= \sum_{j} \frac{\partial \mathcal{L}}{\partial L_{ij}} \Delta x_{ij} \frac{\partial x_{ij}}{\partial s_i} + \sum_{j} \frac{\partial \mathcal{L}}{\partial L_{ji}} \Delta x_{ji} \frac{\partial x_{ji}}{\partial s_i}\\ & = -\frac{1}{Z}\sum_{j} \Delta x_{ji} + \frac{1}{Z}\sum_{j} \Delta x_{ij} \\ & = \frac{1}{Z} \Big( \sum_{j}\Delta x_{ji} - \sum_{j}\Delta x_{ij}\Big) \end{aligned} \]其中 \(\Delta x_{ij}\) 可以由 \(-(L^{*}_{ij} - L_{ij})\) 計算得到並進行誤差驅動更新值,其中 \(L^{*}_{ij}\) 是 GT。AP Loss 和 aLRP Loss 都是通過這種方式進行優化的。
-
文章對以上的部分一些改進
RS Loss 認為:
-
\(L^{*}_{ij}\) 不為 0 時解釋性比較差(因為 \(L\) 為排序誤差產生的 loss,按理來說應該沒有誤差是最好的,也就是 loss 為 0,那麼 GT 應該為 0 才對)
-
關於 \(L_{ij}\) 的計算來說,只有樣本 \(i\) 為正樣本,\(j\) 為負樣本的時候才會產生非零值,其忽略了其他情況的一些誤差。
因此對 Loss Function 進行了重定義為:
\[\mathcal{L}=\frac{1}{Z}\underset{i \in \mathcal{P \cup N}}{\sum} (\ell(i) - \ell^{*}(i)) \]其中 \(\ell^{*}(i)\) 是期望的誤差,這裡其實考慮了 \(i\) 屬於正負樣本的不同情況,另外直接使用與期望的誤差之間差值作為 loss 的值,使得目標 loss 只能向著 0 優化,解決了上述兩個問題。
關於 Loss 的計算則改為:
\[\mathcal{L}=\frac{1}{Z}\underset{i \in \mathcal{P \cup N}}{\sum} (\ell(i) - \ell^{*}(i))p(j|i) \]最後的 Loss 的優化,由於我們的最終 loss 目標是 0,所以 \(\Delta x_{ij} = -(L^{*}_{ij} - L_{ij}) = L_{ij}\) ,最終優化可以簡化為:
\[\frac{\partial \mathcal{L}}{\partial s_i} = \frac{1}{Z} \Big( \sum_{j}L_{ji} - \sum_{j}L_{ij} \Big) \] -
♦ Rank & Sort Loss
Loss 的定義
其中 \(\ell(i)_{RS}\) 是當前 rank error 和 sort error 的累積起來的和,其可以用下式表示
前一項為 rank error,後一項為 sort error,後一項對分數大於 \(i\) 的樣本乘以了一個 \(1-y\) 的權重,這裡的 \(y\) 是分數標籤(即該樣本與 GT 的 IoU 值)。這裡其實使得那些分數比樣本 \(i\) 大,但是分數的標籤又不是特別大(迴歸質量不是特別好)的樣本進行了懲罰使其產生較大的 error。對於誤差的標籤,首先 rank error 我們希望所有正樣本都排在負樣本之前,而這時 rank error 為 0,而對於 sort error 我們則希望只有標籤分數大於樣本 \(i\) 的預測分數可以比它大,從而產生 error,此時產生期望的誤差(也就是迴歸比 \(i\) 好的樣本,我們是可以容忍分數比它高的),這部分樣本由於有期望的誤差,在計算 loss 時會產生更小的 loss。那些分數的標籤不行,但預測分數又比較大的會產生更大的 loss:
同時論文還將 \(H(x_{ij})\) 平滑進入區間 \([-\delta_{RS},\delta_{RS}]\) 中,其中 \(x_{ij} = x_{ij}/2\delta_{RS} + 0.5\) 。
Loss 的計算
關於 loss 的計算同上面也是進行三部曲,最後得到:
其中
這裡對於 rank 的概率質量函式只會統計分數大於 \(i\) 的樣本,這裡其實和之前沒有什麼區別;對於 sort 而言概率質量函式只會統計分數大於 \(i\) 且分數的標籤小於 \(i\) 的樣本。
以上的 loss 計算則變為:
Loss 的優化
對於 \(i \in \mathcal{N}\) 時,
根據上式中的 \(L_{ij}\) 的計算規則,實際上我們只需要計算 rank 產生的 loss 就好,因為 sort 產生的 loss 只會在正樣本之間計算,而 rank 產生的 loss 需要正樣本對所有負樣本的計算,因此只有 \(j\ \in \mathcal{P}, i \ \in \mathcal{N}\) 符合(注意這裡的順序噢,\(i,j\) 就不行噢):
對於 \(i \in \mathcal{P}\) 時,
這時候只有 \(j\ \in \mathcal{N}, i \ \in \mathcal{P}\) 這種情況是不行的(因為這樣就是計算每一個負樣本與所有正樣本的 loss 了):
需要記住的是,rank 中的 loss \(L_{kl}\) 其中必須滿足 \(k \in \mathcal{P},l\ \in \mathcal{N}\) ,sort 中的 loss \(L_{kl}\) 其中必須滿足 \(k \in \mathcal{P},l\ \in \mathcal{P}\) 其餘情況均為 0,因此一對樣本要麼產生 rank loss(一正樣本一負),要麼產生 sort (兩正)
關於多工的權重,使用下述方法避免了人工設定權重:
其中 \(\lambda_{box} = \left|\mathcal{L}_{RS}/\mathcal{L}_{box} \right|\)
演算法的表現
RS Loss 解決訓練預測不一致以及類別不均衡等問題,思路還是挺新穎的,而且具有較好的表現。
-
單階段網路的效能
-
兩階段網路的效能
可以看到還是在下游任務上還是又不小的提升的,只得大家借鑑其思路,創新自己的工作。