深層学習 day4

#目次
[1.強化学習](#1-強化学習)
[2.Alfa Go](#2-alfa-go)
[3.軽量化・高速化技術](#3-軽量化高速化技術)
[4.応用技術](#4-応用技術)
[5.Transfomer](#5-transformer)
[6.物体検知とSS](#6-物体検知とss)

#1. 強化学習
報酬を最大化するような行動選択を学習。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b81faecc-3b2b-bfef-7caf-edfe6fcb7935.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/ce32af1a-f628-db11-4cf0-8ea68b67e26d.png)

##探索と利用のトレードオフ
過去のデータからベストと考えられる行動のみ取り続けると、より良い行動を見つけることができない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/6a3926b8-29fc-523c-dc48-6c39ffde952b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/f94d4082-7678-e988-52e9-6348474ca3e0.png)

Q学習
・行動価値関数を、行動する毎に更新することにより学習を進める方法

関数近似法
・価値関数や方策関数を関数近似する手法のこと

##価値関数
状態価値関数と行動価値関数の2種類がある。Q学習では行動価値関数を利用する。
状態価値関数は状態sから価値が決定する。一方、行動価値関数は行動aと状態sから価値が決定する。

##方策関数
どのような行動をとるか決めるための関数。方策関数の結果に基づき、行動を行う。

方策関数 $\pi(s)=a $
状態価値関数 $V^{\pi}(s)$
行動価値関数 $Q^{\pi}(s, a)$

状態価値関数、行動価値関数はゴールまで今の方策を取り続けた場合の報酬の予測値が得られる。

##方策勾配法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/06edde4a-ee66-dddb-5c74-6d69ffe2c2e9.png)
$\theta$は重みパラメータを意味する。$J(\theta)$は期待報酬を表す。$\epsilon$は学習率。報酬が大きくなるようにするため、式中で和+を取っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/fda26987-5faa-e199-895a-370b9e403aa0.png)
上図の$\pi_{\theta}(a|s)Q^{\pi}(s, a)$は、ある行動をとるときの確率$\pi_{\theta}(a|s)$とそのときの報酬$Q^{\pi}(s, a)$を乗算することで、ある行動aをとったときの報酬を表す。これを行動aについて和を取ると、報酬の期待値となる。
複雑な式変形をすると白抜きの式となる。

#2. Alfa Go
## Alfa Go Lee
PolicyNetで各マスに碁を打つべき確率を計算。ValueNetで19×19の盤面を入力し、局面を-1～1で評価。両方とも畳み込みが用いられる。盤面を色んな方向から評価した情報が入力チャネルとして用いられる。

AlfaGoLeeの学習は以下のステップで行われる。
1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
2. 強化学習によるPolicyNetの学習
3. 強化学習によるValueNetの学習

RolloutPolicyとはPolicyNetに比べ精度は落ちるが、より高速に計算が可能なモデル。

ステップ１の教師あり学習では、棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った。具体的には、教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習した。

ステップ2のPolicyNetの強化学習では、PolicyPoolと呼ばれる複数の学習途上にあるPolicyNetが入ったプールからランダムに学習途上のPolicyNetを選択し、選択されたPolicyNetと学習させたいPolicyNetで対局シミュレーションを行い、方策勾配法で学習を行う。

ステップ3のValueNetの強化学習では、PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習する。教師データ作成の手順は
1. SL PolicyNet(教師あり学習で作成したPolicyNet)でN手まで打つ。
2. N+1手目の手をランダムに選択し、その手で進めた局面をS（N+1）とする。
3. S（N+1）からRLPolicyNet（強化学習で作成したPolicyNet）で終局まで打ち、その勝敗報酬をRとする。S(N+1）とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習。

### モンテカルロ木探索
コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法。他のボードゲームではminmax探索やその派生形のαβ探索を使うことが多いが、盤面の価値や勝率予想値が必要となる。しかし囲碁では盤面の価値や勝率予想値を出すのが困難であるとされてきた。そこで、盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発想で生まれた探索法である。囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい。具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。また、該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる。この探索木の成長を行うというのがモンテカルロ木探索の優れているところである。モンテカルロ木探索はこの木の成長を行うことによって、一定条件下において探索結果は最善手を返すということが理論的に証明されている。

##Alfa Go Zero
1. 教師あり学習を一切行わず、強化学習のみで作成
2. 特徴入力からヒューリスティックな要素(人間が決めた特徴入力)を排除し、石の配置のみにした
3. PolicyNetとValueNetを１つのネットワークに統合した
4. Residual Net（後述）を導入した
5. モンテカルロ木探索からRollOutシミュレーションをなくした

PolicyNetとValuneNetの入力を同一として、出力を2つにわけている。ResidualBlockが39個連なっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/af82ba9c-8ed0-dd49-695c-495b2a287673.png)

### ResidualBlock
ネットワークが深くなると勾配消失が起きるので防ぎたい。そこでネットワークにショートカットを追加。ショートカットによりネットワークが複数あることになり、アンサンブル効果がでる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/004f846f-1075-e015-5926-8c93ee7b1cde.png)

Alfa Go ZeroのResidualBlockでは以下の工夫が行われている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/ff5b0b31-db45-c97c-3713-07a9c241e328.png)


#3. 軽量化・高速化技術
モデル並列・データ並列・GPUにより、モデルの学習を高速化する。量子化・蒸留・プルーニングにより、モデルを軽量化して処理能力の低い装置でも深層学習モデルを利用できるようにする。

コンピュータの性能向上より、深層学習のモデルの複雑化のほうが早い。複数の計算資源を使用して、並列的に計算を行いたい。

##3.1 データ並列
ワーカー ＝ 計算機。ワーカー1：CPU、ワーカー2：GPUといった形で割り当てる。
・親モデルを各ワーカーに子モデルとしてコピー
・データを分割し、各ワーカーごとに計算させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/22a15a7e-e566-256e-00b1-eb161059924f.png)

