튜토리얼

수동 검토에서 자동화된 인텔리전스로: YOLO와 Twelve Labs를 활용한 수술 비디오 분석 플랫폼 구축

김미란

본 튜토리얼에서는 YOLOv8 도구 감지 기술과 Twelve Labs의 Marengo 및 Pegasus 모델을 결합하여, SOAP 수술 기록지를 자동 생성하고, 수술 단계를 세분화하며, 비디오 라이브러리 전반에 걸친 시맨틱 검색과 함께 대화형 임상 Q&A 어시스턴트인 'Dr. Sage'를 구동하는 '수술 비디오 인텔리전스(Surgical Video Intelligence)' 플랫폼의 구축 과정을 단계별로 안내합니다.

본 튜토리얼에서는 YOLOv8 도구 감지 기술과 Twelve Labs의 Marengo 및 Pegasus 모델을 결합하여, SOAP 수술 기록지를 자동 생성하고, 수술 단계를 세분화하며, 비디오 라이브러리 전반에 걸친 시맨틱 검색과 함께 대화형 임상 Q&A 어시스턴트인 'Dr. Sage'를 구동하는 '수술 비디오 인텔리전스(Surgical Video Intelligence)' 플랫폼의 구축 과정을 단계별로 안내합니다.

목차

No headings found on page

뉴스레터 구독하기

뉴스레터 구독하기

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

AI로 영상을 검색하고, 분석하고, 탐색하세요.

2026. 2. 20.

9분

링크 복사하기

외과의와 전공의는 일상적으로 수술당 3~5시간 동안 복강경 영상을 프레임 단위로 검토하며 도구를 기록하고, 수술 단계를 파악하고, 수술 기록지를 수기로 작성합니다. 매달 수백 건의 수술을 처리하는 대학 병원 전체로 보면, 이러한 수동 검토 작업은 수천 시간의 임상 시간을 환자 진료가 아닌 다른 곳에 소모하게 만듭니다.

이 튜토리얼에서는 수술 영상을 실시간으로 쿼리 가능한 풍부한 데이터셋으로 다루는 플랫폼인 Surgical Video Intelligence를 구축합니다. 핵심 아키텍처적 통찰은 다음과 같습니다. 정밀한 객체 감지를 위한 YOLO(You Only Look Once)와 Twelve Labs의 멀티모달 비디오 이해 API를 결합하여, 화면에 어떤 도구가 있는지 보고 그 주변의 수술 맥락을 동시에 이해할 수 있는 시스템을 만드는 것입니다.

u2b50ufe0f 구축하려는 서비uc2a4: 다음 기능을 자동으로 수행하는 Next.js 애플리케이션입니다.

  1. 바운딩 박스와 타임스탬프를 통해 실시간으로 수술 도구 감지

  2. 영상 증거를 기반으로 SOAP 수술 기록지 자동 생성 (주관적 서술, 객관적 소견, 평가, 계획)

  3. 수술 과정을 여러 단계(예: "박리", "봉합")의 챕터로 세분화

  4. 영상 라이브러리 전체에서 시맨틱 검색 활성화 (예: "모든 전기 소작 순간 찾기")

  5. 추가 임상 질의응답을 위한 대화형 AI 어시스턴트 Dr. Sage 제공

ud83dudccc ub7c9uc774ube0c ub370ubaa8 uccb4ud5d8ud558uae30 | GitHub 저장소 보기


시스템 아키텍처

수술 영상 분석에는 근본적으로 다른 두 가지 기능이 필요합니다. 픽셀 단위의 정밀한 기구 식별과 해당 기구가 수술 내에서 무엇을 하고 있는지에 대한 맥락적 이해입니다. 단일 모델로는 이 두 가지를 모두 잘 처리할 수 없습니다.

저희 아키텍처는 이러한 역할을 추론 시점에 하나로 수렴하는 두 개의 병렬 파이프라인으로 분리합니다.

  1. 비디오 수집 (Video Ingestion): 사용자가 복강경 수술 영상을 업로드합니다.

  2. 도구 감지 (Tool Detection): 7가지 특정 수술 기구 클래스에 대해 미세 조정(Fine-tuned)된 YOLOv8 모델이 영상을 스캔하고, 타임스탬프와 바운딩 박스가 포함된 정형 JSON 형식의 감지 데이터 파일을 출력합니다.

  3. 비디오 인덱싱 (Video Indexing): 시맨틱 검색(Marengo 임베딩) 및 맥락 분석(Pegasus 추론)을 위해 Twelve Labs가 영상을 인덱싱합니다.

  4. 맥락 융합 (Context Fusion): 시스템이 기록을 생성하거나 질문에 답변할 때, YOLO의 감지 데이터를 Twelve Labs의 비디오 이해 기능과 함께 프롬프트에 주입하여 AI의 추론을 검증된 시각적 증거에 기반하도록 만듭니다.

이 하이브리드 접근 방식이 중요한 이유는 각 기술이 서로의 사각지대를 보완해 주기 때문입니다. YOLO는 120번째 프레임에서 95%의 신뢰도로 집게(Grasper)를 식별할 수 있지만, 그 집게가 견인(Retraction)에 사용되는지 아니면 박리(Dissection)에 사용되는지까지는 말해주지 못합니다. Twelve Labs는 수술 기법과 단계적 진행 과정을 추론할 수 있지만, 실제 사용되지 않은 기구를 있는 것처럼 오인(Hallucination)하는 것을 방지하기 위해 정밀한 감지 데이터의 지원을 받습니다.


애플리케이션 데모

Loom에서 전체 데모 시청하기


1. 실시간 도구 감지

메인 분석 뷰는 동기화된 경험을 제공합니다. 왼쪽의 비디오 플레이어에는 YOLO가 감지한 실시간 도구 바운딩 박스가 오버레이로 표시됩니다. 하단의 "스윔레인(swimlane)" 타임라인은 각 기구가 정확히 언제 나타나는지 시각화하여, 교육자에게 수술 전반에 걸친 기구 사용 현황을 한눈에 파악할 수 있는 지도를 제공합니다.


2. SOAP 기록지 자동 생성

비디오 업로드 및 인덱싱이 완료되면 시스템은 YOLO 도구 감지 데이터로 강화된 Twelve Labs Analyze API를 사용하여 1인칭 관점의 수술 기록을 생성합니다. 수동 입력은 필요하지 않습니다. 생성된 SOAP 기록에는 특정 타임스탬프에 고정된 정확한 기구 참조가 포함되어 수동 문서 작성 시간을 단 몇 분으로 단축해 줍니다.


3. 수술 단계 세분화 (Surgical Phase Segmentation)

