熟練の農家さんであれば畑や果樹園を見渡して収穫量を把握することができると思います。収穫量を把握することは結構重要なことで、例えば「農薬をつかった!」「今年は雨が多い!」など変化する状況が収穫量へおよぼす影響を理解するためです。
プロはその辺について正確に把握することができるのですが、普通の人はどうしても「先入観による思い込み」がありますよね。なんか収穫量が減った気がする。。。農薬が必要!と思い込んでしまうと、不要な農薬散布でコストUPしたり土壌が改質します。収穫量が本当に減少しているのか?減少していたとしても、どのくらい減少したか?を理解していると違った対応になる可能性がありますよね。
ここを理解しているか、していないかで大きく差が広がります。これは製造業でも「あるある」で大抵の問題は大丈夫だろうみたいな思い込みが原因だったりします。
今回は収穫量を把握したいけど、数えるのはめんどくさいという方にオススメな技術になります!
独自のデータをつかってオブジェクトトラッキングを実装していく方法、そのデータを利用して作物の収穫量を把握する方法をご紹介します。
↓注)音が出ます!
YOLOv5で物体検出した作物の数を数える【Object Counter】という技術を前に紹介しました。この技術では画像に収まりきらない数をかぞえることができないという問題があり、今回はバウンディングボックスにIDを付けて追従するオブジェクトトラッキングを利用しカウントしていきます。
独自に取得したデータでオブジェクトトラッキングを実装する手順
- YOLOv5で独自データをつかった学習を実施。学習重みデータ(***.pt)を取得
- 得られた重みデータ(***.pt)をYolov5_DeepSort_Pytorch作業フォルダへ移動
- Yolov5_DeepSort_Pytorchで学習した重みデータのpathを指定しObject Trackingを実行
簡単に説明するとこんな感じです。この順序で説明していきます。YOLOv5での学習や、Yolov5_DeepSort_Pytorchの使い方詳細については、過去の記事↓をご覧ください。
YOLOv5の学習について
Yolov5_DeepSort_Pytorchの使い方
YOLOv5で独自データの学習
今回はレタスの画像で物体検出していこうと思います。YOLOv5の学習が不安な方はこちら。
寒さの影響で霜にやられ変色しているモノがあります。見た目悪いですが甘いんですけどね。
ラベル付けは↓のように実施しました。labelimgをつかってアノテーションしています。
A:収穫可能
B:育成途中
C:傷み
アノテーションデータを準備したら学習を実施します。
YOLOv5のコードは↓をダウンロードして用いています。
必要なライブラリをインストールして、data.yamlのpathを先ほどアノテーションしたデータ/画像の保存先へ変更し↓のコードを実行します。
cd desktop/yolov5 #作業ディレクトリの場所を指定してください
python train.py --data data.yaml --cfg yolov5l.yaml --weights yolov5l.pt --batch-size 4 --epochs 1000
学習が終了すると./runs/train/expへ学習結果が保存されます。weightフォルダの中のbest.ptをオブジェクトトラッキングでつかうのでコピーしておいてください。
YOLOv5の学習は以上で簡単にご紹介しましたが、実はオブジェクトトラッキングで最も重要なことは「物体検出の精度」と思います。精度にこだわって学習することをオススメします。
重みデータ(best.pt)をYolov5_DeepSort_Pytorch作業フォルダへ移動
オブジェクトトラッキングは↓のコードを用いました。オブジェクトトラッキングの設定が不安な方はここ。
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
先ほど学習した重みデータ(best.pt)を保存します。↓のようにmodel_weightフォルダを作成しデータを保存してください。
Yolov5_DeepSort_Pytorch
-> model_weight
-> best.pt #ここに保存!
これでオブジェクトトラッキングの準備は完了です👍
Yolov5_DeepSort_PytorchでObject Trackingを実行
オブジェクトトラッキングを実施したい動画or画像データを保存します。↓のフォルダへ保存してください。
Yolov5_DeepSort_Pytorch
-> data
-> videos #ここに保存!
いよいよオブジェクトトラッキングを実行していきます。
↓のコードを実行してください。
python track.py --source ./data/videos/ --yolo_model ./model_weight/best.pt --save-vid --save-txt
引数を説明します。
--source :オブジェクトトラッキングするデータの在りか(path)を指定。 --yolo_model :学習済モデルの選択。 --save-vid :動画データの保存。 --save-txt :結果データの保存。収穫量のカウントで使います!
./runs/trackフォルダの中に結果ファイルが保存されています。↓のような感じです。
分かりにくいですが、バウンディングボックスに番号とアルファベットが記載されています。
左から順に、Tracking ID、ラベル、信頼性を表示しています。
ここで問題があり当初Tracking IDを数えれば収穫量が分かると思っていました。ですが動画中Tracking IDをよく見てもらうと飛び飛びでナンバリングされており、そのまま数えるだけではダメなことが判明しました。
そこで、面倒ですが↓次の処理を実行します。
収穫可能なレタスの数を数える
オブジェクトトラッキング処理で取得したtxtデータをつかって数を数えようと思います。
まずは、収穫可能なレタスのみを物体検出していきます。引数–classへ検出したいラベルを指定すると、そのラベルのみを検出することができます。
python track.py --source ./data/videos/ --yolo_model ./model_weight/best.pt --save-vid --save-txt --class 0
オブジェクトトラッキングが完了したらJupyter Notebookなどで↓のコードを実行します。
import pandas as pd
#数を数えたいオブジェクトトラッキング結果txtのpathを指定してください
df = pd.read_table("./runs/track/lettuce_A/.txt", header=None, delimiter=" ")
df_ID = df[1]
df_ID = set(df_ID)
len(df_ID)
Out[1]: 26
実行すると26となり、収穫可能なレタスは26個あることが分かります👍
まとめ・考察
今回はオブジェクトトラッキングを利用してレタスの収穫量を把握するタスクでした。ポイントと注意点をまとめます。
- 物体検出の精度が重要
- そもそも検出されなければカウントされない
- 間違った検出をするとカウントされ数が増える
- 正確な収穫数を出力するのは難しい
- AIが物体検出に迷った場合バウンディングボックスが重なって表示される場合がある
- 葉っぱなどに隠れて再度現れた場合、再びカウントされてしまうことがある
以上のことに注意し、収穫量を把握するレベルであれば十分実用と思います。
それでは、今日も良いディープラーニングライフを👍
YOLOv5の様々な使い方について
FarmLブログではYOLOv5の様々な使い方を紹介しています。お時間あれば併せてご覧ください。
- 独自データをつかったYOLOv5の学習方法
- 事前学習済みデータを転移学習したYOLOv5の学習方法
- 遺伝的アルゴリズムを利用したYOLOv5のパラメータ最適化手法
- YOLOv5で物体検出した画像を切り出して学習データにする方法
- YOLOv5で物体検出した作物の数を数える【Object Counter】
関連書籍のご紹介
ディープラーニングをやってみたい!という方におすすめな関連書籍のご紹介。
コメント