作物を育てて気になることの一つに「どのくらい収穫できるか?」があると思います。熟練の農家さんであれば、畑を見渡して収量を把握するのかもしれませんがなかなか難しいですよね😥
今回はオブジェクトトラッキング(Object Tracking※)というAI技術をつかって、畑にどのくらい収穫できそうなモノがどのくらいあるかを数えていきます❗長くなってしまいそうなので、今回はひとまずObject Trackingの実装編です。
※Multiple Object Tracking(MOT)と言われたりもします。
YOLOv5で物体検出した作物の数を数える【Object Counter】という技術を前に紹介しました。何が違うの・・・?と思うかもしれませんが、その辺りも説明していきます。
Object Trackingとは、↓のように物体検出したバウンディングボックスに番号をつけて追いかける技術です。
Object Trackingとは!?
- Object Detection
Object Trackingを説明する前に、先ずは物体検出(Object Detection)を簡単に説明する必要があります。物体検出は画像から物体の位置と種類を検出するAIモデルになっています。物体検出AIがみているのは一枚の画像のみです。
過去に物体検出の動画を出力していますが、これは複数の物体検出画像をつなげることで動画をつくっています。これが物体検出動画の中身です。
- Object Counter
さて、ここでObject Counterの話になります。Object Counterは物体検出より得られたバウンディングボックスをカウントしています。つまり、ある瞬間での物体の数をかぞえることはできていますが、例えば畑全体で収穫できそうな作物の量を数えるといった、画像に収まりきらない数をかぞえることができないのです。
Object Counterは、例えば瞬間の人混みや、道路の混雑状況など、大まかに数を把握したいタスクには適していますが、正確に数を数えるタスクは苦手なんですね😨
- Object Tracking
これでは困るということで、使えそうな技術がObject Trackingです。Object Trackingは物体を追跡するAI技術です。
↑のGIF動画のバウンディングボックスに割り振られた番号(171, 174とか)がフレームが切り替わっても追従しているのが分かると思います。このバウンディングボックスへ割り振られる番号を数えることで作物の量が分かる!?という発想です。
ちなみに各フレームのバウンディングボックスが同一のモノか?という判断をおこなっているのもAIです。今回はこのAIの部分にDeepSortというモデルをつかっていきます。
YOLOv5+DeepSortオブジェクトトラッキングをやってみる
実行環境
いつものようにローカル環境で実装していきます。
PC環境
- OS : Windows 10
- CPU : AMD Ryzen7 5800
- メモリ : 16GB
- GPU : GeForce RTX3070 8GB
CUDA関連
- CUDA : 11.4
- cuDNN:8.2
Python
- Python 3.8.12
コード
コードは↓のモノをつかわせてもらいました。Colab Notebookも公開されています。試してはいませんがそちらでも同じことができると思います。
Git cloneしていくのですが、ここで注意です。Yolov5_DeepSort_Pytorchは「YOLOv5」をサブモジュールとしてつかっているので、普通にGit cloneしたり、コードをダウンロードしても起動しません。
↓のコードを。AnacondaPromptなどで実行してください。※Gitはあらかじめインストールしておく必要があります。
git clone --recurse-submodules https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
ライブラリインストール
作業ディレクトリへ移動し必要なライブラリのインストールしてください。
cd Yolov5_DeepSort_Pytorch
pip install -r requirements.txt
Pytorchはバージョン1.7が必要なのですが、私の環境ではPyTorchが何故かインストールできなかったので手動でインストールしています。↓のHPより環境にあったモノをpipインストールしました。
学習済重みをつかってひとまず実行してみる
検証用の動画はコレをつかってやってみました。ダウンロードし作業ディレクトリ化へ格納してください。
Yolov5_DeepSort_Pytorch
-> data
-> videos #ここに保存!
さっそく学習済み重みをダウンロードしてObject Trackingをやってみましょう!↓のコードを実行してみてください。
python track.py --source ./data/videos/ --yolo_model yolov5s.pt --save-vid --save-txt --class 0
引数を説明します。
--source :オブジェクトトラッキングするデータの在りか(path)を指定 0 # webcam img.jpg # image vid.mp4 # video path/ # directory path/*.jpg # glob 'https://youtu.be/Zgi9g1ksQHc' # YouTube 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream --yolo_model :学習済モデルの選択。 yolov5n.pt --img 640 yolov5s.pt yolov5m.pt yolov5l.pt yolov5x.pt --img 1280 path/ #独自データ.pt --save-vid :動画データの保存 --save-txt :結果データの保存 --class :物体検出するクラスを指定。デフォルトだとCOCOラベルとなっているので 0 #person 1 #bicycle 2 #car ...
↓のような動画が、./runs/track/expフォルダの中に生成されたと思います。
若干見づらいですが、バウンディングボックスに番号が表示され、フレームが進んでも追従しているのが分かるかと思います。
お疲れ様でした。これでひとまずobject trackingの実装完了です。
–class引数を変更するといろいろなモノをトラッキングできるようになります。また–classになにも設定しなければCOCOのクラス全てをマルチオブジェクトトラッキングします!
いろいろやってみた動画が↓です。よかったらご覧ください。※注)音出ます
オリジナルデータでオブジェクトトラッキングしてみる
独自のデータをつかってもObject trackingを実装することができます!簡単にやり方だけ説明すると↓の感じです。
- YOLOv5で独自データをつかった学習を実施
- 学習で得られた重みデータを(best.pt)をYolov5_DeepSort_Pytorch作業フォルダへ移動
- –yolo_model へ学習した重みデータのpathを指定しObject Trackingを実行
ざっくりこんな手順です。これを利用することで畑の作物の収穫量を把握することができるようになります。詳細は長くなるので別のブログでご紹介しようと思います👍
独自のデータをつかってレタスの収穫量を把握してみました!
YOLOv5の様々な使い方について
FarmLブログではYOLOv5の様々な使い方を紹介しています。お時間あれば併せてご覧ください。
- 独自データをつかったYOLOv5の学習方法
- 事前学習済みデータを転移学習したYOLOv5の学習方法
- 遺伝的アルゴリズムを利用したYOLOv5のパラメータ最適化手法
- YOLOv5で物体検出した画像を切り出して学習データにする方法
- YOLOv5で物体検出した作物の数を数える【Object Counter】
関連書籍のご紹介
ディープラーニングをやってみたい!という方におすすめな関連書籍のご紹介。
コメント