【論文紹介】シンプルな構成なのに識別性能が良い物体検出

# 概要

2019年のX. Zhou, D. Wang, P. Krähenbühlによる[Objects as Points](https://arxiv.org/pdf/1904.07850)を紹介します。

この方法は、物体中心のクラス分類と位置回帰を基本とするのですが、加えて物体サイズ(幅、高さ)、人の姿勢(関節位置)などを回帰します。物体中心を推定することから、この方法をCenterNetと呼びます。

なぜ、この論文を選んだのか、理由を挙げます。
* シンプル
  * 検出枠を回帰するためのアンカーがいらない
  * 多重検出を抑制する仕組み(NMS)がいらない
  * 物体サイズによらず、同じ解像度の特徴量を使うので、教師データ(Ground Truth)の計算が簡単
* 簡単に試せる
  * tensorflowの[object detection API](https://github.com/tensorflow/models/tree/master/research/object_detection)から、checkpoint（学習済みのモデル)をダウンロード可能で、推論を試すことが可能。学習もconfigファイルを書き換えることで可能(ただし、現在はメンテナンス終了しているため、最新のライブラリで実行できない可能性有り)。

CenterNetの論文には、物体検出だけでなく、姿勢推定や3D物体検出についても書かれていますが、今回は物体検出について紹介します。

# 背景
物体検出には、Faster RCNNで代表される2 stageタイプと、YOLOやSSDで代表される1 stageタイプがあります。
CenterNetは、1 stageタイプの物体検出ですが、従来の方法と比較して、以下の点で異なっています。

#### 出力解像度の高さ
従来だと入力解像度の1/16のところ、CenterNetだと1/4と解像度が高いです。これによって、アンカーボックスが不要になりました。
そもそも、アンカーボックスが必要な理由の1つめの理由は、回帰のしやすさと言われています(参考：[cs231n/Object Detection (Haofeng Chen)](https://cs231n.stanford.edu/2021/slides/2021/discussion_6_detection.pdf))。 2つめの理由は重なった物体を区別することが容易になるためと考えます。ただ、解像度が高ければ、物体境界が識別しやすく、物体の中心を抽出しやすくなるだろうと推測できます。
#### アンカーボックスとNMSがいらない
Fig.3 a)に従来のアンカーボックスを使った方法を示します。Fig.3 a)は、入力画像を畳み込み層とpooling層を介して得られた低解像度の特徴量マップで、グリッド状(図では白線で区切られている)に特徴量が並んでいます。このグリッドの中心がアンカー(図では緑丸)で、アンカーを中心に予め決められた数とスケールのアンカーボックス(図では点線枠)が配置されます。アンカーボックスとGround Truth(GT)の重なり率(IoU)が0.7より大だと物体あり、0.3未満だと背景と判定します。一方、b)に示すCenterNetでも同様の特徴量マップを作って、グリッドごとに識別しますが、ここではアンカーボックスは使いません。
Fig.3 a)の従来法を見るとpositiveと判定された枠（緑点線）が3つあります。従い、後工程として候補の中からスコアが高い物体だけを残して他を抑制するNMS(Non-Maximum Suppression)という機能が必要です。CenterNetでは、アンカー1つに対し候補は1つしか検出しないので、多重検出を抑制する必要はありません。

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/6e7cec63-142c-4e35-da6f-a38fae53458e.png>

