チュートリアル

手動レビューから自動化されたインテリジェンスへ:YOLOとTwelve Labsを活用した手術動画分析プラットフォームの開発

ミラン・キム

このチュートリアルでは、YOLOv8による術具検出とTwelve LabsのMarengoおよびPegasusを組み合わせた、Surgical Video Intelligence(外科手術ビデオ・インテリジェンス)の構築方法を詳しく解説します。このプラットフォームは、SOAP手術記録の自動生成、手術プロセスの段階(フェーズ)ごとのセグメンテーション、ビデオライブラリ全体のセマンティック検索、そして対話型の臨床Q&Aアシスタントである「Dr. Sage」の駆動を実現します。

このチュートリアルでは、YOLOv8による術具検出とTwelve LabsのMarengoおよびPegasusを組み合わせた、Surgical Video Intelligence(外科手術ビデオ・インテリジェンス)の構築方法を詳しく解説します。このプラットフォームは、SOAP手術記録の自動生成、手術プロセスの段階(フェーズ)ごとのセグメンテーション、ビデオライブラリ全体のセマンティック検索、そして対話型の臨床Q&Aアシスタントである「Dr. Sage」の駆動を実現します。

この記事の内容

No headings found on page

ニュースレターに登録する

ニュースレターに登録する

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

AIを活用してビデオを検索、分析、探索します。

2026/02/20

9分

記事へのリンクをコピー

外科医や研修医は、通常、1回の手術につき3〜5時間を費やして腹腔鏡下の映像をフレーム単位で手動で見直し、器具の記録、手術フェーズの特定、術記の作成を行っています。毎月何百件もの手術を処理する教育病院全体では、そのような手動レビューによる作業が年間何千時間にも及び、患者のケアに充てるべき臨床時間が奪われています。

このチュートリアルでは、手術動画を検索可能な豊富なデータセットとして扱うプラットフォームである「Surgical Video Intelligence」を構築します。このコアとなるアーキテクチャの洞察は、精密な物体検出を行うYOLO(You Only Look Once)と、Twelve Labsのマルチモーダル動画理解APIを組み合わせることで、どの器具が画面に映っているかを認識し、それらを取り巻く手術のコンテキストを理解できるシステムを構築することにあります。

u2b50ufe0f 構築するもの:以下の処理を自動的に行うNext.jsアプリケーションです。

  1. バウンディングボックスとタイムスタンプを使って、リアルタイムで手術器具を検出(Detects)する

  2. 動画のエビデンスから、SOAP術記(術後経過記録)(主観、客観、評価、計画)を自動生成する

  3. 手術をチャプター(章)に分割(セグメント化)する(例:「剥離」、「閉腹」など)

  4. 動画ライブラリ全体でのセマンティック検索を可能にする(例:「すべての電気凝固の瞬間を検索」など)

  5. 追加の臨床的な質問応答(Q&A)に対応する対話型AIアシスタント「Dr. Sage」を導入する

ud83dudccc ライブデモを体験する | GitHubリポジトリを表示する


システムアーキテクチャ

手術動画の分析には、根本的に異なる2つの機能が必要です。ピクセル精度での器具の特定と、それらの器具が手術中に何を行っているかという文脈の理解です。単一のモデルでこの両方を高水準で処理できるものは存在しません。

本システムのアーキテクチャでは、これら2つの役割を並行する2つのパイプラインに分離し、推論時にそれらを融合させます。

  1. 動画のインポート(動画の取り込み):ユーザーが腹腔鏡下手術の動画をアップロードします。

  2. 器具検出(Tool Detection):YOLOv8モデル(7種類の明確な手術器具クラスにファインチューニング済み)が動画をスキャンし、タイムスタンプとバウンディングボックスを含む、構造化された検出データのJSONファイルを出力します。

  3. 動画のインデックス登録:Twelve Labsが動画をインデックス登録し、セマンティック検索(Marengoエンベディング)と文脈の分析(Pegasus推論)を可能にします。

  4. コンテキストの融合:システムが術記を作成したり、質問に答えたりする際、YOLOの検出データがTwelve Labsの動画理解とともにプロンプトに挿入されます。これにより、AIの推論を検証済みの視覚的エビデンスに基づいて行わせることができます。

このハイブリッドアプローチが重要である理由は、それぞれのテクノロジーが互いの死角を補い合っているためです。YOLOはフレーム120において95%の信頼度で「把持鉗子(Grasper)」を特定できますが、その把持鉗子が牽引に使われているのか、剥離に使われているのかを判別することはできません。それに対しTwelve Labsは、手術手技や手術フェーズの進行について推論することは可能ですが、実際には使用されなかった器具の幻覚(ハルシネーション)を防ぐために、確実な検出データを必要とします。


アプリケーションのデモ

Loomで完全版デモを視聴する


1. リアルタイムの器具検出

メインの分析ビューは同期された体験を提供します。左側では、動画プレイヤーにYOLOによって検出されたリアルタイムの器具バウンディングボックスがオーバーレイ表示されます。下部にある「スイムレーン」タイムラインには、それぞれの器具がどのタイミングで現れたかが可視化され、指導者は手術プロセス全体において器具がどのように使われたかを視覚的に瞬時に把握できます。


2. 自動SOAP術記生成

動画のアップロードとインデックス登録が完了すると、システムはTwelve LabsのAnalyze APIを活用し、YOLOの器具検出データを踏まえた、一人称形式の手術経過記録を自動生成します。手動での入力は一切不要です。生成されたSOAP術記には、特定のタイムスタンプに紐づいた正確な器具の参照が含まれており、ドキュメント作成にかかる時間を数時間から数分へと短縮します。


3. 手術フェーズのセグメンテーション

Twelve Labs Analyze APIは、構造化されたJSON出力を利用して、手術を「準備」、「剥離」、「閉合」などの個別のフェーズに自動的に分割します。これらのチャプターはインタラクティブなタイムライン上に表示され、特定の手術手順へ素早く移動することができます。これにより、研修プログラムにおいて、90分間の録画動画をナビゲーション可能な教材へと変換することができます。


4. セマンティック検索

Twelve LabsのMarengoによるマルチモーダルエンベディングを原動力とした、手術動画ライブラリを対象とする自然言語検索機能です。単なるキーワード一致検索とは異なり、手術の文脈を意味的に理解します。

クエリ例:「執刀医が電気メス(electrocautery)を使用した瞬間を表示してください」結果:約2:34〜2:58および5:12〜5:45のクリップ(信頼度: 0.92)

指導医が50以上の研修動画の中から「モノポーラ凝固器具の使用」を検索する場合、Marengoはタイムスタンプとともにすべての検出結果を返します。これにより、すべての動画を手動で確認することなく、特定のテクニックを集めた映像集を迅速に作成できます。


5. Dr. Sage:対話型の臨床Q&A

自動分析が完了すると、Dr. Sageが追加の質問に対応するための会話型インターフェースを提供します。このAIは、YOLOが検出したデータとTwelve Labsの動画理解情報の両方にアクセスできるため、「剥離中にどの器具が使用されましたか?」や「3:45に使用された手技について説明してください」といったクエリへの応答が可能です。これにより、自動生成されたレポートと、手術見直しや研修セッション中に発生するスポット的な疑問とのギャップを埋めることができます。


