目次
1.はじめに
2.開発環境
3.学習
4.データセット
5.学習
6.テスト
7.実行結果
8.おわりに
9.参考文献
1. はじめに
普通の物体認識だと左下の画像[1]のようなバウンディングボックスが得られると思うのですが、YOLOv5-obb[2]を使用すると右下の画像[1]のように斜めの物体に対しても検出できるみたいです。
(※obb:Oriented Bounding Boxes)
今回は、roboflow[3] (学習用のデータアップロードからデータ整理、ラベリング、画像処理、学習、モデル配置、組み込み、アクティブラーニングまで一連で行えるプラットフォーム)にある、アメリカの手話のデータセット[4]を使って、斜めの物体検出をおこなってみました。この記事 [1]を参考にしてます。
2. 開発環境
実行環境としては、Google Colaboratoryを使用します。
3. 学習
YOLOv5-obbのリポジトリのインストール手順[5]に従って進めて行きます。まずはPytorchを使うための準備をします。(※cudaのバージョンは少なくとも10.0以上)
!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のリポジトリを複製します。
!git clone [https://github.com/hukaixuan19970627/yolov5_obb.git](https://github.com/hukaixuan19970627/yolov5_obb.git)
requirements.txt
にあるものをインストールしてきます。
%cd /content/yolov5_obb/
!pip install -r requirements.txt
utils/nms_rotated
フォルダにあるsetup.py develop
を実行します。
%cd utils/nms_rotated
!python setup.py develop
4. データセット
roboflowにはたくさんのデータセットがあるのですが今回は、アメリカの手話のデータセット[4]のv2を使用します。まずは、データセット用のフォルダを作成します。
%cd /content
!mkdir /content/datasets/
そのあとは、アメリカの手話のデータセット[4]のページに行きます。
右上のDownloadを押して、
FormatをYOLOv5 Oriented Bounding Boxesを選択してContinueを押すと、
このような感じのものが表示されるのでコピーして、Google Colaboratoryに貼り付けます。(※api_keyは隠してあります。)
!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に変更します。
最終的に以下の構造になっていることを確認します(※画像のファイル名は異なる)
5. 学習
今回は、Google Colaboratoryの90分対策として以下のEasy Auto Refresh[6]と呼ばれるChromeの拡張機能を使用しました。この拡張機能を使用することによって、任意の時間でページが再読込みされるようになります。
使用方法としては、上記の拡張ツールをChromeに追加すると、Easy Auto Refreshが選べるようになるので、クリックします。そうすると、右のようなものが表示されるので、再読込みする間隔を入れてstartを押します。この画像だと15分(900秒)ごとにページが再読込みされるようになります。
注意点としては、リロードの実行の1回目だけ、再読込み実行時に確認のウィンドウが出るので「再読み込み」ボタンを押すことです。
startボタンを押した後は学習です。(※引数のオプションの詳細[7])
%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 [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程度なので、ぼちぼちといったところでしょうか。
/content/yolov5_obb/runs/detect/exp/
にある推定結果をランダムに表示するコードです。実行結果は以下の通りになります。
%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)
次に出力結果を見てみたいと思います。
斜めのバウンディングボックスでしっかりと手話を検出することができました!
8. おわりに
今回は、アメリカの手話のデータセット[4]を使って、斜めの物体検出をおこなってみました。斜めでも物体を検出できるので色々と使い道がありそうです。最後までお読みいただき、ありがとうございました。
9. 参考文献
- https://blog.roboflow.com/yolov5-for-oriented-object-detection/
- https://github.com/hukaixuan19970627/yolov5_obb
- https://roboflow.com/
- https://universe.roboflow.com/team-roboflow/american-sign-language-poly/dataset/2
- https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md
- https://chrome.google.com/webstore/detail/easy-auto-refresh/aabcgdmkeabbnleenpncegpcngjpnjkc/related
- https://zenn.dev/gotty/articles/6bd35b25cf3bd9