### 同期型
同期型のパラメータ更新の流れ。各ワーカーが計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する。更新した親モデルを再度子モデルとして各ワーカーにコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/050e08de-f62c-56c3-2db3-1b9717ee1cf5.png)

### 非同期型
非同期型のパラメータ更新の流れ。各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。学習が終わった子モデルはパラメータサーバにPushされる。新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習していく。同期型と比べ、非同期型の方が早い。ただ、非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。現在は同期型の方が精度が良いことが多いので、主流となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/08e495bf-ec3f-e185-39d2-a01685259c98.png)

##3.2 モデル並列
・親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で、一つのモデルに復元。
・モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/d1638034-86e0-d675-36c5-0ccc0b9f351a.png)

層の間ででわけるだけでなく下記のように分割することも可能 ＝ 分岐した部分のニューラルネットだけ取り出して学習することが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/7d692686-d6a2-240e-09d2-9d47f055f414.png)

モデルのパラメータ数が多いほど、スピードアップの効率も向上する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/165bf9b1-d8cd-682d-01eb-56065ef4639c.png)
※Speedupは1台の計算機での時間を1としている

##3.3 GPU
####GPGPU (General-purpose on GPU)
・元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称

####CPU
・高性能なコアが少数•複雑で連続的な処理が得意

####GPU
・比較的低性能なコアが多数
・簡単な並列処理が得意
・ニューラルネットの学習は単純な行列演算が多いので、高速化が可能

###開発環境
####CUDA
・GPU上で並列コンピューティングを行うためのプラットフォーム
・NVIDIA社が開発しているGPUのみで使用可能。
・Deep Learning用に提供されているので、使いやすい

####OpenCL (あまり使われてない)
・オープンな並列コンピューティングのプラットフォーム
・NVIDIA社以外の会社(Intel, AMD, ARMなど)のGPUからでも使用可能。
・Deep Learning用の計算に特化しているわけではない。
・Deep Learningフレームワーク(Tensorflow, Pytorch)内で実装されているので、使用する際は指定すれば良い


##3.4 量子化
深層学習では重みの保存に大量のメモリを消費。パラメータの64 bit 浮動小数点を32 bit など下位の精度に落とすことでメモリと演算処理の削減を行う。利点は計算の高速化、省メモリ化。一方、欠点は精度の低下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/1da9da67-1ab5-b34e-57e9-216e59f31b6e.png)

倍精度(64bit)と比べ、単精度(32bit)は倍の計算速度になる。単精度は小数の有効桁数が小さくなるが、64bitでも32ビットでも精度はほぼ変わらないことが知られている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/baaecb22-23c4-8ba6-354e-8abba66b78cd.png)

半精度(16bit)の場合には、整数に割り当てる領域を増やして大きな値を表現できるようにしたりする。例：bfloat16
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/19df0df5-107f-34e3-b31c-bb7b58c4def6.png)

##3.5 蒸留
学習済みの精度の高いモデルの知識を軽量なモデルへ継承。蒸留は教師モデルと生徒モデルの2つで構成される。教師モデルは予測精度の高い、複雑なモデルやアンサンブルされたモデル。生徒モデルは教師モデルをもとに作られる軽量なモデル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c68e9260-c3b7-a541-1fa9-64d8f9781685.png)