デプロイのアーキテクチャ

このアプリケーションは、コンピューターパワーを大量に消費する推論プロセスと、ユーザーに直接対応する処理を明確に分離した分散システムとして設計されています。


インフラの概要

  1. 開発フロントエンド(Vercel):UIおよびAPIルートを提供するNext.jsアプリケーション

  2. バックエンド(Railway):YOLO推論を実行するFastAPIサーバー

  3. ストレージ(Vercel Blob):すべての分析結果を集約して保管するJSONストレージ

  4. AIプロセシング(Twelve Labs):クラウドベースの動画理解エンジン


データフロー

ユーザーが手術動画をアップロードすると、並行する2つのパイプラインが同時に起動します。


画像認識パイプライン(Railway)

  1. ユーザーが動画をアップロード → フロントエンドがそれをRailwayバックエンドに送信

  2. YOLOが動画をフレーム単位で処理します(効率化のため120フレームごとに処理)

  3. バックエンドが detections.json を生成:

{
  "detections": [
    {
      "frame": 120,
      "timestamp": 5.0,
      "tools": [
        {"class_name": "Grasper", "confidence": 0.95, "bbox": {...}}
      ]
    }
  ]
}
  1. 結果が次のパスに沿ってVercel Blobにアップロードされます:detections/{videoId}.json


動画インテリジェンスパイプライン(Twelve Labs + Vercel)

  1. 動画がTwelve Labsによってインデックス登録されます(エンベディング用のMarengo、動画理解用のPegasus

  2. フロントエンドAPIのルートがAIによるコンテンツ生成を実行します:

    • SOAP術記: POST /api/analysis/{videoId}/soap

    • チャプター/タイムライン: POST /api/timeline

  3. 結果が次の位置に沿ってVercel Blobに保存されます:analysis/{videoId}.json


Vercel Blobによる状態の集中管理

どちらのパイプラインも、JSONファイルの主要キーバリューストアであるVercel Blobに集約されます。これにより、データベース構成を簡素化しつつ、優れた参照処理速度を維持します。

ストレージのスキーマ:



Twelve Labsが実現する強力なインテリジェンス

YOLOは、特定のツール、正確なタイムスタンプといった「何が」「いつ」存在したか特定する情報を提供します。さらにTwelve Labsが、フェーズ特定、器具の使用方法、術中におけるコンテキスト推論といった「なぜ」「どのように」情報を補強します。ここでは、主に利用される3つの代表的なAPI連携、Analyze(SOAP術記用およびチャプター分割用)とSearch(セマンティック検索用)の使用方法を説明します。


1. Analyze API: SOAP術記自動生成

Analyze APIは、Twelve Labsの主要なマルチモーダル生成エンドポイントです。今回はこれを活用し、YOLOのツール検出情報をもとにした一人称視点での手術経過記録を構築します。

参照ソース:frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Vercel BlobからYOLO検出データを取得
const toolData = await fetchToolDetection(videoId);

// 2. プロンプト用に読みやすい文字列として検出データをフォーマット
const toolContext = formatToolDetectionForPrompt(toolData);
// 出力例: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. SOAP術記プロンプトに、この確かな検出データをインプット
const enrichedPrompt = `${soapPrompt}

## REFERENCE DATA
${toolContext}
Use this tool detection data to provide accurate tool names and usage times.`;

// 4. Twelve Labs Analyze APIの呼び出し
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // 事実から逸脱しないため、生成温度(Temperature)を低く設定
});

// 5. JSONレスポンスのパースとVercel Blobへの保存
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

効果的な理由:YOLOによる検出データをプロンプトにインプットすることで、検証済みの視覚情報に基づいた堅固な推論をモデルに行わせることができます。YOLOがクリッパーを一度も検出していないにもかかわらず、AIが「5:30にクリッパーを使用しました」と勝手に不正確な記述を行うことを防止できます。これが最も中核となるアーキテクチャのパターン、つまりマルチモーダル生成時における事実制約としてコンピュータビジョン(YOLO)の出力を役割させる仕組みです。


2. Analyze API: タイムラインの生成(構造化された出力)

また、Analyze APIでのチャプター生成では responseFormat パラメータを渡して、確実に構造化されたJSONから直接情報を得られるようにし、不安定な平文文字列パージング処理の手間を排除します。

参照ソース:frontend/src/app/api/timeline/route.js

const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: "Divide this surgery into distinct phases with medical terminology. For each phase, provide a title, summary, start time, and end time.",
    responseFormat: {
        type: "json_schema",
        jsonSchema: {
            type: "object",
            properties: {
                chapters: {
                    type: "array",
                    items: {
                        type: "object",
                        properties: {
                            chapterNumber: { type: "number" },
                            chapterTitle: { type: "string" },
                            chapterSummary: { type: "string" },
                            startSec: { type: "number" },
                            endSec: { type: "number" }
                        },
                        required: ["chapterNumber", "chapterTitle", "startSec", "endSec"]
                    }
                }
            }
        }
    }
});

// 構造化されたJSONレスポンスをパース
const parsedData = JSON.parse(response.data);
// parsedData.chaptersに配列情報が含まれます

出力データの例:

{
  "chapters": [
    {
      "chapterNumber": 1,
      "chapterTitle": "Preoperative Setup and Positioning",
      "chapterSummary": "Patient positioned and prepped for procedure",
      "startSec": 0,
      "endSec": 163
    },
    {
      "chapterNumber": 2,
      "chapterTitle": "Dissection and Control of Carotid Arteries",
      "startSec": 163,
      "endSec": 326
    }
  ]
}

効果的な理由responseFormat パラメータを使用することで、システムが正規表現ベースの面倒な処理や文字列の前処理を行わずに、自動設計通りに必要な構造のJSONフィールドをタイムラインUIにマッピングして素早く描画できます。


3. Search API: Marengoによるセマンティック検索

Search APIは、Marengoの高性能マルチモーダル埋め込みモデルを使用して、自然言語の指示クエリから動画の特定の瞬間を検出します。

参照ソース:frontend/src/app/api/search/route.js

const response = await getTwelveLabsClient().search.query({
    indexId: process.env.NEXT_PUBLIC_TWELVELABS_MARENGO_INDEX_ID,
    searchOptions: ['visual', 'audio'], // 視覚情報と音声の両方をスキャン
    queryText: query, // 例:"clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // 検出精度と漏れ検知의 밸런스 튜닝
});

// 抽出結果のループ処理
for await (const clip of response) {
    console.log(`Found at ${clip.start}s - ${clip.end}s (confidence: ${clip.confidence})`);
    console.log(`Thumbnail: ${clip.thumbnailUrl}`);
}

効果的な理由:単純な音声データのキーワード処理と異なり、Marengoは手術上の文脈を意味構造として把握します。例えば「胆嚢管のクリッピング」について検索をかけた際、映像内で誰もその単語を発言していなくても、術中の映像パターンをもとにその作業シーケンスを認識し検出します。これにより、マニュアルタグ付の手間を完全に削減可能な「手術アーカイブ用スマート検索ライブラリ」を実現できます。


ステップごとの実装解説