Twelve Labs Analyze API는 구조화된 JSON 출력을 활용하여 수술을 "준비", "박리", "봉합"과 같은 고유한 단계로 자동 세분화합니다. 이러한 챕터들은 대화형 타임라인에 표시되어 특정 수술 단계로 빠르게 탐색할 수 있도록 돕습니다. 훈련 프로그램의 경우, 이는 90분짜리 녹화 영상을 다루기 쉬운 교육 과정으로 전환해 줍니다.


4. 시맨틱 검색

Twelve Labs Marengo의 uba40ud2f0ubaa0ub2ec uc784ubca0ub529을 기반으로 수술 영상 라이브러리 전반에서 자연어 검색을 수행합니다. 일반적인 키워드 매칭과 달리, 이 기능은 수술의 맥락을 의미론적으로 이해합니다.

검색 예시: "외과의가 전기 소작기를 사용한 시점을 보여줘" 결과: 신뢰도 0.92로 2:34~2:58 및 5:12~5:45 구간의 클립 반환

50개 이상의 교육 영상에서 "단극성 응고법(monopolar coagulation)의 사용"을 검색하는 수술 교육자에게, Marengo는 타임스탬프와 함께 모든 관련 인스턴스를 반환하므로 전체 녹화본을 일일이 보지 않고도 기술 요약본을 빠르게 컴파일할 수 있습니다.


5. Dr. Sage: 대화형 임상 Q&A

자동 분석이 완료되면 Dr. Sage가 후속 질문에 대답할 수 있는 대화형 인터페이스를 제공합니다. YOLO 감지 데이터와 Twelve Labs 비디오 이해 기능 모두에 액세스할 수 있어, "박리 중에 어떤 도구가 사용되었나요?" 또는 "3:45에 사용된 기술을 설명해 주세요"와 같은 복잡한 질의가 가능합니다. 이는 자동화된 보고서와 수술 검토 및 교육 세션 중에 발생하는 즉각적인 질문 사이의 공백을 메워줍니다.


배포 아키텍처

이 애플리케이션은 연산 집약적인 추론 영역과 사용자 대면 작업을 명확히 분리한 분산 시스템으로 설계되었습니다.


인프라 개요

  1. 프론트엔드 (Vercel): UI 및 API 라우트를 제공하는 Next.js 애플리케이션

  2. 백엔드 (Railway): YOLO 추론을 실행하는 FastAPI 서버

  3. 스토리지 (Vercel Blob): 모든 분석 결과를 보관하는 중앙 집중식 JSON 스토리지

  4. AI 프로세싱 (Twelve Labs): 클라우드 기반 비디오 이해 기술


데이터 흐름

사용자가 수술 영상을 업로드하면 두 개의 병렬 파이프라인이 즉시 활성화됩니다.


