E試験 2024#2 シラバスメモ④-1 深層学習の応用 画像処理

E試験のシラバスとその概要をメモしたものです。
各サイトや生成AIに聞いたもののツギハギです。

シラバスは2024#2に準拠しています

https://www.jdla.org/certificate/engineer/

本記事は4．深層学習の応用 のうち
- 画像認識
- 物体認識
- セマンティックセグメンテーション

についてとなります。
試験範囲外部分は割愛しています。

# 画像認識、物体検出、セグメンテーション
画像認識：その画像は何か
物体検出：画像中のどこに何の物体が移っているかをバウンディングボックスで検出
セグメンテーション：画像中のどこに何の物体が移っているかを境界線で検出

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9d1fd7fb-2f27-4545-6377-401db2d64935.png)


# 画像認識
歴史的に
画像分類がILSVRCという大会でAlexNetがDeepLearningによる画像分類として従来のものに大きなスコア差をつけた。
その後GoogleNet,VGG,ResNetと進化を遂げていった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/1c36698d-b3e5-0943-b870-da6b19443446.png)
(出所：https://medium.com/analytics-vidhya/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5)

2024#2の試験範囲はAlexNet,VGG,GoogleNetは外れ、ResNetから。

## ResNet(Residual Netework)
従来から層を増やせば表現力があがることはわかっていたが、勾配消失問題が発生するというジレンマがあった。
Residual blockという手法を使って解決した。
### 残差接続（skip-connection）
ResNetの中核となる仕組み。入力に対して中間層を適用した出力と、中間層をスキップして入力をそのまま渡したものを、その層の出力とする。
該当の中間層への入力をx,出力を$F(X)$としたとき、スキップ接続を含んだ中間層の出力は$H(x)=F(x)+x$と入力が加算された形となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/ebe3ad4a-11e2-cf07-3394-feb14069d85f.png)
(出所：https://dx-consultant-fast-evolving.com/resnet/)
逆伝播の際は
$\frac{\partial L}{\partial x} = \frac{\partial L}{\partial H} \frac{\partial H}{\partial x}$
スキップ接続部分の$\frac{\partial H}{\partial x}$は
$\frac{\partial H}{\partial x} = \frac{\partial (F(x)+x)}{\partial x}= \frac{\partial F}{\partial x} +1$
元の式に当てはめると。
$\frac{\partial L}{\partial x} = \frac{\partial L}{\partial H} (\frac{\partial F}{\partial x} +1) = \frac{\partial L}{\partial H}\frac{\partial F}{\partial x} + \frac{\partial L}{\partial H}$
となり、伝播されてきた勾配$\frac{\partial L}{\partial H}$が加算されていることによって勾配が消失することが防がれる。
### 残差ブロック：Residual Block、ボトルネック構造
幾つかの畳み込み層にスキップ接続を組みこんだ構造
左がPlaneアーキテクチャ、右がボトルネックアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/f7d7e26b-2296-e073-f051-ab4f1b750dec.png)
(出所：https://arxiv.org/pdf/1512.03385v1)

ボトルネック層はレイヤ方向の畳み込みを行う。
![1_FP7PruuAq_ZcM7H_nJZuMQ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/e530e896-8370-597a-50be-09803d3aa70b.gif)
ボトルネック層のメリットは計算量の削減と表現力の向上など。
https://qiita.com/hokutoh/items/4b6aa3483757a655c559#depthwise-separable-convolution

## WideResNet
ResNetの弱点
・「特徴再利用の減少」という問題。少数のユニットのみが学習に有用な表現を学習し、他の多くのユニットが最終的な結果にあまり貢献しない。
・学習時の演算負荷が大きい

⇒層を浅く、フィルタを多くしたことで解決を試みたもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/a72ad092-d27b-d1c5-c4ca-14ae6fa55aef.png)
出所：https://zero2one.jp/ai-word/wide-resnet/#google_vignette
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8fa77214-f639-aae9-b3c3-44646189cbd3.png)
出所：https://arxiv.org/pdf/1605.07146
https://deepsquare.jp/2021/08/wideresnet/ で要約

・計算量が少なくて済む
・Dropout層で過学習が抑えられる
・3x3の畳み込み層を2層、幅が10のものが良い結果を出している。

## Vision Transformer
CNNを用いずTransfomerのみを利用した画像認識モデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/a50a1e9a-f205-9813-39f5-7bd09120e9ab.png)
出所：https://arxiv.org/pdf/2010.11929

