YOLOv5の構成ってどうなってるのか調べてみた

オリジナルの論文が出ているのかはいまだによくわかっていない (知る限りでは出ていないはず) が、Mediumでまとめていた方がいた。

https://sh-tsang.medium.com/brief-review-yolov5-for-object-detection-84cc6c6a0e3a

## はじめに (前述の記事から引用)
YOLOv5バージョン v1 は、2020 年 6 月 26 日に公開されました。最新バージョンは v7 で、2022 年 11 月 22 日に公開されました。
しかし、これについて説明した論文や技術レポートは提供されていないようです。

(1 つの方法は、コードを直接読むことですが、これは面倒です。
または、それについて説明しているブログやビデオブログを見つけることです。
私にとって、YOLOv5 を説明する有名なブログの 1 つは、中国語のZhihuのものです。)

(そこで、後で簡単に見直すことができるように、自分で書くことにしました。そのために、YOLOv5 を拡張する論文をいくつか見つけました。これらの論文に基づいて、基本的な YOLOv5 を以下のように要約します。)

-----
最新のYOLOはYOLOv10です。
YOLOv5は論文が出ておらず構成を知るにはコードを読むのが手っ取り早い？が面倒くさい…。


## Overall Architecture
YOLOv5については以下の論文で説明されている。

https://www.mdpi.com/1424-8220/22/15/5817

![overall architecture](https://miro.medium.com/v2/resize:fit:828/format:webp/1*VbSsY7414ogzpHmHnP7EVQ.png)

入力画像はBackboneにて特徴量抽出が行われる。

Backboneは、異なるサイズの特徴量を取得し、ネックによりこれらの特徴を融合し、最終的に3つの特徴マップ P3、P4、P5（YOLOv5 では、次元は 80×80、40×40、20×20 のサイズで表されます）を生成して、それぞれ画像内の小、中、大のオブジェクトを検出します。

3 つの特徴マップが予測ヘッド (head) に渡された後、事前設定された事前アンカーを使用して特徴マップ内の各ピクセルに対して信頼度計算とバウンディング ボックス回帰が実行され、オブジェクト クラス、クラス信頼度、ボックス座標、幅、高さの情報を含む多次元配列 (BBoxes) が取得される。

対応するしきい値（confthreshold、objthreshold）を設定して配列内の無駄な情報をフィルタリングし、非最大抑制（NMS）プロセスを実行することで、最終的な検出情報を出力できます。


## Backbone
Backboneの役割は入力からの特徴量抽出。

![model archi](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*FeAAyTPI4Uz0gJ3jOZ6jBw.png)
![backbone](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*WjobGmjoIZAVHz3S0KE9Sw.png)

BackboneはCSP Darknet53です。

主な構造は、複数のCBS（Conv + BatchNorm + SiLU）モジュールとC3モジュールを積み重ね、最後に1つのSPPFモジュールを接続します。

CBS モジュールは、C3 モジュールによる特徴抽出を支援するために使用され、SPPF モジュールはBackboneの特徴表現能力を強化します。

![sppf](https://miro.medium.com/v2/resize:fit:640/format:webp/1*7Tcs3ZoQWQu1CWfDN0fsIg.png)

SPPF はMaxPoolされた特徴をさらにMaxPoolすることにより、SPPNetの場合のようなSPPの繰り返し操作を回避しました。

これにより、モジュールの実行速度が大幅に向上します。


## Neck
Neckの役割は抽出した小、中、大の特徴量の融合。

![neck1](https://miro.medium.com/v2/resize:fit:640/format:webp/1*GhQ1NpkUYhQ4r1YNaSgDzQ.png)

![neck2](https://miro.medium.com/v2/resize:fit:618/format:webp/1*J-KDog89a2AAbqXJbWwX0Q.png)

YOLOv5 はFPN(Feature Pyramid Attention)とPAN(Pyramid Attention Network)のメソッドを使用します。
FPNの基本的な考え方は、特徴抽出ネットワークからの複数の畳み込みダウンサンプリング操作によって生成された出力特徴マップ (C3、C4、C5) をアップサンプリングして、異なるスケールのターゲットを検出するための複数の新しい特徴マップ (P3、P4、P5) を生成することです。

## Head
![head](https://miro.medium.com/v2/resize:fit:516/format:webp/1*Q26UWNWwAhhu01-ovXJsbQ.png)
![bbox reg](https://miro.medium.com/v2/resize:fit:356/format:webp/1*UuiXtEKfCzgdipeK_4VsKA.png)

特徴マップの左上隅の座標値は（0, 0）に設定されます。

$r_x$と$r_y$ は、予測された中心点の調整されていない座標です。

$g_x$、$g_y$、$g_w$、$g_h$は調整された予測ボックスの情報を表します。

$p_w$と$p_h$ は、前のアンカーの情報です。

$s_x$と$s_y$ はモデルによって計算されたオフセットを表します

事前設定されたアンカーの中心座標とサイズを、最終予測ボックスの中心座標とサイズに調整するプロセス。

## Model Variants
![veision](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*zJjmRSuIiNXzPz9e_6D2-Q.png)

YOLOv5には、YOLOv5x、YOLOv5l、YOLOv5m、YOLOv5s、YOLOv5nの 5 つのバージョンがあります。

対応するより大きなバージョンも 5 つあり、YOLOv5x6、YOLOv5l6、YOLOv5m6、YOLOv5s6、YOLOv5n6 です。

![detailed architecture](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*mtTOwoiMImWagaZbYTm3ew.png)

上記はYOLOv5lの詳細構成

## おまけ：Results

### Larger Models
![larger models](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*30DDNAgPcn179aldRdxU9A.png)

YOLOv5 の大型モデルはすべて、EfficientDet を大幅に上回ります。

### Smaller Models
![smaller models](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*pav7YL8Rc4xdl0PnjLxpZQ.png)

より小さなモデルと同様に、YOLOv5 のすべてのより小さなモデルもEfficientDetを大幅に上回り、速度もさらに高速です。

### Detailed Results
![detailed results](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*L3kYTQjUihcMz6px8jbQcw.png)

## 参考

https://github.com/ultralytics/yolov5

https://docs.ultralytics.com/yolov5/

https://www.mdpi.com/1424-8220/22/15/5817