PR
AI・プログラミング

AIが動画まで作ってくれる時代にSAM 2で釣竿の「光の残像」可視化に挑戦してみた

1. はじめに

2026年4月、Anthropic から Claude の新モデル Opus 4.7 がリリースされました。そのニュースを追いかけているうちに、たまたまフェンシングの中継映像を目にする機会がありました。剣先の軌跡が光の帯として残像表示される、あの演出です。綺麗だなあと眺めているうちに、ふと「これ、釣竿でやったらかっこよくないか?」という思いが頭をよぎりました。

https://www.instagram.com/reel/DXOAep7EzTV

釣りは趣味の一つで、竿がしなる瞬間の動きには独特の美しさがあります。あのしなりを光のリボンで可視化できたら、おもしろ動画としても、釣りの解析用としても面白いのではないか。Opus 4.7 でどこまでやれるか試してみたくもあり、挑戦してみることにしました。

結論から言うと、最終的にはこんな映像が出力できるようになりました。

コード一式は GitHub に公開しています。 https://github.com/hiirofish/rod-ribbon

この記事では、そこに辿り着くまでに Claude と対話しながら試行錯誤した過程を書いてみます。

2. まさかの「AIがコードを書いて動画まで作ってくれる」体験

最初に Claude に相談したところ、返ってきた提案は OpenCV と scikit-image を使った古典的な画像処理アプローチでした。色のコントラストで竿を抽出し、線状構造を検出して骨格化して中心線を取り出す、という組み立てです。

驚いたのはここからで、Claude に「やってみて」と頼むと、コードを書くだけではなく、自分の環境の中でそのコードを実際に実行し、釣り動画からトレース結果の動画まで生成して返してきたのです。チャットの中でコードを書くだけでなく、実行して成果物として動画ファイルを渡してくれる。「ここまでできるようになったのか」と素直に驚きました。

後で調べてみたところ、これは Anthropic が 2025年9月に提供開始した Code execution and file creation(コード実行とファイル作成)という機能でした。Claude 側にサンドボックス化された Linux コンテナ環境が用意されていて、その中で Python や Node.js のコードを実行したり、ファイルを生成したりできるとのこと。個人的には相当のインパクトがあって、しばらくこの機能で遊んでしまいました。

そして、Claude の報告はこんな感じで返ってきました。

ファイティング中(竿が明確に画面に映っている瞬間)は、竿のしなりカーブが黄色いラインできれいにトレース、穂先も特定できている。軌跡は光の尾として残像表示。検出成功率: 約38%(290/751フレーム)

自信満々です。「38% は低そうだけど、成功例を見る限り良さそう」と思って実際に動画を再生してみました。


結果は…成功した 38% のフレームだけ切り出せば確かに見栄えはするのですが、連続した動画として見ると、竿がコロコロ消えたり、突然あらぬ場所に線が描かれたり、そもそも海の波を竿と誤認識していたりで、「おもしろ動画」にすら使えない状態でした。

原因が何かという議論はここでは省きますが、古典的画像処理ではフレーム間の時間的文脈を持てないのが根本的な弱点で、動画の追跡にはどうしても向いていません。そこで Claude から改めて推奨されたのが、以前から候補として出ていた SAM 2 を使うアプローチでした。今度はこっちに賭けてみることにしました。


3. SAM 2 とは何か

SAM 2 (Segment Anything Model 2) は Meta 社が 2024 年に公開した、画像と動画の両方に対応した物体セグメンテーション(切り出し)のファウンデーションモデルです。

ひとことで言うと、SAM 2 は

「これを追いかけて」と最初のフレームで1回クリックすれば、動画の最後までその物体のピクセル形状を追ってくれる汎用トラッカー

です。釣竿のような「学習データに入っていないニッチな物体」でも、クリックで指定するだけで動画全体を追跡できる。今回の用途にはうってつけでした。

なぜ動画に強いのか

ポイントは、SAM 2 が各フレームを独立に処理するのではなく、過去フレームの情報を記憶として保持しながら進む仕組みを持っていることです。

モデル内部には「ストリーミングメモリ」と呼ばれる仕組みがあって、前のフレームで対象物がどう見えていたかを圧縮して保存しています。次のフレームを処理するときは、その記憶を参照しながら「さっき見たアレがこのフレームではどこにいるか」を判定する。コマごとの変化を連続的に追うので、物体が一瞬隠れたり、形が変わったり、画面外に出て戻ってきたりしても追跡を維持できます。

古典的画像処理やフレーム単位のモデルは「毎コマ、ゼロから探す」のに対して、SAM 2 は「前のコマからの続きとして探す」。この設計の違いが、竿のように色で区別しづらく・形が常に変わり続ける対象には決定的に効きます。

要するに、どういう技術か

  • 最初のフレームでユーザーがクリックで対象を指定(プロンプタブル)
  • 学習時に「竿」を知らなくても追える(クラス非依存)
  • 過去フレームを記憶して連続的に追跡(ストリーミングメモリ)
  • 出力はピクセル単位の形(マスク)

参考リンク:

4. 使い方

