Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)

FromL77發表於2021-12-31

♥ 第一印象

Rank & Sort Loss for Object Detection and Instance Segmentation 這篇文章算是我讀的 detection 文章裡面比較難理解的,原因可能在於:創新的點跟普通的也不太一樣;文章裡面比較多公式。但之前也有跟這方面的工作如 AP LossaLRPLoss 等。它們都是為了解決一個問題:單階段目標檢測器分類和迴歸在訓練和預測不一致的問題。那麼 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 使得所有正樣本都能排序在負樣本之前,並且只選取了較高分數的負樣本進行計算,在不使用啟發式的取樣情況下解決了正負樣本不均衡的問題。
  • 不需要進行多工的權重或係數調整。
Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)

由上圖可以看出,一般的標籤分配正樣本之間是沒有區分的,但是在 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 的計算

    Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)
    • 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 的定義

\[\mathcal{L}_{RS}=\frac{1}{|\mathcal{P}|}\underset{i \in \mathcal{P}}{\sum} (\ell_{RS}(i) - \ell_{RS}^{*}(i)) \]

其中 \(\ell(i)_{RS}\) 是當前 rank error 和 sort error 的累積起來的和,其可以用下式表示

\[\ell_{RS}(i) = \frac{rank^{-}(i)}{rank(i)} + \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})(1 - y_j)}{rank^{+}(i)} \]

前一項為 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:

\[\ell^{*}_{RS}(i) = 0 + \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})[y_j\ge y_i](1 - y_j)}{H(x_{ij})[y_j\ge y_i]} \]

同時論文還將 \(H(x_{ij})\) 平滑進入區間 \([-\delta_{RS},\delta_{RS}]\) 中,其中 \(x_{ij} = x_{ij}/2\delta_{RS} + 0.5\)

Loss 的計算

關於 loss 的計算同上面也是進行三部曲,最後得到:

\[L_{ij}=\begin{cases} (\ell_{R}(i) - \ell_{R}^{*}(i))p_{R}(j|i),\quad for\ i \in \mathcal{P},j\ \in \mathcal{N} \\ (\ell_{S}(i) - \ell_{S}^{*}(i))p_{S}(j|i),\quad for\ i \in \mathcal{P},j\ \in \mathcal{P} \\ 0, \quad \qquad \qquad \qquad \qquad \ ohterwise \end{cases} \]

其中

\[\begin{aligned} p_{R}(j|i)&=\frac{H(x_{ij})}{\underset{k \in \mathcal{N}}{\sum} H(x_{ik})} =\frac{H(x_{ij})}{rank^{-}(i)} \\ p_{S}(j|i)&=\frac{H(x_{ij})[y_j < y_i]}{\underset{k \in \mathcal{P}}{\sum} H(x_{ik})[y_k < y_i]} \end{aligned} \]

這裡對於 rank 的概率質量函式只會統計分數大於 \(i\) 的樣本,這裡其實和之前沒有什麼區別;對於 sort 而言概率質量函式只會統計分數大於 \(i\) 且分數的標籤小於 \(i\) 的樣本。

以上的 loss 計算則變為:

\[L_{ij}=\begin{cases} \frac{rank^{-}(i)}{rank(i)}\frac{H(x_{ij})}{rank^{-}(i)},\quad \qquad \qquad \ \qquad \qquad \ \qquad \qquad \qquad \quad \ for\ i \in \mathcal{P},j\ \in \mathcal{N} \\ \Big(\frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})(1 - y_j)}{rank^{+}(i)} - \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})[y_j\ge y_i](1 - y_j)}{H(x_{ij})[y_j\ge y_i]}\Big)\frac{H(x_{ij})[y_j < y_i]}{\underset{k \in \mathcal{P}}{\sum} H(x_{ik})[y_k < y_i]},\quad for\ i \in \mathcal{P},j\ \in \mathcal{P} \\ 0, \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \ ohterwise \end{cases} \]

Loss 的優化

對於 \(i \in \mathcal{N}\) 時,

