2022年最新のYOLOv7の論文解説


最新のYOLOv7が出ました。

https://arxiv.org/abs/2207.02696

論文を読むのに必要な周辺情報をいろいろ追加しながらまとめてみました。
あとnetronで表示するために[ONNXファイル](https://qiita.com/h1day/items/ab003cc1ed03b795d95f#7-netron%E8%A1%A8%E7%A4%BA%E7%94%A8%E3%81%AEonnx)を置いておきました。

# 1. どんなもの？
1. 2022年7月に出た物体検出の最新手法。
1. YOLOv4のチームが作った正統なやつ(※)。
1. **5FPSから160FPSのリアルタイム物体検出で最強。**
1. 追加データなし。MS COCO データセットのみので学習している。
1. エッジデバイスで使いやすいレイヤーを選んでいる。（イントロで気にしている。）

※YOLOの作成者が入り乱れている様子については下のリンクにまとめています。

https://qiita.com/h1day/items/e43d9ae57329558cfb20


※論文タイトルの trainable bag-of-freebies は推論時間に影響を与えずに精度を向上する工夫のこと言っています。
bag-of-freebiesというのは YOLOv4のときも使っている言葉で、freebiesはプロモーション用の景品のことみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/b60cfd92-7718-b8ce-88f3-a015aa92ce68.png)

# 2. 先行研究と比べてどこがすごい？

5FPSから160FPSのリアルタイム物体検出で最強です。（数字や図は[darknet](https://github.com/AlexeyAB/darknet#yolov7-trainable-bag-of-freebies-sets-new-state-of-the-art-for-real-time-object-detectors)より引用。)

* YOLOv7-e6 (55.9% AP, 56 FPS) by `+500%` FPS faster than **SWIN-L C-M-RCNN** (53.9% AP, 9.2 FPS)
* YOLOv7-e6 (55.9% AP, 56 FPS) by `+550%` FPS faster than **ConvNeXt-XL C-M-RCNN** (55.2% AP, 8.6 FPS)
* YOLOv7-w6 (54.6% AP, 84 FPS) by `+120%` FPS faster than **YOLOv5-X6-r6.1** (55.0% AP, 38 FPS)
* YOLOv7-w6 (54.6% AP, 84 FPS) by `+1200%` FPS faster than **Dual-Swin-T C-M-RCNN** (53.6% AP, 6.5 FPS)
* YOLOv7x (52.9% AP, 114 FPS) by `+150%` FPS faster than **PPYOLOE-X** (51.9% AP, 45 FPS)
* YOLOv7 (51.2% AP, 161 FPS) by `+180%` FPS faster than **YOLOX-X** (51.1% AP, 58 FPS V100)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/1f65d1a4-7985-76a4-d1ea-2e3c66b172ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/9863081a-b181-75b5-b69c-07bef5d800c2.png)

# 3. 技術や手法のキモはどこ？




## 3.1 concatで効率的に動作する Extended efficient layer aggregation networks (E-ELAN)

これはbackbone用のネットワークです。
著者らが提案し、YOLOv4でも使っている[Cross Stage Partial Network(CSPNet)](https://openaccess.thecvf.com/content_CVPRW_2020/html/w28/Wang_CSPNet_A_New_Backbone_That_Can_Enhance_Learning_Capability_of_CVPRW_2020_paper.html)の発展形です。

CSPNetは勾配の多様性を得ながら計算を減らすために特徴量の分割とconcatを多用しています。下図。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/dd61fa07-be59-5a37-8ef6-494bcf0ff264.png)


E-ELANの図を見る前に[Scaled YOLOv4](https://arxiv.org/abs/2011.08036)の図を見ておくと分かりやすいと個人的には思います。
$g$がチャンネル数。kがconvのカーネルサイズです。
チャンネル数2gの特徴量マップを2つに分割し、片方は3x3convします。このように
作った複数の特徴量マップをconcatし合計4gのチャンネル数になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/a70a2c7d-c019-2a46-b782-92a9ca2176d8.png)


