深層学習まとめ: 画像認識タスクと物体検知タスク

# 画像認識モデル

## ResNet (Residual Network)
- 中間層にSkip connectionを持つ
    - 層を飛び越えた結合
        - 恒等写像(Identity mapping)を層を飛び越えて結合している
        - 勾配消失や勾配爆発を回避し、深い層の積み重ねでも学習が可能に
        - 結果的に様々な形のネットワークのアンサンブル学習になっている
    - 通常の畳み込み層とSkip connectionを組み合わせたのがResidual block(残差ブロック)
        - 複数の畳み込み層を関数$ F(x) $と表記すれば、残差ブロックの出力は$ H(x) = F(x) + x $と表現できる
            - この時、$ F(x) $は、入出力の差分$ H(x) - x $を学習しているとみなすことができる
            - $ x $を変換する必要がない時は、$ F(x) $はゼロ写像になるように学習される
                - 層の重みが0になる
            - $ H(x) $の$ x $に対する勾配は、$ \dfrac{∂H}{∂x} = \dfrac{∂F}{∂x} + 1 $となるため、$ F(x) $の勾配が0になった場合でも、$ H(x) $の勾配は0にならない
                - $ F(x) $の勾配の値が小さくても勾配が消失せず、小さな変動でも見つけやすい
- Bottleneck構造をもつ
    - 3×3の畳み込みを2回行う代わりに、1×1→3×3→1×1の3層とする
        - 計算コストは変わらないが1層増やすことができる
- WideResNet
    - ResNetにおけるフィルタ数をk倍する
        - 畳み込みチャンネル数が増加
        - GPUの特性に合った動作
        - 結果的に高速・高精度の学習が可能になる
    - その反面、ResNetと比べ、層数は浅くする
    - また、DropoutをResidual blockに導入