大きく言うと画像をベクトルかしてTransformerに流し込んだもの
- 画像をパッチに分割し、flatten化してベクトル化
- [CLS] トークンの追加
入力トークンの先頭に追加される特別なトークン。最終的に、このトークンの内部表現が、画像全体の分類や予測に使われます。
このトークンの最終的な出力が、画像に対するクラスラベル（例えば「猫」や「犬」など）を決定するために利用される
- Positional Embedding の加算
パッチの順序を認識するため、各トークンに位置情報を示す Positional Embedding を加算
‐ Transformerによる処理
self-attentionを持つTransformerが、トークン間の関係を学習し、出力トークンを生成。この出力の中で [CLS] トークンが最終的な予測に使用される。


以下にて手順がビジュアル化されている。
https://blog.mdturp.ch/posts/2024-04-05-visual_guide_to_vision_transformer.html
以下、上記URLの手順メモ
1. 画像分類中のひとつの画像の流れについて見てみる。
1. ラベルはいったん忘れる。入力データだけをいったん使う
1. $p\times p$の数に画像のパッチを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/dcf07906-57c3-2486-65db-525bbb05b35f.png)
1. 分割したパッチをflattenする
パッチは、$p'= p^2 \times c$の次元のベクトルに平坦化されます。ここで、pはパッチのサイズ、cはチャネル数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/201112b0-bb51-486a-10b2-22e57f38b437.png)
1. パッチ埋め込みの作成
これらの画像パッチ ベクトルは線形変換を使用してエンコードされます。結果のパッチ埋め込みベクトルのサイズは固定dになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/c5194e7b-475e-5089-aef9-8832467cfc9c.png)
1. すべてのパッチを埋め込む
画像パッチを固定サイズのベクトルに埋め込んだので、サイズnxdの配列が残ります。ここでnは画像パッチの数、dはパッチ埋め込みのサイズです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/3107fbe0-5179-78bd-5f38-b243b0f73811.png)
1. 分類トークン(CLS token)の追加
モデルを効果的にトレーニングするために、 **分類トークン (cls トークン)** と呼ばれる追加のベクトルによってパッチ埋め込みの配列を拡張します。このベクトルはネットワークの学習可能なパラメータであり、ランダムに初期化されます。注: cls トークンは 1 つだけなので、すべてのデータ ポイントに同じベクトルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/46dec792-62ff-149d-d392-6a54d266148e.png)
1. Position embeddingベクトルを追加する
現在、パッチ埋め込みには位置情報が関連付けられていません。これを修正するために、学習可能なランダムに初期化された **Position embedding ベクトル** をすべてのパッチ埋め込みに追加します。また、このようなPosition embeddingベクトルを分類トークンにも追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/f5b69132-c8eb-4663-1d53-7500d26e15dd.png)
1. Transformer Input
位置埋め込みベクトルが追加された後、サイズ(n+1) xdの配列が残ります。これは、次のステップでより詳細に説明されるTransformerの入力になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/a3139691-1426-ba3c-384b-d3c481db9e46.png)
1. Transformer
  10-1．Transformer: QKVの作成
トランスフォーマーの入力パッチ埋め込みベクトルは、複数の大きなベクトルに線形に埋め込まれます。これらの新しいベクトルは、3 つの同じサイズの部分に分割されます。Q - Query Vector, the K - Key Vector and the V - Value Vector。これらすべてのベクトルの (n+1) が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/920daa89-4998-9a2f-20c7-e29f1720cb4e.png)
  10-2. Transformer: Attention Scoreの計算
Attention Score:A を計算するために、すべてのQ とすべてK を掛け合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/f333a465-d4ce-093f-6d90-436c1cffec88.png)
  10-3. Transformer: Attention Score Matrix
これでAttention Score Matrix:A ができたので、各行の合計が 1 になるように、すべての行に `softmax` 関数を適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9ec3e236-8f84-894f-d020-4a136ab1ada1.png)
  10-4. Transformer:  Aggregated Contextual Informationの計算
最初のパッチ埋め込みベクトルのAggregated Contextual Informationを計算します。注目行列の最初の行に注目します。そして、そのエントリを値ベクトル Vの重みとして使用します。結果は、最初の画像パッチ埋め込みのAggregated Contextual Informationベクトルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/b0fa6800-8b1e-ab31-857d-879e18391a45.png)
  10-5. Transformer: パッチごとのAggregated Contextual Information