こちらがYOLOv7の図です。cがチャンネル数です。図の中の**partial** はもともと2cチャンネルあった特徴量マップを分割していることを表します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/13e0ee29-5a47-88dd-8f5f-79a998fb2a6f.png)


補足：DenseNet や VoVNet もこの方針のネットワークです。そのため、上の図にVoVNetが登場しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/35f2d36a-e784-1d0a-66d1-6c0560ea67af.png)



## 3.2 model scaling

一般論として、モデルを大きくするときは以下のパラメータがあります。
- Resolution : 画像サイズ
- depth : レイヤー数
- width : チャンネル数
- stage ：フィーチャーピラミッドの数

Neural Architecture Search (NAS)で探索するのが（GPUいっぱい使えるなら）一般的ですが、今回のようなconcatを使うネットワークでは困ってしまいます。
NASは1パラメータずつ探索していくのに対して、concatを使うネットワークはdepthを大きくするとwidthが大きくなるような挙動でパラメータ間の関連が強いためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/24800099-9611-0e14-fd85-3d8f5a867fbe.png)

以下のようなモジュールにすることで、depthが増えても直後のwidhtで調整することでwidthの変化の入力をwidthの変化の出力にできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/db74178c-ab86-a255-534b-c48229d10161.png)


## 3.3 model re-parameterization 

これは [Rep-VGG](https://good-lemon.tech/2021/03/06/repvgg/) の考え方をconcatベースのネットワークに入れ込もうとしています。

Rep-VGGは学習時には3x3conv，1x1conv，skip-connectionを並列にして勾配消失問題を解決し、推論時は3つを合成したconv1個にして高速に動きます。
まさに freebies ですね。
(余談ですが、この[Rep-VGG](https://github.com/megvii-model/RepVGG) を出している megviiが[YOLO X](https://github.com/Megvii-BaseDetection/YOLOX)を出しています。すごい。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/ae9eb0a4-1049-f6a8-4487-77fef7c8c625.png)

ただし、このRepConvはVGGではうまくいっていますが、ResNetやDenseNetに適用するとうまくいきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/2c9e7021-fea7-f757-9833-08fd9d394285.png)

筆者らの分析によると、RepConvのskip-connectionの部分がResNetのResidualやDenseNetのconcatを破壊しているとのこと。
そこで、RepConvNというskip-connectionなしのモジュールを導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/588644e0-abbf-7d09-9ac9-8c4f863a16a1.png)

RepConvで差し替えるか、RepConvNで差し替えるかは下の図のように決めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/4416c874-b367-f3eb-016c-ec0a46cda52d.png)


##  Coarse for auxiliary and fine for lead loss

最近の流行り2点を取り込むことを目論んでいます。
1. Deep supervision : 学習中は中間に補助のヘッドを足して浅い層の学習を促します。
1. ソフトラベル: 正解、不正解だけでなく中間の結果をラベルして学習します。

ということで、もともと使うヘッド(Lead Head)に追加してAuxiliary Head も使って学習します。
学習方法としは、図の(d)と(e)を提案しています。
(c)独立に学習
(d)Lead Head を Aux Head のソフトラベルとして学習する。
(e)Lead Head を Aux Head のソフトラベルとして学習するが、Aux Head がよくなりすぎるとLead Head が考えなくて良くなっちゃうので、完全な結果にならないようにする。【著者達のオススメ】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/a850f234-8b54-d9eb-3fa1-eff1533e9fdb.png)




# 4. どうやって有効だと検証した？

- まずは冒頭のグラフ。強い。すごい。5FPSから160FPSのリアルタイム物体検出で最強です。
下の図はV7の議論より引用しました。 → https://github.com/WongKinYiu/yolov7/issues/40
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/ee7465f4-71f8-403b-1aa6-7b99cf58c863.png)



- スケーリング方法の比較
これは違いが出ている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/bc8dbd6a-5573-52da-fd48-3329c6db5f51.png)