システム要件

  • Node.js 18+ および Python 3.10+

  • Twelve Labs APIキーPlaygroundから取得可能です

  • コンピュータービジョンモデル:本内容では、80例の胆嚢摘出術を対象に開発されたCholec80データセットで微調整(ファインチューニング)され、7種の代表的な器具クラスを識別可能なYOLOv8システムを使用します


ステップ 1: バックエンドの構築(Railway)

YOLOによる検出バックエンドサーバーは、動画ファイルを受けて推論処理を担う、FastAPIで書かれたインスタンスです。

参照ソース:backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # YOLOで動画に対して推論を実行
    results_data = run_inference(temp_video_path, video_id)

    # 生成画像をフロントエンドAPI経由でVercel Blobに直接保存
    await upload_results_to_blob(video_id, results_data, blob_token)

    return {"status": "completed", "data": results_data}

バックエンドは120フレームごと(24fpsの場合、約5秒に1回)に画像をスキャンします。これにより、処理効率と抽出箇所の精密さのバランスを担保します。例えば30分の動画であるならば約360フレームを処理すれば十分なので、全ての瞬間を完全に計算対象とする場合の余分な負荷や、遅延による無意味なコストコスト増を伴うことなく完璧なプロセス器具抽出図を構成できます。


ステップ 2: フロントエンドAPI設計(Vercel)

Next.jsのAPIルートが全体のオーケストレーションをコーディネートします。エンドポイントは次の主要3つです:

  1. GET /api/detect-tools/{videoId}: Vercel BlobからYOLOで算出ずみの物体検出ログデータを取り込みます

  2. POST /api/analysis/{videoId}/soap: Twelve LabsのAnalyze APIをもとにSOAPを生成します

  3. POST /api/timeline: Twelve LabsのAnalyze APIによるタイムラインチャプターを取得します

各ルートは一貫した3ステップのパターンに従います。BlobからYOLOデータをフェッチし、強化されたプロンプトを使用してTwelve Labs APIを呼び出し、その結果を次回以降のキャッシュとしてBlobに保存します。


ステップ 3: Dr. Sage対話機能への統合

対話型アシスタントインターフェースでは、エンドユーザーからの問い合わせクエリに視覚情報を追加して拡張した形で、Twelve Labsへリクエストされます。

参照ソース:frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// ヘルパー: 生のオブジェクト検知ログを、対話向けテキスト要約に変換
function formatToolDetectionForChat(toolData) {
    // ... 検出時間とツール検出箇所の集約処理ロジック ...
    // 返値例:
    // "- Grasper: 450 detections (0:05 - 12:30)"
    // "- Hook: 120 detections (4:15 - 8:00)"
    return summary;
}

export async function POST(request) {
    const { userQuery, videoId } = await request.json();

    // 1. YOLOバックエンドで生成されたJSONデータを取得
    const toolData = await fetchToolDetection(videoId);

    // 2. AIがコンテキストとして読める形式に変換
    // これにより多くの検出プロットポイントが1つの明快な要約テキストとなります
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. ユーザーからの本来の質問内容をアップデート変換
    // システムが強制的に推論の際の事実(Ground Truth)として判断できるよう専用タグを補足します
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Twelve Labs Pegasusを呼び出す
    const client = new TwelveLabs({ apiKey: process.env.TWELVELABS_API_KEY });
    const response = await client.analyze({
        videoId: videoId,
        prompt: enrichedQuery,
        temperature: 0.2 // 事実正確性を高めるためのロー・テンパチャー設計
    });

    return new Response(JSON.stringify(response));
}


ステップ 4: インタラクティブ・タイムライン表示

オブジェクトの検出ログデータはシステムAIには有用ですが、執刀・研修スタッフにはわかりやすい視覚的レイアウトが不可欠です。私たちは、各代表的な器具を区別してライン化した、React製の次のようなタイムラインパーツと自動的にマッピングを統合させました:

  • 赤色のプロット:電気凝固メス(Bipolar Cautery)

  • 緑色のプロット:フック電極器具(Hook Dissection)

  • 黄色のプロット:把持鉗子(Grasper Manipulation)

教員は研修医の腹腔鏡動画を確認する際、一目で全体の操作癖、たとえば「不十分な剥離状態で長い凝固操作を続けた」ケースや不適切なプロセスを発見でき、そのポイントを選択するだけで瞬時に当該の動画フレームの位置へと正確にジャンプして検証を行えます。フロントエンド側はJSON内の detections リストをもとに、CSS等でタイムライン上の適切な水平位置へと展開描画します。


結論

緻密なコンピュータビジョンモデリング(YOLO)と文脈の分析に対応する高度のマルチモーダル設計(Twelve Labs)を組み合わせることで、従来単に保存されるだけであった手術データが瞬時に参照でき、活用価値が高いものへと生まれ変わります。

  • YOLOは「いつ」「何が起こったか」を提示します:ピクセル単位の正確さからどの器具がどの時間で使用されているかを保証します。

  • Twelve Labsは「なぜ」「どういったアクションか」を保管補完します:フェーズ検出、執刀操作の検証、詳細なオペレポート等のドキュメント構築にフル機能で貢献します。

このアーキテクチャパターン、すなわち信頼精度の高い局所的な画像センサ情報をシステム内のAI生成における不変要素として制御する仕組みは、手術に限らず様々な領域に適応可能です(生産工場の製品品質エラー検証、スポーツ競技データの分析、物理セキュリティ・防犯分野等での自動監査化)。

今後の発展シナリオ:

  • 部門全体で蓄積される複数の動画データベースを交差させた相関・分析

  • ストリーミング技術を使用した、手術中のリアルタイム表示サポート

  • ラベル付けされた動画情報に基づいた、完全自動の研修テキスト・トレーニング教材作成

さあ、始めましょう

外科医や研修医は、通常、1回の手術につき3〜5時間を費やして腹腔鏡下の映像をフレーム単位で手動で見直し、器具の記録、手術フェーズの特定、術記の作成を行っています。毎月何百件もの手術を処理する教育病院全体では、そのような手動レビューによる作業が年間何千時間にも及び、患者のケアに充てるべき臨床時間が奪われています。

このチュートリアルでは、手術動画を検索可能な豊富なデータセットとして扱うプラットフォームである「Surgical Video Intelligence」を構築します。このコアとなるアーキテクチャの洞察は、精密な物体検出を行うYOLO(You Only Look Once)と、Twelve Labsのマルチモーダル動画理解APIを組み合わせることで、どの器具が画面に映っているかを認識し、それらを取り巻く手術のコンテキストを理解できるシステムを構築することにあります。

u2b50ufe0f 構築するもの:以下の処理を自動的に行うNext.jsアプリケーションです。

  1. バウンディングボックスとタイムスタンプを使って、リアルタイムで手術器具を検出(Detects)する

  2. 動画のエビデンスから、SOAP術記(術後経過記録)(主観、客観、評価、計画)を自動生成する

  3. 手術をチャプター(章)に分割(セグメント化)する(例:「剥離」、「閉腹」など)

  4. 動画ライブラリ全体でのセマンティック検索を可能にする(例:「すべての電気凝固の瞬間を検索」など)

  5. 追加の臨床的な質問応答(Q&A)に対応する対話型AIアシスタント「Dr. Sage」を導入する