教師モデルと生徒モデルの出力の誤差をもとに、生徒モデルの重みを更新。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5095883e-f5ca-95ee-7b86-c0602ce5a67b.png)

通常学習時(赤)よりも蒸留(青)の方が精度が高い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/01db18ee-9b14-fa60-28aa-983b567c0ff4.png)

##3.6 プルーニング
ネットワークが大きいと大量のパラメータが存在するが、すべてのパラメータが計算に寄与しているわけではない。そこで精度に寄与の少ないパラメータを削減し、モデルを軽量化する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c65b7a8b-9493-74e8-b175-2a635423c797.png)

重みが閾値以下であればパラメータを削除して再学習する。下記の例は重みが1以下のパラメータを削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/a46ccaf3-562d-483e-abe0-035d054ab088.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/3cf0a6bb-4bcf-ee02-e70a-8073ea9a9a30.png)


#4. 応用技術
##4.1 Mobile Net
軽量化のため、Mobile Netでは畳み込みの演算を工夫している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/7465f2b2-65f5-9d0f-f8ae-cbc175ea06fc.png)

###Depthwise Convolution
・フィルタ数が1つだけ
・赤青緑を合成した入力は除く
以上により、計算量を削減
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b05954bc-f0d2-8504-4e6d-a151713cc0e4.png)

##Pointwise Convolution
・フィルタサイズが1×1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/4df2e885-5d38-27e2-2c97-e672962d1657.png)

##MobileNet
Depthwise Convolution、Pointwise Convolutionの順で実施。計算量を削減。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/be9f9f8a-abc4-25af-4b6b-e678880f1e9f.png)

##4.2 Dense Net
全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c959574a-6334-6a63-8531-caf04bcf9889.png)

Dense Block概要
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/50b774ba-119b-7a28-65c2-ddfc62244dba.png">

Dense Block1の3つ目の●を表したのが下図。●を1つ経るごとに出力がKチャネルずつ増えていく。
・Kをネットワークのgrowth rateと呼ぶ
・Kが大きくなるほどネットワークが大きくなるため、小さな整数に設定するのがよい
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/96ea7615-c123-30c0-226b-c920ca669390.png">

Transition Layer
Dense Blockでチャネルが追加されるため、Transition layerでチャネル数を減らしてもとに戻す。
Dense Block2ではDense Block1での入力と同じチャネル数になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/0ba6d65f-1168-24b3-9309-cb6e3730b052.png)

ResNetでもスキップコネクションがあった。DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられるのに対し、RessidualBlockでは前1層の入力のみ後方の層へ入力。DenseBlockではGrowth Rateと呼ばれるハイパーパラメータが存在する。
DenseBlock
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/511b4f6f-d3ba-f770-0aaf-dd9499d06174.png">
スキップコネクション(ResNet)
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/4ab30431-3a18-8b15-3f8e-ec5de0228c76.png">

##4.3 Batch Norm
レイヤー間を流れるデータの分布を、ミニバッチ単位で平均が0・分散が1になるように正規化。学習時間の短縮や初期値への依存低減、過学習の抑制など効果がある。Batch Normの問題点として、Batch Sizeが小さい条件下では学習が収束しないことがあり、代わりにLayer Normalizationなどの正規化手法が使われることが多い
ミニバッチがやっかい。CPUではメモリが潤沢にあるのでミニバッチが大きくても大丈夫だが、GPUではメモリが足りずミニバッチサイズを小さくしなければいけないため、実際には使いづらい。

下図の箱は、6チャネルの画像が6枚分(バッチサイズ)並んでいるところを表している。青い部分が正規化を行う箇所。
**Batch Norm**
ある1つのチャネルで、ミニバッチのすべての画像に対して、平均0・分散1となるように正規化
Batch Normだけミニバッチのサイズが小さい場合には正規化の効果が薄れる➡使い勝手わるい
**Layer Norm**
ある1つの画像における全てのピクセルが平均0・分散1となるように正規化
入力データを倍にしたりしてもLayer Normによって出力が変わらない➡Layer Norm使用により、入力データが倍になるといったスケールに対して堅牢(ロバスト)
**Instance Norm**
ある1つの画像におけるあるチャネルの全ピクセルが平均0・分散1となるように正規化（各々の画像の各チャネルで正規化）
コントラストの正規化に寄与。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/7850803d-b812-367d-bf07-cfd8c345bd2e.png)

