物体検出の種類についてザックリ解説【E資格対策】

## <font color="rgb(107, 142, 35)">物体検出アルゴリズムの全体像</font>
有名なのは以下。
・R-CNN
・Fast R-CNN　←これはE資格には出ないっぽい。
・Faster R-CNN
・YOLO
・SSD
・MaskR-CNN
・FCOS

## <font color="rgb(107, 142, 35)">**R-CNN**</font>
R-CNNは、物体検出のアルゴリズム。2013年に発表された。以下の手順で物体を検出する。

#### ＜手順＞
##### ①Selective Searchというアルゴリズムで候補領域を抽出する。

##### ②候補領域の画像特徴を、CNNで抽出。（つまりAlexNetとかで抽出するらしい）
ただし、AlexNetは固定サイズの画像しか受け取らないから、①で抽出した領域を不自然に変換しないといけないらしい。それが欠点。

##### ③SVMによる物体の分類
AlexNetの最終出力層はクラス数の次元のベクトルなんだけど、その一つ前の層の出力は4096次元のベクトルになってる。これを、次の層のSVMに渡すらしい。そんで、候補領域に写っている物体のクラス分類を行う。
（ちなみに線形SVMは分類したいクラス数+1の全結合層一層と捉えることができる。それぞれのクラスに対して、SVMがYes/Noを返すようなイメージ。ちなみに、「+1」は背景クラス。）


#### （補足説明）
↑で述べたように、R-CNNでは、画像全体から領域提案（オブジェクトが存在しそうな領域）を生成し、それらを切り出してCNNに入力して特徴を抽出している。
これは、領域ごとにCNNを実行する必要があり、処理速度が遅く、メモリ消費が大きいという欠点がある。



## <font color="rgb(107, 142, 35)">**Fast R-CNN**</font>
 
R-CNNの改良版。
画像全体をCNNに入力して特徴マップを作り、その上に領域提案を重ねて、各領域の特徴をプーリング(RoI Pooling)する。これにより、R-CNNのように領域ごとにCNNを実行する必要がなくなり、処理速度がUP。
また、領域の分類と境界ボックスの調整を同時に行うことで、精度も向上。

重要キーワードは以下の2つ。

##### RoI Pooling
縦横比が異なる可変長サイズの入力に対して、固定サイズ(たとえば7×7など)の特徴マップを得ることができるプーリング。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/453d9462-5a27-44e7-335a-acb2bcc02c84.png)
https://blog.negativemind.com/2019/02/14/general-object-recognition-fast-r-cnn/

##### Multi-task Loss
Multi-task Lossとは、クラスの分類と、バウンディングボックスの回帰という２つのタスクの誤差を同時に考慮できる損失関数のこと。（バウンディングボックスの回帰というのは、物体の領域を表す矩形の座標やサイズを推定すること。）
領域の分類に対する交差エントロピー損失と、境界ボックスの調整に対する平滑化L1損失の重み付き和で定義される。Multi-task Lossを用いると、領域の分類と境界ボックスの調整の両方を最適化することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/98068436-280d-aa55-bae9-6b2fe3bfa008.png)
https://www.slideshare.net/takashiabe338/fast-rcnnfaster-rcnn?ref=https://blog.negativemind.com/2019/02/14/general-object-recognition-fast-r-cnn/

## <font color="rgb(107, 142, 35)">**Faster R-CNN**</font>
 
Fast R-CNNの改良版。領域提案を外部のアルゴリズムではなく、Region Proposal Network (RPN)というネットワークを使用する。これにより、領域提案の時間が大幅に短縮され、さらに高速な物体検出が可能になります。領域提案ネットワークと物体検出ネットワークは共通の特徴マップを共有し、End to Endで学習できる。


##### Faster R-CNNの構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/ffb3e352-9fc0-5899-695b-e3e005b6a490.png)
https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9


##### Region Proposal Network (RPN)
RPNは、物体検出のための領域候補を生成するネットワークです。RPNは、画像から特徴マップを抽出するCNNの出力を入力として受け取り、各位置において物体の境界と物体性のスコアを同時に予測します。
RPNは、高品質な領域候補を生成するために、エンドツーエンドで学習されます。特徴は以下の通り。

**◆RPNの流れ**

**①画像の各位置に対して、複数のアンカーボックスを設定。**
アンカーボックスとは、物体の形や大きさに応じて事前に定義された矩形のこと。

**②RPNは、各アンカーボックスに対して、物体性のスコアと境界の補正値を出力。**
（物体性のスコアとは、そのアンカーボックスが物体を含む確率を表す値(背景or物体の2値)。
境界の補正値とは、そのアンカーボックスを物体に合わせるために必要な平行移動や拡大縮小の量を表す値。）

