論文：Self-supervised Prototype Conditional Few-Shot Object Detection

## Info

- タイトル：Self-supervised Prototype Conditional Few-Shot Object Detection
- カンファ：ICIAP2021
- 著者：Daisuke Kobayashi
- 論文：https://link.springer.com/chapter/10.1007/978-3-031-06430-2_57
- プレス：https://www.global.toshiba/jp/technology/corporate/rdc/rd/topics/22/2205-02.html

## 概要

- ファインチューニングを行わずに新しいカテゴリに適応できる手法を提案。
- 各カテゴリーのプロトタイプベクトルで条件付ける検出モジュールを使用。
- 自己教師付き条件付き検出モジュールを使用して、画像変換前後の同一領域を検出する自己教師付きタスクにより、新しいカテゴリを検出するための表現力を向上。
- PASCALVOCとMS COCOを用いた広範な実験の結果、提案手法の有効性が確認された。

## 背景
- 従来のディープラーニングを用いた物体検出手法は、学習に大量のアノテーションが必要であり、そのようなデータセットを作成するにはコストがかかる。
- わずかなデータ量で新しいカテゴリを検出する手法として、Few-shot Object Detection (FSOD) がある。
- FSODの従来手法にはメタ学習やファインチューニングに基づく手法があるが、組み込みシステムでは計算リソースに乏しくファインチューニングでさえ学習は厳しい。またファインチューニングを行うモデルの表現力が十分かも分からない。
- 本論文では自己教師付きプロトタイプ条件付き検出アプローチ(SPCD)を開発し、微調整なしに新規カテゴリに適応できるようにした。また、データ不足に対応するため、背景領域からも特徴を抽出する自己教師付きアプローチにより、検出性能を向上させることができた。


## 手法

### ネットワーク全体

次のような問題設定を考える。まず、アノテーションを持つ大規模で豊富なベースデータセット$D_{\mathrm{base}}$ に対して物体検出の知識を獲得し、次に少数の新規サポートデータセット$D_{\mathrm{novel}}$ を用いて新規カテゴリにネットワークを適応させる。サポートデータセット中のベースカテゴリ$C_{\mathrm{base}}$と新規カテゴリ$C_{\mathrm{novel}}$は重複しないようにする。

<img width=800 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/3411bbf9-33f7-4525-4352-f22209fa0d96.png" />

SPCDはFaster-RCNNをベースとしつつ、図に示すようにPCPM（PrototypeConditional Prediction Module）とSCPM（Self-Supervised Conditional Pre-diction Module）から構成される。

PCPMでは、Faster-RCNNのRCNN Headに埋め込みを出力する層を追加し、物体カテゴリごとにプロトタイプを作成する。RCNNでは、カテゴリごとにプロトタイプから生成した動的パラメータを用いて、条件付きでボックス回帰と分類を実行する。このため、プロトタイプを用意するだけで、簡単に新しいカテゴリを追加することができる。

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/8d033d6f-71dd-1865-4cc6-fb6fd054f911.png" />

しかし、図に示すように、ベースカテゴリ以外のカテゴリはネガティブとなるため、新規カテゴリを識別するには表現力が不十分である。そこで、ベースカテゴリ以外の領域から矩形領域を抽出し、自己教師付きで画像変換前後の同じ領域を検出するようにネットワークを学習させることで、表現力を向上させる。

### PCPMモジュール

<img width=800 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/786531cb-6e9c-3687-b0d6-73edc976136f.png" />

↑Faster-RCNNのネットワーク。[こちら](https://jonathan-hui.medium.com/image-segmentation-with-mask-r-cnn-ebe6d793272)から引用。

従来のRCNNのHeadに埋め込みhead追加し、ROIAlignで切り出した特徴量を変換して埋め込み表現を得る。各カテゴリの埋め込み表現をメモリに保存してプロトタイプベクトルとする。プロトライプベクトルは指数移動平均(EMA)を用いて学習の過程で更新する。損失関数は、埋め込み表現$x$が既存のプロトタイプ$p$に近づくように交差エントロピーを使用する。

```math
L_{\mathrm{embd}} = -\frac{1}{N}\sum_{i=1}^N P(x)\log P(p), \ \mathrm{where} \ P(x)=\mathrm{softmax(x)}
```
boxのクラス分類は、埋め込み表現とプロトタイプベクトルとの類似度を使用する。

```math
\mathrm{Sim}(\boldsymbol{x}, \boldsymbol{p}) = \alpha \frac{\boldsymbol{x}^\top \boldsymbol{p}}{|\boldsymbol{x}||\boldsymbol{p}|}
```
$\alpha$は学習で決定するスケール因子である。

Box回帰はROI Alignで切り出したfeatureと、メモリに保管されているプロトタイプベクトルを組み合わせることで、条件付けされた回帰を行っているらしいが、論文中には詳しい記述はない。

### SCPMモジュール

SCPMでは、ベースカテゴリ以外の領域を用いて未知のカテゴリに対応することで、モデルの表現力を向上させる。具体的には、水平反転や色変換などの画像変換に対して、Selective Search によりベースカテゴリ以外の領域から矩形を生成し、ROIAlign により埋込みを行う。これらをプロトタイプとみなし、PCPMと同様にプロトタイプを条件として、画像変換前の同一領域を検出するように学習する。

正確で安定した埋め込みを行うために、教師-生徒の相互学習を導入する。同じアーキテクチャのモデルが2つあり、生徒モデルと教師モデルである。学習開始時に、生徒モデルと教師モデルの両方がランダムに初期化される。生徒モデルの損失は、

```math
L_{\mathrm{all}} = L_{\mathrm{sup}} + L_{\mathrm{selfsup-cls}} + L_{\mathrm{selfsup-reg}} + L_{\mathrm{selfsup-embed}}
```

であり、$L_{\mathrm{sup}}$がラベルありデータに対する損失、$L_{\mathrm{selfsup-cls}}$、$L_{\mathrm{selfsup-reg}}$、$L_{\mathrm{selfsup-embed}}$が自己教師付きで生成されたデータに対する教師モデルの埋め込みを条件とした埋め込み損失である。

※ abeTコメント：Selective Search で作成した自己教師のクラス分類ってどうやってクラスラベルつけるのか。背景クラスにする？

## 評価
<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/898698a7-dbff-51e5-b240-0cfda2e9723c.png" />

PASCALおよびCOCOで良い結果を出している。

### アブレーションスタディ

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/580fa953-9637-d1ec-85e5-f6f6190369e8.png" />

アブレーションスタディの結果を見ると、自己教師あり学習で表現力を高めることが重要のよう。

## まとめ・感想

- プロトタイプベクトルで条件付ける部分が記載されておらず、プロトタイプベクトルをどのように使用しているのか明確でない部分が残念。
- 自己教師あり学習も説明が大雑把で分かりにくい。
- 実質メタラーニングだが、モデルの表現力を上げて新規カテゴリのプロトタイプも特徴的なベクトルにし、プロトタイプを活用して新規カテゴリに対応する考え方はStraightforward way of thinkingでとても気に入りました。