ここで、このプロセスを注意スコア マトリックスのすべての行に対して繰り返します。その結果、N+1 個のAggregated Contextual Informationベクトルが生成されます。パッチごとに 1 つ、分類トークンごとに 1 つです。この手順で、最初のAttention headが終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8fefeb41-19aa-a2e0-afb2-916606aa9538.png)
  10-6. Transformer: Multi-Head Attention
ここでは、Multi-Head Attentionを扱っているため、異なる QKV マッピングを使用して、ステップ10.1 - 10-5のプロセス全体を再度繰り返します。説明設定では 2 つのヘッドを想定していますが、通常、VIT にはさらに多くのヘッドがあります。最終的には、Aggregated Contextual Informationベクトルが複数生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9047f3a5-a217-9b20-5436-98a1ba8c302a.png)
10-7. Transformer: 最後のAttention Layerステップ
これらのheadは積み重ねられ、パッチ埋め込みと同じサイズdのベクトルにマッピングされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/fd7ffa6a-d2fd-4508-115f-b7ff5a2c21ff.png)
  10-8. Transformer: Attention Layerの出力
前のステップでAttention Layerが終了し、入力として使用したものとまったく同じサイズの埋め込みと同じ量が残ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/03a84425-b709-ff43-608c-6fa5fb70fd67.png)
  10-9. Transformer: Residual connections
Transformerは残差接続を多用します。これは、前のレイヤーの入力を現在のレイヤーの出力に追加することを意味します。これもこれから実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/af8e44bd-a690-cdcd-38d8-73986f699f8d.png)
  10-10.Transformer: Residual connection Result
The addition results in vectors of the same size.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/ef584ae4-e5da-c9dd-65e7-80e28335d4a9.png)
  10-11. Transformer: Feed Forward Network
これらの出力は、非線形活性化関数を持つフィードフォワードニューラルネットワークに送られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/22032fd6-c020-d4cc-dd18-0539e12f9d1c.png)
  10-12. Transformer: Final Result
Transformerのステップの後には、別の残りの接続がありますが、ここでは簡潔にするために省略します。そして、最後のステップでTransformer層が終了しました。最終的に、Transformerは入力と同じサイズの出力を生成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/20261228-da89-318c-c7cc-382e8d660ea9.png)
1. Transformerを繰り返す
Transformerの計算手順 10.1 ～ 10.12 を、Transformerに対して複数回 (たとえば 6 回) 繰り返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9656705d-b26b-de99-bfce-2de8d65dd404.png)
1. 出力されたCLS tokenの識別
CLS Tokenの出力を特定することである。このベクトルはVision Transformerの最終ステップで使用されます。
1. Final Step: 分類されたクラスの確率予測
最後のステップでは、このCLSトークン出力と別の全連結ニューラルネットワークを使って、入力画像の分類確率を予測します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/5ca02f94-37da-1593-264c-49de48f2e0eb.png)
1. Vision Transformerの訓練
予測されたクラスの確率と真のクラスラベルを比較する標準的なクロスエントロピー損失関数を用いてVision Transformerを学習する。モデルはバックプロパゲーションと勾配降下を用いて学習され、損失関数を最小化するようにモデルパラメータを更新する。


# 物体検出
R-CNN,Fast-R-CNN,Faster-R-CNN Mask R-CNNと言った形で進化してきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/2edafd4b-47ee-1078-96ed-01752b9a96e8.png)
出所：https://lilianweng.github.io/posts/2017-12-31-object-recognition-part-3/

R-CNN,Fast-R-CNNは試験範囲外なので簡単に
- R-CNN：領域探索と画像分類を組み合わせて物体検出する。
- Fast R-CNN：R-CNNを改良し計算時間を改善したもの

領域探索は入力画像に対して領域の候補( **RoI** ：Region of Interest, 候補領域)を数1000個抽出する。
ROIの選出には **Selective Search** という類似する領域をグルーピングしていくことで候補領域を選出する手法がとられている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/6039f53c-c82b-6006-731a-b36fb6b20aad.png)
ただし、認識制度が低かったり学習・認識共に計算量が多くなり遅いという欠点があった。
## 精度検証
mAP（mean Average Precision）という指標が使われる。
mAPはIOU、Precision、Recall、Precision Recall Curve、APを元に計算される
### IOU
予測と正解領域の$\cfrac{予測領域\bigcap正解領域}{予測領域\bigcup正解領域}$
つまり$\cfrac{あっている部分}{合計面積}$　1に近いほど精度が良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8ebd09b7-d750-e203-f240-4ba50be2da1a.png)
https://carbgem.com/plus/wp-object-detection/
### Precision(適合率)とRecall(再現率)
IOUが閾値以上のものとTP,閾値以下のものをFNとみなして
$Precistion=\cfrac{TP}{TP+FP}=\cfrac{IOUが閾値以上のもの}{モデルが検出した全ての領域数}$
$Recall=\cfrac{TP}{TP+FN}=\cfrac{IOUが閾値以上のもの}{正解の検出対象数}$