ud83dudccc ライブデモを体験する | GitHubリポジトリを表示する


システムアーキテクチャ

手術動画の分析には、根本的に異なる2つの機能が必要です。ピクセル精度での器具の特定と、それらの器具が手術中に何を行っているかという文脈の理解です。単一のモデルでこの両方を高水準で処理できるものは存在しません。

本システムのアーキテクチャでは、これら2つの役割を並行する2つのパイプラインに分離し、推論時にそれらを融合させます。

  1. 動画のインポート(動画の取り込み):ユーザーが腹腔鏡下手術の動画をアップロードします。

  2. 器具検出(Tool Detection):YOLOv8モデル(7種類の明確な手術器具クラスにファインチューニング済み)が動画をスキャンし、タイムスタンプとバウンディングボックスを含む、構造化された検出データのJSONファイルを出力します。

  3. 動画のインデックス登録:Twelve Labsが動画をインデックス登録し、セマンティック検索(Marengoエンベディング)と文脈の分析(Pegasus推論)を可能にします。

  4. コンテキストの融合:システムが術記を作成したり、質問に答えたりする際、YOLOの検出データがTwelve Labsの動画理解とともにプロンプトに挿入されます。これにより、AIの推論を検証済みの視覚的エビデンスに基づいて行わせることができます。

このハイブリッドアプローチが重要である理由は、それぞれのテクノロジーが互いの死角を補い合っているためです。YOLOはフレーム120において95%の信頼度で「把持鉗子(Grasper)」を特定できますが、その把持鉗子が牽引に使われているのか、剥離に使われているのかを判別することはできません。それに対しTwelve Labsは、手術手技や手術フェーズの進行について推論することは可能ですが、実際には使用されなかった器具の幻覚(ハルシネーション)を防ぐために、確実な検出データを必要とします。


アプリケーションのデモ

Loomで完全版デモを視聴する


1. リアルタイムの器具検出

メインの分析ビューは同期された体験を提供します。左側では、動画プレイヤーにYOLOによって検出されたリアルタイムの器具バウンディングボックスがオーバーレイ表示されます。下部にある「スイムレーン」タイムラインには、それぞれの器具がどのタイミングで現れたかが可視化され、指導者は手術プロセス全体において器具がどのように使われたかを視覚的に瞬時に把握できます。


2. 自動SOAP術記生成

動画のアップロードとインデックス登録が完了すると、システムはTwelve LabsのAnalyze APIを活用し、YOLOの器具検出データを踏まえた、一人称形式の手術経過記録を自動生成します。手動での入力は一切不要です。生成されたSOAP術記には、特定のタイムスタンプに紐づいた正確な器具の参照が含まれており、ドキュメント作成にかかる時間を数時間から数分へと短縮します。


3. 手術フェーズのセグメンテーション

Twelve Labs Analyze APIは、構造化されたJSON出力を利用して、手術を「準備」、「剥離」、「閉合」などの個別のフェーズに自動的に分割します。これらのチャプターはインタラクティブなタイムライン上に表示され、特定の手術手順へ素早く移動することができます。これにより、研修プログラムにおいて、90分間の録画動画をナビゲーション可能な教材へと変換することができます。


4. セマンティック検索

Twelve LabsのMarengoによるマルチモーダルエンベディングを原動力とした、手術動画ライブラリを対象とする自然言語検索機能です。単なるキーワード一致検索とは異なり、手術の文脈を意味的に理解します。

クエリ例:「執刀医が電気メス(electrocautery)を使用した瞬間を表示してください」結果:約2:34〜2:58および5:12〜5:45のクリップ(信頼度: 0.92)

指導医が50以上の研修動画の中から「モノポーラ凝固器具の使用」を検索する場合、Marengoはタイムスタンプとともにすべての検出結果を返します。これにより、すべての動画を手動で確認することなく、特定のテクニックを集めた映像集を迅速に作成できます。


5. Dr. Sage:対話型の臨床Q&A

自動分析が完了すると、Dr. Sageが追加の質問に対応するための会話型インターフェースを提供します。このAIは、YOLOが検出したデータとTwelve Labsの動画理解情報の両方にアクセスできるため、「剥離中にどの器具が使用されましたか?」や「3:45に使用された手技について説明してください」といったクエリへの応答が可能です。これにより、自動生成されたレポートと、手術見直しや研修セッション中に発生するスポット的な疑問とのギャップを埋めることができます。


デプロイのアーキテクチャ

このアプリケーションは、コンピューターパワーを大量に消費する推論プロセスと、ユーザーに直接対応する処理を明確に分離した分散システムとして設計されています。


インフラの概要

  1. 開発フロントエンド(Vercel):UIおよびAPIルートを提供するNext.jsアプリケーション

  2. バックエンド(Railway):YOLO推論を実行するFastAPIサーバー

  3. ストレージ(Vercel Blob):すべての分析結果を集約して保管するJSONストレージ

  4. AIプロセシング(Twelve Labs):クラウドベースの動画理解エンジン


データフロー

ユーザーが手術動画をアップロードすると、並行する2つのパイプラインが同時に起動します。


画像認識パイプライン(Railway)

  1. ユーザーが動画をアップロード → フロントエンドがそれをRailwayバックエンドに送信

  2. YOLOが動画をフレーム単位で処理します(効率化のため120フレームごとに処理)

  3. バックエンドが detections.json を生成:

{
  "detections": [
    {
      "frame": 120,
      "timestamp": 5.0,
      "tools": [
        {"class_name": "Grasper", "confidence": 0.95, "bbox": {...}}
      ]
    }
  ]
}
  1. 結果が次のパスに沿ってVercel Blobにアップロードされます:detections/{videoId}.json


動画インテリジェンスパイプライン(Twelve Labs + Vercel)

  1. 動画がTwelve Labsによってインデックス登録されます(エンベディング用のMarengo、動画理解用のPegasus

  2. フロントエンドAPIのルートがAIによるコンテンツ生成を実行します:

    • SOAP術記: POST /api/analysis/{videoId}/soap

    • チャプター/タイムライン: POST /api/timeline

  3. 結果が次の位置に沿ってVercel Blobに保存されます:analysis/{videoId}.json


Vercel Blobによる状態の集中管理

どちらのパイプラインも、JSONファイルの主要キーバリューストアであるVercel Blobに集約されます。これにより、データベース構成を簡素化しつつ、優れた参照処理速度を維持します。

ストレージのスキーマ:



Twelve Labsが実現する強力なインテリジェンス

YOLOは、特定のツール、正確なタイムスタンプといった「何が」「いつ」存在したか特定する情報を提供します。さらにTwelve Labsが、フェーズ特定、器具の使用方法、術中におけるコンテキスト推論といった「なぜ」「どのように」情報を補強します。ここでは、主に利用される3つの代表的なAPI連携、Analyze(SOAP術記用およびチャプター分割用)とSearch(セマンティック検索用)の使用方法を説明します。


1. Analyze API: SOAP術記自動生成

Analyze APIは、Twelve Labsの主要なマルチモーダル生成エンドポイントです。今回はこれを活用し、YOLOのツール検出情報をもとにした一人称視点での手術経過記録を構築します。

参照ソース:frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Vercel BlobからYOLO検出データを取得
const toolData = await fetchToolDetection(videoId);

// 2. プロンプト用に読みやすい文字列として検出データをフォーマット
const toolContext = formatToolDetectionForPrompt(toolData);
// 出力例: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. SOAP術記プロンプトに、この確かな検出データをインプット
const enrichedPrompt = `${soapPrompt}

## REFERENCE DATA
${toolContext}
Use this tool detection data to provide accurate tool names and usage times.`;

// 4. Twelve Labs Analyze APIの呼び出し
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // 事実から逸脱しないため、生成温度(Temperature)を低く設定
});