컴퓨터 비전 파이프라인 (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는 단계 인식, 기법 분석, 맥락적 추론과 같은 '왜, 어떻게'에 대한 통찰을 제공합니다. 다음은 저희가 두 가지 주요 API 기능인 Analyze(SOAP 및 챕터 생성용) 및 Search(시맨틱 검색용)를 활용하는 방식입니다.


1. Analyze API: SOAP 기록지 생성

Analyze API는 Twelve Labs의 뛰어난 멀티모달 생성 엔드포인트입니다. 저희는 이를 활용하여 YOLO 감지 데이터에 기반한 1인칭 수술 기록을 작성합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Fetch YOLO detection data from Vercel Blob
const toolData = await fetchToolDetection(videoId);

// 2. Format detections as readable text for the prompt
const toolContext = formatToolDetectionForPrompt(toolData);
// Example output: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. Enrich the SOAP generation prompt with hard detection data
const enrichedPrompt = `${soapPrompt}

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

// 4. Call Twelve Labs Analyze API
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // Low temperature for factual, not creative, output
});

// 5. Parse JSON response and save to Vercel Blob
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

작동 원리: YOLO가 탐지한 정보들을 프롬프트에 제공함으로써 모델의 비디오 추론을 검증된 시각적 증거에 결합시킬 수 있습니다. YOLO가 클리퍼를 한 번도 감지하지 못했다면 실질적으로 AI가 "5분 30초에 클리퍼를 사용했다"는 식의 허위 사실을 주장할 수 없게 되는 셈입니다. 이것이 바로 컴퓨터 비전의 하드웨어적 출력 데이터를 멀티모달 생성 모델의 사실 제약 조건으로 사용하는 핵심 아키텍처 패턴입니다.


2. Analyze API: 타임라인 생성 (구조화된 출력)

또한 챕터 생성 시 Analyze API의 responseFormat 파라미터를 사용해 구조화된 JSON 형식을 명시적으로 요청합니다. 이를 통해 신뢰도 높은 스키마 검증 데이터를 직접 얻음으로써, 불안정하고 번거로운 문자열 파싱 과정을 배제할 수 있습니다.

uc18cuc2a4 ucf54ub4dc: 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"]
                    }
                }
            }
        }
    }
});

// Parse the structured JSON response
const parsedData = JSON.parse(response.data);
// parsedData.chapters contains the chapter array

출력 예시:

{
  "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의 멀티모달 임베딩 성능을 토대로 사용자의 일반 검색 질의와 관련된 ube44ub5ecuc624 ub0b4uc758 ud2b9uc815 uc21cuac04uc744 ud3ecucc29합니다.

uc18cuc2a4 ucf54ub4dc: 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'], // Search both modalities
    queryText: query, // e.g., "clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // Balance precision vs. recall
});

// Iterate through results
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는 복잡한 수술 상황의 맥락적 정의를 정확히 이해합니다. "담낭 동맥의 클리핑(clipping of cystic artery)"과 같은 고차원적인 질의 검색 시, 해당 오디오 언급 유무와 관계없이 정교한 시각적/동작적 패턴 특징을 토대로 해당 세부 클립을 추출할 수 있습니다. 덕분에 별도 레이블링 리소스 없이 강력한 영상 아카이브 검색을 실현할 수 있습니다.


단계별 구현 절차


사전 준비 사항

  • Node.js 18 이상Python 3.10 이상

  • Twelve Labs API 키: Playground에서 발급받으실 수 있습니다.

  • 컴퓨터 비전 모델: 저희는 7가지 수술 도구 분류로 태깅되어 있는 80건의 담낭 절제 수술 데이터셋인 Cholec80 기반으로 파인 튜닝된 YOLOv8 모델을 사용합니다.


1단계: 백엔드 구축 (Railway 배포)

YOLO 분석을 처리할 백엔드는 업로드된 비디오를 받아 탐지된 결과들을 구조적인 JSON으로 반환해 주는 간단한 FastAPI 구조로 빌드합니다.

uc18cuc2a4 ucf54ub4dc: backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # Process video with YOLO
    results_data = run_inference(temp_video_path, video_id)

    # Upload results to Vercel Blob via Frontend API
    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 프론트엔드에서 구현하는 다음 주요 라우트 세 개는 전체적인 인공지능 워크플로우를 주율하는 매개 역할을 합니다.

  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로 장면에 따른 단계 분절 데이터 취득

위 엔드포인트들은 모두 일관된 프로세스를 거치도록 설계되었습니다: Blob 파일 스토리지 상의 기존 탐지 정보 조회, 보완된 프롬프트를 담아 Twelve Labs 비디오 탐사 요청, 캐싱을 위해 결과 데이터를 마저 Blob에 영구 저장하는 과정입니다.


3단계: Dr. Sage 대화 기능 연결

대화 인터페이스에서는 Twelve Labs 서비스를 타기 직전 사용자의 입력 텍스트 질의에 비디오 내 가용한 기구 객체 탐지 증명을 보정하여 인풋으로 전달해 주는 방식으로 제어합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// Helper: Convert raw JSON detections to a chat-friendly summary
function formatToolDetectionForChat(toolData) {
    // ... logic to aggregate frames into time ranges ...
    // Output example:
    // "- 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. Fetch the JSON data produced by our YOLO backend
    const toolData = await fetchToolDetection(videoId);

    // 2. Format it into natural language context
    // This turns thousands of data points into a readable summary for the AI
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. Enrich the user's query
    // We tag this as system-injected data so the model treats it as ground truth
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Call 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 // Low temperature for factual accuracy
    });

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


4단계: 시계열 타임라인 구성 시각화

로 데이터 형식의 원본 탐지 결과물은 AI에겐 유용하지만 의료진이나 실수요 유저에겐 정교한 시각 프레임이 필수적입니다. 저희는 추출된 타임스탬프 정보들을 React 타임라인 컴포넌트에 넘겨 각 수술용 대표 도구들에 해당하는 스윔레인(Timeline Rows)을 그림으로 그려 줍니다.

  • 빨간색 (Red): 양극성 소각 기구 (Bipolar/Cautery)

  • 초록색 (Green): 후크 분리기구 (Hook/Dissection)

  • 노란색 (Yellow): 집게 장치 (Grasper/Manipulation)

의학 교육 담당자가 피교육자가 시연한 수술 과정을 검토할 시, 기구 흐름 패턴을 통해 혹시 미처 수술 단계를 다 안 뗀 상태서 불필요하게 고열 지혈을 길게 하지 않는지 등의 장비 기용 정황을 일망타진으로 찾아내어 비디오 세그먼트를 즉각 검증할 수 있습니다. 프론트엔드는 수집된 JSON 내 detections 목록 배열을 파라미팅하여 브라우저 타임라인 내 알맞은 CSS 포지션 컴포넌트 마킹으로 자동 환치해 드립니다.


마치며

정밀한 컴퓨터 비전 분석 기법과 맥락 인지에 특화된 고도화 멀티모달 추론 프로세스를 상호 결합함으로써, 기존의 죽어있던 수술 레코딩 동영상들을 풍부히 질의 검색할 수 있는 유기적 자산 데이터로 탈바꿈시켰습니다.

  • YOLO가 정확한 타임라인 정보와 완결성 높은 장비 레이블링이라는 '어느 위치에 무엇을(who/when)'을 깔끔히 찾아내 주고,

  • Twelve Labs는 그것들을 집약해 실제 프로세스가 지닌 '어떤 성격의 단계이며 무슨 연유(what/why)'인지를 한층 넓은 임상 수술 기록과 챕터 구분을 통해 논리 정연하게 해석해 줍니다.

정밀 컴퓨터 비전 분석을 통해 검증받아 엄격히 제어된 객체 탐출 정보를 멀티모달 지능 추정의 단서 규약으로 투입시키는 이 고유의 아키텍처 결합 원리는 비단 외과 영상 분석뿐 아니라 다양한 영역에서 고스란히 확장 적용될 수 있습니다. 정밀 계측과 세련된 흐름 상의 추론이 병행되어야 하는 첨단 스마트 공장 품질 생산 관리(Manufacturing QA)나, 스포츠 움직임 분석, 혹은 특수 시큐리티 감시 모니터링 분야 등에서도 이와 같은 혁신적인 하이브리드 아키텍처 설계를 적극 고려해 보시는 것을 강력히 추천합니다.

추가로 도전해 볼 수 있는 아이디어:

  • 부서 및 소속 병원에 축적된 대용량 수술 영상 라이브러리를 가로지르는 대형 교차 임상 분석 인프라 구축

  • 스트리밍 형식의 점진적 YOLO 디텍션을 탑재한 실시간 원격 협진/집도 보조 시각 장비 구축

  • 주석 처리된 사례 라이브러리로부터 학습용 가이드 교재 및 커리큘럼 자동화 설계 프라임 빌딩

지금 바로 시작해 보세요:

외과의와 전공의는 일상적으로 수술당 3~5시간 동안 복강경 영상을 프레임 단위로 검토하며 도구를 기록하고, 수술 단계를 파악하고, 수술 기록지를 수기로 작성합니다. 매달 수백 건의 수술을 처리하는 대학 병원 전체로 보면, 이러한 수동 검토 작업은 수천 시간의 임상 시간을 환자 진료가 아닌 다른 곳에 소모하게 만듭니다.

이 튜토리얼에서는 수술 영상을 실시간으로 쿼리 가능한 풍부한 데이터셋으로 다루는 플랫폼인 Surgical Video Intelligence를 구축합니다. 핵심 아키텍처적 통찰은 다음과 같습니다. 정밀한 객체 감지를 위한 YOLO(You Only Look Once)와 Twelve Labs의 멀티모달 비디오 이해 API를 결합하여, 화면에 어떤 도구가 있는지 보고 그 주변의 수술 맥락을 동시에 이해할 수 있는 시스템을 만드는 것입니다.

u2b50ufe0f 구축하려는 서비uc2a4: 다음 기능을 자동으로 수행하는 Next.js 애플리케이션입니다.

  1. 바운딩 박스와 타임스탬프를 통해 실시간으로 수술 도구 감지

  2. 영상 증거를 기반으로 SOAP 수술 기록지 자동 생성 (주관적 서술, 객관적 소견, 평가, 계획)

  3. 수술 과정을 여러 단계(예: "박리", "봉합")의 챕터로 세분화

  4. 영상 라이브러리 전체에서 시맨틱 검색 활성화 (예: "모든 전기 소작 순간 찾기")

  5. 추가 임상 질의응답을 위한 대화형 AI 어시스턴트 Dr. Sage 제공

ud83dudccc ub7c9uc774ube0c ub370ubaa8 uccb4ud5d8ud558uae30 | GitHub 저장소 보기


시스템 아키텍처

수술 영상 분석에는 근본적으로 다른 두 가지 기능이 필요합니다. 픽셀 단위의 정밀한 기구 식별과 해당 기구가 수술 내에서 무엇을 하고 있는지에 대한 맥락적 이해입니다. 단일 모델로는 이 두 가지를 모두 잘 처리할 수 없습니다.

저희 아키텍처는 이러한 역할을 추론 시점에 하나로 수렴하는 두 개의 병렬 파이프라인으로 분리합니다.

  1. 비디오 수집 (Video Ingestion): 사용자가 복강경 수술 영상을 업로드합니다.

  2. 도구 감지 (Tool Detection): 7가지 특정 수술 기구 클래스에 대해 미세 조정(Fine-tuned)된 YOLOv8 모델이 영상을 스캔하고, 타임스탬프와 바운딩 박스가 포함된 정형 JSON 형식의 감지 데이터 파일을 출력합니다.

  3. 비디오 인덱싱 (Video Indexing): 시맨틱 검색(Marengo 임베딩) 및 맥락 분석(Pegasus 추론)을 위해 Twelve Labs가 영상을 인덱싱합니다.

  4. 맥락 융합 (Context Fusion): 시스템이 기록을 생성하거나 질문에 답변할 때, YOLO의 감지 데이터를 Twelve Labs의 비디오 이해 기능과 함께 프롬프트에 주입하여 AI의 추론을 검증된 시각적 증거에 기반하도록 만듭니다.

이 하이브리드 접근 방식이 중요한 이유는 각 기술이 서로의 사각지대를 보완해 주기 때문입니다. YOLO는 120번째 프레임에서 95%의 신뢰도로 집게(Grasper)를 식별할 수 있지만, 그 집게가 견인(Retraction)에 사용되는지 아니면 박리(Dissection)에 사용되는지까지는 말해주지 못합니다. Twelve Labs는 수술 기법과 단계적 진행 과정을 추론할 수 있지만, 실제 사용되지 않은 기구를 있는 것처럼 오인(Hallucination)하는 것을 방지하기 위해 정밀한 감지 데이터의 지원을 받습니다.


애플리케이션 데모

Loom에서 전체 데모 시청하기


1. 실시간 도구 감지

메인 분석 뷰는 동기화된 경험을 제공합니다. 왼쪽의 비디오 플레이어에는 YOLO가 감지한 실시간 도구 바운딩 박스가 오버레이로 표시됩니다. 하단의 "스윔레인(swimlane)" 타임라인은 각 기구가 정확히 언제 나타나는지 시각화하여, 교육자에게 수술 전반에 걸친 기구 사용 현황을 한눈에 파악할 수 있는 지도를 제공합니다.


2. SOAP 기록지 자동 생성

비디오 업로드 및 인덱싱이 완료되면 시스템은 YOLO 도구 감지 데이터로 강화된 Twelve Labs Analyze API를 사용하여 1인칭 관점의 수술 기록을 생성합니다. 수동 입력은 필요하지 않습니다. 생성된 SOAP 기록에는 특정 타임스탬프에 고정된 정확한 기구 참조가 포함되어 수동 문서 작성 시간을 단 몇 분으로 단축해 줍니다.


3. 수술 단계 세분화 (Surgical Phase Segmentation)

Twelve Labs Analyze API는 구조화된 JSON 출력을 활용하여 수술을 "준비", "박리", "봉합"과 같은 고유한 단계로 자동 세분화합니다. 이러한 챕터들은 대화형 타임라인에 표시되어 특정 수술 단계로 빠르게 탐색할 수 있도록 돕습니다. 훈련 프로그램의 경우, 이는 90분짜리 녹화 영상을 다루기 쉬운 교육 과정으로 전환해 줍니다.


4. 시맨틱 검색

Twelve Labs Marengo의 uba40ud2f0ubaa0ub2ec uc784ubca0ub529을 기반으로 수술 영상 라이브러리 전반에서 자연어 검색을 수행합니다. 일반적인 키워드 매칭과 달리, 이 기능은 수술의 맥락을 의미론적으로 이해합니다.

검색 예시: "외과의가 전기 소작기를 사용한 시점을 보여줘" 결과: 신뢰도 0.92로 2:34~2:58 및 5:12~5:45 구간의 클립 반환

50개 이상의 교육 영상에서 "단극성 응고법(monopolar coagulation)의 사용"을 검색하는 수술 교육자에게, Marengo는 타임스탬프와 함께 모든 관련 인스턴스를 반환하므로 전체 녹화본을 일일이 보지 않고도 기술 요약본을 빠르게 컴파일할 수 있습니다.


5. Dr. Sage: 대화형 임상 Q&A

자동 분석이 완료되면 Dr. Sage가 후속 질문에 대답할 수 있는 대화형 인터페이스를 제공합니다. YOLO 감지 데이터와 Twelve Labs 비디오 이해 기능 모두에 액세스할 수 있어, "박리 중에 어떤 도구가 사용되었나요?" 또는 "3:45에 사용된 기술을 설명해 주세요"와 같은 복잡한 질의가 가능합니다. 이는 자동화된 보고서와 수술 검토 및 교육 세션 중에 발생하는 즉각적인 질문 사이의 공백을 메워줍니다.


배포 아키텍처

이 애플리케이션은 연산 집약적인 추론 영역과 사용자 대면 작업을 명확히 분리한 분산 시스템으로 설계되었습니다.


인프라 개요

  1. 프론트엔드 (Vercel): UI 및 API 라우트를 제공하는 Next.js 애플리케이션

  2. 백엔드 (Railway): YOLO 추론을 실행하는 FastAPI 서버

  3. 스토리지 (Vercel Blob): 모든 분석 결과를 보관하는 중앙 집중식 JSON 스토리지

  4. AI 프로세싱 (Twelve Labs): 클라우드 기반 비디오 이해 기술


데이터 흐름

사용자가 수술 영상을 업로드하면 두 개의 병렬 파이프라인이 즉시 활성화됩니다.


컴퓨터 비전 파이프라인 (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는 단계 인식, 기법 분석, 맥락적 추론과 같은 '왜, 어떻게'에 대한 통찰을 제공합니다. 다음은 저희가 두 가지 주요 API 기능인 Analyze(SOAP 및 챕터 생성용) 및 Search(시맨틱 검색용)를 활용하는 방식입니다.


1. Analyze API: SOAP 기록지 생성

Analyze API는 Twelve Labs의 뛰어난 멀티모달 생성 엔드포인트입니다. 저희는 이를 활용하여 YOLO 감지 데이터에 기반한 1인칭 수술 기록을 작성합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Fetch YOLO detection data from Vercel Blob
const toolData = await fetchToolDetection(videoId);

// 2. Format detections as readable text for the prompt
const toolContext = formatToolDetectionForPrompt(toolData);
// Example output: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. Enrich the SOAP generation prompt with hard detection data
const enrichedPrompt = `${soapPrompt}

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

// 4. Call Twelve Labs Analyze API
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // Low temperature for factual, not creative, output
});

// 5. Parse JSON response and save to Vercel Blob
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

작동 원리: YOLO가 탐지한 정보들을 프롬프트에 제공함으로써 모델의 비디오 추론을 검증된 시각적 증거에 결합시킬 수 있습니다. YOLO가 클리퍼를 한 번도 감지하지 못했다면 실질적으로 AI가 "5분 30초에 클리퍼를 사용했다"는 식의 허위 사실을 주장할 수 없게 되는 셈입니다. 이것이 바로 컴퓨터 비전의 하드웨어적 출력 데이터를 멀티모달 생성 모델의 사실 제약 조건으로 사용하는 핵심 아키텍처 패턴입니다.


2. Analyze API: 타임라인 생성 (구조화된 출력)

또한 챕터 생성 시 Analyze API의 responseFormat 파라미터를 사용해 구조화된 JSON 형식을 명시적으로 요청합니다. 이를 통해 신뢰도 높은 스키마 검증 데이터를 직접 얻음으로써, 불안정하고 번거로운 문자열 파싱 과정을 배제할 수 있습니다.

uc18cuc2a4 ucf54ub4dc: 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"]
                    }
                }
            }
        }
    }
});

// Parse the structured JSON response
const parsedData = JSON.parse(response.data);
// parsedData.chapters contains the chapter array

출력 예시:

{
  "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의 멀티모달 임베딩 성능을 토대로 사용자의 일반 검색 질의와 관련된 ube44ub5ecuc624 ub0b4uc758 ud2b9uc815 uc21cuac04uc744 ud3ecucc29합니다.

uc18cuc2a4 ucf54ub4dc: 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'], // Search both modalities
    queryText: query, // e.g., "clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // Balance precision vs. recall
});

// Iterate through results
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는 복잡한 수술 상황의 맥락적 정의를 정확히 이해합니다. "담낭 동맥의 클리핑(clipping of cystic artery)"과 같은 고차원적인 질의 검색 시, 해당 오디오 언급 유무와 관계없이 정교한 시각적/동작적 패턴 특징을 토대로 해당 세부 클립을 추출할 수 있습니다. 덕분에 별도 레이블링 리소스 없이 강력한 영상 아카이브 검색을 실현할 수 있습니다.


단계별 구현 절차


사전 준비 사항

  • Node.js 18 이상Python 3.10 이상

  • Twelve Labs API 키: Playground에서 발급받으실 수 있습니다.

  • 컴퓨터 비전 모델: 저희는 7가지 수술 도구 분류로 태깅되어 있는 80건의 담낭 절제 수술 데이터셋인 Cholec80 기반으로 파인 튜닝된 YOLOv8 모델을 사용합니다.


1단계: 백엔드 구축 (Railway 배포)

YOLO 분석을 처리할 백엔드는 업로드된 비디오를 받아 탐지된 결과들을 구조적인 JSON으로 반환해 주는 간단한 FastAPI 구조로 빌드합니다.

uc18cuc2a4 ucf54ub4dc: backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # Process video with YOLO
    results_data = run_inference(temp_video_path, video_id)

    # Upload results to Vercel Blob via Frontend API
    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 프론트엔드에서 구현하는 다음 주요 라우트 세 개는 전체적인 인공지능 워크플로우를 주율하는 매개 역할을 합니다.

  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로 장면에 따른 단계 분절 데이터 취득

위 엔드포인트들은 모두 일관된 프로세스를 거치도록 설계되었습니다: Blob 파일 스토리지 상의 기존 탐지 정보 조회, 보완된 프롬프트를 담아 Twelve Labs 비디오 탐사 요청, 캐싱을 위해 결과 데이터를 마저 Blob에 영구 저장하는 과정입니다.


3단계: Dr. Sage 대화 기능 연결

대화 인터페이스에서는 Twelve Labs 서비스를 타기 직전 사용자의 입력 텍스트 질의에 비디오 내 가용한 기구 객체 탐지 증명을 보정하여 인풋으로 전달해 주는 방식으로 제어합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// Helper: Convert raw JSON detections to a chat-friendly summary
function formatToolDetectionForChat(toolData) {
    // ... logic to aggregate frames into time ranges ...
    // Output example:
    // "- 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. Fetch the JSON data produced by our YOLO backend
    const toolData = await fetchToolDetection(videoId);

    // 2. Format it into natural language context
    // This turns thousands of data points into a readable summary for the AI
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. Enrich the user's query
    // We tag this as system-injected data so the model treats it as ground truth
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Call 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 // Low temperature for factual accuracy
    });

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


4단계: 시계열 타임라인 구성 시각화

로 데이터 형식의 원본 탐지 결과물은 AI에겐 유용하지만 의료진이나 실수요 유저에겐 정교한 시각 프레임이 필수적입니다. 저희는 추출된 타임스탬프 정보들을 React 타임라인 컴포넌트에 넘겨 각 수술용 대표 도구들에 해당하는 스윔레인(Timeline Rows)을 그림으로 그려 줍니다.

  • 빨간색 (Red): 양극성 소각 기구 (Bipolar/Cautery)

  • 초록색 (Green): 후크 분리기구 (Hook/Dissection)

  • 노란색 (Yellow): 집게 장치 (Grasper/Manipulation)

의학 교육 담당자가 피교육자가 시연한 수술 과정을 검토할 시, 기구 흐름 패턴을 통해 혹시 미처 수술 단계를 다 안 뗀 상태서 불필요하게 고열 지혈을 길게 하지 않는지 등의 장비 기용 정황을 일망타진으로 찾아내어 비디오 세그먼트를 즉각 검증할 수 있습니다. 프론트엔드는 수집된 JSON 내 detections 목록 배열을 파라미팅하여 브라우저 타임라인 내 알맞은 CSS 포지션 컴포넌트 마킹으로 자동 환치해 드립니다.


마치며

정밀한 컴퓨터 비전 분석 기법과 맥락 인지에 특화된 고도화 멀티모달 추론 프로세스를 상호 결합함으로써, 기존의 죽어있던 수술 레코딩 동영상들을 풍부히 질의 검색할 수 있는 유기적 자산 데이터로 탈바꿈시켰습니다.

  • YOLO가 정확한 타임라인 정보와 완결성 높은 장비 레이블링이라는 '어느 위치에 무엇을(who/when)'을 깔끔히 찾아내 주고,

  • Twelve Labs는 그것들을 집약해 실제 프로세스가 지닌 '어떤 성격의 단계이며 무슨 연유(what/why)'인지를 한층 넓은 임상 수술 기록과 챕터 구분을 통해 논리 정연하게 해석해 줍니다.

정밀 컴퓨터 비전 분석을 통해 검증받아 엄격히 제어된 객체 탐출 정보를 멀티모달 지능 추정의 단서 규약으로 투입시키는 이 고유의 아키텍처 결합 원리는 비단 외과 영상 분석뿐 아니라 다양한 영역에서 고스란히 확장 적용될 수 있습니다. 정밀 계측과 세련된 흐름 상의 추론이 병행되어야 하는 첨단 스마트 공장 품질 생산 관리(Manufacturing QA)나, 스포츠 움직임 분석, 혹은 특수 시큐리티 감시 모니터링 분야 등에서도 이와 같은 혁신적인 하이브리드 아키텍처 설계를 적극 고려해 보시는 것을 강력히 추천합니다.

추가로 도전해 볼 수 있는 아이디어:

  • 부서 및 소속 병원에 축적된 대용량 수술 영상 라이브러리를 가로지르는 대형 교차 임상 분석 인프라 구축

  • 스트리밍 형식의 점진적 YOLO 디텍션을 탑재한 실시간 원격 협진/집도 보조 시각 장비 구축

  • 주석 처리된 사례 라이브러리로부터 학습용 가이드 교재 및 커리큘럼 자동화 설계 프라임 빌딩

지금 바로 시작해 보세요:

외과의와 전공의는 일상적으로 수술당 3~5시간 동안 복강경 영상을 프레임 단위로 검토하며 도구를 기록하고, 수술 단계를 파악하고, 수술 기록지를 수기로 작성합니다. 매달 수백 건의 수술을 처리하는 대학 병원 전체로 보면, 이러한 수동 검토 작업은 수천 시간의 임상 시간을 환자 진료가 아닌 다른 곳에 소모하게 만듭니다.

이 튜토리얼에서는 수술 영상을 실시간으로 쿼리 가능한 풍부한 데이터셋으로 다루는 플랫폼인 Surgical Video Intelligence를 구축합니다. 핵심 아키텍처적 통찰은 다음과 같습니다. 정밀한 객체 감지를 위한 YOLO(You Only Look Once)와 Twelve Labs의 멀티모달 비디오 이해 API를 결합하여, 화면에 어떤 도구가 있는지 보고 그 주변의 수술 맥락을 동시에 이해할 수 있는 시스템을 만드는 것입니다.

u2b50ufe0f 구축하려는 서비uc2a4: 다음 기능을 자동으로 수행하는 Next.js 애플리케이션입니다.

  1. 바운딩 박스와 타임스탬프를 통해 실시간으로 수술 도구 감지

  2. 영상 증거를 기반으로 SOAP 수술 기록지 자동 생성 (주관적 서술, 객관적 소견, 평가, 계획)

  3. 수술 과정을 여러 단계(예: "박리", "봉합")의 챕터로 세분화

  4. 영상 라이브러리 전체에서 시맨틱 검색 활성화 (예: "모든 전기 소작 순간 찾기")

  5. 추가 임상 질의응답을 위한 대화형 AI 어시스턴트 Dr. Sage 제공

ud83dudccc ub7c9uc774ube0c ub370ubaa8 uccb4ud5d8ud558uae30 | GitHub 저장소 보기


시스템 아키텍처

수술 영상 분석에는 근본적으로 다른 두 가지 기능이 필요합니다. 픽셀 단위의 정밀한 기구 식별과 해당 기구가 수술 내에서 무엇을 하고 있는지에 대한 맥락적 이해입니다. 단일 모델로는 이 두 가지를 모두 잘 처리할 수 없습니다.

저희 아키텍처는 이러한 역할을 추론 시점에 하나로 수렴하는 두 개의 병렬 파이프라인으로 분리합니다.

  1. 비디오 수집 (Video Ingestion): 사용자가 복강경 수술 영상을 업로드합니다.

  2. 도구 감지 (Tool Detection): 7가지 특정 수술 기구 클래스에 대해 미세 조정(Fine-tuned)된 YOLOv8 모델이 영상을 스캔하고, 타임스탬프와 바운딩 박스가 포함된 정형 JSON 형식의 감지 데이터 파일을 출력합니다.

  3. 비디오 인덱싱 (Video Indexing): 시맨틱 검색(Marengo 임베딩) 및 맥락 분석(Pegasus 추론)을 위해 Twelve Labs가 영상을 인덱싱합니다.

  4. 맥락 융합 (Context Fusion): 시스템이 기록을 생성하거나 질문에 답변할 때, YOLO의 감지 데이터를 Twelve Labs의 비디오 이해 기능과 함께 프롬프트에 주입하여 AI의 추론을 검증된 시각적 증거에 기반하도록 만듭니다.

이 하이브리드 접근 방식이 중요한 이유는 각 기술이 서로의 사각지대를 보완해 주기 때문입니다. YOLO는 120번째 프레임에서 95%의 신뢰도로 집게(Grasper)를 식별할 수 있지만, 그 집게가 견인(Retraction)에 사용되는지 아니면 박리(Dissection)에 사용되는지까지는 말해주지 못합니다. Twelve Labs는 수술 기법과 단계적 진행 과정을 추론할 수 있지만, 실제 사용되지 않은 기구를 있는 것처럼 오인(Hallucination)하는 것을 방지하기 위해 정밀한 감지 데이터의 지원을 받습니다.


애플리케이션 데모

Loom에서 전체 데모 시청하기


1. 실시간 도구 감지

메인 분석 뷰는 동기화된 경험을 제공합니다. 왼쪽의 비디오 플레이어에는 YOLO가 감지한 실시간 도구 바운딩 박스가 오버레이로 표시됩니다. 하단의 "스윔레인(swimlane)" 타임라인은 각 기구가 정확히 언제 나타나는지 시각화하여, 교육자에게 수술 전반에 걸친 기구 사용 현황을 한눈에 파악할 수 있는 지도를 제공합니다.


2. SOAP 기록지 자동 생성

비디오 업로드 및 인덱싱이 완료되면 시스템은 YOLO 도구 감지 데이터로 강화된 Twelve Labs Analyze API를 사용하여 1인칭 관점의 수술 기록을 생성합니다. 수동 입력은 필요하지 않습니다. 생성된 SOAP 기록에는 특정 타임스탬프에 고정된 정확한 기구 참조가 포함되어 수동 문서 작성 시간을 단 몇 분으로 단축해 줍니다.


3. 수술 단계 세분화 (Surgical Phase Segmentation)

Twelve Labs Analyze API는 구조화된 JSON 출력을 활용하여 수술을 "준비", "박리", "봉합"과 같은 고유한 단계로 자동 세분화합니다. 이러한 챕터들은 대화형 타임라인에 표시되어 특정 수술 단계로 빠르게 탐색할 수 있도록 돕습니다. 훈련 프로그램의 경우, 이는 90분짜리 녹화 영상을 다루기 쉬운 교육 과정으로 전환해 줍니다.


4. 시맨틱 검색

Twelve Labs Marengo의 uba40ud2f0ubaa0ub2ec uc784ubca0ub529을 기반으로 수술 영상 라이브러리 전반에서 자연어 검색을 수행합니다. 일반적인 키워드 매칭과 달리, 이 기능은 수술의 맥락을 의미론적으로 이해합니다.

검색 예시: "외과의가 전기 소작기를 사용한 시점을 보여줘" 결과: 신뢰도 0.92로 2:34~2:58 및 5:12~5:45 구간의 클립 반환

50개 이상의 교육 영상에서 "단극성 응고법(monopolar coagulation)의 사용"을 검색하는 수술 교육자에게, Marengo는 타임스탬프와 함께 모든 관련 인스턴스를 반환하므로 전체 녹화본을 일일이 보지 않고도 기술 요약본을 빠르게 컴파일할 수 있습니다.


5. Dr. Sage: 대화형 임상 Q&A

자동 분석이 완료되면 Dr. Sage가 후속 질문에 대답할 수 있는 대화형 인터페이스를 제공합니다. YOLO 감지 데이터와 Twelve Labs 비디오 이해 기능 모두에 액세스할 수 있어, "박리 중에 어떤 도구가 사용되었나요?" 또는 "3:45에 사용된 기술을 설명해 주세요"와 같은 복잡한 질의가 가능합니다. 이는 자동화된 보고서와 수술 검토 및 교육 세션 중에 발생하는 즉각적인 질문 사이의 공백을 메워줍니다.


배포 아키텍처

이 애플리케이션은 연산 집약적인 추론 영역과 사용자 대면 작업을 명확히 분리한 분산 시스템으로 설계되었습니다.


인프라 개요

  1. 프론트엔드 (Vercel): UI 및 API 라우트를 제공하는 Next.js 애플리케이션

  2. 백엔드 (Railway): YOLO 추론을 실행하는 FastAPI 서버

  3. 스토리지 (Vercel Blob): 모든 분석 결과를 보관하는 중앙 집중식 JSON 스토리지

  4. AI 프로세싱 (Twelve Labs): 클라우드 기반 비디오 이해 기술


데이터 흐름

사용자가 수술 영상을 업로드하면 두 개의 병렬 파이프라인이 즉시 활성화됩니다.


