前半はポエムです。
imgsz
について早く知りたい方は後半からどうぞ。
UltralyticsのDiscordで質問をしたら、叱られた!
私もいい大人なのに、見事に叱られました。
Ultralytics YOLOv8を利用して、物体検出のアプリを作成しています。
物体検出できている時は良いのですが、学習が不十分なのか、周囲の環境の影響か認識できないこともあり、その場合は検出/不検出とでチラチラと点滅するような挙動になってしまいます。
直前のフレームでは検出できているので時間軸を考慮した検出ができないか?と考えました。
パラメータにaugment
というものがあり、時間という言葉が見えたので時間軸を考慮したものか?と思い試していたのですが、イマイチ効果を体感できません。(処理が遅くなったので動作はしていた)
作成しているアプリでは動画ファイルをフレーム単位で処理対象としていますが、ultralyticsでは動画ファイルそのものを読み込んだり、youtubeのアドレスも処理対象として扱えます。
- もしかしてフレーム単位だとaugmentは機能しないのかな?
- もしそうなら、ultralyticsのDiscordで相談したら、いい案を教えてくれるかも?
と思い、早速ultralyticsのDiscordに参加しました。
質問ややり取りは、google翻訳を利用して言いたいことになってそうなことを確認してコピペ。
augmentについて質問したところ、
「augmentに時間軸というような機能はないよ(意訳)」
ということでした。
私は検出精度をあげかったので、どうすればいいだろう?とアドバイスを求めたところ、どんなコードで検出しているのか?と問われ、
results = model.predict(source=rsz_frame,conf=score,device=device,imgsz=int(w*0.5),show_labels=False,show_conf=False,show_boxes=False,augment=False,stream_buffer=False)
「入力画像をリサイズしているのか??なんで???ultralyticsが自動でするのに?(意訳)」
いや、その方が処理速度が速かったから・・・
「元の画像の解像度は?(意訳)」
「学習に利用しているデータの解像度は?それもリサイズしてるの?(意訳)」
「学習時のimgsz
は?」
順に回答する私。
「はー・・・(頭を抱える(想像)」
えーと、わたしはどうすれば・・・
私が行っていた処理は次の通りです。
- 私は2560x1080の画像を50%に縮小し、学習させていました(1280x540)
-
imgsz
は入力画像の解像度と思っていたので、学習時はimgsz=1280
としていました - 物体検出をするフレーム切り出し時は元の解像度(2560x1080)ですが、50%リサイズしたものも準備します
- リサイズした画像をyolov8に渡し、
imgsz
は、元解像度の50%としています(1280) - yolov8で検出した座標を1/0.5で割り戻して、元の画像に当てます
Ultralytics YOLOv8 imgszについて
「ok、わかった!キミは次の通りにしろ!(意訳)」
Don't resize your training dataset
Don't resize the images you inference with
Put imgsz=1280 for both training and inference
imgsz
は、入力画像の解像度だと思い込んでいましたが、正確にはYOLOv8に取り込む際の解像度になります。
デフォルト値はimgsz=640
となっており、どのような解像度のデータが来ても、YOLOv8に取り込む際に自動的に640x640にして、学習や推論を行います。
つまり私はUltralytics YOLOv8側でいい感じに縮小処理してくれるものを、わざわざ外で処理していたことになります。
また、学習においてもわざわざ縮小していましたが、これも本来は不要で、処理速度や精度が満足できるだけのimgszを設定するのが正解でした。
例えば、元画像が1024*1024で、処理速度の向上を図りたいのであれば、極端にいえば、imgsz=100
(100x100)というように縮小した状態で、学習、推論させればいいわけです。
但しimgsz
を小さくしすぎると、画像は潰れてしまうので検出や学習ができない場合が増えてくるだろうと思います。
元画像の解像度よりimgsz
を大きくするなという話は別のやり取りで見ました。恐らく空白で不足部分を埋めてYOLOv8に渡されるのではないかと思います(確認してません)
私が利用しているのはYOLOv8ですが、YOLOv10やYOLOv11においても同様だと思います。
物体検出以外でもパラメータがimgsz
であれば、同じような考え方だろうと想像します。
その他、感想とか。
- Ultralyticsは、使う側に寄り添った痒い所に勝手に手が届く作りになってるなーと思っていましたが、今回の出来事でますますその印象が強くなりました。すごく簡単!
- 自前リサイズと、Ultralyticsにおまかせリサイズでは、Ultralyticsおまかせの方がやや速かったです
- 別のOSSでgithub issueを起票したこともあるのですが、正直自分のスキルレベルから考えるとかなりハードルが高いと感じていました。(英語、内容の正誤、忙しいメンテナ、いつ手をつけるのだろう?直してもらえるのかな?などなど)
Discordでの問い合わせややり取りは、google翻訳の力を借りれば、意外とイけるなと感じました(ただ事前に英語は苦手でgoogle翻訳使ってます、と前置きはしてます) - いい大人なのに根本的な内容で叱られると結構堪えます。気を付けよう!