// 5. JSONレスポンスのパースとVercel Blobへの保存
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

効果的な理由:YOLOによる検出データをプロンプトにインプットすることで、検証済みの視覚情報に基づいた堅固な推論をモデルに行わせることができます。YOLOがクリッパーを一度も検出していないにもかかわらず、AIが「5:30にクリッパーを使用しました」と勝手に不正確な記述を行うことを防止できます。これが最も中核となるアーキテクチャのパターン、つまりマルチモーダル生成時における事実制約としてコンピュータビジョン(YOLO)の出力を役割させる仕組みです。


2. Analyze API: タイムラインの生成(構造化された出力)

また、Analyze APIでのチャプター生成では responseFormat パラメータを渡して、確実に構造化されたJSONから直接情報を得られるようにし、不安定な平文文字列パージング処理の手間を排除します。

参照ソース:frontend/src/app/api/timeline/route.js

const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: "Divide this surgery into distinct phases with medical terminology. For each phase, provide a title, summary, start time, and end time.",
    responseFormat: {
        type: "json_schema",
        jsonSchema: {
            type: "object",
            properties: {
                chapters: {
                    type: "array",
                    items: {
                        type: "object",
                        properties: {
                            chapterNumber: { type: "number" },
                            chapterTitle: { type: "string" },
                            chapterSummary: { type: "string" },
                            startSec: { type: "number" },
                            endSec: { type: "number" }
                        },
                        required: ["chapterNumber", "chapterTitle", "startSec", "endSec"]
                    }
                }
            }
        }
    }
});

// 構造化されたJSONレスポンスをパース
const parsedData = JSON.parse(response.data);
// parsedData.chaptersに配列情報が含まれます

出力データの例:

{
  "chapters": [
    {
      "chapterNumber": 1,
      "chapterTitle": "Preoperative Setup and Positioning",
      "chapterSummary": "Patient positioned and prepped for procedure",
      "startSec": 0,
      "endSec": 163
    },
    {
      "chapterNumber": 2,
      "chapterTitle": "Dissection and Control of Carotid Arteries",
      "startSec": 163,
      "endSec": 326
    }
  ]
}

効果的な理由responseFormat パラメータを使用することで、システムが正規表現ベースの面倒な処理や文字列の前処理を行わずに、自動設計通りに必要な構造のJSONフィールドをタイムラインUIにマッピングして素早く描画できます。


3. Search API: Marengoによるセマンティック検索

Search APIは、Marengoの高性能マルチモーダル埋め込みモデルを使用して、自然言語の指示クエリから動画の特定の瞬間を検出します。

参照ソース:frontend/src/app/api/search/route.js

const response = await getTwelveLabsClient().search.query({
    indexId: process.env.NEXT_PUBLIC_TWELVELABS_MARENGO_INDEX_ID,
    searchOptions: ['visual', 'audio'], // 視覚情報と音声の両方をスキャン
    queryText: query, // 例:"clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // 検出精度と漏れ検知의 밸런스 튜닝
});

// 抽出結果のループ処理
for await (const clip of response) {
    console.log(`Found at ${clip.start}s - ${clip.end}s (confidence: ${clip.confidence})`);
    console.log(`Thumbnail: ${clip.thumbnailUrl}`);
}

効果的な理由:単純な音声データのキーワード処理と異なり、Marengoは手術上の文脈を意味構造として把握します。例えば「胆嚢管のクリッピング」について検索をかけた際、映像内で誰もその単語を発言していなくても、術中の映像パターンをもとにその作業シーケンスを認識し検出します。これにより、マニュアルタグ付の手間を完全に削減可能な「手術アーカイブ用スマート検索ライブラリ」を実現できます。


ステップごとの実装解説


システム要件

  • Node.js 18+ および Python 3.10+

  • Twelve Labs APIキーPlaygroundから取得可能です

  • コンピュータービジョンモデル:本内容では、80例の胆嚢摘出術を対象に開発されたCholec80データセットで微調整(ファインチューニング)され、7種の代表的な器具クラスを識別可能なYOLOv8システムを使用します


ステップ 1: バックエンドの構築(Railway)

YOLOによる検出バックエンドサーバーは、動画ファイルを受けて推論処理を担う、FastAPIで書かれたインスタンスです。

参照ソース:backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # YOLOで動画に対して推論を実行
    results_data = run_inference(temp_video_path, video_id)

    # 生成画像をフロントエンドAPI経由でVercel Blobに直接保存
    await upload_results_to_blob(video_id, results_data, blob_token)

    return {"status": "completed", "data": results_data}

バックエンドは120フレームごと(24fpsの場合、約5秒に1回)に画像をスキャンします。これにより、処理効率と抽出箇所の精密さのバランスを担保します。例えば30分の動画であるならば約360フレームを処理すれば十分なので、全ての瞬間を完全に計算対象とする場合の余分な負荷や、遅延による無意味なコストコスト増を伴うことなく完璧なプロセス器具抽出図を構成できます。


ステップ 2: フロントエンドAPI設計(Vercel)

Next.jsのAPIルートが全体のオーケストレーションをコーディネートします。エンドポイントは次の主要3つです:

  1. GET /api/detect-tools/{videoId}: Vercel BlobからYOLOで算出ずみの物体検出ログデータを取り込みます

  2. POST /api/analysis/{videoId}/soap: Twelve LabsのAnalyze APIをもとにSOAPを生成します

  3. POST /api/timeline: Twelve LabsのAnalyze APIによるタイムラインチャプターを取得します

各ルートは一貫した3ステップのパターンに従います。BlobからYOLOデータをフェッチし、強化されたプロンプトを使用してTwelve Labs APIを呼び出し、その結果を次回以降のキャッシュとしてBlobに保存します。


ステップ 3: Dr. Sage対話機能への統合

対話型アシスタントインターフェースでは、エンドユーザーからの問い合わせクエリに視覚情報を追加して拡張した形で、Twelve Labsへリクエストされます。

参照ソース:frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// ヘルパー: 生のオブジェクト検知ログを、対話向けテキスト要約に変換
function formatToolDetectionForChat(toolData) {
    // ... 検出時間とツール検出箇所の集約処理ロジック ...
    // 返値例:
    // "- Grasper: 450 detections (0:05 - 12:30)"
    // "- Hook: 120 detections (4:15 - 8:00)"
    return summary;
}