컴퓨터 비전 파이프라인 (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는 단계 인식, 기법 분석, 맥락적 추론과 같은 '왜, 어떻게'에 대한 통찰을 제공합니다. 다음은 저희가 두 가지 주요 API 기능인 Analyze(SOAP 및 챕터 생성용) 및 Search(시맨틱 검색용)를 활용하는 방식입니다.


1. Analyze API: SOAP 기록지 생성

Analyze API는 Twelve Labs의 뛰어난 멀티모달 생성 엔드포인트입니다. 저희는 이를 활용하여 YOLO 감지 데이터에 기반한 1인칭 수술 기록을 작성합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/[videoId]/soap/route.js

// 1. Fetch YOLO detection data from Vercel Blob
const toolData = await fetchToolDetection(videoId);

// 2. Format detections as readable text for the prompt
const toolContext = formatToolDetectionForPrompt(toolData);
// Example output: "DETECTED TOOLS: Grasper at 0:45, 1:20, 2:30..."

// 3. Enrich the SOAP generation prompt with hard detection data
const enrichedPrompt = `${soapPrompt}

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

// 4. Call Twelve Labs Analyze API
const response = await getTwelveLabsClient().analyze({
    videoId: videoId,
    prompt: enrichedPrompt,
    temperature: 0.2 // Low temperature for factual, not creative, output
});

// 5. Parse JSON response and save to Vercel Blob
const parsedData = JSON.parse(response.data);
await saveToBlob(videoId, { operative_note: parsedData.operative_note });

작동 원리: YOLO가 탐지한 정보들을 프롬프트에 제공함으로써 모델의 비디오 추론을 검증된 시각적 증거에 결합시킬 수 있습니다. YOLO가 클리퍼를 한 번도 감지하지 못했다면 실질적으로 AI가 "5분 30초에 클리퍼를 사용했다"는 식의 허위 사실을 주장할 수 없게 되는 셈입니다. 이것이 바로 컴퓨터 비전의 하드웨어적 출력 데이터를 멀티모달 생성 모델의 사실 제약 조건으로 사용하는 핵심 아키텍처 패턴입니다.


2. Analyze API: 타임라인 생성 (구조화된 출력)

또한 챕터 생성 시 Analyze API의 responseFormat 파라미터를 사용해 구조화된 JSON 형식을 명시적으로 요청합니다. 이를 통해 신뢰도 높은 스키마 검증 데이터를 직접 얻음으로써, 불안정하고 번거로운 문자열 파싱 과정을 배제할 수 있습니다.

uc18cuc2a4 ucf54ub4dc: 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"]
                    }
                }
            }
        }
    }
});

// Parse the structured JSON response
const parsedData = JSON.parse(response.data);
// parsedData.chapters contains the chapter array

출력 예시:

{
  "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의 멀티모달 임베딩 성능을 토대로 사용자의 일반 검색 질의와 관련된 ube44ub5ecuc624 ub0b4uc758 ud2b9uc815 uc21cuac04uc744 ud3ecucc29합니다.

uc18cuc2a4 ucf54ub4dc: 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'], // Search both modalities
    queryText: query, // e.g., "clipping of cystic artery"
    groupBy: "clip",
    threshold: "low" // Balance precision vs. recall
});

// Iterate through results
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는 복잡한 수술 상황의 맥락적 정의를 정확히 이해합니다. "담낭 동맥의 클리핑(clipping of cystic artery)"과 같은 고차원적인 질의 검색 시, 해당 오디오 언급 유무와 관계없이 정교한 시각적/동작적 패턴 특징을 토대로 해당 세부 클립을 추출할 수 있습니다. 덕분에 별도 레이블링 리소스 없이 강력한 영상 아카이브 검색을 실현할 수 있습니다.


단계별 구현 절차


사전 준비 사항

  • Node.js 18 이상Python 3.10 이상

  • Twelve Labs API 키: Playground에서 발급받으실 수 있습니다.

  • 컴퓨터 비전 모델: 저희는 7가지 수술 도구 분류로 태깅되어 있는 80건의 담낭 절제 수술 데이터셋인 Cholec80 기반으로 파인 튜닝된 YOLOv8 모델을 사용합니다.


1단계: 백엔드 구축 (Railway 배포)

YOLO 분석을 처리할 백엔드는 업로드된 비디오를 받아 탐지된 결과들을 구조적인 JSON으로 반환해 주는 간단한 FastAPI 구조로 빌드합니다.

uc18cuc2a4 ucf54ub4dc: backend/main.py

# backend/main.py
@app.post("/detect/upload")
async def detect_tools_upload(video_id: str, video: UploadFile):
    # Process video with YOLO
    results_data = run_inference(temp_video_path, video_id)

    # Upload results to Vercel Blob via Frontend API
    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 프론트엔드에서 구현하는 다음 주요 라우트 세 개는 전체적인 인공지능 워크플로우를 주율하는 매개 역할을 합니다.

  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로 장면에 따른 단계 분절 데이터 취득

위 엔드포인트들은 모두 일관된 프로세스를 거치도록 설계되었습니다: Blob 파일 스토리지 상의 기존 탐지 정보 조회, 보완된 프롬프트를 담아 Twelve Labs 비디오 탐사 요청, 캐싱을 위해 결과 데이터를 마저 Blob에 영구 저장하는 과정입니다.


3단계: Dr. Sage 대화 기능 연결

대화 인터페이스에서는 Twelve Labs 서비스를 타기 직전 사용자의 입력 텍스트 질의에 비디오 내 가용한 기구 객체 탐지 증명을 보정하여 인풋으로 전달해 주는 방식으로 제어합니다.

uc18cuc2a4 ucf54ub4dc: frontend/src/app/api/analysis/route.js

import { TwelveLabs } from 'twelvelabs-js';

// Helper: Convert raw JSON detections to a chat-friendly summary
function formatToolDetectionForChat(toolData) {
    // ... logic to aggregate frames into time ranges ...
    // Output example:
    // "- 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. Fetch the JSON data produced by our YOLO backend
    const toolData = await fetchToolDetection(videoId);

    // 2. Format it into natural language context
    // This turns thousands of data points into a readable summary for the AI
    const toolContext = formatToolDetectionForChat(toolData);

    // 3. Enrich the user's query
    // We tag this as system-injected data so the model treats it as ground truth
    const enrichedQuery = toolContext
        ? `${userQuery}\n\n[SYSTEM INJECTED DATA - DO NOT IGNORE]\n${toolContext}`
        : userQuery;

    // 4. Call 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 // Low temperature for factual accuracy
    });

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


4단계: 시계열 타임라인 구성 시각화

로 데이터 형식의 원본 탐지 결과물은 AI에겐 유용하지만 의료진이나 실수요 유저에겐 정교한 시각 프레임이 필수적입니다. 저희는 추출된 타임스탬프 정보들을 React 타임라인 컴포넌트에 넘겨 각 수술용 대표 도구들에 해당하는 스윔레인(Timeline Rows)을 그림으로 그려 줍니다.

  • 빨간색 (Red): 양극성 소각 기구 (Bipolar/Cautery)

  • 초록색 (Green): 후크 분리기구 (Hook/Dissection)

  • 노란색 (Yellow): 집게 장치 (Grasper/Manipulation)

의학 교육 담당자가 피교육자가 시연한 수술 과정을 검토할 시, 기구 흐름 패턴을 통해 혹시 미처 수술 단계를 다 안 뗀 상태서 불필요하게 고열 지혈을 길게 하지 않는지 등의 장비 기용 정황을 일망타진으로 찾아내어 비디오 세그먼트를 즉각 검증할 수 있습니다. 프론트엔드는 수집된 JSON 내 detections 목록 배열을 파라미팅하여 브라우저 타임라인 내 알맞은 CSS 포지션 컴포넌트 마킹으로 자동 환치해 드립니다.


마치며

정밀한 컴퓨터 비전 분석 기법과 맥락 인지에 특화된 고도화 멀티모달 추론 프로세스를 상호 결합함으로써, 기존의 죽어있던 수술 레코딩 동영상들을 풍부히 질의 검색할 수 있는 유기적 자산 데이터로 탈바꿈시켰습니다.

  • YOLO가 정확한 타임라인 정보와 완결성 높은 장비 레이블링이라는 '어느 위치에 무엇을(who/when)'을 깔끔히 찾아내 주고,

  • Twelve Labs는 그것들을 집약해 실제 프로세스가 지닌 '어떤 성격의 단계이며 무슨 연유(what/why)'인지를 한층 넓은 임상 수술 기록과 챕터 구분을 통해 논리 정연하게 해석해 줍니다.

정밀 컴퓨터 비전 분석을 통해 검증받아 엄격히 제어된 객체 탐출 정보를 멀티모달 지능 추정의 단서 규약으로 투입시키는 이 고유의 아키텍처 결합 원리는 비단 외과 영상 분석뿐 아니라 다양한 영역에서 고스란히 확장 적용될 수 있습니다. 정밀 계측과 세련된 흐름 상의 추론이 병행되어야 하는 첨단 스마트 공장 품질 생산 관리(Manufacturing QA)나, 스포츠 움직임 분석, 혹은 특수 시큐리티 감시 모니터링 분야 등에서도 이와 같은 혁신적인 하이브리드 아키텍처 설계를 적극 고려해 보시는 것을 강력히 추천합니다.

추가로 도전해 볼 수 있는 아이디어:

  • 부서 및 소속 병원에 축적된 대용량 수술 영상 라이브러리를 가로지르는 대형 교차 임상 분석 인프라 구축

  • 스트리밍 형식의 점진적 YOLO 디텍션을 탑재한 실시간 원격 협진/집도 보조 시각 장비 구축

  • 주석 처리된 사례 라이브러리로부터 학습용 가이드 교재 및 커리큘럼 자동화 설계 프라임 빌딩

지금 바로 시작해 보세요: