SERP偵察とコンテンツの隙間
まず、これを書く前に「YOLO 追跡 範囲指定」とかで検索してみたんだ。うん、だいたい予想通り。上位に来るのは、だいたい公式ドキュメントの翻訳みたいなやつか、GitHubのREADMEをちょっと詳しくしたような技術ブログばっかり。
見てて思った、足りないなーって思うのは、こういう点かな。
- 「いつ使うべきじゃないか」が書かれてない:みんな「速くなる!すごい!」って言うけど、じゃあ逆に、全画面を追跡した方がいいケースは?とか、この「領域」から出たり入ったりする物体をどう数えるの?って話が全然ない。IDがリセットされちゃう問題とか、地味に困るはずなんだけど。
- ビジネス視点の欠如:「駐車場で使える」って書いてあっても、具体的にどうコスト削減につながるのか、とか、導入のハードルとか、そういう生々しい話がないんだよね。技術者のための技術解説って感じ。
- ちゃんと比較してない:「領域だけ見るから速い」はわかる。でも、じゃあ「領域内でただ物体検出するだけ」と「領域内で追跡する」のは、どう違うの?って。そのトレードオフが、いまいちピンとこない。
だから、この記事では、そういう「で、結局どうなの?」ってところに、もう少し突っ込んで考えてみたい。うん、そんな感じでいこう。
頭の中の整理も兼ねて、キーになる要素の関係を書き出しておくと…
- Ultralytics -[が提供してるのが]-> TrackZone
- TrackZone -[っていうのは…の一部で]-> Ultralytics Solutions
- TrackZone -[が解決しようとしてるのは]-> 全画面を追跡するときのパフォーマンス問題
- NVIDIA Jetson -[みたいなエッジデバイスに]-> TrackZone は結構向いてる
うん、よし。この辺を軸に書いていこう。
重点一句話
最近、物体検出の話をよくするけど、正直、ただ「見つける」だけじゃ物足りないことが多いんだよね。で、オブジェクトトラッキング、つまり「追跡」が大事になる。でも、それもPCのパワーを結構食う…。そんな時に、このTrackZoneっていう考え方が、なかなかいい落としどころになるかもしれない。
要するに、画面全体じゃなくて、「ここだけ見てて」って指定した範囲の中だけで、モノを追いかける技術。これだけで、処理がぐっと軽くなる。うん、マジで。
で、これ、実際どこで使うの?
「領域を絞る」って言われても、ピンとこないかもしれない。でも、よく考えると、僕らの周りって「全体」を見る必要がないケース、結構多いんだよね。
例えば、スマート交通システム。道路全体を24時間監視するのもいいけど、本当に知りたいのは「あの交差点の右折レーンが、今どれくらい詰まってるか」とか、「バス停に人が何人待ってるか」だったりする。道路全体を追跡するより、その特定の「枠」の中だけ見た方が、効率的だし、結果も早くわかる。
あとは、小売店の在庫管理とか。広い店内を映してる防犯カメラ映像、全部を解析するのは大変。でも、例えば「A社の新商品が置いてある棚」とか「レジ前の行列ができやすいエリア」だけを切り取って見れば、商品の減り具合とか、レジ応援が必要なタイミングとかが、もっと手軽にわかるようになる。正直、多くの店のカメラって棚を監視するために設置されてるわけじゃないから、こういう技術で必要な部分だけ注目できるのは、すごく実用的だと思う。
工場の生産ラインの監視も同じだね。巨大な工場全体じゃなくて、ベルトコンベアの特定の検品ポイントとか、ロボットアームが作業する範囲だけを監視すれば十分なことが多い。そこだけ見てれば、不良品の数を数えたり、機械の動きがいつもと違うことを検知したりできる。
結局、全部を見るんじゃなくて、一番大事な「一点」に集中する。その方が、結果的にうまくいくことって、多いよね。そういうことなんだと思う。
普通の追跡と何が違うの?
ここで、たぶん疑問に思うのが、「普通の追跡」とか「検出だけする」のと何が違うの?ってことだと思う。僕も最初、そう思った。ちょっと、頭の整理のために表にしてみようか。
| アプローチ | メリット(良いところ) | デメリット(うーん…なところ) | 個人的な使いどころメモ |
|---|---|---|---|
| 領域内での検出のみ (Detection-Only in Zone) | 処理は一番速いかも。特定の場所に「何かがあるか・ないか」だけ知りたいなら、これで十分。 | でもね、IDがないから、同じ物体がちょっと動いただけでも「新しい物体」として数えちゃう可能性がある。個数を正確に数えたい時には向いてない。 | 駐車場の「空き/満車」判定とか。車がそこに「ある」か「ない」かがわかればいいから。 |
| 全画面での追跡 (Full-Frame Tracking) | 一番情報量が多い。画面内の全ての物体の動きを把握できる。画面をまたぐような複雑な動きを分析したいなら、これしかない。 | とにかく重い。マジで。高性能なGPUがないと、リアルタイム処理は厳しい。消費電力も大きいしね。 | 交差点全体の人や車の流れを分析して、信号のタイミングを最適化したい、みたいな大規模な用途かな。 |
| TrackZone (領域内での追跡) | 速度と精度のバランスがいい。指定したエリア内なら、ちゃんとIDで物体を区別してくれるから、個数のカウントも正確。なのに、処理はそこそこ軽い。 | 領域から一回出ちゃうと、もう追えない。当たり前だけど。再び領域に入ってきたら、それは「新しい物体」として認識されちゃう可能性が高い。 | 店舗の出入り口の人数カウントとか。通過するだけで、長く画面に留まらないから、この弱点が気にならない。まさにこういう用途にぴったり。 |
こうやって見ると、TrackZoneは、完璧な解決策ってわけじゃなくて、「ちょうどいい」選択肢なんだなってのがわかる。何でもかんでもこれでOK、というわけじゃない。でも、ハマる場所には、めっちゃハマる。
じゃあ、どうやって動かすの?
さて、理屈はわかった。じゃあ実際にどうやって使うのか。Ultralyticsのいいところは、こういうのが驚くほど簡単に試せるところだよね。
Pythonコードでも書けるし、もっと手軽にコマンドライン(CLI)でも動かせる。とりあえず、動画ファイルのパスを指定して、どの範囲を見るかを設定するだけ。
モデルも指定できるけど、省略すればデフォルトの `yolo11n.pt`… あ、原文はyolo11ってなってるけど、これは多分将来のバージョン名かな。今のところはYOLOv8とかYOLOv9、最新のYOLOv10とかを使えばいい。ここでは一番軽い `yolov8n.pt` あたりを想定しておけばOK。 `n` はnanoモデルで、一番軽くて速いやつね。
これがPythonで書いた場合のサンプル。OpenCVを使ってる人なら、見慣れた感じだと思う。
import cv2
from ultralytics import solutions
# まあ、まずは動画を読み込むところから
cap = cv2.VideoCapture("path/to/your/video.mp4")
assert cap.isOpened(), "あれ、動画ファイルが読めない…"
# 動画のサイズとかフレームレートを取得
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH,
cv2.CAP_PROP_FRAME_HEIGHT,
cv2.CAP_PROP_FPS))
# 「ここだけ見て」の範囲を多角形で指定する
# これは (x, y) 座標のリスト
region_points = [(150, 150), (1130, 150), (1130, 570), (150, 570)]
# 結果を保存するための準備
video_writer = cv2.VideoWriter("result_video.avi",
cv2.VideoWriter_fourcc(*"mp4v"),
fps,
(w, h))
# TrackZoneの初期化。ここがキモ。
trackzone = solutions.TrackZone(
show=True, # 処理中の映像を表示するかどうか
region=region_points, # さっき定義した範囲を渡す
model="yolov8n.pt", # 使うモデルを指定。省略も可能
# classes=[0, 2], # 特定のクラスだけ追跡したい場合(例:0=人, 2=車)
)
# 1フレームずつ処理していくループ
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("動画の終わりか、エラーかな。ループを抜けます。")
break
# ここでTrackZoneの処理を呼び出す
im0 = trackzone.trackzone(im0)
# 結果を書き込み
video_writer.write(im0)
# 後片付けは大事
cap.release()
video_writer.release()
cv2.destroyAllWindows()
見ての通り、メインの処理は `trackzone.trackzone(im0)` のたった1行。Ultralyticsが面倒なところを全部やってくれる。ありがたい。
ちなみに、この `region_points` の座標を調べるのが地味に面倒だったりするんだけど、Ultralyticsには `parking annotator` っていう、駐車場の枠をGUIでポチポチ指定して座標を出力してくれるツールもある。それを使えば、もっと楽に領域指定ができる。
でも、いいことばっかりじゃないよね?
ここまで、良いところを中心に話してきたけど、もちろん弱点というか、考えるべき点もある。
一番大きいのは、さっきもちょっと触れたけど、「領域の外」は完全に無視されるってこと。もし追跡したい対象が、領域を出たり入ったりするような動きをする場合、TrackZoneはあんまり向いてない。入ってくるたびに新しいIDが振られちゃうから、「全部で何人(何個)いたか」っていう延べ人数みたいなカウントはできるけど、「特定の個人Aさんが、どれくらい滞在したか」みたいな分析は難しくなる。
それから、精度が上がるっていうのも、ちょっと注意が必要。「領域を拡大して見るから、小さい物体も見つけやすくなる」っていう理屈なんだけど、これは元の映像の解像度にもよる。もともとすごく低解像度の映像だと、拡大してもボケボケのままで、結局うまく検出できないってこともありえる。
あとね、エッジデバイスで動くのが魅力だけど、例えば NVIDIA Jetsonみたいなデバイスで動かすなら、どのYOLOモデルを選ぶかがすごく重要になる。一番精度の高い `x` モデル(extra large)とかを使うと、やっぱりカクカクしちゃう。軽い `n` モデル(nano)とのトレードオフを、現場でちゃんとテストする必要がある。日本だと、例えばマクニカさんとかがJetsonの技術情報に詳しいから、そういうところで最新のベンチマーク情報をチェックするのもいいかもね。
結局のところ、TrackZoneは「銀の弾丸」じゃない。処理を軽くするための、賢い「割り切り」の技術なんだと思う。この割り切りが許容できるかどうか、それが使いどころを見極める一番のポイントかな。
うん、だいたいそんな感じ。全画面を贅沢に処理するパワーがない時、でも「数える」精度は欲しい時。そんな、ちょっとわがままな要求に応えてくれる、なかなか面白いツールだと思うよ。
もしあなたがこれを使うなら?
もしこのTrackZoneを自分の身の回りで使うとしたら、どこに「監視エリア」を設定しますか?
例えば、オフィスの入口? 家のペットの餌皿の前? それとも、冷蔵庫の中? コメントで、あなたの面白いアイデアを教えてもらえると嬉しいです。意外な使い道が見つかるかも。
