【論文理解】①Integrated Recognition, Localization and Detection using Convolutional Networks

# はじめに
<!-- 発端や概要を記載 -->

https://arxiv.org/pdf/1409.1556.pdf

Author：Karen Simonyan∗ & Andrew Zisserman+
Visual Geometry Group, Department of Engineering Science, University of Oxford

機械学習において、Fine-tuningされて多く用いられるVGGの論文。
keras/Tensorflow/pytorchなどでも学習済みモデルが公開されていたりします。
自己学習のまとめとして記事を作成しているので、間違いもあるかもしれませんので、訂正や指摘等いただければと思っています。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [ざっくり概要](#ざっくり概要)
1. [Introduction](#Introduction)
1. [ConvNet Configuration](#ConvNet Configuration)
1. [Classification Framework](#Classification Framework)
1. [Classification Experiments](#Classification Experiments)
1. [Conclusion](#Conclusion)
1. [Reference](#reference)

<!-- 各チャプター -->
<a id="#ざっくり概要"></a>
# ざっくり概要
- 大規模な画像認識において、畳み込みネットワークの深さが精度に与える影響を調査した。
- 本論文の特徴
    - 先行研究に比べて小さい畳み込みフィルタ(3x3)を用いた。
    - 層の深さを16-19層にすることで精度を大きく向上させた。
- このモデルでは、ISLVRCの分類・位置検出のタスクでSoTAを達成。
- 他のデータセットにも適用可能。  

※下図はVGG16のモデルです。
![VGG16](https://neurohive.io/wp-content/uploads/2018/11/vgg16-1-e1542731207177.png, "VGG16")

https://neurohive.io/en/popular-networks/vgg16/

画像引用元：[VGG16 – Convolutional Network for Classification and Detection](https://neurohive.io/en/popular-networks/vgg16/)

<a id="#Introduction"></a>
# Introduction
- 畳み込みネットワーク(ConvNets)は、画像・動画認識において大きな成功を収めている。これは、ImageNetのような大規模リポジトリやGPUのような高性能なシステムなどの発展によるものである。とりわけ重要な役割を果たしているのは、ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)である。ILSVRCは下記の記事が参考になります。

https://qiita.com/taki_tflare/items/40bd1313d85513b4b861

- ConvNetsにおいて、先行研究では小さいフィルタサイズやストライド数を用いたり、画像全体/マルチスケールで学習・評価を行うことで精度向上を図ってきた。本論文では、ネットワークの深さに焦点を当てた検証を行っている。また深さに焦点を当てた評価を行うため、ネットワーク構造は深さ以外は一定として、フィルタサイズは3x3としている。

- 結果として、精度を大幅に向上したConvNetのモデルを開発することができた。
    - このモデルでは、ISLVRCの分類・位置検出のタスクでSoTAを達成。
    - 他のデータセットにも適用可能。

※上記のモデルのうち最も性能の高い2つのモデルを公開している。

https://www.robots.ox.ac.uk/~vgg/research/very_deep/

<a id="#ConvNet Configuration"></a>
# ConvNet Configuration

- ConvNetの深さの効果のみを評価するため、基本構成は以下と同じものとしている。

[Flexible, High Performance Convolutional. Neural Networks for Image Classification.](https://people.idsia.ch//~juergen/ijcai2011.pdf)
[ImageNet Classification with Deep Convolutional Neural Networks](https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf)

###2.1-2.2 Architecture / Configurations
<details><summary>モデルの詳細</summary>
- 入力画像サイズ：224x224x3(RGB)
- 前処理：RGBの平均画素で全体を引き算
- 畳み込みフィルタサイズ：3x3
- ※Paddingを行い畳み込み後の画像サイズが変わらないようにしている。
- ストライド：1
- プーリング：MaxPooling(2x2)
- ※プーリングの総数は5層あり、すべての畳み込み層の後でプーリングしているわけではない。
- 活性化関数：Relu
- ※LRN正則化は1層を除き実施していない。この正則化は精度向上させるものではなく、メモリ消費量と計算時間の増加につながるため、削除している。1層あるLRNのパラメータは下記と同じとしている。
[ImageNet Classification with Deep Convolutional Neural Networks](https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf)
</details>

- 検証モデル
    - A-Eの5つのモデルを検証。A→Eの順に深いモデルとなる。
    - フィルタ数は64から始まり倍々に増やして512を上限としている。
    - モデル：畳み込み層→＊(ex:Aでは8)層 / FC層→3層。
    - 小さい畳み込み層を使っているため、層の深さにかかわらずパラメータ数はそれほど変わらない。(パラメータ数はAでは133M、Eでは144M)

※画像内の太字箇所が各モデルでの変更箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/55191b80-7ede-43da-298a-a25206e390c9.png)

###2.3 Discussion###
- 本論文の構造の特徴：フィルタサイズ・ストライド数が小さい
- 先行研究では11x11のフィルタ＋ストライド数4や7x7のフィルタ＋ストライド数2のように大きいサイズを用いていた。

- 小さいサイズのフィルタを使うメリットは下記2点としている
①決定関数の非線形性を高められる。
②パラメータ数が少なくて済む。

①同じ受容野のサイズを実現するのに必要な層数が増えるため、大きなサイズを使うのに比べて決定関数の非線形性を高められる。
- 5x5フィルタが1層：5x5の領域を青色の四角で一度に畳み込み活性化。
- 3x3フィルタが2層：1層目で青色の四角を畳み込んで活性化。その後にピンクの四角で畳み込んで活性化。
    - どちらも5x5の領域を見ているが、フィルタサイズが小さいものは活性化の処理が2回入る分非線形性が高まるという意味だと解釈。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/b36e0cf8-093a-d5c5-3d1d-0fc333b5fb36.png)

②パラメータ数が少なくて済む。
- パラメータ数
    - 7x7フィルタ1層：$ (7C)^2 = 49C^2 $
    - 3x3フィルタ3層：$3*(3C)^2 = 27C^2 $
となり7x7フィルタを使うよりもパラメータ数が少なく済む。

<a id="#Classification Framework"></a>
# Classification Framework

###3.1 Training###
- 学習はKrizhevsky(2012)に則っているが、マルチスケールの学習画像から入力をサンプリングすることは行っていない。
- 学習パラメータは以下である。
    - 多項ロジスティック回帰
    - Momentumのミニバッチ降下法
    - バッチサイズ：256 / Momentum：0.9
    - 正則化
        - 正則化には重み減衰を用いる。L2のペナルティ係数は$ 5*10^{(-4)} $としている。
        - 最初の2つのFC層ではDropout(Dropout率：0.5)によって正則化。
    - 学習
        - 学習係数：$ 1*10^{(-2)} $からスタート。Validationの精度が上がらなくなった時点で1/10にする。合計3回1/10の処理を行った。
        - エポック数：74回。イテレーション数：37万回
 
***
####重みの初期化について
- 重みの初期化は重要である。初期化がうまくいかないと学習が停滞してしまうなどの弊害がある。この懸念点を解消するため、浅いモデル(A)で学習。より深いモデルを学習する際には最初の4つの畳み込み層と3つのFC層はA層のパラメータで初期化している。中間層はランダムに初期化。
    - A層で初期化・ランダムに初期化したもののどちらも学習係数は1x10^-2からスタートした。
    - ランダムな初期化では、平均値0 / 分散10^-2となるように設定した。

***
####学習画像サイズ
- 入力画像サイズを(SxSx3)[S=224 or 384]とし、学習では下記2種類のアプローチを取っている。
- 画像の切り出しはイテレーションごとに1画像1回としている。
- データ拡張のため、水平方向の反転とランダムなRGBシフトを実施。
    - シングルスケールトレーニング
        - 画像の短辺サイズ = S'にリサイズして任意の場所でSxSx3で画像をサンプリングして訓練データとする。
    - マルチスケールトレーニング
        - サンプリングサイズを[Smin=256,Smax=512]とする。
        - 上記のままだと画像サイズがバラバラになるので、Sにリサイズして訓練データとする
        - サンプリングサイズが異なるので、様々な大きさで物体を学習できる点がメリット。
- 下図がそれぞれのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/99c4142c-1729-8338-d1e5-6bdd6da2eabb.png)

###3.2 Testing
- テストでは学習したConvNetと入力画像を用いて下記の方法で分類を行う。
    - 入力画像をテストスケールとして定めた最小サイズQでリスケールする。
    - ※この時Qは必ずしも学習時のSとは一致しない。
    - FC層は畳み込み層で置き換える。1層目のFC層は7x7の畳み込み層、残り2つのFC層は1x1の畳み込み層に置き換える。
    - 画像全体を上記のネットワークに入力すると、出力のパラメータは(*)x(*)x1000となる。
    - ※ネットワークすべてが畳み込み層で構成されているため、出力結果は1x1x1000ではなくあるサイズ(a)x(a)x1000となる。
    - 得られた出力[(a)x(a)x1000]を空間的に平均化して1x1x1000のクラスのスコアマップを得る。
    - 水平方向に反転した画像でも同じ処理を行い、最後にそれらを平均化して最終的な判定スコアを得る。

<a id="#Classification Experiments"></a>
# Classification Experiments
- データセットにはILSVRC-2012のものを用いた。
- クラス数は1000あり、トレーニング(1.3M)/評価(50K)/テスト(100K)の画像で構成されている。
- 分類のパフォーマンスはtop-1/top-5の2つの指標で評価した。
    - top-1：他クラス分類のエラー(誤分類された画像の割合)
    - top-5：ILSVRCで使用されている主な評価基準(正解クラスが予測クラスの上位5位に入らない画像の割合)

###4.1 Single Scale Evaluation
- 備考
    - Q＝S、Q=(Smin+Smax)/2の2パターンとしている。
    - LRNを用いたモデルと用いないモデルで差異がなかったため、試しに取り入れたAを除いてLRNは実装していない。
- シングルスケールの各モデルの評価結果
    - 分類エラーは層数が増えるほど低下している。
    - 同じ深さにもかかわらず、1x1の畳み込み層を3つ含むモデルCは、3x3の畳み込み層を使用するDよりも性能が悪くなった。
        - 層数が多いことによる非線形関数での表現力増加の効果はあるが、1x1畳み込み層では空間的な畳み込みがないためＤよりも精度が悪くなったと考察。
    - モデルBとモデルBの3x3フィルタ2枚を5x5フィルタ1枚に置き換えたモデル(B')とを比較している。
        - Bのモデルが高精度であった。B'のエラー率はBよりも7%程度高かった。
    - 同じ層数でもSmin ≦ S ≦ Smaxとしてサンプリング(スケールジッタリング)したモデルがSを固定したモデルよりも高精度であった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/c3fa7ec8-9827-cab5-1723-fa6bd011a9ca.png)

###4.2 Multi Scale Evaluation
- マルチスケールの各モデルの評価結果
    - Q ≠ Sのパターンも含めて精度を評価している。ただし、学習画像とテスト画像のスケールが違いすぎると精度が低下することを考慮して、下記のように条件を制約した。
    - 条件式：Q = {S-32, S, S+32}
    - 同一モデルでの比較において、テスト時にスケールをジッタリングすることで精度が向上することが分かった。
    - こちらでもやはり層が深いほど高精度となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/5cfacc2e-8f61-1627-33cc-f5f41478ef5c.png)

###4.3 Multi-Crop Evaluation
- 全層を畳み込み層に置き換えたモデル(α)と置き換えなかったモデル(β)、2つの出力を平均化した結果を比較
    - (β)が(α)よりも高精度な結果となった。また、平均化した結果が最もよいものとなった。
    - (β)>(α)となった理由
➡(α)：画像の全領域にわたって畳み込み / (β)：画像から何点かサンプリングしており、畳み込み条件の扱いが起因していると考察。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/2a0d44ce-66eb-95de-b68c-bf1ace1da6fe.png)

###4.4 ConvNet Fusion
- アンサンブルでの結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/73af27c6-cfe2-b5ab-9b85-f98d2aec7365.png)

###4.5 Comparison With The State Of The Art
- 本モデルとSoTAとの比較を行っている。
- 4.3での(α)(β)の平均を取るモデルのエラー率は6.8%であった。これはILSVRC2012/2013で最高の結果を出した前世代のモデルを大幅に上回っている。
- たった2つのモデルを組み合わせただけで上記の結果が得られたのは驚異的である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055322/3ceeafc1-a512-cdda-0edb-8fdaff718af9.png)

<a id="#Conclusion"></a>
# Conclusion
- 本研究では画像分類のための非常に深い畳み込みネットワークの評価を行った。
- モデルの深さは分類精度向上に大きく寄与し、認識領域における深さの重要性を改めて確認できた。

<a id="#reference"></a>
# 参考文献
- [VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION](https://arxiv.org/pdf/1409.1556.pdf)
- [VGG16 – Convolutional Network for Classification and Detection](https://neurohive.io/en/popular-networks/vgg16/)
- [ILSVRCとは何か？](https://qiita.com/taki_tflare/items/40bd1313d85513b4b861)
- [Very Deep Convolutional Networks for Large-Scale Visual Recognition](https://www.robots.ox.ac.uk/~vgg/research/very_deep/)
- [Flexible, High Performance Convolutional. Neural Networks for Image Classification.](https://people.idsia.ch//~juergen/ijcai2011.pdf)
- [ImageNet Classification with Deep Convolutional Neural Networks](https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf)