Point Tracking
ポイントトラッキングは、動画内で選択した点を追跡し、各フレームでの位置と可視性を報告します。手法、モデル、用途を紹介します。
ポイント追跡は、動画内の個々の点を追跡するコンピュータービジョンのタスクです。たとえば袖の模様や窓の角など、あるフレーム内のクエリポイントを指定すると、トラッカーは同じ物理的な点がほかの各フレームのどこに現れるか、また見えているかどうかを推定します。最近の研究では、クエリに事前定義されたキーポイントではなく任意のピクセルを指定できるため、ポイントを任意に追跡するタスク(TAP)と呼ばれています。ポイント追跡は、オクルージョン中も含めて、複数フレームにわたり疎な点の集合を追跡します。これは、ID付きのバウンディングボックスで物体全体を追跡する物体追跡や、連続する2フレーム間の全ピクセルの動きを推定するオプティカルフローとは異なります。
ポイント追跡の仕組み#
従来のKanade-Lucas-Tomasi(KLT)トラッカーは、2方向に強いテクスチャを持つコーナー、つまりShi-Tomasiの「追跡に適した特徴点」を選びます。そして、その周囲のパッチが最もよく位置合わせされる小さな移動量を求め、次のフレームで各点を見つけます。大きな動きには画像ピラミッドを使います。OpenCVでは、この両方の処理を利用できます:
import cv2
import numpy as np
# Read an overhead clip of people walking and pick 300 corners in its first frame
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4")
prev = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
points = cv2.goodFeaturesToTrack(prev, maxCorners=300, qualityLevel=0.01, minDistance=5)
start = points.copy()
# Follow every point frame to frame with pyramidal Lucas-Kanade optical flow
while (frame := cap.read()[1]) is not None:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
points, status, _ = cv2.calcOpticalFlowPyrLK(prev, gray, points, None)
found = status.ravel() == 1 # keep only the points found again
points, start, prev = points[found], start[found], gray
distance = np.linalg.norm(points - start, axis=-1)
print(f"{len(points)} of 300 points tracked to the last frame, median shift {np.median(distance):.1f} px")出力は292 of 300 points tracked to the last frame, median shift 28.7 pxです。クリップの62フレームを通じてトラッカーは8点を見失い、残りの点は開始位置からの距離の中央値が28.7ピクセルでした。KLTは連続するフレームだけを比較するため、小さな誤差が蓄積します。また、オクルージョンを認識しません。通行人に隠された床の点が通行人上に滑り移っても、追跡結果として報告され続ける場合があります。
学習ベースのポイントトラッカー#
ディープラーニングを使うトラッカーは一度に多くのフレームを処理し、各フレームの位置と可視フラグを予測します。TAP-Vidベンチマークは2022年にこのタスクを定義し、人手でポイント軌跡をラベル付けした実動画を用意しました。PIPs(2022)は複数フレームのウィンドウでポイントの軌跡を反復的に調整し、短いオクルージョンをつなぎます。TAPIR(2023)は、まずクエリポイントの特徴を全フレームと照合し、次に時間的コンテキストを使って軌跡を調整します。MetaのCoTrackerはTransformerで複数の点を同時に追跡するため、同じ物体上にある点同士が、いずれかの点が隠れたときに互いを補います。実動画のラベル付き軌跡は少ないため、CoTracker3(2024)は合成動画で学習した後、ほかのトラッカーが擬似ラベルを付けた実動画で学習します。そして、従来の1,000倍のデータで学習したトラッカーより良い結果を報告しています。
実際のアプリケーション#
Ultralyticsの追跡モードは、マルチオブジェクト追跡でポイント追跡を使ってカメラの動きを相殺します。デフォルトのTrackTrackトラッカーとBoT-SORTは、各フレームで最大400個のコーナーを検出し、ピラミッド型Lucas-Kanadeフローで追跡します。次にRANSAC(gmc_method: sparseOptFlow)で回転、スケール、平行移動を当てはめ、各トラックの予測ボックスを移動させて、新しいYOLO26検出結果とのマッチングを行います。










