超解像化(ESRGAN)と物体検出(DETR)を組み合わせたハイビジョン物体検出

# はじめに

物体検出の最新モデルであるDETRとGANを用いた超解像化のESRGANの二つを組み合わせて、物体検出を行います。

以下、オリジナルの動画です。

![origin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/dddb2663-cd5f-28ed-5152-607dfd7fc9c1.gif)

レポジトリはこちらです。

https://github.com/sugiyama404/ObjectDetection

## 動画について

youtube8mの動画を再編集して使用しています。

https://research.google.com/youtube8m/

引用している動画

https://www.youtube.com/watch?v=9CiP6ANtiJg&list=WL&index=5

### 動画のライセンス

以下のライセンスに従っています。

https://creativecommons.org/licenses/by/4.0/deed.ja


# 物体検出(DETR)[^1]

DETR(End-to-End Object Detection with Transformers)は、Transformerを使った初めての物体検出です。

以下の図のように、transformerを使わなかった場合は、複雑な機能付けを必要としていましたが、transformerを使ったことで極めてシンプルかつ、「End-to-End」構造を持ち、DETRに画像を入力だけで、物体検出が行えます。

![Screen Shot 2021-12-06 at 17.25.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/706a1615-2d80-db96-4846-cd451445c67f.png)


引用: [End-to-end object detection with Transformers](https://ai.facebook.com/blog/end-to-end-object-detection-with-transformers/)

## DETRのアーキテクチャ

![Screen Shot 2021-12-06 at 10.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/947b9048-7238-85a5-49db-a782fcfa7f28.png)

物体検出の流れは以下の通りです。
①backbone層
CNNで畳み込みを行い特徴量を次元dに圧縮する。

②encoder層
backbone層に位置情報(positional encoding)を付与し、transformer encoderでエンコードしdecoder層に渡す。

③decoder層
encoder層と(学習パラメータ：object queries)(N個)が入力、N個の特徴量が出力

④prediction heads層
FNN(全結合層)により、物体の位置座標とクラスをデコードする。N個のオブジェクト推論(class,box)が出力される。


encoder層とdecoder層のtransformerの図に関して下記のようになります。

![Screen Shot 2021-12-06 at 16.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/3c70b818-fa69-53d0-e3fc-1e0701148c71.png)


## 実装と結果

実装は以下のファイルにあります。

https://github.com/sugiyama404/ObjectDetection/blob/main/DETR.ipynb

結果は以下の通りです。

![detr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/63d2b2b8-dfbc-1b68-401f-3a1d6cad32d8.gif)

実装に当たりチュートリアルを参考にしました。

https://colab.research.google.com/github/facebookresearch/detr/blob/colab/notebooks/detr_demo.ipynb


# 超解像度(ESRGAN)[^2]

ESRGANは、超解像度の基本モデルであるSRResNetをブラシュアップモデル。

## SRResNet/SRGANの基本アーキテクチャ

![Screen Shot 2021-12-06 at 14.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/93f3d885-3bd8-8b68-3e60-d7328882e4f4.png)

SRResNetからESRGAN変更点は以下の通りです。

## バッチ正規化（BatchNormalization層）が削除

### 一般的なResidualNetwork(AlphaZeroモデルを参考)

![alphago_arch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/347092f4-4134-9352-ddfe-9b0655a9ab53.png)

引用: [AlphaZero Explained](https://nikcheerla.github.io/deeplearningschool/)

一般的なResidualNetworkでは、畳み込み層→バッチ正規化→活性化を行います。ESRGANでは、畳み込み層→活性化→畳み込み層に変更しました。バッチ正規化を削除することで、計算の簡略化に成功しパフォーマンスが向上したからです。

![Screen Shot 2021-12-06 at 14.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/8c8ce114-2ab5-bb07-ed34-b4d923646220.png)

## Residual Block を Residual in Residual Dense Block（RRDB)に変更

一般的なResidualNetworkのようにインプット層をブロックの最後に他の層と足し算するのではなく、結合することで、ネットワーク自体を深くすることに変更しました(Residual in Residual Dense Block)。


## 実装と結果

実装は以下のファイルにあります。

https://github.com/sugiyama404/ObjectDetection/blob/main/ESRGAN.ipynb

結果は以下の通りです。

![detr_esrgan.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/caa4724b-5415-23d0-744d-090e94e778b9.gif)

コーディングにあたりチュートリアルを参考にしました。

https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ja/hub/tutorials/image_enhancing.ipynb


ライセンスの使用はAPACHE LICENSE, VERSION 2.0に準拠しています。

http://www.apache.org/licenses/LICENSE-2.0


[^1]: Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. End-to-End Object Detection with Transformers. ArXiv, abs/2005.12872. 2020.

[^2]: Xintao Wang, Ke Yu, Shixiang Wu, Jinjin Gu, Yihao Liu, Chao Dong, Chen Change Loy, Yu Qiao, Xiaoou Tang. ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks. ArXiv, abs/1809.00219. 2018.