export async function POST(request) {
    const { userQuery, videoId } = await request.json();

    // 1. YOLOバックエンドで生成されたJSONデータを取得
    const toolData = await fetchToolDetection(videoId);

    // 2. AIがコンテキストとして読める形式に変換
    // これにより多くの検出プロットポイントが1つの明快な要約テキストとなります
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. ユーザーからの本来の質問内容をアップデート変換
    // システムが強制的に推論の際の事実(Ground Truth)として判断できるよう専用タグを補足します
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Twelve Labs Pegasusを呼び出す
    const client = new TwelveLabs({ apiKey: process.env.TWELVELABS_API_KEY });
    const response = await client.analyze({
        videoId: videoId,
        prompt: enrichedQuery,
        temperature: 0.2 // 事実正確性を高めるためのロー・テンパチャー設計
    });

    return new Response(JSON.stringify(response));
}


ステップ 4: インタラクティブ・タイムライン表示

オブジェクトの検出ログデータはシステムAIには有用ですが、執刀・研修スタッフにはわかりやすい視覚的レイアウトが不可欠です。私たちは、各代表的な器具を区別してライン化した、React製の次のようなタイムラインパーツと自動的にマッピングを統合させました:

  • 赤色のプロット:電気凝固メス(Bipolar Cautery)

  • 緑色のプロット:フック電極器具(Hook Dissection)

  • 黄色のプロット:把持鉗子(Grasper Manipulation)

教員は研修医の腹腔鏡動画を確認する際、一目で全体の操作癖、たとえば「不十分な剥離状態で長い凝固操作を続けた」ケースや不適切なプロセスを発見でき、そのポイントを選択するだけで瞬時に当該の動画フレームの位置へと正確にジャンプして検証を行えます。フロントエンド側はJSON内の detections リストをもとに、CSS等でタイムライン上の適切な水平位置へと展開描画します。


結論

緻密なコンピュータビジョンモデリング(YOLO)と文脈の分析に対応する高度のマルチモーダル設計(Twelve Labs)を組み合わせることで、従来単に保存されるだけであった手術データが瞬時に参照でき、活用価値が高いものへと生まれ変わります。

  • YOLOは「いつ」「何が起こったか」を提示します:ピクセル単位の正確さからどの器具がどの時間で使用されているかを保証します。

  • Twelve Labsは「なぜ」「どういったアクションか」を保管補完します:フェーズ検出、執刀操作の検証、詳細なオペレポート等のドキュメント構築にフル機能で貢献します。

このアーキテクチャパターン、すなわち信頼精度の高い局所的な画像センサ情報をシステム内のAI生成における不変要素として制御する仕組みは、手術に限らず様々な領域に適応可能です(生産工場の製品品質エラー検証、スポーツ競技データの分析、物理セキュリティ・防犯分野等での自動監査化)。

今後の発展シナリオ:

  • 部門全体で蓄積される複数の動画データベースを交差させた相関・分析

  • ストリーミング技術を使用した、手術中のリアルタイム表示サポート

  • ラベル付けされた動画情報に基づいた、完全自動の研修テキスト・トレーニング教材作成

さあ、始めましょう

外科医や研修医は、通常、1回の手術につき3〜5時間を費やして腹腔鏡下の映像をフレーム単位で手動で見直し、器具の記録、手術フェーズの特定、術記の作成を行っています。毎月何百件もの手術を処理する教育病院全体では、そのような手動レビューによる作業が年間何千時間にも及び、患者のケアに充てるべき臨床時間が奪われています。

このチュートリアルでは、手術動画を検索可能な豊富なデータセットとして扱うプラットフォームである「Surgical Video Intelligence」を構築します。このコアとなるアーキテクチャの洞察は、精密な物体検出を行うYOLO(You Only Look Once)と、Twelve Labsのマルチモーダル動画理解APIを組み合わせることで、どの器具が画面に映っているかを認識し、それらを取り巻く手術のコンテキストを理解できるシステムを構築することにあります。

u2b50ufe0f 構築するもの:以下の処理を自動的に行うNext.jsアプリケーションです。

  1. バウンディングボックスとタイムスタンプを使って、リアルタイムで手術器具を検出(Detects)する

  2. 動画のエビデンスから、SOAP術記(術後経過記録)(主観、客観、評価、計画)を自動生成する

  3. 手術をチャプター(章)に分割(セグメント化)する(例:「剥離」、「閉腹」など)

  4. 動画ライブラリ全体でのセマンティック検索を可能にする(例:「すべての電気凝固の瞬間を検索」など)

  5. 追加の臨床的な質問応答(Q&A)に対応する対話型AIアシスタント「Dr. Sage」を導入する

ud83dudccc ライブデモを体験する | GitHubリポジトリを表示する


システムアーキテクチャ

手術動画の分析には、根本的に異なる2つの機能が必要です。ピクセル精度での器具の特定と、それらの器具が手術中に何を行っているかという文脈の理解です。単一のモデルでこの両方を高水準で処理できるものは存在しません。

本システムのアーキテクチャでは、これら2つの役割を並行する2つのパイプラインに分離し、推論時にそれらを融合させます。

  1. 動画のインポート(動画の取り込み):ユーザーが腹腔鏡下手術の動画をアップロードします。

  2. 器具検出(Tool Detection):YOLOv8モデル(7種類の明確な手術器具クラスにファインチューニング済み)が動画をスキャンし、タイムスタンプとバウンディングボックスを含む、構造化された検出データのJSONファイルを出力します。

  3. 動画のインデックス登録:Twelve Labsが動画をインデックス登録し、セマンティック検索(Marengoエンベディング)と文脈の分析(Pegasus推論)を可能にします。

  4. コンテキストの融合:システムが術記を作成したり、質問に答えたりする際、YOLOの検出データがTwelve Labsの動画理解とともにプロンプトに挿入されます。これにより、AIの推論を検証済みの視覚的エビデンスに基づいて行わせることができます。

このハイブリッドアプローチが重要である理由は、それぞれのテクノロジーが互いの死角を補い合っているためです。YOLOはフレーム120において95%の信頼度で「把持鉗子(Grasper)」を特定できますが、その把持鉗子が牽引に使われているのか、剥離に使われているのかを判別することはできません。それに対しTwelve Labsは、手術手技や手術フェーズの進行について推論することは可能ですが、実際には使用されなかった器具の幻覚(ハルシネーション)を防ぐために、確実な検出データを必要とします。


アプリケーションのデモ

Loomで完全版デモを視聴する


1. リアルタイムの器具検出

メインの分析ビューは同期された体験を提供します。左側では、動画プレイヤーにYOLOによって検出されたリアルタイムの器具バウンディングボックスがオーバーレイ表示されます。下部にある「スイムレーン」タイムラインには、それぞれの器具がどのタイミングで現れたかが可視化され、指導者は手術プロセス全体において器具がどのように使われたかを視覚的に瞬時に把握できます。


2. 自動SOAP術記生成

動画のアップロードとインデックス登録が完了すると、システムはTwelve LabsのAnalyze APIを活用し、YOLOの器具検出データを踏まえた、一人称形式の手術経過記録を自動生成します。手動での入力は一切不要です。生成されたSOAP術記には、特定のタイムスタンプに紐づいた正確な器具の参照が含まれており、ドキュメント作成にかかる時間を数時間から数分へと短縮します。


3. 手術フェーズのセグメンテーション