これをもとにmAPを作成
https://qiita.com/hokutoh/items/c170d0c3447d01e57186#%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%80%A7%E8%83%BD%E6%8C%87%E6%A8%99
### 2ステージ検出
前述のように領域検出と画像認識の2ステージで構成されている
- R-CNN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/41cfcb77-5c68-c8e5-d1ab-a385108727d7.png)
- Fast R-CNN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/a0a0b7d2-8a0a-c074-305c-c8cff002ece1.png)
この二つは領域探索と画像分類という二つの学習がそれぞれ個別で機能（非End-to-End学習）しており一つのネットワークとなっていない。次項のFaster R-CNN以降はEnd-to-End学習となっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/6d4bdbd0-93b3-ac68-a8e2-417eb2cb9a73.png)
出所：https://cvml-expertguide.net/terms/dl/optimization/end-to-end-leaning/




## FasterR-CNN
物体検出にRPN(Region Proposal Network)というネットワークを使用し、一貫したネットワーク(End-to-Endネットワーク)を実現したもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9a52a9ad-ee73-fbce-128a-f5a204481217.png)
出所：https://cvml-expertguide.net/terms/dl/object-detection/faster-r-cnn/
- RPN [前半ステージ]
  - アンカーボックス方式で，領域提案のバウンディングボックス群を検出．
- Fast R-CNN [後半ステージ] ：
  - RPNで計算した，全画像の特徴マップを，入力特徴に用いる．
  - ROI Poolingした領域特徴を入力に，以下の2タスクを並列に実施：
    - 識別ヘッド[タスク1]: 領域提案をクラス識別．
    - 回帰ヘッド[タスク2]: 領域提案を残差回帰して洗練．

### アンカーボックス方式
物体検出の中心点(アンカー)を決め、アンカーに対してK個のボックスを用意する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/67eb228a-85cb-8d85-8c0b-e8e24ade0397.png)
1. アンカーボックス内に「物体が有る or 物体が無い」の2クラス識別.
2. アンカーボックスから領域提案への，位置(x,y)・サイズ(w,h)の修正量を回帰．
### RoIプーリング
検出領域は縦横比がそれぞれ異なる可変長サイズになるが、可変長入力に対して、固定サイズ(たとえば7×7など)の特徴マップを得ることができるプーリング。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/c3d302fd-da5e-3be3-8ac2-e1d2cb3904ee.png)

下記のようにRoI(関心領域)が可変サイズに対して、Max Poolingを行っている。
![roi_pooling-1.gif.pagespeed.ce.5V5mycIRNu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/77acbaac-3a6b-ea7a-4317-db2d5eefde89.gif)
https://deepsense.ai/region-of-interest-pooling-explained/
## Mask R-CNN
Faster R-CNNにインスタンスセグメンテーションのタスクを足したもの。
変更点として
- RoI PoolingがRoI Alignに
- Mask branchというネットワークが追加されている。領域提案中の物体であるピクセルを得るための層になる
![1_QaPtdVXIeIdFhbW0Ac7tNA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/2ccd541b-e994-d95e-f409-387f7833f136.png)
(出所：https://jonathan-hui.medium.com/image-segmentation-with-mask-r-cnn-ebe6d793272 より一部編集)
### ROI Align
RoI Poolingではピクセル単位のズレがでる。バウンディングボックスであればさして影響はなかったが、セグメンテーションの場合ピクセルのズレが結果に影響するのでズレを解消するための手法。

提案領域はグリッドに対して浮動小数点位置にとられる。(グリッドに対して中途半端な位置に取る)
各区画で4つのポイントが取られ、各ポイントを線形補完し新しいグリッドをつくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/e8c0763a-c66a-3daa-90ba-bbd12cf9c927.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/6c56a12b-2cd4-5323-98f2-6cf2e0d01542.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/4bdf3313-ba8f-530b-327f-c4abaf7e2162.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/9c7d91d2-6acf-4059-7e34-449cc31e3e30.png)

https://firiuza.medium.com/roi-pooling-vs-roi-align-65293ab741db