- model re-parameterization の効果
skip-connectionから遠いパーツだけ変更した(c)が一番良かった。けど図4を見ると(d)のAPが下がっているのが狙い通りなのか疑問。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/7a50506d-1155-323d-b899-58bcb9088bf1.png)

- Coarse for auxiliary and fine for lead loss の効果
AUＸヘッドには効果ありそうだが、提案のcoarse-to-fineは微妙では？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/656b883e-135a-fc5e-30cb-b1f1a3eff212.png)

# 5. 議論はある？

- 精度の変化は小さいのでAblation study はパーツごとの速度変化にしてほしかった。
- あと、モデルの命名規則がよくわからないです。。。

# 6. 次に読むべき論文は？

”Designing network design strategies"という[anonymousの論文](https://github.com/WongKinYiu/yolov7/issues/17)。これでELANの全容が分かりそう。

そして次のYOLO！

# 7. netron表示用のONNX

[netron](https://netron.app/)で見たいだけのわりに変換が面倒なので作成したものを置いておきます。
ダウンロードして、netronで開いてください。

| ONNX |  Test Size |layers  |  parameters  |  GFLOPS  |
| ---- | ---- | ---- | ---- | ---- |
| [YOLOv7-tiny](https://drive.google.com/file/d/1VojECc9BjOGDBfNBRVfaLPo8ZsefDR4I/view?usp=sharing) |  640 | 200 | 6219709 | 13.7 |
| [YOLOv7](https://drive.google.com/file/d/1yEeersD38uEYsDHjTuV9phljKlCz-YKb/view?usp=sharing) |  640 | 306 | 36905341 | 104.5 |
| [YOLOv7x](https://drive.google.com/file/d/1u5STPBu_zaXobISUu0pecll767nVyBxG/view?usp=sharing) | 640| 354 | 71311741 | 189.7 |
| [YOLOv7w6](https://drive.google.com/file/d/1X8HIG7Dl7TejbSfTqM5Ab01FCgaPxR_P/view?usp=sharing) | 1280 | 343 | 70394300 | 89.9 |
| [YOLOv7e6](https://drive.google.com/file/d/125N4FmA9XGUNyJL5Dx8UFwoXNbxLN-n8/view?usp=sharing) | 1280 | 473 | 97202940 | 128.6 |
| [YOLOv7d6](https://drive.google.com/file/d/1-WaUavncBfv1Kd4lm0ukL93vdwTfHTBi/view?usp=sharing) | 1280 | 539 | 133757052 | 175.4|
| [YOLOv7e6e](https://drive.google.com/file/d/1L11bloSq4lK-fLKnF55SamwPAdhI1J0w/view?usp=sharing) | 1280 | 792 | 151687420 | 210.5 |

比較用: これらはdarknetのcfgがあるのでクリックで直接見れます。
| cfg |  Test Size | layers  |  parameters  |  GFLOPS  |
| ---- | ---- | ---- | ---- | ---- |
|[YOLOv4-CSP](https://netron.app/?url=https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-csp.cfg) | 640 | ー | 52.9M | 120.4 |
|[YOLOR-CSP](https://netron.app/?url=https://github.com/WongKinYiu/yolor/blob/main/cfg/yolor_csp.cfg) | 640 | ー | 52.9M | 120.4 |
|[YOLOR-CSP-X](https://netron.app/?url=https://github.com/WongKinYiu/yolor/blob/main/cfg/yolor_csp_x.cfg) | 640 | ー | 96.9M | 226.8 |
 

注：このアクティベーションは[SiLUまたはSWISH](https://atmarkit.itmedia.co.jp/ait/articles/2004/15/news018.html)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/691d222f-1736-ba80-1953-86b067d23122.png)


## 8. 参考
論文  https://arxiv.org/abs/2207.02696
Github https://github.com/WongKinYiu/yolov7

YOLOv4とScaled YOLOv4を知っていることが前提の論文。これらについては本人による記事が良さそう。

https://alexeyab84.medium.com/scaled-yolo-v4-is-the-best-neural-network-for-object-detection-on-ms-coco-dataset-39dfa22fa982