ラビットチャレンジ　深層学習　Day4 後半

###　ラビットチャレンジのレポートに関するリンクはこちら

[ラビットチャレンジ　応用数学](https://qiita.com/matsu0130/items/6ba0279485ef8904fffb)
[ラビットチャレンジ　機械学習](https://qiita.com/matsu0130/items/12d6ed23e4189fd494cd)
[ラビットチャレンジ　深層学習　Day1](https://qiita.com/matsu0130/items/fa36ff86aa24a3e05810)
[ラビットチャレンジ　深層学習　Day2](https://qiita.com/matsu0130/items/2afa699b2d008e6fe19a)
[ラビットチャレンジ　深層学習　Day3](https://qiita.com/matsu0130/items/adc56e82168f9f86c8ee)
[ラビットチャレンジ　深層学習　Day4前半](https://qiita.com/matsu0130/items/36b867605960e3ea9aca)
[ラビットチャレンジ　深層学習　Day4後半](https://qiita.com/matsu0130/items/68f32635b63f74dc723c)

## 1.物体検知
### 1.1.広義の物体認識タスク
![スクリーンショット 2021-07-11 17.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/15de0662-43bc-a76b-d015-4ec396617e4e.png)

### 1.2.物体検知タスクにおけるデータセット
![スクリーンショット 2021-07-11 17.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f778ba2d-fe60-6374-f2ee-37fb71f86511.png)

### 1.3.評価指標
![スクリーンショット 2021-07-11 18.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f946816f-f721-e842-9d1d-69f5dd8b9fcc.png)

#### 1.3.1.IoU（Intersection over Union）
**IoU**とは**予測領域がどれだけ正解領域と重なっているのか**を示す指標である。
IoUの最大値は１（正解領域と予測領域が一致している場合）。
IoUの最小値は０（正解領域と予測領域が全く重なっていない場合）。
![スクリーンショット 2021-07-11 20.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/511c9c1c-9cd7-5b21-d941-44b32f0f0d3d.png)
IoUは厳しい評価指標となっており、
同じ正方形を斜めに1/9ズラしただけでも、
IoUは81/118≒0.69になる（一辺の長さが10だった場合）。

#### 1.3.2.Precision/Recallの指標の見方
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/d5609bed-a914-0087-1a23-7b5d187ba7dc.png'>

#### 1.3.3.mAP(mean Average Precision)
クラス数がCの時
$$
mAP = \frac{1}{C}\sum_{i=1}^CAP_i
$$
【計算例】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/b159eb67-8836-db58-e1bd-87e735cc8816.png)

余談になるが、MS COCOはIoU閾値は0.5から0.95まで0.05刻みで
AP&mAPを計算し算術平均を計算した指標を用いている。
$$
mAP_{COCO} = \frac{mAP_{0.5} + mAP_{0.55} + \cdots + mAP_{0.95}}{10}
$$

#### 1.3.4.FPS(Flames per Second)
応用する上で検出精度に加え**検出速度**も問題となる
**Frame Pre Second**とは1秒あたりに何フレーム処理できるかという**処理速度を測る指標**である。
<img width='300' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/dbad2ac1-e566-e4f8-67ec-f921bae5c077.png'><img width='380' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/c80d17bd-3811-a182-d38a-89f4a402efca.png'>

### 1.4.物体検知のフレームワーク
#### 1.4.1.フレームワーク
物体検知のフレームワークは大きく分けて２種類ある。
【**1段階検出器**】　DetectorNet、YOLO、SSD、YOLO9000、RetinaNet、CornerNet
・候補領域の検出と**クラス推定を同時**に行う
・相対的に**精度が低い**
・相対的に計算量が小さく**推論も早い**傾向


【**2段階検出器**】　RCNN、SPPNet、Fast RCNN、Faster RCNN、RFCN、FPN、Mask RCNN
・候補領域の検出と**クラス推定を別々**に行う
・相対的に**精度が高い**傾向
・相対的に計算量が大きく**推論も遅い**傾向　

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/b181096a-c9e6-4ec7-ddb9-25f7a33fa520.png'>

#### 1.4.2.SSD(Single Shot Detector)
<img width='400' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f0bfbec6-336f-6f58-c612-b4b47a29cd02.png'>

SSDを説明するためにVGGを比較対象として見ていく。
下図がVGG16のネットワーク図である
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/999dc3f6-7841-8200-eefd-3161de6cd19e.png'>
一方でSSDのネットワークアーキテクチャは下図の通りとなっている。
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f979afa5-61f0-1401-b0e3-fcce960f9492.png'>

### 2.Transfomer
#### 2.1.Transfomerとは
ニューラル機械翻訳は**長文に対して精度が高くない**ことが問題点として挙げられていたが、
**Transformer**は**Attention機構**を用いることで**長文に対しても高い精度を出すことができる**。

<img width='400' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/13115d1b-ea61-7da8-314b-96e51553110e.png'>

また、**Transformer**は**RNN構造を使用せずにAttention技術から作られたもの**で、Attention機構だけでAttention付きのRNNに匹敵するパフォーマンスが得られることを明らかにした。

####2.2.Attention
**Attention機構**とは和訳で「注意機構」と呼ばれるもので、
翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用する手法のことである。
query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができるため、
辞書オブジェクトの機能と同じである。

<img width='400' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/5643caa0-db59-43c8-5f76-b9d90fe615a0.png'>

queryとKeyの内積はqueryと各Keyの類似度を測り、
softmaxで正規化したAttention Weightは、queryに一致したKeyの位置を表現する。
Attention wightとValueの内積はKeyの位置に対応するValueを加重和として取り出す操作である。

翻訳元の各単語の隠れ状態を加重平均
$$
C_i = \sum_{j=1}^{T_x}α_{ij}h_j
$$

重み（全て足すと1）はFFNN (FeedForward Neural Network)で求める
$$
a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}
$$

$$
e_{ij} = a(s_{i-1}, h_j)
$$

【メリット】
・現在のSoTAの多くがAttentionベースで**学習が速い**
・RNNは時刻tの計算が終わるまで時刻t+1の計算をできず、GPUをフルに使えないことがある。
一方で、Transformerは推論時の**Decoderを除いて、すべての時刻の計算を同時に行えるためGPUをフルに使いやすい**。
・RNNを使わないため比較的構造が単純。全結合と行列積くらい知っていれば理解できてしまう。

#### 2.3.Transfomer主要モジュール
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/067417cf-372f-7d6e-6c4d-b7dcfe1006a5.png'>

####2.4.Transfomer-Encoder
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/a937d30f-a925-369d-c00e-f65ef65f9375.png'>
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/e9d63c3a-f832-b560-ee8f-05ee4f10a0ee.png'>
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/fe15130b-2628-c85b-a576-2da6895e7308.png'>

###3.GAN(Generative Adversarial Nets)
####3.1.GANとは
**生成器（Generator）**と**識別機(Discriminator)**を競わせて学習する生成&識別モデル
Generator：乱数からデータを生成
Discriminator：入力データが真のデータ（学習データ）であるか識別

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/032425f3-3bd7-8ca0-0786-b3128d83d662.png'>


#### 3.2.GANの価値関数
GANでは価値関数Vに対し、**Dが最大化**、**Gが最小化**を行う

<img width='450' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/87dde03b-d809-4c1f-9baf-9c5786fb86a7.png'>

GANの価値関数はバイナリークロスエントロピーである。
$$
L=−\sum{y}\log{\hat{y}}+(1−y)\log{(1−\hat{y})}
$$
<img width='550' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/6f50f84d-0bd5-590f-3809-5708df8f08b0.png'>

#### 3.3.最適化方法
【Generatorのパラメータを固定】
真データと生成データをm個ずつサンプル
θdを**勾配上昇法で更新**
$$\frac{𝜕}{𝜕θ_d}\frac{1}{m}[log[D(x)]+log[1-D(G(z)]]$$

【Discriminatorのパラメータを固定】
真データと生成データをm個ずつサンプル
θgを**勾配降下法で更新**
$$\frac{𝜕}{𝜕θ_g}\frac{1}{m}[log[1-D(G(z)]]$$

#### 3.4.Generatorの生成アルゴリズム
生成データが真データとそっくりな状況とは
$$p_g=p_{data}$$
であるはず
価値関数が上記の時に最適化されていることを示せば良い。
<img width='450' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/e84a091d-7da8-8cba-b702-b94f87ad5498.png'>

２つのステップにより確認していく。
1) Gを固定し、価値関数が最大値を取るときのD(x)を算出
2) 上記のD(x)を価値関数に代入し、Gが価値関数の最小化する条件を算出

1）
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/3d071dc0-0eb1-acb4-246c-1083de19c3be.png'>

ここでalog(y)+blog(a-y)をyで微分

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/b9c98dae-31f5-7be0-aad1-79d3de66705a.png'>

2)
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/73ec6e76-8dc8-8e14-e8a9-1f8d8ffdfcf6.png'>

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/fbc43883-3b2e-1131-5a39-6f8418216f56.png'>

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/cb5859a1-8b0d-725e-9f4e-62eefd638965.png'>

### 4.DCGAN(Deep Convolutional GAN)
**DCGAN**とはGANを利用した画像生成モデルで、いくつかの構造制約により生成品質を向上。

【Generator】
・Pooling層の代わりに**転置畳み込み層を使用**
・**最終層はtanh**、**その他はReLU関数**で活性化

【Discriminator】
・Pooling層の代わりに**畳み込み層を使用**
・**Leaky ReLU関数**で活性化

【共通事項】
・**中間層に全結合層を使わない**
・**バッチノーマライゼーションを適用**