Twelve Labs Analyze APIは、構造化されたJSON出力を利用して、手術を「準備」、「剥離」、「閉合」などの個別のフェーズに自動的に分割します。これらのチャプターはインタラクティブなタイムライン上に表示され、特定の手術手順へ素早く移動することができます。これにより、研修プログラムにおいて、90分間の録画動画をナビゲーション可能な教材へと変換することができます。


4. セマンティック検索

Twelve LabsのMarengoによるマルチモーダルエンベディングを原動力とした、手術動画ライブラリを対象とする自然言語検索機能です。単なるキーワード一致検索とは異なり、手術の文脈を意味的に理解します。

クエリ例:「執刀医が電気メス(electrocautery)を使用した瞬間を表示してください」結果:約2:34〜2:58および5:12〜5:45のクリップ(信頼度: 0.92)

指導医が50以上の研修動画の中から「モノポーラ凝固器具の使用」を検索する場合、Marengoはタイムスタンプとともにすべての検出結果を返します。これにより、すべての動画を手動で確認することなく、特定のテクニックを集めた映像集を迅速に作成できます。


5. Dr. Sage:対話型の臨床Q&A

自動分析が完了すると、Dr. Sageが追加の質問に対応するための会話型インターフェースを提供します。このAIは、YOLOが検出したデータとTwelve Labsの動画理解情報の両方にアクセスできるため、「剥離中にどの器具が使用されましたか?」や「3:45に使用された手技について説明してください」といったクエリへの応答が可能です。これにより、自動生成されたレポートと、手術見直しや研修セッション中に発生するスポット的な疑問とのギャップを埋めることができます。


デプロイのアーキテクチャ

このアプリケーションは、コンピューターパワーを大量に消費する推論プロセスと、ユーザーに直接対応する処理を明確に分離した分散システムとして設計されています。


インフラの概要

  1. 開発フロントエンド(Vercel):UIおよびAPIルートを提供するNext.jsアプリケーション

  2. バックエンド(Railway):YOLO推論を実行するFastAPIサーバー

  3. ストレージ(Vercel Blob):すべての分析結果を集約して保管するJSONストレージ

  4. AIプロセシング(Twelve Labs):クラウドベースの動画理解エンジン


データフロー

ユーザーが手術動画をアップロードすると、並行する2つのパイプラインが同時に起動します。


画像認識パイプライン(Railway)

  1. ユーザーが動画をアップロード → フロントエンドがそれをRailwayバックエンドに送信

  2. YOLOが動画をフレーム単位で処理します(効率化のため120フレームごとに処理)

  3. バックエンドが detections.json を生成:

{
  "detections": [
    {
      "frame": 120,
      "timestamp": 5.0,
      "tools": [
        {"class_name": "Grasper", "confidence": 0.95, "bbox": {...}}
      ]
    }
  ]
}
  1. 結果が次のパスに沿ってVercel Blobにアップロードされます:detections/{videoId}.json


動画インテリジェンスパイプライン(Twelve Labs + Vercel)

  1. 動画がTwelve Labsによってインデックス登録されます(エンベディング用のMarengo、動画理解用のPegasus

  2. フロントエンドAPIのルートがAIによるコンテンツ生成を実行します:

    • SOAP術記: POST /api/analysis/{videoId}/soap

    • チャプター/タイムライン: POST /api/timeline

  3. 結果が次の位置に沿ってVercel Blobに保存されます:analysis/{videoId}.json


Vercel Blobによる状態の集中管理

どちらのパイプラインも、JSONファイルの主要キーバリューストアであるVercel Blobに集約されます。これにより、データベース構成を簡素化しつつ、優れた参照処理速度を維持します。

ストレージのスキーマ:



Twelve Labsが実現する強力なインテリジェンス

YOLOは、特定のツール、正確なタイムスタンプといった「何が」「いつ」存在したか特定する情報を提供します。さらにTwelve Labsが、フェーズ特定、器具の使用方法、術中におけるコンテキスト推論といった「なぜ」「どのように」情報を補強します。ここでは、主に利用される3つの代表的なAPI連携、Analyze(SOAP術記用およびチャプター分割用)とSearch(セマンティック検索用)の使用方法を説明します。


1. Analyze API: SOAP術記自動生成

Analyze APIは、Twelve Labsの主要なマルチモーダル生成エンドポイントです。今回はこれを活用し、YOLOのツール検出情報をもとにした一人称視点での手術経過記録を構築します。

参照ソース:frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Vercel BlobからYOLO検出データを取得
const toolData = await fetchToolDetection(videoId);

// 2. プロンプト用に読みやすい文字列として検出データをフォーマット
const toolContext = formatToolDetectionForPrompt(toolData);
// 出力例: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. SOAP術記プロンプトに、この確かな検出データをインプット
const enrichedPrompt = `${soapPrompt}

## REFERENCE DATA
${toolContext}
Use this tool detection data to provide accurate tool names and usage times.`;

// 4. Twelve Labs Analyze APIの呼び出し
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // 事実から逸脱しないため、生成温度(Temperature)を低く設定
});

// 5. JSONレスポンスのパースとVercel Blobへの保存
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

効果的な理由:YOLOによる検出データをプロンプトにインプットすることで、検証済みの視覚情報に基づいた堅固な推論をモデルに行わせることができます。YOLOがクリッパーを一度も検出していないにもかかわらず、AIが「5:30にクリッパーを使用しました」と勝手に不正確な記述を行うことを防止できます。これが最も中核となるアーキテクチャのパターン、つまりマルチモーダル生成時における事実制約としてコンピュータビジョン(YOLO)の出力を役割させる仕組みです。


2. Analyze API: タイムラインの生成(構造化された出力)

また、Analyze APIでのチャプター生成では responseFormat パラメータを渡して、確実に構造化されたJSONから直接情報を得られるようにし、不安定な平文文字列パージング処理の手間を排除します。

参照ソース:frontend/src/app/api/timeline/route.js

const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: "Divide this surgery into distinct phases with medical terminology. For each phase, provide a title, summary, start time, and end time.",
    responseFormat: {
        type: "json_schema",
        jsonSchema: {
            type: "object",
            properties: {
                chapters: {
                    type: "array",
                    items: {
                        type: "object",
                        properties: {
                            chapterNumber: { type: "number" },
                            chapterTitle: { type: "string" },
                            chapterSummary: { type: "string" },
                            startSec: { type: "number" },
                            endSec: { type: "number" }
                        },
                        required: ["chapterNumber", "chapterTitle", "startSec", "endSec"]
                    }
                }
            }
        }
    }
});

// 構造化されたJSONレスポンスをパース
const parsedData = JSON.parse(response.data);
// parsedData.chaptersに配列情報が含まれます

出力データの例:

{
  "chapters": [
    {
      "chapterNumber": 1,
      "chapterTitle": "Preoperative Setup and Positioning",
      "chapterSummary": "Patient positioned and prepped for procedure",
      "startSec": 0,
      "endSec": 163
    },
    {
      "chapterNumber": 2,
      "chapterTitle": "Dissection and Control of Carotid Arteries",
      "startSec": 163,
      "endSec": 326
    }
  ]
}