#### 関連する論文　(CornerNet)
CenterNetでは、物体中心をヒートマップ状に推定します。先例として[CornerNet (Hei Law etc)](https://arxiv.org/pdf/1808.01244)があり、これは検出枠の左上／右下の点を検出しますが、CornerNetには画像に多数の物体があった場合にどの点同士を組み合わせるのか、別に推定が必要となります。

# ネットワーク（概要）
まずは、ざっくり構成を説明します。図の白い四角はネットワーク、色付きの四角は入力画像や特徴量を示します。ネットワークは、特徴量を抽出するためのbackbone部と、検出の目的に即したhead部があります。物体検出のhead部は、物体中心、サイズ、中心座標のオフセットを推定するための特徴量を出力します。head部はいずれも3x3畳み込み層、1x1畳み込み層となっています。この図で示す$\hat{Y}, \hat{S}, \hat{O}$は予測値です。 

<img width=500 align-items=center src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/18e74001-08ed-503b-8051-4709711c4888.png>

# 損失関数
## 物体検出
最終的に物体中心の予測値は次式を目標とします。
```math
\hat{Y} \in [0, 1]^{\frac{W}{R}×\frac{H}{R}×C}
```
物体中心だと1、背景だと0ですね。Rは出力ストライドです。
なお、損失関数を計算する前に、予めsigmoid関数に入力することで、特徴量を0〜1の確率値にします。
一方、物体中心のGroundTruthは中心が1,その他が0ではなく、物体中心を最大とするガウス分布とします（次式）。
```math
Y = exp(-\frac{(x-\tilde{p_x})^2+(y-\tilde{p_y})^2}{2{\sigma_p}^2})
```
ここで、$(\tilde{p_x},\tilde{p_y})$は出力特徴量での物体中心の座標で、$(x,y)$は任意の座標で、どちらも画素単位です。$\sigma_p$は分散値です。
物体検出用の損失関数は次の通りです。これは、 [Focal Loss (Tsung-Yi Li etc)](https://arxiv.org/pdf/1708.02002) をアレンジしています。
```math
L_k = -\frac{1}{N}\sum_{xyc}\left\{
      \begin{align*}
      (1 - \hat{Y}_{xyc})^\alpha log(\hat{Y}_{xyc}) \; \; \; \; if \; Y_{xyc} = 1 \\
         (1 - Y_{xyc})^\beta (\hat{Y}_{xyc})^\alpha log(1 - \hat{Y}_{xyc}) \; \; \; otherwise
      \end{align*}
   \right.
```
Nは物体の数で、論文では$\alpha = 2$、$\beta = 4$としています。Focal Lossは、入力画像の中で背景が支配的な物体検出タスクにおいて効率的に学習を進められる損失関数として知られています。さらに、Ground Truthがガウシアン関数であることによって、位置がちょっとずれて「物体：1」となっても、損失が抑制されることが分かります。ガウシアン関数の$\sigma_p$や意図は、[CornerNet](https://arxiv.org/pdf/1808.01244)に詳しく書いているので、参照してください。

## オフセット
物体中心の予測は出力特徴量の画素粒度なので、実際の物体中心を計算するためのオフセットが必要です。オフセットの予測値は次式です。
```math
\hat{O} \in \mathbb{R}^{\frac{W}{R}×\frac{H}{R}×2}
```
損失関数$L_{off}$ は次の通りでL1ロスです。
```math
L_{off} = \frac{1}{N}\sum_p |\hat{O}_\tilde{p} - (\frac{p}{R} -\tilde{p})|
```
$N$は、物体の数、$p$は入力画像での物体中心の座標,$R$は出力ストライド、$\tilde{p}$は推定物体中心座標です。
## サイズ
最終的に物体検出結果を「枠」として表示します。それには物体$p_k$ごとのサイズ$s_k$=(w,h)が必要です。サイズの予測値は次式です。
```math
\hat{S} \in \mathbb{R}^{\frac{W}{R}×\frac{H}{R}×2}
```
損失関数$L_{size}$は次式の通りです。
```math
L_{size} = \frac{1}{N}\sum_{k=1}^N |\hat{S}_{p_k} - s_k|
```

## 全体の損失関数
最後に、物体中心、オフセット、サイズの損失関数を重みづけして加算します。
```math
L_{det}=L_k + \lambda_{size}L_{size}+\lambda_{off}L_{off}
```
論文では、$\lambda_{size}=0.1$、$\lambda_{off}=1$としています。

# 実装の詳細
この論文では、特徴量抽出のためのbackboneとしては、ResNet-18,ResNet-101,DLA-34とHourglass-104を試しています。この紹介では、Hourglassを説明します。

## Hourglass
[Hourglass](https://arxiv.org/pdf/1603.06937)は、カスケード接続したencoder-decoderモデル(下図 Figure6 (a))で、キーポイント (=関節とか顔のランドマークとか固有の特徴を持つ小部位)推定に有効なモデルです。下図(a)の通り、CenterNetのHourglassはencoder-decoderが2セット接続しています。カスケード接続するモジュール(encoder-decoder)ごとで損失関数を計算した方がより性能が高まり、カスケードするごとにキーポイントの精度が高まることが[Hourglass](https://arxiv.org/pdf/1603.06937)の論文に報告されています。CenterNetでも2つの出力がhead部に接続しています。
![スクリーンショット 2024-07-22 15.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/daf7ccdc-4681-3cd0-7fe0-d9322bbb6ab5.png)

## 学習方法
* 入力解像度
512x512 (出力解像度:128x128)
* 前処理
ランダムに左右フリップ、拡大・縮小(60%〜130%)、クロッピング、カラージッタリング
* 最適化
Adam
* その他パラメータ(Hourglass版)
batchsize:29, 学習率：2.5e-4,50epoch(ただし40epochで1/10にする)

# 実験結果
本論文では、[MS COCO](https://cocodataset.org/#home)で評価した結果が報告されています。MS COCOには118k件のtrainデータ、5k件のvalidationデータ、20k件テストデータがあります。
検出結果の重なり率(IoU)が50%または75%を閾値として判定した時のAP($AP_{50},AP_{75}$)と50%〜95%を閾値として判定したAPの平均($AP$)を報告しています。

## 物体検出の結果
下に、Backboneネットワークの違いによる識別性能(AP)と処理時間(Time/FPS)を示します。
![スクリーンショット 2024-07-22 15.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/2784421c-0fc7-a34e-f8a2-8b3d8e4ea895.png)
Hourglass-104が最もAP値が高い一方、低速であることが分かります。
CenterNetと他の検出器(FasterRCNN,RetinaNet,YOLOv3)で、識別性能と処理時間のグラフを示します。なお、他の検出器は学習済みネットワークをダウンロードして、CenterNetと同じマシーンで実行したとあります。これを見ると、処理時間と識別性能のトレードオフで、CenterNetがベストな性能だと分かります。
<img width=500 align-items=center src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/46c2837f-b9f0-8c2e-b8c0-d513a9595e30.png>

次に細かく他の検出器との比較結果を見ていきます。
![スクリーンショット 2024-07-22 15.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/6f3b23be-48a0-a49f-320e-1343223e6594.png)
Backboneネットワークが同じで、head違いのネットワークと比較して、このCenterNetの有効性を見てみましょう。上の表のCornetNet、ExtremeNetとCenterNet-HGを比較すると、CenterNet-HGがAP値がよく、しかもFPSが高いことが分かります。著者によると、処理時間の低減の理由は、head部と検出枠の計算がシンプルになったためと説明しています。識別性能の改善の理由は、コーナー点や[Extreme点](https://arxiv.org/pdf/1901.08043)の検出より中心検出の方が容易のためと説明しています。

### 最新技術との比較
Deform-v2,SNIPER,PANet,TridentNet,FSAFと比較すると、CenterNetは識別性能は劣るのですが、処理速度は速いことがわかります。

## 追加の実験
* NMS
CenterNet(backbone:DLA-34)の出力処理にNMSを加えた実験で、APは39.2%から39.7%に改善し、CenterNet(backbone:Hourglass-104)では42.2%のままと報告がありました。そのため、NMSを使わないことにしたそうです。
* テストでの解像度の問題
学習時は解像度を512x512固定としています。テストでは、パディングして解像度を512x512や384x384にする場合と、元画像と同じままとした場合で比較すると、AP値は元画像の解像度の方が若干よく、処理時間は解像度の低い方が高速という結果でした(Table3 (a))。
* サイズ推定にはL1かsmoothL1か
CenterNetのサイズ推定に使われているL1ロスとsmoothL1ロスを比較した結果、L1ロスの方がかなりAP値が高い結果でした(Table3 (c))。スケール精度を高めることがCOCOの評価値を改善することに影響を与えたようです。中心オフセットの損失関数も同様だった、と報告がありました。
* 損失関数でのweight
損失関数のweightである$\lambda_{size}$は2倍にするとAP値が劣化する一方、1/５倍にしてもAP値は劣化してもあまり大きな差がないようです(Table3 (b))。他の損失関数のレンジが0〜1に対して、サイズはレンジが大きいためだそうです。
* 学習スケジュール
backboneがDLA-34の場合、140epochで学習し、90epochで学習率を下げるように学習しましたが、学習率を下げるまでを2倍とすると1.1ポイントAP値が改善しました(Table3 (d))。ただし、コストパフォーマンスの観点から基本的に140epochを採用しているそうです。

![スクリーンショット 2024-07-22 18.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882531/f19eaf36-dd78-360c-f98c-cf1e34ac79d7.png)

* アンカーの必要性
アンカーが必要性を評価して、CenterNetには不要と分かったそうです。

# 感想
CenterNetは、出力特徴量の解像度を高めたことによって、シンプルな構成を維持しつつ、識別性能と処理時間の良いバランスがとれた識別器だと思います。