物体検出AIのYOLOの精度がかなり上がっているようで、ビオトープのメダカの種類を識別するAIをYOLOv8で作ってみた。ビオトープは昨年の夏から始めて、今は白メダカ、楊貴妃メダカ、幹之(みゆき)メダカの3種類を飼っている。水面の反射があったり、オレンジ色の石が入っている状況で、それらを誤認識せず、メダカだけをそれぞれの種類を正確に表示するタスクになる。
YOLOv8について
YOLO (You Only Look Once) は物体検出の代表的なアルゴリズムで、物体を見つけてバウンディングBoxで囲ってくれる。YOLOv1は2015年に発表されており、YOLOv8はUltralytics社より2023/1に発表された。ソースと環境一式がGithubで公開されており、商用利用は有償ライセンスが必要である。Repositoryで説明されている性能を見ると、モデルサイズを小さく、高速に、それでいてこれまでのYOLOよりも精度が良いと報告されている。

データの準備
うちのベランダのビオトープをiPhoneで上から動画撮像し、各動画から数フレームピックアップしてJPEG画像で保存する。JPEG画像をLabelimgというアノテーションツールで各画像のメダカを矩形で囲って、3つのラベル(”shiro”: 白メダカ、”yokihi”: 楊貴妃メダカ、”miyuki”: 幹之メダカ)をつけていく。用意した画像は学習用に67枚、検証用に18枚用意した。
学習方法
実行環境はGoogle colabを使用。学習は至って簡単で、学習も推論もコマンドが用意されているので、1行を実行するだけで全て行ってくれる。データセットとラベル(“data.yaml”)をGoogle colabにアップロードしておく。
Google colabのセルで以下を実行し、YOLOをインストール。
!pip install ultralytics
その後に、事前学習済みのモデルをロードし、学習条件を設定するだけで学習を実行してくれる。モデルはYOLOv8lを使用。今回Epoch数は200回に設定、GPU使用で時間は大体50分ぐらいで終わる。
from ultralytics import YOLO
model = YOLO('yolov8l.pt')
model.train(data="data.yaml", epochs=200, batch=8, workers=4, degrees=90.0)
以下が結果で、ValidationデータでもAP50が98%を超えており、かなりいい結果が得られた。

実際の動画での検証
推論用の動画を置いたフォルダーを指定して、以下のコマンドを実行すると推論結果を表示し、動画を保存してくれる。(動画の保存はsave=Trueが必要)
!yolo task=detect mode=predict model=runs/detect/train/weights/best.pt conf=0.35 source="dataset/test" save=True
以下の動画のように、学習画像枚数が少ないにも関わらず、良好な結果が得られた。最初はYOLOv8sを使用したが、水面の反射で白くなっている部分を白メダカと誤判定したり、オレンジ色の岩の部分を楊貴妃メダカと誤判定しており、モデルを大きめのYOLOv8lに切り替え、Epoch数を増やして対応した。白メダカと幹之メダカは色が近いが、それぞれの認識もしっかりとできている。
オブジェクトトラッキング
このYOLOv8にはオブジェクトトラッキングの機能も用意されている。トラッキングはBoT-SORT (Robust Associations Multi-Pedestrian Tracking)というアルゴリズムが使われている。以下のコマンドでトラッキング結果を確認することができる。
!yolo track tracker="botsort.yaml" model=best.pt conf=0.4 source="IMG_9226.mp4" save=True show=False
トラッキングにより、一旦対象を検出できなくなっても可能な限り同一のものとしてトラッキングを継続してくれる。この動画だと左の方のid:3 (miyuki) が0:01のほどで一旦検出できなくなっているが、その後再検出した際に同じid:3でトラッキングを継続している。
まとめ
YOLOv8は非常にシンプルで使いやすく、高い精度で予測ができている。見たい対象をアノテーションしてデータを用意すれば、すぐに試して結果を見ることができる。今回の睡蓮鉢では概ね認識できるようになったが、水槽の動画で試したところ、認識精度はよくなかったので、汎化を求めるなら、他の背景でのデータセットを用意するなどデータセットに工夫が必要だと思う。