チャレンジ！画像認識 (Yoloファミリー編)

OvenCVから3年。最近、Yoloなるものがあることを知りました。
どんなものか、整理してみます。すでに、いろいろと記事が出ているので、二番煎じ感は否めません。

# Yoloシリーズ
執筆時点(2022年9月末)で、githubにてサーチしてみると、ワラワラ引っかかります。スクショは、人気順(Most starts)にしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/fdf15ee1-a6fb-b36d-ec36-3f79854af326.png)

V5が一番人気で、V3、Xと見えますね。この記事では、V3は本家を参照していますが、MakefileでCUDA=1としたい場合は、この画面に見えているレポを使うのが良いそうです(未確認ですが、ネットの記事で多く引っかかります)


# それぞれのチュートリアルに従ってみた
## Yolo v3 でトライ
Yolo v3の本家は、githubではなく、https://pjreddie.com/darknet/yolo/ のようです。Yoloの創始者の方のようです。
ここに、やり方がかかれているので、そのまんま追っていきます。

```
git clone https://github.com/pjreddie/darknet
cd darknet
make
wget https://pjreddie.com/media/files/yolov3.weights
```

ここまで実行すると、必要なファイルが揃います。
- darknet: 実行ファイル
- yolov3.weights: 学習済モデル

このあと、テストしてみなはれ、ということで、書かれているコマンドをそのまま実行します。

```
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
(snip)
  106 yolo
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 17.329849 seconds.
dog: 100%
truck: 92%
bicycle: 99%
```

サイトの情報とやや違うけど、表示されました。うちの環境は遅いのかぁ。。。(本家は秒殺) でも、結果はほぼ同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/3ea9d492-2a47-d951-1b19-baed2845636c.png)

GPUを使うには、MakefileにGPU=1を書きましょう。GPUを使ってくれます。ただし、yolov3.weightsは、4Gでは動かなさそう。(jetson nanoでは動かなかった。3060で、7Gほど利用しているように見えた)
CUDAを利用するには、2xxx世代が必要のようです。7.6だかが必要なエラーがでて先に進みません。CUDA=0でも、GPUで演算してくれます。nvidia-smiが反応します。

リベンジは、あえなく達成。学習させていないのに、ぬいぐるみって表示されています。bearじゃないけどね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/f16f4240-9be5-42e6-a151-9c9f31e62bc0.png)

プーさんも、余裕で認識。スゲー...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/b5c1c29d-7af6-8795-5c43-486cd84a1219.png)



## Yolo X でトライ
こちらは、https://github.com/Megvii-BaseDetection/YOLOX.git からダウンロードします。
python pipでインストールするので、環境保全を気にする方は、venvしてください。

```
python3 -m venv yolox
source yolox/bin/activate
python3 -m pip install -U torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
```

本家に書かれている通り実行

```
git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
python3 -m pip install -v -e .
wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_x.pth
```

学習済モデルは、性能がよいものを選択。スピード重視なら、yolox_s.pthとかのほうが良いでしょう

このあと、テストしてみましょう。

```
python tools/demo.py image -n yolox-x -c yolox_x.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/eb1f1d92-11d5-9d6a-dc36-1de694722f93.png)

ちなみに、辞書の大きさは2G程度なので、そのまま使うのであれば、v3より優しいと思われます


AI界のアイドル犬に引き続き、我が家のウサギとプーで検証。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/e9b8bfd8-d78a-5b9b-8662-cff1912cb8e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/ad7df7ad-a3a2-61ed-b8f1-2a69a17b44dc.png)

こちらも、難なくクリア。すごいっすね。


## Yolo v5 でトライ
GitHubが本家のようなので、そのままクローン https://github.com/ultralytics/yolov5

```
https://github.com/ultralytics/yolov5
cd yolov5
python3 -m pip install -U -r requirements.txt
```

このあと、実行です。チュートリアルのまま実行すると、yolov5sが選択されるので、ここでは、weightsを追記しています。

```
python ./detect.py --weights yolov5x.pt --source ../darknet/data/dog.jpg 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/cb8b21f5-fdfe-8d80-0808-76bf436db0f3.png)

うーん、なんとなく、悪い結果。人様の学習済モデルを使っているのに、上から目線コメントですな。

では、我が家のアイドルで挑戦！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/7aef63de-2e84-adbb-aa0d-a24b30c4d8c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/ae7eb194-67b7-f52a-8e1b-8dce17b052fc.png)

こちらも、yoloxに比べると、なんとなく、confidence levelが低いです。8割台かぁ。

それと、処理速度が微妙に遅いです。yoloxは、4.x msでフレーム処理していたのが、こちらは、5.x msが多い印象。ただし、yolov5は、640x480に整形しているので、その分の負荷があるかもです。

ちなみに、GPUのメモリ、8G食ってます。このあたり、Xよりグラボを選ぶので、面倒かもしれないです。


## Yolo v7 でトライ
現時点で、一番数字が大きそうな、v7も触ってみます。
こちらの本家もGitHubで大丈夫そう。https://github.com/WongKinYiu/yolov7.git

```
https://github.com/WongKinYiu/yolov7.git
```

おまじないに、requirements.txtをインストールしてもいいとは思います。v5のあとにやったので、ここでは無視しました。

で、実行。AI界のアイドル犬でトライ！

```
python3 ./detect.py --weights yolov7x.pt --conf 0.25 --img-size 640 --source ../darknet/data/dog.jpg
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/a167d671-c1db-ab2d-395b-b8f8c147bc0d.png)
v5よりは、いけてそう。Xと同じくらいの確信度が出てます。左上の茂みの物体は、バイクですかね。Xでは、植木鉢だったものが、バイクになってますね(v5もですが)。見た目、バイクが正解っぽいですよね。

それでは、再び、我が家のアイドルたちで見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/3faf1659-b2c6-60fd-265b-570c000a7e5b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/770141c1-e6ea-4a97-4331-194ec33062b2.png)

v5と比べると、優秀。Xと同じくらい。それよりも良い?くらい?

今日は力尽きたのでここまで。
yoloシリーズが動く環境が整ったので、めでたしめでたし