**③RPNは、物体性のスコアと境界の補正値を用いて、領域候補を選択します。**
（領域候補とは、物体を含む可能性が高いアンカーボックスのことで、物体性のスコアが閾値以上のものや、非最大抑制 (Non-Maximum Suppression, NMS)によって重複を除去したものが該当します。）

**④RPNは、領域候補を次の段階の物体検出ネットワークに渡します。**
（物体検出ネットワークとは、領域候補に対して、物体のクラスと境界をさらに精度よく予測するネットワークのことで、例えばFast R-CNNやMask R-CNNなどがあります。）


## <font color="rgb(107, 142, 35)">**YOLO**</font>

Faster R-CNN以前は物体候補の生成→候補を分類/回帰という流れで分類問題として物体検出を行っていたのに対し、バウンディングボックスとクラスの識別を同時に行うことで、速い処理速度を実現。
物体検出を分類ではなく回帰としてモデル化しているのが特徴。

**検出アルゴリズム**

①画像をS×S個の小さな正方形に分割する。これをグリッドセルと呼ぶ。

②各グリッドセルにB個のバウンディングボックスを配置する。バウンディングボックスは、物体の位置と大きさを表す長方形です。バウンディングボックスは、中心の座標(x, y)、横幅w、縦幅h、信頼度Fの5つの要素を持ちます。信頼度は、バウンディングボックスが物体を含む確率を表します。

③各グリッドセルにC個のクラス確率を割り当てる。クラス確率は、グリッドセルがどの種類の物体を含むかを表す確率です。

④バウンディングボックスとクラス確率を組み合わせて、物体の位置と種類を推定する。このとき、信頼度とクラス確率の積が一定の閾値以上のバウンディングボックスだけを残す。また、同じ物体を複数のバウンディングボックスで囲んでいる場合は、重なり具合(IoU)が一定の閾値以上のバウンディングボックスを除外する。これをNMSと呼ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/02ab4fbb-d1a4-f13a-309b-ea8d588ba9aa.png)
https://arxiv.org/pdf/1506.02640.pdf



## <font color="rgb(107, 142, 35)">**SSD**</font>
Single Shot MultiBox Detectorの略で、画像の異なるスケールの特徴マップを利用して物体を検出します。各特徴マップのセルに対して、事前に定義された複数のアンカーボックスを用意し、それらに対してクラスとオフセットを予測します。YOLOよりも精度が高く、Faster R-CNNよりも速いという特徴があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/b27c0f2a-1776-1952-6130-521a550b50a9.png)
https://arxiv.org/pdf/1512.02325.pdf

**SSDの流れ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/126dca13-8d33-3dc9-6bb5-7d8d48988bda.png)
https://www.acceluniverse.com/blog/developers/2020/02/SSD.html

**YOLOとSSDの違い**
YOLOとSSDは、物体検出のためのニューラルネットワークを用いた手法ですが、いくつかの違いがあります。主な違いは以下の通りです。

YOLOは画像をグリッドに分割し、各セルに対して固定数のバウンディングボックスとクラスを予測します。SSDは画像の異なるスケールの特徴マップから、複数のアスペクト比を持つデフォルトボックスを用いて、バウンディングボックスとクラスを予測します。
YOLOは画像全体を一度に処理するため、高速ですが、小さな物体や重なった物体の検出が苦手です。SSDは画像の複数の領域を個別に処理するため、精度が高いですが、速度はYOLOより遅いです。
YOLOは最終層のみで物体検出を行いますが、SSDは複数の層から物体検出を行います。これにより、SSDはYOLOよりも多様なサイズや形の物体を検出できます。


## <font color="rgb(107, 142, 35)">**MaskR-CNN**</font>

Mask R-CNNは、Faster R-CNNをベースにして、物体の領域とクラスだけでなく、物体の形をピクセル単位で検出するマスクも出力するように拡張した手法である。Mask R-CNNは、入力画像の特徴を抽出するBackbone、物体らしき領域を提案するRPN、領域のクラスとバウンディングボックスを推定するHead、領域のマスクを生成するMask Branchの4つのモジュールから構成される。


## <font color="rgb(107, 142, 35)">**FCOS**</font>
Fully Convolutional One-Stage Object Detectionの略で、アンカーボックスを使わずに物体を検出する。各特徴マップのセルに対して、Center-ness（真ん中度合い）、物体のクラス、物体のサイズを予測する。アンカーボックスの設計やマッチングの手間がなく、高い精度と速度を実現している。

・Center-ness（真ん中度合い）の定義式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/60dcf157-e1fa-a1a3-069e-de887f55dce0.png)
Center-nessが高いほど、バウンディングボックスは物体の中心に近く、信頼性が高いと判断される。Center-nessは、物体検出の精度を向上させる効果がある。


# 参考
https://www.acceluniverse.com/blog/developers/2020/02/SSD.html