根據上式中的 \(L_{ij}\) 的計算規則,實際上我們只需要計算 rank 產生的 loss 就好,因為 sort 產生的 loss 只會在正樣本之間計算,而 rank 產生的 loss 需要正樣本對所有負樣本的計算,因此只有 \(j\ \in \mathcal{P}, i \ \in \mathcal{N}\) 符合(注意這裡的順序噢,\(i,j\) 就不行噢):

\[\begin{aligned} \frac{\partial L_{RS}}{\partial s_i} &= \frac{1}{|\mathcal{P}|} \Big(-\underset{j \in \mathcal{P}}{\sum}L_{ij}+\underset{j \in \mathcal{P}}{\sum}L_{ji}-\underset{j \in \mathcal{N}}{\sum}L_{ij}+\underset{j \in \mathcal{N}}{\sum}L_{ji}\Big) \\ &= \frac{1}{|\mathcal{P}|}\underset{j \in \mathcal{P}}{\sum}\Big(\ell_{R}(i)-\ell^{*}_{R}(i)\Big)p_{R}(i|j) \\ &= \frac{1}{|\mathcal{P}|}\underset{j \in \mathcal{P}}{\sum}\ell_{R}(i)p_{R}(i|j) \end{aligned} \]

對於 \(i \in \mathcal{P}\) 時,

這時候只有 \(j\ \in \mathcal{N}, i \ \in \mathcal{P}\) 這種情況是不行的(因為這樣就是計算每一個負樣本與所有正樣本的 loss 了):

\[\begin{aligned} \frac{\partial L_{RS}}{\partial s_i} &= \frac{1}{|\mathcal{P}|} \Big(-\underset{j \in \mathcal{P}}{\sum}L_{ij}+\underset{j \in \mathcal{P}}{\sum}L_{ji}-\underset{j \in \mathcal{N}}{\sum}L_{ij}+\underset{j \in \mathcal{N}}{\sum}L_{ji}\Big) \\ &= \frac{1}{|\mathcal{P}|}\Big(-\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(i) - \ell_{S}^{*}(i))p_{S}(j|i)+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-\underset{j \in \mathcal{P}}{\sum}(\ell_{R}(i) - \ell_{R}^{*}(i))p_{R}(j|i)+0\Big) \\ &= \frac{1}{|\mathcal{P}|}\Big(-(\ell_{S}(i) - \ell_{S}^{*}(i))\underset{j \in \mathcal{P}}{\sum}p_{S}(j|i)+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-(\ell_{R}(i) - \ell_{R}^{*}(i))\underset{j \in \mathcal{P}}{\sum}p_{R}(j|i)+0\Big) \\ &=\frac{1}{|\mathcal{P}|}\Big(-(\ell_{S}(i) - \ell_{S}^{*}(i))+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-(\ell_{R}(i) - \ell_{R}^{*}(i))+0\Big) \\ &=\frac{1}{|\mathcal{P}|}\Big((\ell_{RS}^{*}(i) - \ell_{RS}(i))+\underset{j \in \mathcal{P}}{\sum} \big(\ell(i)_{S} - \ell_{S}^{*}(i)\big)p_{S}(i|j)\Big) \end{aligned} \]

需要記住的是,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 (兩正)

關於多工的權重,使用下述方法避免了人工設定權重:

\[\mathcal{L}_{RS-model} = \mathcal{L}_{RS} + \lambda_{box}\mathcal{L}_{box} \]

其中 \(\lambda_{box} = \left|\mathcal{L}_{RS}/\mathcal{L}_{box} \right|\)

演算法的表現

RS Loss 解決訓練預測不一致以及類別不均衡等問題,思路還是挺新穎的,而且具有較好的表現。

  • 單階段網路的效能

    Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)
  • 兩階段網路的效能

    Rank & Sort Loss for Object Detection and Instance Segmentation 論文解讀(含核心原始碼詳解)

可以看到還是在下游任務上還是又不小的提升的,只得大家借鑑其思路,創新自己的工作。

♣ 核心原始碼解讀

元旦快樂明年見

相關文章