効果的な理由responseFormat パラメータを使用することで、システムが正規表現ベースの面倒な処理や文字列の前処理を行わずに、自動設計通りに必要な構造のJSONフィールドをタイムラインUIにマッピングして素早く描画できます。


3. Search API: Marengoによるセマンティック検索

Search APIは、Marengoの高性能マルチモーダル埋め込みモデルを使用して、自然言語の指示クエリから動画の特定の瞬間を検出します。

参照ソース:frontend/src/app/api/search/route.js

const response = await getTwelveLabsClient().search.query({
    indexId: process.env.NEXT_PUBLIC_TWELVELABS_MARENGO_INDEX_ID,
    searchOptions: ['visual', 'audio'], // 視覚情報と音声の両方をスキャン
    queryText: query, // 例:"clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // 検出精度と漏れ検知의 밸런스 튜닝
});

// 抽出結果のループ処理
for await (const clip of response) {
    console.log(`Found at ${clip.start}s - ${clip.end}s (confidence: ${clip.confidence})`);
    console.log(`Thumbnail: ${clip.thumbnailUrl}`);
}

効果的な理由:単純な音声データのキーワード処理と異なり、Marengoは手術上の文脈を意味構造として把握します。例えば「胆嚢管のクリッピング」について検索をかけた際、映像内で誰もその単語を発言していなくても、術中の映像パターンをもとにその作業シーケンスを認識し検出します。これにより、マニュアルタグ付の手間を完全に削減可能な「手術アーカイブ用スマート検索ライブラリ」を実現できます。


ステップごとの実装解説


システム要件

  • Node.js 18+ および Python 3.10+

  • Twelve Labs APIキーPlaygroundから取得可能です

  • コンピュータービジョンモデル:本内容では、80例の胆嚢摘出術を対象に開発されたCholec80データセットで微調整(ファインチューニング)され、7種の代表的な器具クラスを識別可能なYOLOv8システムを使用します


ステップ 1: バックエンドの構築(Railway)

YOLOによる検出バックエンドサーバーは、動画ファイルを受けて推論処理を担う、FastAPIで書かれたインスタンスです。

参照ソース:backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # YOLOで動画に対して推論を実行
    results_data = run_inference(temp_video_path, video_id)

    # 生成画像をフロントエンドAPI経由でVercel Blobに直接保存
    await upload_results_to_blob(video_id, results_data, blob_token)

    return {"status": "completed", "data": results_data}

バックエンドは120フレームごと(24fpsの場合、約5秒に1回)に画像をスキャンします。これにより、処理効率と抽出箇所の精密さのバランスを担保します。例えば30分の動画であるならば約360フレームを処理すれば十分なので、全ての瞬間を完全に計算対象とする場合の余分な負荷や、遅延による無意味なコストコスト増を伴うことなく完璧なプロセス器具抽出図を構成できます。


ステップ 2: フロントエンドAPI設計(Vercel)

Next.jsのAPIルートが全体のオーケストレーションをコーディネートします。エンドポイントは次の主要3つです:

  1. GET /api/detect-tools/{videoId}: Vercel BlobからYOLOで算出ずみの物体検出ログデータを取り込みます

  2. POST /api/analysis/{videoId}/soap: Twelve LabsのAnalyze APIをもとにSOAPを生成します

  3. POST /api/timeline: Twelve LabsのAnalyze APIによるタイムラインチャプターを取得します

各ルートは一貫した3ステップのパターンに従います。BlobからYOLOデータをフェッチし、強化されたプロンプトを使用してTwelve Labs APIを呼び出し、その結果を次回以降のキャッシュとしてBlobに保存します。


ステップ 3: Dr. Sage対話機能への統合

対話型アシスタントインターフェースでは、エンドユーザーからの問い合わせクエリに視覚情報を追加して拡張した形で、Twelve Labsへリクエストされます。

参照ソース:frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// ヘルパー: 生のオブジェクト検知ログを、対話向けテキスト要約に変換
function formatToolDetectionForChat(toolData) {
    // ... 検出時間とツール検出箇所の集約処理ロジック ...
    // 返値例:
    // "- Grasper: 450 detections (0:05 - 12:30)"
    // "- Hook: 120 detections (4:15 - 8:00)"
    return summary;
}

export async function POST(request) {
    const { userQuery, videoId } = await request.json();

    // 1. YOLOバックエンドで生成されたJSONデータを取得
    const toolData = await fetchToolDetection(videoId);

    // 2. AIがコンテキストとして読める形式に変換
    // これにより多くの検出プロットポイントが1つの明快な要約テキストとなります
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. ユーザーからの本来の質問内容をアップデート変換
    // システムが強制的に推論の際の事実(Ground Truth)として判断できるよう専用タグを補足します
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Twelve Labs Pegasusを呼び出す
    const client = new TwelveLabs({ apiKey: process.env.TWELVELABS_API_KEY });
    const response = await client.analyze({
        videoId: videoId,
        prompt: enrichedQuery,
        temperature: 0.2 // 事実正確性を高めるためのロー・テンパチャー設計
    });

    return new Response(JSON.stringify(response));
}


ステップ 4: インタラクティブ・タイムライン表示

オブジェクトの検出ログデータはシステムAIには有用ですが、執刀・研修スタッフにはわかりやすい視覚的レイアウトが不可欠です。私たちは、各代表的な器具を区別してライン化した、React製の次のようなタイムラインパーツと自動的にマッピングを統合させました:

  • 赤色のプロット:電気凝固メス(Bipolar Cautery)

  • 緑色のプロット:フック電極器具(Hook Dissection)

  • 黄色のプロット:把持鉗子(Grasper Manipulation)

教員は研修医の腹腔鏡動画を確認する際、一目で全体の操作癖、たとえば「不十分な剥離状態で長い凝固操作を続けた」ケースや不適切なプロセスを発見でき、そのポイントを選択するだけで瞬時に当該の動画フレームの位置へと正確にジャンプして検証を行えます。フロントエンド側はJSON内の detections リストをもとに、CSS等でタイムライン上の適切な水平位置へと展開描画します。


結論

緻密なコンピュータビジョンモデリング(YOLO)と文脈の分析に対応する高度のマルチモーダル設計(Twelve Labs)を組み合わせることで、従来単に保存されるだけであった手術データが瞬時に参照でき、活用価値が高いものへと生まれ変わります。

  • YOLOは「いつ」「何が起こったか」を提示します:ピクセル単位の正確さからどの器具がどの時間で使用されているかを保証します。

  • Twelve Labsは「なぜ」「どういったアクションか」を保管補完します:フェーズ検出、執刀操作の検証、詳細なオペレポート等のドキュメント構築にフル機能で貢献します。

このアーキテクチャパターン、すなわち信頼精度の高い局所的な画像センサ情報をシステム内のAI生成における不変要素として制御する仕組みは、手術に限らず様々な領域に適応可能です(生産工場の製品品質エラー検証、スポーツ競技データの分析、物理セキュリティ・防犯分野等での自動監査化)。

今後の発展シナリオ:

  • 部門全体で蓄積される複数の動画データベースを交差させた相関・分析

  • ストリーミング技術を使用した、手術中のリアルタイム表示サポート

  • ラベル付けされた動画情報に基づいた、完全自動の研修テキスト・トレーニング教材作成

さあ、始めましょう