文字で指定した“概念”を動画から全部追跡できる。Ultralytics「SAM 3」をWindowsで最短実行する手順(例つき)

文字で指定した“概念”を動画から全部追跡できる。Ultralytics「SAM 3」をWindowsで最短実行する手順(例つき)

これが何がすごいの?

SAM 3(Segment Anything Model 3)の一番のポイントは、**「テキストで指定した“概念”に当てはまる物体を、画像・動画の中から見つけて、マスクで切り抜き、動画では追跡までやってくれる」**ところです。

従来の「物体検出=決め打ちクラス(例:COCO80)」とは違い、SAM 3は **open-vocabulary(オープン語彙)**の方向に寄っていて、単純な名詞句(例: “yellow school bus” など)で概念を指定できます。

何ができるの?(動画で)

UltralyticsのSAM 3には「テキストで指定した概念を動画内で追跡する」ためのAPIが用意されています。

  • 動画の全フレームで 概念に合う対象を検出
  • セグメンテーション(ピクセル単位のマスク)
  • 対象をフレーム間で 追跡(トラック)
  • save=True で結果の保存、r.show() で表示(※環境によって表示不可の場合あり)

注意(大事):今回は例として boy を使いますが、これは**“性別判定AI”ではありません**。
open-vocabularyの概念一致なので、状況次第で混ざります。安全・評価・意思決定に使う用途には向きません(デモ・研究用途向け)。

Windowsで最短実行(YOLO12記事と同じ流れ)

前提(これだけ)

  • Windows 10/11
  • NVIDIA GPU(あると快適)
  • NVIDIAドライバ導入済み
  • Python 3.10〜3.12 推奨

1) 作業フォルダ作成 + 仮想環境

PowerShellで実行:

mkdir windows_sam3
cd windows_sam3

py -m venv .venv
.\.venv\Scripts\activate
python -m pip install -U pip

2) GPU版PyTorchを入れる(重要)

ここを間違えるとGPUが使えません。

python -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

GPU確認:

python -c "import torch; print('torch', torch.__version__); print('cuda', torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'no gpu')"

Ultralytics + OpenCV を入れる

(表示にOpenCVを使うので一緒に入れます)

pip install -U ultralytics opencv-python

簡易チェック(任意):

yolo checks

まずは「自分の動画」で boy を追跡して表示する(保存もOK)

SAM 3モデル(sam3.pt)のダウンロード方法

SAM 3の重みファイル sam3.pt は自動ダウンロードされません。最初に Hugging Face上でアクセス申請 → 承認後に手動ダウンロードして、ローカルに置く必要があります。

Ultralyticsの SAM 3ドキュメントを開き、案内されている Hugging Faceのモデルページで **アクセス申請(Request access)**を行います。

承認されたら、sam3.pt をダウンロードする。私の場合、承認は一瞬で終わりました。

ダウンロードした sam3.pt を、以下で説明する作業フォルダに配置しましょう。

使い方

  1. 作業フォルダに track_boy.py を作る
  2. video_path を自分の動画パスに変える
  3. 実行 python track_boy.py

track_boy.py(表示しながら実行・保存)

Ultralytics docsの SAM3VideoSemanticPredictor を使う形です。

from pathlib import Path
import cv2

from ultralytics.models.sam import SAM3VideoSemanticPredictor

def main():
    # ========= ここを自分の環境に合わせて変更 =========
    video_path = "9.mp4"    # ←自分の動画
    out_dir    = "sam3_out" # ←出力先フォルダ
    # ==============================================

    video_path = Path(video_path)
    out_dir = Path(out_dir)
    out_dir.mkdir(parents=True, exist_ok=True)

    predictor = SAM3VideoSemanticPredictor(
        overrides=dict(
            model="sam3.pt",
            conf=0.53,
            imgsz=1024,
            half=True,
            device=0,          # GPUが無いなら "cpu"
            save=True,         # 保存もしたいなら True(不要なら False)
            project=str(out_dir),
            name="car",
            exist_ok=True,
            vid_stride=1,
            verbose=False,
        )
    )

    text_prompts = ["boy"]  # まずはこれで

    results = predictor(source=str(video_path), text=text_prompts, stream=True)

    win = "SAM3 - Tracking (press q to quit)"
    cv2.namedWindow(win, cv2.WINDOW_NORMAL)

    for r in results:
        # r.plot() は注釈付きフレーム(numpy配列)を返す
        frame = r.plot()  # たいていBGRで返ります(環境によってRGBの場合あり)

        # もし色が変(青っぽい/赤っぽい)なら次の1行を有効化して調整
        # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

        cv2.imshow(win, frame)

        # q で終了(EscでもOKにしたければ条件追加)
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break

    cv2.destroyAllWindows()
    print("Done.")
    print(f"Output folder: {out_dir / 'girl_track'}")


if __name__ == "__main__":
    main()

調整ポイント(うまくいかない時はここだけ触る)

「女の子っぽい子も混ざる」→ conf を上げる

  • conf=0.350.45 へ(拾う数は減るが誤検出も減る)
    YOLO同様に conf の考え方は同じです。

「重い・遅い」→ imgsz と間引き

  • imgsz=640 にする(軽い)
  • さらに軽くしたいなら vid_stride を追加して間引き(例:2)
    (※間引くと追跡が荒くなることがあります)

「表示がエラーになる(cv2)」→ OpenCVの入れ直し

opencv-python-headless が入っていると表示できないことがあります。
その場合は headless を消して opencv-python を入れ直します。

pip uninstall opencv-python-headless
pip install -U opencv-python

よくある詰まり(動画)

  • 動画が読み込めない(形式/コーデック) → まずは mp4(H.264)など一般的な形式で試す
  • FileNotFoundError → パスが違うのでフルパス指定が確実

まとめ

boy はデモとして分かりやすい一方で、概念の境界は曖昧なので conf調整が効く

SAM 3は、テキストで指定した概念を動画から拾い、マスクで切り抜きつつ追跡できるのが強い

Windowsでも、YOLOと同じノリで venv → GPU版PyTorch → ultralytics で試せる

ぜひ試してみてください。

About The Author

Hideki
東京大学発AIスタートアップ企業でロボット開発室室長、画像解析室室長、動画解析室室長を務め、AIエンジニアとしても画像認識関連の特許を在籍中に3つ取得。その後、KDDIグループ内でプロダクトリーダーとして自然言語処理パッケージの自社開発を経て、現在はAGRISTのテックリードとして農業の人手不足の解決に向けた収穫ロボットの開発にチャレンジしている。ロボットは技術の総合格闘技との考え方から、AIだけでなく、ハードやエレキ、通信からクラウド、IOTまで幅広く手掛けることができる。最近では人とロボットの共存を目指すべく、性能だけを追い求める開発から「感動やワクワク体験」をデザインできるロボットの研究を進めており、人とロボットがうまく共存できる世界を作り出したいと日々行動している。

LEAVE A REPLY

*
*
* (公開されません)