##4.4 Wave Net
音声などの時系列データでも畳み込みを適用できる。既存の時系列データ畳み込みでは(下図左)、入力層の5つの青丸から中間層1層目の4つの白丸になるよう畳み込みを行い、中間層を経るごとに畳み込み演算を行っている。Wave Netでの畳み込みでは(下図右)、飛ばし飛ばしに畳み込みを行うことで時間的に幅広いデータを用いながら、計算負荷を減らすことができる。これをDilated Causal Convolutionと呼ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/de60555f-0f6f-c23b-6310-e292f381d1eb.png)

#5. Transformer
TransformerはSeq2Seq(Encoder-Decoder)とAttentionからなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5b6b54f3-4d24-6f04-3ca1-ccacb14c14ce.png)

##5.1 Seq2Seq
・系列(Sequence)を入力として系列を出力するもの
・Encoder-Decoderモデルとも呼ばれる
・入力系列がEncode(内部状態に変換)され、内部状態からDecode(系列に変換)する
・実応用上も、入力・出力共に系列情報なものは多い
例： 翻訳 (英語→日本語)、音声認識 (波形→テキスト)、 チャットボット (テキスト→テキスト)

### RNN
再帰的ニューラルネットワークのこと。以下のような再帰的な構造を持つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/45a75a21-7d6a-d96d-d22d-e46a045968dc.png)
上のRNNを展開すると、以下のようになる。言語の系列を入力して、最後に出力されるベクトルを内部状態ベクトルという。内部状態ベクトルは言語の系列情報を圧縮したベクトルと考えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/e03882d5-c471-7607-f7d1-f2db9ae80d0a.png)

### 言語モデル
・単語の並びに対して尤度(それがどれだけ起こり得るか)、
・すなわち、文章として自然かを確率で評価する
例) - You say goodbye → 0.092 (自然) 
　　- You say good die → 0.00000032 (不自然)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/96714409-bf75-2c41-adcf-c7253a9fb525.png)

時刻t-1までの情報で、時刻tの事後確率を求めることが目標 
→これで同時確率が計算できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b5710894-e0fb-6955-cad2-3c6962ff2119.png)

### Seq2Seq
RNNのモデルを2つ並べたモデル。1つ目のRNNはEncoderとして働き、言語の入力系列から内部状態ベクトルを作る。2つ目はDecoderとして働き、内部状態ベクトルから言語の出力系列を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/eda024fb-54eb-8c80-0a02-539bd4540fe2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/a8cea044-2574-4b4a-541c-c52dc957ac85.png)

## 5.2 Transofomer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/6b581ee3-9a05-accf-39c5-29fe972fc635.png)

文章が長くなった時に、何に注意を払うべきで、何に注意を払わないべきかを決定する学習機構が必要になる。
それがAttention。リカレントネットワークからの出力$h_j$に対して、$\alpha_{ij}$で重み付けする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/815c689f-0aab-88bf-57bb-5c569bd0a39f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/68543695-39eb-5f82-9688-869ab2c9da38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/a713e3eb-6d3c-b5b6-ea5e-95e254a10b3e.png)


### Transformer構造
大きくEncoderとDecoderに分かれる。
主要なモジュールは4つ。RNNを使っていないため文字の位置情報を保存できない。なので、①で単語の位置を追加。②でAttentionがかかって、③で全結合。次はDecoderで、未来の系列も含めすべて入力してしまうため、④未来の単語をマスクする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/8090a477-d6f3-513b-8d9c-c7b3dd140ec5.png)

Self attentionでは入力だけで、どの単語に注目を払うべきか決めてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/45fe9b49-6a3c-e403-c392-7f1cd6efabab.png)

バナナからクエリ$q_1$と、Key $k_1$、Value $v_1$を作る。$q_1$と$k_1$の内積を求める。同様に$k_2$、$k_3$、$v_2$、$v_3$から$q_1 ・v_2$と$q_1 ・v_3$を求め、バナナという単語の内部状態ベクトル$Z_1 = 0.3 v_1 + 0.5 v_2 + 0.2 v_3$を計算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/231f5555-47f0-10e7-ccec-4173e63d5136.png)

DecoderでMulti-Headh attentionが2つ使われているのは、Source Target AttentionとSelf-Attentionの両方が使われているため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/6ed65777-f0e6-1869-dfad-4978dccf9097.png)



#6. 物体検知とSS

### 物体検知の概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/f645c5aa-284b-63db-7076-a44c374eaab2.png)

## データセット
代表的なデータセットで精度評価を行う。データセットごとの特性を理解して、学習の評価を正しく行えるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/2a946179-bd41-8ae0-5707-e6484fc5287a.png)

## 評価指標

クラスラベル判定の閾値を変化させることで、検出結果が変化。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/9e8503c9-04ed-2586-0ff7-cda78ef8b45a.png)

クラスラベルだけでなく、物体位置の予測精度も評価する場合には、IoUを利用する。
真に正しい画像領域と機械学習モデルが提案した画像領域の結合を分母とし、双方の重なりあった部分を分子とする。
真に正しい画像領域と機械学習モデルが提案した画像領域があまり一致していない ➡ 結合領域が大きくなり分母が大きくなる & 重なりあう領域が小さくなり分子が小さくなる ⇒ 精度が低い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b847dbc1-ef01-4afe-7156-e11a5f3bc9a1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/de3cca27-a260-d087-97f7-bb620f2dfacd.png)

PrecisionとRecallに関する例題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/96bb10cb-5909-9e99-4eae-6b9bdb036931.png)

### Average Precision
Confidenceの閾値を変更しながら、PrecisionとRecallの値を計算。そうすると、PrecisionとRecallのセットからPrecision-Recall curveを描くことができる。つまり、Recallの関数としてPrecisionを次のように記述できる。

$P = f(R)$

このとき、Average Precisionは以下と定義される。

$Average Precision = \int P(R) dR  $ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/8f51d5f8-1695-851f-738e-fbd8f3422ad7.png)

mean Average Precisionは以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b70f57fb-3133-7ba8-8cfe-73ef18620e70.png)

物体検知では速度が求められることがある。例）自動運転など。
⇒ FPS (Flames per Second)
以下はモデルごとの比較。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/257d4573-9668-34e8-ca6b-668c65b7c4a8.png)

## 物体検知の大枠
物体検知のフレームワークは大きく2つにわけられる。
2段階検出器と1段階検出器。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/3b4dbc71-3e64-2b4b-e16f-a4d817afde5a.png)

2段階検出器は物体の位置を切り出して、そこに何があるかを推定する。
1段階検出器は物体の位置の切り出しと、何があるかの推定を同時に行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/770e5ef1-ac50-d296-dd62-e18cd1965e66.png)

## SSD
### Single Shot Detectorのアルゴリズム概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/6d190902-c770-c673-4e5d-3f55ed6ef389.png)

### SSDのネットワークアーキテクチャ
VGG16を基本として、変更が加えられている。
VGG16との違いは以下画像で注釈が加えられている点。特に異なるサイズの特徴マップを出力している点に注目。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/eedc560a-e8f4-5eed-e46b-d71e34e02005.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/bb1d02c6-2f46-9384-83e4-24bac2e45778.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/2e34ba26-ee1a-afa3-8897-5eb033034ca0.png)

出力に関与するSSDの特徴マップの数は6つ（青3つ、赤3つ）。青の特徴マップはDefault Boxの数が各特徴ごとに4つ。赤の特徴マップは各特徴毎に6つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5ff64247-6674-29d8-c090-bfdebde395cc.png)

多数のDefault Boxを用意したことで、「人」を切り出すバウンディングボックスが複数ある。
⇒ IoUが0.3以上でその中で最もコンフィデンスの大きいものを残す (Non-Maximum Suppression)

「背景」を切り出すバウンディングボックスが多くなりがち。
⇒「背景」を切り出すバウンディングボックスの数を、「非背景」を切り出すバウンディングボックスの数の3倍まで、というルールを設けることで情報量を減らす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5f457eda-97bc-48c1-31fa-813a3565411a.png)

損失関数では、コンフィデンスだけでなく、位置に対する損失も計算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/97a4e83a-399d-cd68-7e3d-cce491d6c120.png)

## セマンティックセグメンテーション
セマンティックセグメンテーションでは入力画像と同じサイズの出力画像の各ピクセルにクラス分類を行う。
⇒アップサンプリングをいかに行うかが肝となる

アップサンプリングの手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/4c54f7d5-33f3-d723-9114-fc79497b54d7.png)

プーリングにより輪郭が失われてしまう。
⇒ 以下のように輪郭情報の保管を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/6848d27d-cd18-dd7e-2c8f-89d260e0c43f.png)

U-Netでは、アップサンプリングにスキップコネクションを加えることで元の解像度に戻す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/e6c60583-45aa-486b-6405-247bf5e89f25.png)

アップサンプリングには、Deconvolutionだけでなく、Unpoolingもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/9b443938-067c-bd4d-22af-92588f361ce6.png)

カーネルの間隔を空けることで、受容野を広くとって畳み込みを行う。
⇒ Dilated Convolution
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/fb0e1738-d9af-c46c-0b7a-89214f972d19.png)