オープン語彙検出モデルとは
以下の画像のようにテキストベースの入力から,物体検出を行うニューラルネットワークモデルのことです.
本来はデータを収集して,アノテーションをして,検証をして,使えるモデルの完成!!のような流れですが,オープン語彙検出モデルを使うことで,一番時間がかかるといっても良いアノテーションの作業を自動化させようと考えました.
今回はUltralyticsが公開している"yolov8x-worldv2"を使ってみました.
検出を試す
やること
アノテーションをしたい対象の画像から,検出対象をYOLO-WorldにアノテーションをしてもらいYOLO形式のアノテーション結果を出力させる.
準備(必要なライブラリのインストール)
$ conda create -n yolo_venv python=3.11(必要に応じて仮想環境を作る)
$ conda activate yolo_venv(必要に応じて仮想環境を作る)
$ pip install ultralytics
アノテーション対象の画像
セブンイレブンの弁当やコールスローなどのサラダなどが写っている画像が手元にありましたので,こちらを使用します.
検出と結果の出力
弁当とサラダスティックとコールスローを検出してみます.
それぞれプロンプトを["lunch_box", "plastic cup", "salad bag"]としてみます.
from ultralytics import YOLO
model_path = "model/yolov8x-worldv2.pt"
detect_classes = ["lunch_box", "plastic cup", "salad bag"]
img_path = "data/bento.png"
model = YOLO(model_path)
model.set_classes(detect_classes)
results = model(img_path, save_txt=True)
results[0].show()
モデル自体はultralyticsのライブラリが自動でダウンロードしてくれるので,画像のパスと検出対象の変数だけ変更してください.
結果
-
検出結果の画像出力
このような結果になりました.弁当は検出できています.
コールスローとサラダスティックが検出できていません.プロンプトもいろいろ変えてみたのですが,検出できなかったのでそもそも学習データに近い物体がなかったと考えられます.
あと画像全体がlunch_boxになっちゃってますね.また,confidenceも高いので,修正が難しそうです..これはあまりいい結果とは言えません.
追加でtrainingを行うことで,検出できるかもしれませんが,それだと本末転倒です.(泣)
-
テキストファイルの出力
出力結果はカレントディレクトリのruns\detect\predict
に保存されます.
効果的な使い方
正直,今回用いたデータでは,うまく機能しなかったためあまり必要性を感じませんでした.ただ,推論時間が画像1枚あたり100msもかからない程度だったので,Ultralyticsのサイトでも記述されている通りリアルタイム検出として用いるべきなのかもしれません.
また,簡単に調べてみたところ,"tallest man"だったり,"white dog"など色や特徴などを記述する使い方をされている方が多かったです.十分なデータセットがない場合でもこのモデルを使うことで,異常検知・検出のようなモデルを作成できそうだなと感じました.
簡単に試したい場合
hugging faceでYOLO-Worldを検索すると,簡単に検出のデモをできるアプリケーションが公開されています.
手元に環境が用意できなければ,そちらから試してみると良いかもしれません.