【YOLOv5】物体検出 斜めのバウンディングボックス

# 目次
[1.はじめに](#1-はじめに)
[2.開発環境](#2-開発環境)
[3.学習](#3-学習)
[4.データセット](#4-データセット)
[5.学習](#5-学習)
[6.テスト](#6-テスト)
[7.実行結果](#7-実行結果)
[8.おわりに](#8-おわりに)
[9.参考文献](#9-参考文献)

# 1. はじめに
普通の物体認識だと左下の画像[1]のようなバウンディングボックスが得られると思うのですが、[YOLOv5-obb](https://github.com/hukaixuan19970627/yolov5_obb)[2]を使用すると右下の画像[1]のように斜めの物体に対しても検出できるみたいです。
(※obb：Oriented Bounding Boxes)
![スクリーンショット 2022-11-24 20.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/7e8f823a-9135-49ab-c483-b1d66c992ce8.png)
今回は、[roboflow](https://roboflow.com/)[3] (学習用のデータアップロードからデータ整理、ラベリング、画像処理、学習、モデル配置、組み込み、アクティブラーニングまで一連で行えるプラットフォーム)にある、[アメリカの手話のデータセット](https://universe.roboflow.com/team-roboflow/american-sign-language-poly/dataset/2)[4]を使って、斜めの物体検出をおこなってみました。この[記事](https://blog.roboflow.com/yolov5-for-oriented-object-detection/) [1]を参考にしてます。

# 2. 開発環境

実行環境としては、Google Colaboratoryを使用します。

# 3. 学習
YOLOv5-obbのリポジトリの[インストール手順](https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md)[5]に従って進めて行きます。まずはPytorchを使うための準備をします。（※cudaのバージョンは少なくとも10.0以上）
```python
!pip3 install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f [https://download.pytorch.org/whl/cu113/torch_stable.html](https://download.pytorch.org/whl/cu113/torch_stable.html)
```
YOLOv5-obbのリポジトリを複製します。
```python
!git clone [https://github.com/hukaixuan19970627/yolov5_obb.git](https://github.com/hukaixuan19970627/yolov5_obb.git)
```
`requirements.txt`にあるものをインストールしてきます。
```python
%cd /content/yolov5_obb/
!pip install -r requirements.txt
```
`utils/nms_rotated`フォルダにある`setup.py develop`を実行します。
```python
%cd utils/nms_rotated
!python setup.py develop
```

# 4. データセット
roboflowにはたくさんのデータセットがあるのですが今回は、アメリカの手話のデータセット[4]のv2を使用します。まずは、データセット用のフォルダを作成します。

```python
%cd /content
!mkdir /content/datasets/
```

そのあとは、[アメリカの手話のデータセット](https://universe.roboflow.com/team-roboflow/american-sign-language-poly/dataset/2)[4]のページに行きます。
![スクリーンショット 2022-11-24 19.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/0a972312-fa23-059c-f827-ae0637f30b57.png)
右上のDownloadを押して、
![スクリーンショット 2022-11-24 19.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/23cd7f96-ff00-e2e7-05f7-a8eeca9b285c.png)
FormatをYOLOv5 Oriented Bounding Boxesを選択してContinueを押すと、
![スクリーンショット 2022-11-24 19.18.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/94faf7c8-e161-2cd4-6655-29e1f13bf9c9.png)
このような感じのものが表示されるのでコピーして、Google Colaboratoryに貼り付けます。(※api_keyは隠してあります。)
![スクリーンショット 2022-11-24 16.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/05b435b9-34fd-db59-9ccc-bdbe4d1a5d09.png)
```python
!pip install roboflow

%cd /content/datasets/

from roboflow import Roboflow
rf = Roboflow(api_key="cKLlAAZJcgnAhi3ybN53")
project = rf.workspace("team-roboflow").project("american-sign-language-poly")
dataset = project.version(2).download("yolov5-obb")
```
`/content/datasets/American-Sign-Language-Poly-2`のAmerican-Sign-Language-Poly-2の名前をroboflowに変更します。
![スクリーンショット 2022-11-24 20.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/0bc82efe-376e-3f64-1ff1-01b092621f37.png)
最終的に以下の構造になっていることを確認します(※画像のファイル名は異なる)
![スクリーンショット 2022-11-24 16.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/e97619a3-bd26-9c1b-f5d1-f7b48b30fb48.png)

# 5. 学習

今回は、Google Colaboratoryの90分対策として以下の[Easy Auto Refresh](https://chrome.google.com/webstore/detail/easy-auto-refresh/aabcgdmkeabbnleenpncegpcngjpnjkc/related)[6]と呼ばれるChromeの拡張機能を使用しました。この拡張機能を使用することによって、任意の時間でページが再読込みされるようになります。

使用方法としては、上記の拡張ツールをChromeに追加すると、Easy Auto Refreshが選べるようになるので、クリックします。そうすると、右のようなものが表示されるので、再読込みする間隔を入れてstartを押します。この画像だと15分（900秒）ごとにページが再読込みされるようになります。

注意点としては、リロードの実行の1回目だけ、再読込み実行時に確認のウィンドウが出るので「再読み込み」ボタンを押すことです。
![スクリーンショット 2022-11-24 20.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/adbf9c46-6c0a-9f4a-9954-4f11c6c26504.png)
startボタンを押した後は学習です。（※引数のオプションの[詳細](https://zenn.dev/gotty/articles/6bd35b25cf3bd9)[7]）
```python
%cd /content/yolov5_obb/

!python train.py --data /content/datasets/roboflow/data.yaml --epochs 100 --batch-size 32 --img 416 --device 0 --exist-ok
```
30分ほどで学習が終わりました。

# 6. テスト
```python
!python [detect.py](http://detect.py/) --weights 'runs/train/exp/weights/best.pt' --source '../datasets/roboflow/valid/images' --conf-thres 0.5 --img 416 --device 0 --agnostic
```
今回は確信度の閾値指定としてが0.50を指定しています。

# 7. 実行結果
まずは、`/content/yolov5_obb/runs/train/exp/results.png`にある、学習の推移の画像です。（`/content/yolov5_obb/runs/train/exp/results.png`にあります）mAP@0.5が0.7程度なので、ぼちぼちといったところでしょうか。
![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/3d2c163b-f50f-15c1-4e17-90aaf94e44f7.png)

`/content/yolov5_obb/runs/detect/exp/`にある推定結果をランダムに表示するコードです。実行結果は以下の通りになります。

```python
%cd /content/yolov5_obb/runs/detect/exp/

import os, random
random_file = random.choice(os.listdir("/content/yolov5_obb/runs/detect/exp"))

from IPython.display import Image
Image(random_file)
```
次に出力結果を見てみたいと思います。
![スクリーンショット 2022-11-24 20.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624652/2577319f-2e69-a065-2034-45030d8785a7.png)
斜めのバウンディングボックスでしっかりと手話を検出することができました！

# 8. おわりに

今回は、アメリカの手話のデータセット[4]を使って、斜めの物体検出をおこなってみました。斜めでも物体を検出できるので色々と使い道がありそうです。最後までお読みいただき、ありがとうございました。

# 9. 参考文献

1. [https://blog.roboflow.com/yolov5-for-oriented-object-detection/](https://blog.roboflow.com/yolov5-for-oriented-object-detection/)
2. [https://github.com/hukaixuan19970627/yolov5_obb](https://github.com/hukaixuan19970627/yolov5_obb)
3. [https://roboflow.com/](https://roboflow.com/)
4. [https://universe.roboflow.com/team-roboflow/american-sign-language-poly/dataset/2](https://universe.roboflow.com/team-roboflow/american-sign-language-poly/dataset/2)
5. [https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md](https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md)
6. [https://chrome.google.com/webstore/detail/easy-auto-refresh/aabcgdmkeabbnleenpncegpcngjpnjkc/related](https://chrome.google.com/webstore/detail/easy-auto-refresh/aabcgdmkeabbnleenpncegpcngjpnjkc/related)
7. [https://zenn.dev/gotty/articles/6bd35b25cf3bd9](https://zenn.dev/gotty/articles/6bd35b25cf3bd9)