使い方はとてもシンプルで、3つのステップで動きます。詳しいセットアップ手順や依存パッケージは GitHub の README を見てください。ここでは流れとコツだけ紹介します。

Step 1: 竿をクリックで指定する (annotate.py)

python annotate.py input/fishing.mp4

最初のフレームが表示されるので、竿の上をマウスで数点クリックします。これが SAM 2 への「この物体を追いかけて」という指示になります。

  • 左クリックでトレースする物体
  • 右クリックでトレースしない物体(人や手など)、無くても良いかも

Step 2: 全フレームに追跡を伝播する (track.py)

python track.py input/fishing.mp4

SAM 2 が動画全体に対して竿のマスクを生成します。RTX 3060 Ti + 10秒の動画で数分程度。結果は .npz ファイルに保存されます。

Step 3: 光のリボンとして描画する (render.py)

python render.py input/fishing.mp4

マスクから中心線を抽出して、過去フレーム分のカーブを残像として重ねて描画します。色・太さ・残像の長さはオプションで変えられます。

5. SAM 2 での実装と、ここからが本番の試行錯誤

SAM 2 で竿マスクを取ること自体は驚くほどスムーズでした。最初のフレームで竿を数点クリックするだけで、動画全体を通してかなり正確に竿の形状を追ってくれます。OpenCV での苦労は一体何だったのか、という感じです。

ただ、SAM 2 でマスクが取れたあとも、そこから綺麗な「光のリボン」を描画するまでには意外とハマりどころがありました。むしろこの後半戦の方が時間がかかったかもしれません。

処理を3段階に分けたのが効いた理由

annotate → track → render の3段階パイプラインにしましたが、これは試行錯誤の速度に直結しました。

SAM 2 の推論は重く、10秒の動画でも数分かかります。一方、描画パラメータ(色・太さ・残像長)の調整は何度もやり直したい部分です。ここが同じスクリプトに入っていると、パラメータを1つ変えるたびに SAM 2 の推論からやり直しで毎回数分待ち、ということになります。

3段階に分けたことで、重い SAM 2 推論は1度だけ走らせて結果を .npz にキャッシュし、render.py は数秒で回せるループに集約できました。これによって描画の試行錯誤が数十倍速くなり、「aurora と rainbow どっちが合うか」「残像は30フレームか60フレームか」みたいなパラメータの探索がサクサクできるようになったのが大きかったです。

「当たり前じゃないか」と思われるかもしれませんが、最初の実装ではつい一連のスクリプトにしがちで、試行錯誤が始まってから「あ、これ分けないとダメだ」と気づくパターンでした。

中心線の抽出でハマった

マスクが取れても、そこから「竿のしなりを表す 1 本の線」を取り出す処理が必要です。最初は素朴に「マスクの各 x 座標で中央の y を取る」で実装しましたが、竿が深くしなって画面内でカーブが折り返すケースでうまく動かない。折り返し検出を入れたら入れたで、急な曲がりと折り返しの区別がつかなくなる。

結局、マスクを skimage.skeletonize で 1 ピクセル幅の骨格に変換し、骨格上を「前ステップの進行方向に最も近い隣接点」を選んでたどる方式に切り替えて解決しました。骨格は本質的にマスクの中心線そのものなので、ad-hoc なロジックが減ってむしろシンプルになりました。

6. 出来上がった映像

冒頭でお見せしたのがデフォルト設定での出力例です(rainbow プリセット、残像30フレーム、太さ1)。

render.py にはいくつかオプションを用意していて、色・太さ・残像の長さを変えることで雰囲気を自由に変えられます。

プリセットいろいろ

  • rainbow: 時間軸で虹色に変化(デフォルト)
  • aurora: オーロラのような青紫グラデーション
  • emerald: 鮮やかな緑
  • ruby: 赤系の熱い色合い
  • mono: 白〜黄のモノトーン

派手にしたバージョンはこんな感じ。太さと残像長を上げると印象がガラッと変わります。

python render.py input/fishing.mp4 –preset aurora –thickness 5 –ribbon 60


7. おわりに

AI が成果物まで作って返してくる体験自体は前からありましたが、今回印象的だったのはそれが動画にまで及んだこと。動画生成には相応の実行環境が必要なはずで、そこまで AI 側で用意できているのは素直にすごいと感じました。

ただ、精度はまだまだで、今の段階では人間の目で再生して確認した方が安くて速いシーンが多そうです。とはいえ、コストさえ見合えば精度もスピードも AI が上回る未来は簡単に予想できます。Cowork のような環境でも、トークン消費をうまく抑える工夫が今後のコーディングの鍵になりそうです。

今回は残像を重ねるだけでしたが、もっと工夫すれば映えのある映像が作れそうです。色やリボンの描き方だけでなく、穂先の軌跡を別レイヤーで光らせる、BGM に合わせて色を変える、竿のしなり量に応じて太さを変える、など応用の幅は広そうです。やってみたいアイデアがある方は、ぜひ GitHub からフォークして遊んでみてください。


リンクまとめ

タイトルとURLをコピーしました