## YOLO(You Only Look Once)
Faster R-CNNまでは2ステージ(物体検出と画像分類を別々)で行っていたのに対し、1ステージ検出(物体検出と画像分類を同時)に行うことで、高い処理速度を出したアーキテクチャ。
物体検出を分類問題ではなく、回帰問題として扱っている。

- 任意の数SxSに分割したgird cellを用意
- 分割した各grid cellに対して、B個のバウンディングボックスとそのconfidence scoreとを出力する。
バウンディングボックスは中心座標値(x, y)、幅/高さ(w, h)を持つ。confidence scoreはバウンディングボックス内に物体を含んでいるかどうかの信頼度となる。
- また、各grid cell単位で、そのクラスである確率C(条件付き確率)を推定する
- バウンディングボックスと各grid cellのクラス確率を結合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/96caad2f-b4d6-0615-f5b3-e26809aa8ee3.png)
https://arxiv.org/pdf/1506.02640

これらのバウンディングボックスには重複領域が多くあるため、IOU等を元にした信頼度スコアの高いバウ
ンディングボックスを基準に **NMS** (Non-Maximum Suppression:最大でない物を取り除く)で選別する。

## SSD(Single Shot MultiBox Detector)
特徴マップに対して **デフォルトボックス** を配置することでバウンディングボックスを推定する。
学習の仮定で回帰で推定したオフセットベクトルにより、ボックスの位置x,yとサイズw,hの矩形を補正する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/380ea18a-b3bd-d146-3807-3451e6811342.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/3704fed6-a23b-53ab-ab9c-a9ac9086f087.png)
出所：https://qiita.com/xu1718191411/items/442e58f24e6608b6173c

### ハードネガティブマイニング
SSDでは、デフォルトボックスの中には正解ラベルと一致しない「負の例」も多数存在します。
全ての負の例を使って学習すると効率が悪いため、特にモデルが誤って正と予測してしまう「ハードネガティブ」を選び出して再トレーニングします。
このアプローチにより、モデルがより難しい負の例に対しても正確に物体を検出できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8663abda-9bf5-38c6-bb0a-31745463d860.png)
出所：https://qiita.com/TKsaku/items/df4b3f1e90e93c401eaf

## FCOS(Fully Convolutional One-Stage)
特徴として
- アンカーフリー（Anchor-Free）
- Feature Pyramid Network（FPN）
- センターネス（Center-ness）

### アンカーフリー
アンカーボックス方式だとIOUを基準にネガ／ポジを区別しているため、ほとんどのアン
カーボックスがネガティブサンプルとして認識されるため、ポジティブサンプル(物体)との不均衡が発生する。
また、学習時にサイズ・アスペクト比・数などの事前設定で精度が大きく変動することがある。

アンカー(点)に対してアンカーボックスを複数設定するのではなく、
点に対する上下左右(l,t,r,b)距離を使用することで課題を解決した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/39c22408-2f3f-d1d4-23eb-8471e381a660.png)
出所：https://arxiv.org/pdf/1904.01355

- positive sample
フィーチャマップの各点が、1つの物体の正解ラベルのバウンディングボックス内にある
- ambiguous sample(あいまいサンプル)
フィーチャマップの各点が、複数の物体の正解ラベルのバウンディングボックス内にある(バウンディングボックスは複数物体の共通部分)
- negative sample
物体なし(背景)

### Feature Pyramid Network（FPN）
高レベル(ピラミッドの頂点)のフィーチャマップをアップサンプリングして、低レベルの
フィーチャマップに加える事で、低レベルのフィーチャマップの予測精度が強化される
![スクリーンショット 2024-08-24 002023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/870b8364-07a0-83a2-13f7-e060b84e2b60.png)
https://arxiv.org/pdf/1904.01355
H × Wはfeature mapsの大きさ、‘/s’(s = 8, 16, ..., 128) は入力画像からのdownsampling ratio
P3-P7は最終的な予測に使用されるfeature level
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/65c6d0fa-1222-5989-fc0b-3a3ce2802512.png)
https://www.fastpath.one/blog/feature-pyramid-network-fpn
高レベル：大きい物体の検出を担当
低レベル：小さい物体の検出を担当
### センターネス（Center-ness）
物体中心付近を改善する機構。
Ground Truthの上下左右の距離r*,l*,t*,b*を損失に加えることにより、物体中心の特徴量マップにおける損失を増加させる。これにより、より物体中央に近い部分が優先して改善される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/da4f5d4e-fe17-95b2-26a1-032e2f400aec.png)
https://arxiv.org/pdf/1904.01355
赤、青、その他の色はそれぞれ1～0の値を示す。Centernessは下記式によって計算され、位置が物体の中心からずれるにつれて1から0に減衰する。テスト時には、ネットワークによって予測されたCenternessは分類スコアと乗算されるため、オブジェクトの中心から離れた位置によって予測された低品質なバウンディングボックスを重み付けすることができる。