- [参考資料: Residual Network(ResNet)の理解とチューニングのベストプラクティス](https://deepage.net/deep_learning/2016/11/30/resnet.html)

## MobileNet
- ディープラーニングモデルの軽量化・高速化・高精度化を実現
- 畳み込み演算での工夫
    - Depthwise separable convolutionという手法を用いて計算量を削減している
        - 通常の畳込みが空間方向とチャンネル方向の計算を同時に行うのに対し、MobileNetでは、Depthwise Convolution(空間方向)とPointwise Convolution(チャンネル方向)と呼ばれる演算によって個別に行う
    - 一般的な畳み込みレイヤーでの計算量: $H×W×K×K×C×M$
        - Kはカーネルサイズ(高さ、幅が同じ想定)、Mはフィルタ数($K×K×C$がM枚)
        - 入力のチャンネルは統合されるが、フィルタ数Mだけの出力マップが得られる($H×W×M$)
    - Depthwise Convolution
        - フィルタ数は1に固定
        - チャンネルごとに畳み込み(RGBをまとめて畳み込むことはしない)
        - 出力マップは入力マップのチャンネル数と同じになる($H×W×C$)
        - 計算量は$H×W×K×K×C$(Mが1なので)
    - Pointwise Convolution
        - フィルタサイズが1×1
        - 1×1 convとも呼ばれる
        - Depthwiseと逆で、カーネルサイズを1×1とするかわりにチャンネル分用意、さらにフィルタ数はM枚($1×1×C$がM枚)
        - フィルタ数Mだけの出力マップが得られる($H×W×M$)
        - 計算量は$H×W×C×M$(Kが1なので)

## DenseNet
- DenseBlockの中で、出力層に前の層の入力を足し合わせる
    - 特徴マップの入力に対し、Batch正規化、ReLu、3×3 Convで出力を得る
    - 上記の出力に入力特徴マップを足し合わせる
        - 入力特徴マップのチャンネル数が$l×k$だった場合、出力は$(l+1)×k$となる
            - ここでkをネットワークのgrowth rateと呼ぶ(一回ごとにkチャンネル増えていくので)
- DenseBlockの後ろにTransition Layerを接続する
    - Transition Layerの中でConvolution/Pooling処理を行いチャンネル数を元に戻す
- DenseNetとResNetの違い
    - DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる
    - これに対し、Residual Blockでは前1層の入力のみ後方の層へ入力

## EfficientNet
- 深さ、幅、解像度といった変数を闇雲にスケールアップするのではなく、Compound Coefficient(複合係数)に基づいて効率的にスケールアップする
    - 精度が向上すると同時に、パラメーター数が大幅に減少
    - モデルがシンプルであり、転移学習でも性能を発揮する
- 畳み込み演算の演算量FLOPSは$d, w^2, r^2$に比例する
    - 深さ(Depth, $ d $): レイヤーの数
    - 幅(Width, $ w $): 1レイヤーのサイズ(ニューロンの数)
    - 解像度(Resolution, $ r $): 入力画像の大きさ
- Compound Scaling Methodでは、上記パラメーターの最適化問題として定式化
    - 計算リソースが$ 2^φ $倍にできるのであれば、Depth, Width, Resolutionをそれぞれ$ α^φ, β^φ, γ^φ $倍にスケーリングする
        - ただし、$ α×β^2×γ^2 \approx 2 $、$ α \geq 1, β\geq 1, γ \geq 1 $とする
        - これら$ α, β, γ $は、ベースとなるモデルに対してグリッドサーチすることで決定される


# 物体検知モデル

## 概論
- 入力は画像
- 出力はタスクによる
    - 分類(Classification): (画像に対し)単一または複数のクラスラベル
    - 物体検知(Object Detection): Bounding Box(BB)
        - 物体検知では、物体の位置(BB)とそのクラス分類、コンフィデンスレベルを出力する
    - 意味領域分割(Semantic Segmentation): (各ピクセルに対し)単一のクラスラベル 
    - 個体領域分割(Instance Segmentation): (各ピクセルに対し)単一のクラスラベル
- 学習に利用される代表的なデータセット
    - VOC12, ILSVRC17, MS COCO18, OICOD18など
        - VOC12, MS COCO18, OICOD18はInstance Annotationを有する
    - データセットによってクラス数や画像当たりのBox数が異なる
        - MS COCO18やOICOD18は画像当たりのBox数が多く、現実的な画像に近い
        - 逆にフリマアプリ用の学習(物体一つを正確に認識したい)には向かない
- 物体検知における評価指標
    - 物体検知においては、クラス分類の精度に加え、物体位置の予測制度も評価したい
    - 一般的なクラス分類の場合、閾値を変えても、Confusion Matrixに入るサンプル数は変わらないが、物体検知の場合、閾値が変わると、検出されるBBoxの数が変わる
    - 物体検知における物体位置の予測精度: IoU(Intersection over Union、別名Jaccard係数)
        - $ IoU = \dfrac{Area &ensp; of &ensp; Overlap}{Area &ensp; of &ensp;Union} $
            - Area of Overlapは検知した領域(Predicted bounding box)のうち正しい領域(Ground-truth bounding box)(Overlapしている領域)
            - Area of Unionは、検知した領域と正しい領域を合体させたもの
        - Confusion matrtixで表現すると、$ IoU = \dfrac{TP}{TP + FP + FN} $
        - 一般的にはIoUが0.5を超える場合に、良いBounding Boxの予測であると判断される
        - IoUの分母を2つの領域の面積の平均値に置き換えたものがDice係数であり、$ IoU \leq Dice係数 $の関係性が成り立つ
    - 物体検知ではConfidenceだけでなく、IoUにも閾値を設定する
        - さらにConfidence/IoUともに閾値を超えていても、同じものが先に(別に検出されていれば)、よりConfidence/IoUが低い方はFalse Positiveと判定される
    - Confidenceの閾値を変えると、(クラスごとに)Precision-Recall curveが描ける
        - PR曲線の下側の面積がAverage Precision
        - APが大きいのが良いモデル
        - APはクラスごとなので、クラスを通じた(平均の)mean APも評価される
            - さらに$ mAP_{COCO} $では、IoUの閾値も0.5から0.95まで0.05ずつ引き上げてAP&mAPを計算する
    - 検知精度に加え、検知速度も問題となる
        - 指標としてはFPS(Flames Per Second)

## 物体検知の二つのフレームワーク
- 2段階検出器: R-CNNやFPNなど
    - 候補領域の検出とクラス推定を別々に行う
    - 相対的に精度が高い傾向
    - 相対的に計算量が大きく推論も遅い傾向
- 1段階検出器: YOLOやSSDなど
    - 候補領域の検出とクラス推定を同時に行う
    - 相対的に精度が低い傾向
    - 相対的に計算量が少なく推論も早い傾向

## 2段階検出器の各種モデル
### R-CNN(Regional CNN)
- 物体検出タスクと物体認識タスクを順次に行う
    - 関心領域(RoI, Region of Interest)を切り出す
        - この際はDLを使わず、選択的探索(Selective Search)を行っている
            - 色や濃淡勾配などが似ている領域に分けて、隣接する似ている領域同士を結合していく
    - 関心領域のサイズを227×227 pixelに揃えた上で、CNNで特徴量を求める
    - 物体認識(クラス分類)はSVM
    - 領域の正確さを示す評価指標として回帰で推定したIoUを用いる
- 多数の物体領域に対し複雑な処理を行うため、処理が重くて遅いのが課題
- 改良版のFast R-CNNは、関心領域ごとに畳み込み層に通すのではなく、画像全体を複数回畳み込んで特徴マップを生成することによって、計算量を大幅に減少させている
    - ただし、その後の関心領域の切り出しは引き続き選択的探索
- さらに改良版のFaster R-CNNでは関心領域の切り出しもCNNで行う
    - ほぼリアルタイムで動作し、動画認識にも応用できるように

### Faster R-CNN
- 物体候補領域の提案の処理にCNNを使用する領域提案ネットワーク(Region Proposal Network, RPN)を提案
    - 画像全体に対してCNNで特徴マップを生成し、特徴マップからRPNで関心領域を出力する
    - 物体候補領域の選定から物体のクラス分類までEnd-to-endでの一括処理が可能になり、ほぼリアルタイムで動作できるようになった
- 処理
    - 特徴マップへの変換はVGG16
    - 特徴マップにAnchor Pointsを想定し、PointごとにAnchor Boxesを作成する
    - 各Anchor BoxesをGround-truthのBoxesと比較し、含まれているものが背景か物体か、どれくらいズレてるか出力
        - IoUが最大になるAnchor Boxを正例(物体)とする
        - いずれかのGround-truthのBoxとのIoUが0.7を超えるAnchor Boxも正例(物体)とする
        - どのGround-truthのBoxとのIoUが0.3未満となるAnchor Boxを負例(背景)とする
        - ここで0.7や0.3はハイパーパラメーター

## 1段階検出器の各種モデル
### YOLO(You Only Look Once)
- Faster R-CNNでは物体候補領域の提案とクラス分類を異なるネットワークで処理するが、YOLO(V1)では、物体候補領域の提案とクラス分類を一つのネットワークで処理
- 利点
    - 高速な処理
    - 画像全体を一度に見るため、背景を物体と間違えることがない
    - 汎化性が高い
- 欠点
    - 精度はFaster R-CNNに劣る
- 処理
    - Grid cell
        - 入力画像をS×SのGridsに分割
        - 各Gridにおいて、そのGridの真ん中を中心とするB個のBounding Boxを生成
        - 各Gridごとに、含む物体のクラス分類とBounding Boxの回帰を行う

### SSD: Single Shot multibox Detector
- Default boxを用意した上で、Default boxを変形し、Confidenceを出力する
- 画像処理のベースモデルはVGG16
- マルチスケール特徴マップを採用
    - 特徴マップを少しずつ小さくしていく
        - 一番大きいのは38×38、一番小さいのは1×1
            - 大きな特徴マップでは小さな物体を、小さな特徴マップでは大きな物体を検出する
    - 特徴マップからの出力はk × (クラス数+オフセット項)　× mn
        - kはDefault boxの数
        - オフセット項はDefault boxと本来あるべきBound boxのずれを4つのパラメーター(Δx, Δy, Δw, Δh)で示す
        - mnは特徴マップのサイズ(m×n)
- 多数のDefault boxを用意したことによる問題への対処
    - Non-Maximum Suppression
        - 一つの物体が複数のBounding boxで検出されてしまう
            - Bounding boxのIoUを計算し、Confidenceの低いものを排除
    - Hard Negative Mining
        - 背景のクラスが多く発生し、非背景のクラスとのバランスが崩れる
            - 背景のクラスの割合を一定に制約する
- 損失関数はConfidenceに対する損失と検出位置に対する損失の合算

### FCOS (Fully Convolutional One-Stage Object Detection)
- アンカーベースの手法のデメリットを回避し、アンカーベースに匹敵もしくは超える精度を出すone-stageモデル
    - アンカーボックス: Bounding boxの候補
        - しかしアンカーボックスはハイパーパラメーターの設定に敏感
            - 例えば、アンカーボックスのサイズ、アスペクト比、数
        - アンカーボックスのサイズやアスペクト比が固定されている
            - 向きや角度などによる形の変化が大き物体に対応できない
            - 小型の物体に対応できない
        - ポジティブサンプルとネガティブサンプル(検出したい物体が含まれていない領域)のバランスが崩れる
            - アンカーボックスのほとんどがネガティブサンプルのため、均衡が崩れ学習がうまくいかなくなる
- FCOSはアンカーフリーの手法
    - FCOSはアンカーフリーによって、ポジティブサンプル数とネガティブサンプル数の不均衡を改善している
    - YOLO v1もアンカーフリーだが、画像の中央付近の点からのBounding Boxのみ予測するため、精度が低くなる
    - これに対し、FCOSは全てのピクセルから四次元ベクトルとクラスラベルを予測する
        - センターからの左右上下(l, r, t, b)
    - FPN(Feature Pyramid Networks): 複数のサイズの特徴マップを生成する
        - 低解像度の特徴は全体の特徴を捉えやすく、意味に強い
        - 高解像度の特徴は細かい部分に強いが、意味に弱い
        - 両方の良いところを両立させたのがFPN
        - FPNだと、重なったオブジェクトは異なる特徴レベルで予測されやすくなるため、ambiguous sample(中央の点が複数のクラスを含むサンプル)を大きく減らせる
    - 物体の中心から離れた点を中心としたバウンディングボックスを抑制するため、Center-nessというインデックスを学習に加える
        - Center-nessは、特徴マップ上の点とGround truthの中心距離を数値化したインデックスであり、$ 0 \leq centerness^* \leq 1 $となる(1に近いほど中心に存在する)

## セグメンテーションタスク
### Semantic Segmentation
- ピクセルごとにクラスラベルを出力する
- Upsampling、すなわちConvolutionとPoolingで落ちた解像度を戻す処理が必要になる
    - Poolingは受容野を広くとるために必要(Convでも可能だが、そのためには深い階層 = 多くの計算量が必要)
    - Deconvolution/Transposed convolutionでUpsamplingを実現する
        - 特徴マップのピクセル間隔をstride分だけ空けた上で畳み込み演算を行う
            - 逆畳み込みではなく、失われた情報が復元される訳ではない
            - ただ、このままではローカルな情報(輪郭)が失われたまま
        - FCNでは、低レイヤープーリング層の出力をelement-wiseで合算することで、ローカルな情報を補完しつつUpsamplingする
        - ある意味Encoder-Decoderモデル
    - Convolutionの段階で受容野を広げる工夫としてDilated Convolutionがある
        - Convolutionの際に畳み込む対象のピクセルの間隔をあけることで、同じフィルターサイズでもより広くの領域をカバーできる

### Instance Segmentation
- 画像のピクセルをどのクラスに属するかに分類するのに加えて、検出したそれぞれの物体を見分け、クラスIDに加えインスタンスID(それぞれの物体のID)を予測する
    - 同じクラスであっても個々の物体を区別する
- 有名なアプローチはYOLACT
    - ワンステップ
- もう一つ代表的なアルゴリズムがMask R-CNN

### Panoptic Segmentation
- Semantic SegmentationとInstance Segmentationの組み合わせ
    - Instance Segmentationでは、空や道路などの定まった形を持たない物体などはクラスラベルの予測を行わないが、Panoptic Segmentationでは行う

## Segmentationタスクの各種モデル
### FCN(Fully Convolutional Network)
- CNNをセマンティックセグメンテーションタスクに利用する
    - 一般的なCNNは、畳み込み層とプーリング層だけではなく、全結合層を用いるが、FCNは全結合層を用いず、その代わりに逆畳み込み層(deconvolution)を利用する
        - 全結合層を排除することにより、入力画像のサイズを固定する制約がなくなった
        - 逆畳み込みは転置畳み込み(Transposed convolution)とも言う
        - 逆畳み込みでアップサンプリングする
    - FCNの最後の特徴マップは入力画像に対して小さいため、出力を逆畳み込み(転置畳み込み)によって入力画像サイズまで拡大、その際に位置情報としてプーリングで得られた特徴マップを各画素ごとに足し合わせる(スキップ接続)ことで、局所的な情報と大局的な情報の両方を加味したセグメンテーションを行う

### SegNet
- 畳み込み層とプーリング層を繰り返し積層することで小さくなった特徴マップを徐々に拡大する構造を採用(Encoder-Decoderモデル)
- エンコーダーで特徴マップを徐々に小さくする、逆にデコーダーで特徴マップを徐々に大きくする
    - エンコーダー側で最大値プーリングした位置(Maxプーリングインデックス)を記憶しておく
    - デコーダー側の拡大時には、特徴マップを直接利用するのではなく、記憶していた位置(Maxプーリングインデックス)に特徴マップの値を配置してそれ以外の位置の値は0にすることによって、境界付近のセグメンテーション結果をぼやけさせない工夫がなされている

### U-Net
- SegNetと同様にエンコーダー・デコーダーモデル
- デコーダー側で特徴マップを拡大して畳み込み処理をする際、エンコーダー側の特徴マップを同じサイズになるように切り出して、チャンネル方向に結合する
- 少ない学習データでも比較的良好な性能を示す

### PSPNet
- エンコーダーとデコーダーの間にPyramid Pooling Module(PPM)という複数の解像度で特徴を捉えるモジュールを追加
    - PPMでは、エンコーダーで得られた特徴マップを異なるサイズでプーリングし、それぞれの大きさで畳み込み処理を行う

### Mask R-CNN
- Faster R-CNNを拡張したアルゴリズム
    - Mask R-CNN はインスタンスセグメンテーションに対応するので、 Faster R-CNNの物体検出機能にセグメンテーションの機能を付加したイメージ
    - Bounding Box内の画素単位でクラス分類を行うため、物体の形も推定可能
    - 画像全体ではなく、物体検出の結果として得られた領域についてのみセグメンテーションを行うことで効率アップ
        - 「物体らしさ」が閾値以上の領域にのみ絞り、領域毎に最も確率が高いクラスを採用
- 構造としてもFaster R-CNNと類似
    - Faster R-CNNでは畳み込みで得られた特徴マップから、バウンディングボックス(回帰の結果)と物体クラス(分類の結果)を出力する
    - Mask R-CNNでは、これに加え、物体領域マスクの推定(ピクセルの分類)を出力する
- RoI(Region of Interest)の作成の仕方の違い
    - Fast/Faster R-CNNではRoI Poolingを使用
        - 畳み込み処理後の特徴マップから、region proposal領域を固定サイズの特徴マップとして抽出
        - 高速化できる反面、高精度の推定が難しい
    - Mask R-CNNでは、RoI Poolingの代わりに、RoI Alignを導入している
        - Alignment(位置合わせ)を重視したRoI特徴の作成
        - 特徴マップをただ間引くのではなく、 補間処理(bilinear interpolationなど)によって、より多くのピクセルの情報を使うことで推定の精度を上げられた
            - 整数への丸め処理を行わない
            - 領域一つにつき、4つの点を打つ
            - 一つの点につき、近くの四つのピクセルを使って補間を行う
            - 4つの点を最大値や平均で一つにまとめる

### セグメンテーションで活用される技法
- 条件付き確率場
    - セグメンテーションのモデルが出力した確率マップに対して、条件付き確率場(Conditional Random Field, CRF)という確率モデルを適用することで、物体境界をはっきりさせることができる
        - 条件付き確率場を用いた画像処理では、画像をグラフ構造として表現する
- ダイレイト畳み込み
    - ダイレイト畳み込み(Dilated Convolution)は、フィルタの適用範囲を広げながら畳み込む手法
        - Atrous Convolutionとも言う
        - 通常の畳み込みよりも受容野が広くなる
        - ダイレイト畳み込みによって、少ないパラメータで大域的な特徴を捉えることができるため、パラメータ数が多くなりがちなセグメンテーションのモデルでよく用いられる
        - ダイレイト畳み込みを用いたモデルとして、DeepLabがある
- 注意機構
    - 注意機構(Attention Mechanism)は、データのどこに注目すべきかを学習させる仕組みであり、深層学習全般で用いられる
        - 注意機構がコンピュータビジョンにおいて用いられた場合は、特徴マップのどこに注目すべきかを学習させることになる
    - セグメンテーションの分野では、解像度が異なる複数の入力画像から得られた特徴を混ぜ合わせることで予測精度が向上することが知られている
        - 注意機構を用いることで混ぜ合わせる際の重みづけを自動的に決めることができる
- 敵対的トレーニング
    - 敵対的生成ネットワーク(Generative Adversarial Networks, GAN)は生成モデルの1つであり、セグメンテーションに適用することもできる
    - GANにおける生成器にあたるSegmentorと、GANにおける識別器にあたるAdversarial networkから成る
        - Adversarial networkは、Segmentorが出力した予測の確率マップ(Class predictions)と正解の確率マップ(Ground truth)をうまく識別できるように学習が進む
        - Segmentorは、Adversarial networkを騙せるような確率マップを出力できるように学習が進む
        - この学習方法により、予測の確率マップ(Class predictions)の細かな間違いがSegmentorにフィードバックされるようになり、Segmentorの性能が向上する
- CNNと動的輪郭モデルの組み合わせ
    - 動的輪郭モデルは物体の輪郭を検出する古典的な手法だが、CNNを組み合わせることができる
        - 動的輪郭モデルによって得られる輪郭の長さや領域の面積を損失関数に組み込む
        - 一般に、セグメンテーションの学習で用いられるクロスエントロピー誤差関数は、予測と正解をピクセル単位で比較しているため、大域的な特徴を比較できてないが、動的輪郭モデルを損失関数に組み込んだ場合は、輪郭などの大域的な特徴を比較することができ、セグメンテーションの精度向上が期待できる