$Centerness=\sqrt{\cfrac{\min(l*,r*)\cdot\min(t*,b*)}{\max(l*,r*)\cdot\max(t*,b*)}}$　(一致すると$\cfrac{max}{max}$の部分が1になる)

# セマンティックセグメンテーション
セグメンテーションとはピクセル単位の認識を行うタスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/30a01dc4-e20c-e111-96a0-fff37e3ce211.png)
(b)セマンティックセグメンテーションは、画像中の全ての画素に対して、クラスラベルを予測する。
この時車が複数台映っていた場合は、それぞれの区別はない。
(c)インスタンスセグメンテーションは、画像中の全ての物体に対して、クラスラベルを予測し、一意のIDを付与する。セマンティックセグメンテーションとの主な違いは、重なりのある物体を別々に検出したり、空や道路などの定まった形を持たない物体などはクラスラベルの予測を行わない。例えば、1つの画像に複数の車が映っている場合、それぞれの車を別々の物体と認識する。
(d)パノプティックセグメンテーションは、上の2つのセグメンテーションを組み合わせたタスクとなる。画像中の全ての画素に対して、クラスラベルを予測し、一意のIDを付与する。

## FCN(Fully Convolutional Network)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/0ecd92d8-6a1c-94f6-5c6f-caa60b1086d3.png)
https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf

FCNは，VGGNetなどの初期のアーキテークチャを元に，出力付近の全結合層も含めて，(プーリング層やReLU活性化関数以外は) ，全ての層を畳み込み層(および転置畳み込み)で済ませる設計のCNNである．これにより，出力画像の全ての画素位置で，クラス識別による複数チャンネルのラベル予測を行う「密な予測(dense prediction)」を行うことができる．

このような，全結合層を無くして「出力層付近(ヘッド)も，全て畳み込み層で済ませるCNN」を，全結合が終盤に備わっているCNNと区別する意味で，「Fully Convolutional なニューラルネットワーク」(あるいは「Fully convolutional な CNN = FCN」)と呼ぶ．
https://cvml-expertguide.net/terms/dl/semantic-segmentation/fcn/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/1ff6d71b-6e4f-7d55-e1d2-1cbc5b5c3f24.png)
https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf
VGG-16の全結合層をGlobal Average Poolingと1×1 Convolutionに置き換えることによって、クラス分類の結果が2次元ヒートマップとして出力されるようになる。


#### アップサンプリング、逆畳み込み/転置畳み込み
プーリングによって出力されるヒートマップは小さくなるため、小さい画像のアップサンプリングを行う。

転置畳み込み (Transposed Convolution)は，2D畳み込み層と反対のアップサンプリング畳み込み操作を行う層である [Long et al., 2014]．(順)畳み込み層の逆操作であるので，各論文では Deconvolution (逆畳み込み) とも呼ばれる．FCN，U-Net/FPN型の，砂時計型画像Encoder-Decoder内のDecoder部分や，深層生成モデルの画像Generatorなどにおいて，特徴マップの空間サイズ拡大(アップサンプリング)を，効率的に行う用途で，転置畳み込み層がよく用いられる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/c81892a6-9472-ccc8-9dd5-63b79a336705.png)
https://www.reddit.com/r/learnmachinelearning/comments/wuxgn4/transposed_convolutions_for_smart_upsampling_of/

## U-Net
畳み込み層とプーリング層で構成されるアーキテクチャ。
- 学習に使う画像の数が少なくてもセグメンテーションの精度がよい
- 学習および学習後の処理が高速
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/3b0f3a52-b701-8efd-22bf-189b852e61f6.png)
出所：https://arxiv.org/pdf/1505.04597 より一部編集

U字の下りの部分でダウンサンプリングを行い、上りの部分でアップサンプリングを行っていく。

図中の灰色矢印部分の**スキップコネクション** と呼ばれるEncoder側の「局所情報」と「空間位置情報」を，対応するDecoder側へ直接コピーして受け渡し，Decode時も使用する構造になっている。