튜토리얼

다중 소스 법적 증거 보고: AWS Bedrock 및 NeMo Retriever와 TwelveLabs를 활용한 조사 플랫폼 구축

흐리시케시 야다브(Hrishikesh Yadav)

개발자는 AWS Bedrock을 통해 Twelve Labs의 Marengo 및 Pegasus를 고성능 비디오 지능형 분석 제품으로 활용하고, NVIDIA NeMo Retriever를 문서 검색용으로 결합하여 다중 소스 방식의 법적 증거 조사 플랫폼을 구축할 수 있습니다. 이를 통해 서로 다른 12개의 비디오 소스에 대한 자연어 쿼리, 다중 카메라 피드 전반의 엔티티 추적, 타임스탬프가 포함된 결과 기반의 자동화된 준법 감시(컴플라이언스) 분석이 가능해집니다.

개발자는 AWS Bedrock을 통해 Twelve Labs의 Marengo 및 Pegasus를 고성능 비디오 지능형 분석 제품으로 활용하고, NVIDIA NeMo Retriever를 문서 검색용으로 결합하여 다중 소스 방식의 법적 증거 조사 플랫폼을 구축할 수 있습니다. 이를 통해 서로 다른 12개의 비디오 소스에 대한 자연어 쿼리, 다중 카메라 피드 전반의 엔티티 추적, 타임스탬프가 포함된 결과 기반의 자동화된 준법 감시(컴플라이언스) 분석이 가능해집니다.

목차

No headings found on page

뉴스레터 구독하기

뉴스레터 구독하기

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

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

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

2026. 4. 25.

16분

링크 복사하기

소개

영상 증거 자료를 처리하는 법률 팀은 날로 심각해지는 문제에 직면해 있습니다. 단 하나의 사건만 하더라도 대시캠, 바디캠, CCTV 시스템, 도어벨 카메라, 보험 제출 자료 등에서 확보한 40시간 이상의 영상이 포함될 수 있으며, 형식이 다르고 해상도도 제각각이며 타임스탬프도 일치하지 않습니다. 조사관들은 이 수많은 콘텐츠를 수동으로 검토하기 위해 보조 법률 전문 인력 비용으로 시간당 200~500달러를 사용합니다. 7번 카메라 피드의 23시간째 분량에 묻혀 있는 결정적인 10초짜리 클립 하나를 놓친다면 사건의 결과가 완전히 바뀔 수 있습니다.

기존의 방식(수동 검토, 기본적인 메타데이터 태깅, 프레임 단위 분석)으로는 감당이 되지 않습니다. 법률 팀은 서로 다른 소스 전반에서 동시에 검색하고 파편화된 영상에서 타임라인을 재구성하며, 모든 비디오를 일일이 시청하지 않고도 핵심적인 순간을 식별할 수 있어야 합니다.

본 자습서에서는 비디오 인텔리전스를 위한 AWS Bedrock 기반 TwelveLabs 기법과 문서 검색용 NVIDIA NeMo Retriever 모델을 사용하여 법적 증거 조사 플랫폼을 구축하는 방법을 설명합니다. 결과적으로 조사관은 자연어 쿼리(예: "빨간색 세단 차를 찾아줘" 또는 "인물이 건물로 들어온 시점을 보여줘")를 가지고 12개 비디오 소스를 동시에 검색하고, 정확한 타임스탬프가 매겨진 검색 결과 목록을 받아보며, 며칠씩 걸리던 구체적인 규정 주소 준수 분석서 작성을 단 수분 만에 완료할 수 있습니다.

개발 결과물: 복합 형식 폐쇄회로 화면(CCTV)을 수집하고, 다중 소스 간 시맨틱 검색을 제공하며, 보안 규정 분석을 자동 수행할 뿐만 아니라 서로 다른 비디오 소스로부터 시간순 타임라인을 결합해 내는 다중 소스 증거 분석 조사 시스템을 완성하게 됩니다.

중요 효율성 개선: 40시간이 소요되던 증거 자료 수동 검토 시간이 단 4시간의 표적 조사로 대폭 축소됩니다.

여기에서 관련 데모 버전을 먼저 체험해 보실 수 있습니다: 법가 증거 분석 조사 서비스 데모 애플리케이션

아래에서 소스 코드를 확인해 볼 수 있습니다: GitHub 소스 저장소


데모 애플리케이션

이번 데모는 여러 비디오 소스의 통합 검색, 정밀한 타임스탬프 기반 탐지, 정규 양식에 맞춘 보안 위험 규정 분석, 상세 조사를 돕는 양방향 질의응답 기능 활용 등 실무 분석 작업을 본 플랫폼이 어떻게 구체적으로 수행하는지 제시합니다.

구현된 주요 핵심 기능:

  • 12가지 이상 혼합된 형식 속 멀티 소스 통합 검색 지원

  • 개체 추적 (전체 자료에서 특정 피의자나 도주 차량을 추적 검색)

  • 위험 범주 분류를 포함한 법규 분석 보고서 자동 생성

  • 시간 흐름에 따른 사건 전개 단계별 정밀 타임라인 재구성

  • 타임스탬프 연계를 갖춘 지능형 비디오 대화식 Q&A 기능


시스템 아키텍처: 단일 인덱스 멀티 소스 설계가 중요한 이유

본 개발 시스템의 설계 구조 결정 시 다음 사항의 해결이 핵심이었습니다. TwelveLabs 검색 엔진은 인덱싱 레벨 단위로 작동합니다. 즉 특정 비디오가 아닌 하나의 인덱스(색인 공간)를 통째로 검색한다는 의미이며, 이 부분이 전체 설계를 좌우합니다.

그다지 좋지 못한 접근 방식은 개별 비디오 파일마다 인덱스를 하나씩 생성하여 관리하는 것입니다. 이 경우 당장 한 인물을 12개 채널 카메라에서 찾으려 한다면 12개의 검색을 실행한 후 결과 값을 애플리케이션 내에서 수작업으로 머지하고 조율해야 하므로 속도가 무척 느려지고, 유지 관리가 취약해집니다.

훨씬 정교한 모범적 방식은 '단일 인덱스 기반 멀티 소스 통합 전략'입니다. 전체 분석용 증거 비디오를 단 하나의 TwelveLabs 인덱스에 넣되, 메타데이터 태그를 풍부히 엮어 고유의 출처를 확보하는 방법입니다. 검색창에 질의 한 번이면 복수 채널 전체가 동시에 기동됩니다. 영상별 연관성에 맞게 정렬된 결과 값이 나오며 메타데이터 필터를 응용해 세부 검색("바디캠 영상만 검색" 혹은 "메인 스트리트 위치 카메라 검색")도 곧바로 적용할 수 있습니다.

핵심 아키텍처 모듈:

  1. 비디오 인제스천 파이프라인: 복수 촬영본 S3에 저장 → Bedrock을 거쳐 twelvelabs.marengo-embed-3-0-v1:0 모델로 색인 생성 → 식별 메타데이터와 결합해 멀티모달 임베딩 형태로 저장

  2. 문서 인제스천 파이프라인: 사건 조서 PDF 텍스트 추출 → 스마트 분절 수행 → nvidia/llama-nemotron-embed-vl-1b-v2 기반 임베딩 → 문서 인덱스로 적재

  3. 하이브리드 정보 추출 레이어: 비디오 임베딩(Marengo)과 문서 조각(NeMo) 병렬 입체 검색 → 검색 결과의 조화로운 결합 → 사용자 화면에 맞춘 단일 응답 표출

  4. 분석 및 평가 엔진: twelvelabs.pegasus-1-2-v1:0 기반 보고서 작성. 영상 제목, 위험 등급, 탐지 차량/개체 종류, 인물 포착 구간, 음성 텍스트 자막 포함

  5. 인터랙티브 대화 프레임: 타임스탬프 클릭 이동이 지원되는 정밀 비디오 Q&A 레이아웃

단일 검색 시 반응 속도는 12개의 중밀도 비디오 연산 환경에서도 3초 미만으로 단축됩니다. 인덱스 검색 최적화로 처리 시간을 극적으로 줄였습니다.


사전 준비: 개발 시작하기 전에


1 - TwelveLabs 모델 이용을 위한 AWS Bedrock 활성화

다음 구성을 충족하는 AWS 사용자 권한(Credentials)을 발급받으십시오:

  • Amazon Bedrock 사용 권한과 특정 모델 활성화 상태

  • 비디오 전용 스토리지 및 Bedrock 비동기 처리 파일 아웃풋 설정을 위한 S3 권한

  • Bedrock으로 호출 가능한 아래 TwelveLabs 인공지능 모델 엑세스 권한:

    • twelvelabs.marengo-embed-3-0-v1:0 (멀티모달 비디오 분석용 임베딩 모델)

    • twelvelabs.pegasus-1-2-v1:0 (고등 영상 분석 및 서사 추론 기능)

이 전용 모델들이 귀중한 이유: Marengo는 영상 이미지 구조를 정확한 벡터 표현 공간으로 전환하는 훌륭한 엔코더 역할을 하고, Pegasus는 이를 구조화하여 지적 해석을 덧붙이는 인터프리터 임무를 맡습니다. 비디오 구조화와 시각 데이터 번역 및 인물 심층 인식이 동시에 균형을 이루어야 법률 조사 업무에 바로 투입될 수 있습니다.


2 - S3 버킷 설정 및 구조화

다음 용도로 사용할 동일 S3 버킷 환경을 준비해주십시오:

  • 사건 영상 분석 아카이브 및 원본 스토리지

  • Bedrock 비동기식 임베딩 생성을 위한 전용 아웃풋 폴더 (일괄 업로드 처리 시 강제 필수 요건)

  • 자동 추출된 썸네일 파일 및 분석 중간 산출물 보관

  • 참조가 필요한 텍스트 및 조서 문서 스토리지

S3 스토리지 연관 중요성: Bedrock 비동기 API 모델은 기본 입출력을 직접 S3 버킷 디렉터리를 통해 수행합니다. 또한 이는 하드웨어 부하 걱정 없는 대용량 멀티 인제스천 환경의 단단한 주춧돌이 됩니다.


3 - NVIDIA 개발 포털 인증키 발급

아래 모델 개발 접근을 위해 NVIDIA API Key를 발급받으십시오:

  • nvidia/llama-nemotron-embed-vl-1b-v2 (다양한 텍스트 파트 조각화 임베딩 전용 개발)

왜 NeMo Retriever인가: 완벽한 법적 증거는 영상만으로 입증되지 않습니다. 보조 경찰 보고서, 현장 자술서, 진술 기록 등이 영상 데이터와 입체적으로 결합해야 합니다. TwelveLabs를 거친 동영상 비전과 NeMo의 대형 문서 검색을 종합 매칭하여 진정한 픽셀-문헌 다차원 하이브리드 검색망을 실현합니다.


4 - 저장소 클론 및 설정 복제

git clone https://github.com/Hrishikesh332/tl-compliance-intelligence
cd

우선 백엔드 런타임 환경 구성 파일인 .env.example 문서를 그대로 복제해 세팅하십시오:

  1. AWS 접근 인증 정보 입력 (Access Key ID, Secret Access Key 및 활성화 리전 정보)

  2. 대상 S3 버킷 설정 이름 및 Bedrock 출력 위치 폴더 경로 지정

  3. 발급된 NVIDIA API Key 등록

  4. 인덱스 설정 및 정합 정확성 유사도 컷오프 값(Threshold) 등 어플리케이션 옵션 값 입력


핵심 코드 구현 심층 탐구


파트 1: 비디오 적재 및 다차원 임베딩 생성

이 인제스천 파이프라인은 업로드된 감시 카메라 화면 데이터를 검색 가능한 최적의 임베딩 데이터로 변환합니다. 수 시간 분량 영상의 긴 분석 시간 동안 사용자 인터페이스가 멈추지 않도록 비동기 배치 형태로 작동하게 설계합니다.


1.1 - Marengo 비동기 임베딩 생성 명령 호출

비디오 파일 업로드가 완료되면 본 백엔드가 파일 자체를 즉각 S3에 넣고 Bedrock 비동기 프로세스 처리 요청을 바로 전송합니다.

참조 소스 파일: backend/app/services/bedrock_marengo.py (Line 111)

def start_video_embedding(
    s3_uri: str,
    output_s3_uri: str,
    bucket_owner: str | None = None,
) -> dict:
    client = get_bedrock_client()
    owner = bucket_owner
    body = {
        "inputType": "video",
        "video": {
            "mediaSource": media_source_s3(s3_uri, owner),
            "embeddingOption": ["visual", "audio"],
            "embeddingScope": ["clip", "asset"],
        },
    }
    resp = client.start_async_invoke(
        modelId=MARENGO_MODEL_ID,
        modelInput=body,
        outputDataConfig={"s3OutputDataConfig": {"s3Uri": output_s3_uri}},
    )
    return {
        "invocation_arn": resp.get("invocationArn", ""),
        "status": "pending",
    }

파라미터 embeddingScope: ["clip", "asset"] 설정의 핵심 의미: 이 구조는 다음과 같이 두 갈래 차원에서 정밀 임베딩 벡터를 함께 만듭니다.

  • 클립형 임베딩 (단위: 6초 미세 세그먼트): 고도로 현미경 타임라인을 파고들어 대상자가 포착된 8초짜리 짧은 순간을 기가 막히게 추적해 줍니다.

  • 에셋형 임베딩 (전체 소스 요약본): 멀리서 숲을 보듯, 비디오의 구조적 특징과 전개 흐름 자체를 대변하는 유사도 검출 기능을 지원합니다.

두 구조 모두 필요합니다. 클립 단위 검색은 정교한 시간대 추적을, 에셋 임베딩은 '유사 행동 유형을 보유한 연관 감시 파일 찾기' 업무를 가속화합니다.

이 비동기 연산 기법의 타당성: 2시간 상당의 영상에서 무려 1,200개의 세세한 클립 벡터(2시간을 6초 단위 분할)가 추출됩니다. 대단히 무거운 작업이기에 백그라운드 환경에서 유연히 전개되어야 수십 개 파일이 동시 투입되어도 앱 오류 없이 부드럽게 임베딩 작업을 마무리할 수 있습니다.


1.2 - 백그라운드 로직 큐와 실행 상태 중단점 폴링

완료 확인 스레드는 메모리 대기 흐름(Queue)을 늘 매끄럽게 관리하며 Bedrock 처리 서버에 연산이 끝났는지 상시 무중단 확인을 시도합니다.

참조 소스 파일: backend/app/utils/video_helpers.py (Line 104)

while True:
        job = bedrock_queue.get()
        task_id = job["task_id"]
        s3_uri = job["s3_uri"]
        output_uri = job["output_uri"]
        filename = job["filename"]
        meta = job["meta"]
        log.info("[QUEUE] Processing Bedrock start for %s (%s)", filename, task_id)
        success = False
        for attempt in range(1, max_retries + 1):
            try:
                result = start_video_embedding(s3_uri, output_uri)
                arn = result.get("invocation_arn", "")
                log.info("[QUEUE] Bedrock started for task_id=%s", task_id)
                video_tasks[task_id]["status"] = "indexing"
                video_tasks[task_id]["invocation_arn"] = arn
                video_tasks[task_id]["output_s3_uri"] = output_uri
                for rec in vs_index():
                    if rec.get("id") == task_id:
                        rec.setdefault("metadata", {})["status"] = "indexing"
                        break
                vs_save()
                with bedrock_poller_lock:
                    bedrock_poller_jobs.append({
                        "task_id": task_id,
                        "invocation_arn": arn,
                        "output_s3_uri": output_uri,
                        "started_at": time.monotonic(),
                    })
                success = True
                break

해당 구현 소스의 기능: 대기열 연산 모듈이 진행 상태를 "색인 중(indexing)"으로 치환하고 분석 추적에 꼭 필요한 AWS Bedrock 고유 고리인 ARN 값을 캐싱 보관 처리합니다. 이후 모니터링 폴링 루프 스레드가 30초의 여유 주기마다 점검하며 S3 결과 객체가 무사 복원되면 상태를 최종 "ready"로 변경합니다.

재시도(Retry) 설계가 특히 중요한 이유: 클라우드 연산 처리에는 일정한 사용량 제한과 호출 임계치가 있습니다. 지수 백오프 방식의 우아한 안전장치는 업로드 피크 상황이 집중되더라도 작업들이 버려지지 않고 뒤이어 순차 수행되도록 견고히 잡아줍니다.

데이터 설계 패턴 장점: 촬영 인물 얼굴 정보와 동영상 자원 임베딩은 모두 복합 단일 인덱스 한 군데 저장하되 다형 속성 태깅 분류 기법을 넣습니다. 다만 대규모 조서 텍스트 데이터는 별도의 조각화 전담 인덱스로 이화합니다. 이로써 영상과 용무 인물 검색 연산 속도는 한 번에 끌어올리고 대용량 문서 처리는 간소하게 우회할 수 있습니다.


1.3 - 지능형 문단 의미 분석을 적용한 PDF 텍스트 주입

보고서 문서는 비디오 파일과는 다릅니다. 이 시스템은 법률 조서 문서들을 의미론적인 세부 문단(텍스트 단락 단위)으로 입체 구조 분할한 뒤, NeMo 로직을 적용해 검색 가능한 레코드로 차곡차곡 임베딩 처리합니다.

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 688)

def ingest_document(file_path: str, doc_id: str, filename: str) -> dict:
    extra: dict = {}
    try:
        pdf_info = store_pdf_document(file_path, doc_id)
        extra.update(pdf_info)
    except Exception as exc:
        log.warning("Could not persist PDF for %s (%s)", doc_id, type(exc).__name__)
    ext = os.path.splitext(file_path)[1].lower()
    chunks: list[str] = []
    sections: list[str] = []
    if ext == ".pdf":
        try:
            pairs = split_into_semantic_chunks(file_path)
            sections = [s for s, _ in pairs]
            chunks = [t for _, t in pairs]
            log.info("Smart PDF chunking produced %d chunks for doc %s", len(chunks), doc_id)
        except Exception as exc:
            log.warning("Smart PDF extraction failed for doc %s, falling back to NeMo (%s)", doc_id, type(exc).__name__)
    if not chunks:
        chunks = extract_document(file_path)
    if not chunks:
        log.warning("No content extracted for doc %s", doc_id)
        return {"doc_id": doc_id, "chunks": 0, "status": "empty"}
    embeddings = embed_texts(chunks)
    add_chunks(
        doc_id, filename, chunks, embeddings,
        sections=sections or None,
        extra_metadata=extra or None,
    )
    return {"doc_id": doc_id, "chunks": len(chunks), "status": "ready"}

스마트 분할 전략: 먼저 단락 및 타이틀 마킹 기준으로 세부 내용을 구분하는 '섹션 분해 분절 기법'을 씁니다. 이게 불가능한 평문 문서 등은 문장 및 단락 카운트 방식으로 완충 분할합니다. 이는 문서 자체의 계통 정보("사건 타임라인 일지", "증언 발췌록" 등)가 추적 시 고도로 가치 있는 맥락 단서가 되는 사법 증거 분류 환경에서 필수입니다.

AI 임베딩 모델 선택: nvidia/llama-nemotron-embed-vl-1b-v2 기법은 각 개별 문단에 가장 깊은 차원의 특징 벡터 값을 매겨내어 파일 전체 매치 대신 맥락 단위의 정교한 매칭 적합성을 확실하게 확보합니다.

메타데이터의 완전한 보전: 추출 완료된 각 주입 조각은 원본 PDF 소스 파일 경로 및 소제목 정보가 함께 꼬리표로 묶입니다. 따라서 조사관이 질의창에 검색하면 실제 조작문 속 원본 단락 위치로 한 클릭 이동이 가능해집니다.

NVIDIA API 전송 임베딩 구현 구문:

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 515)

def embed_via_requests(texts: list[str], input_type: str) -> list[list[float]]:
    """Call NVIDIA embeddings API directly with requests"""
    import requests
    t0 = time.perf_counter()

    resp = requests.post(
        "https://integrate.api.nvidia.com/v1/embeddings",
        headers={
            "Authorization": f"Bearer {NVIDIA_API_KEY}",
            "Content-Type": "application/json",
        },
        json={
            "input": texts,
            "model": EMBED_MODEL,
            "encoding_format": "float",
            "input_type": input_type,
        },
        timeout=60,
    )
    resp.raise_for_status()
    data = resp.json()
    vectors = [d["embedding"] for d in data["data"]]
    first_dim = len(vectors[0]) if vectors else 0
    return vectors

핵심적인 input_type 제어 요소: NeMo 기술은 백엔드에 영구 색인하는 데이터인 "passage"와 일반 조사관이 타이핑하는 "query" 요소를 정확히 갈라 설계합니다. 데이터의 본 사용 목적과 쓰임 규격에 맞게 임베딩 공간 가중치를 보정해 주므로 훨씬 정합도 높은 정밀 비교 검색이 구현될 수 있습니다.


1.4 - 감시 대상 용무 인물 사진 기반 검색 레코드 확보

현장 수사용 기능에는 특정 용무 인물(CCTV 포착 대상)을 여러 감시카메라 화면에서 통시 검색하는 기능이 중추를 이룹니다. 대상자 단 한 장면의 얼굴 스냅샷 사진으로부터 검색용 임베딩 코드를 가공해 냅니다.

얼굴 이미지 임베딩 처리 루틴:

def embed_image(media_source: dict) -> list[float]:
    return invoke_embedding_model({
        "inputType": "image",
        "image": {"mediaSource": media_source},
    })

Marengo의 전용 이미지 임베딩 파이프라인은 얼굴 형상 및 실루엣 세부 특징을 비주얼 지표 형태로 번역해 줍니다. 텍스트 정보가 전무하더라도 이 정합적 수치들 덕에 어둡거나 구도가 틀어진 실제 고해상도 CCTV 무비 프레임 속 한가운데서도 동일 대상을 놀라울 만큼 민첩하게 매칭시킵니다.


얼굴 조각 이미지 수집 엔드포인트:

@entities_bp.route("/entities/from-image", methods=["POST"])
def api_entities_from_image():
    if "image" not in request.files:
        return jsonify({"error": "No 'image' file provided"}), 400

    file = request.files["image"]
    if file.filename == "":
        return jsonify({"error": "Empty filename"}), 400

    data = request.form or {}
    name = data.get("name") or (request.get_json(silent=True) or {}).get("name") or ""
    if not name.strip():
        return jsonify({"error": "Missing 'name'"}), 400

    image_bytes = file.read()
    faces = detect_and_crop_faces(image_bytes, min_confidence=ENTITY_FACE_MIN_CONFIDENCE)
    if not faces:
        return jsonify(
            {"error": "No face detected in image. Use a clear, front-facing photo with good lighting."}
        ), 404

    best = faces[0]
    face_b64 = best["image_base64"]
    embed_b64 = best.get("embedding_crop_base64") or face_b64

    import base64

    face_bytes = base64.b64decode(embed_b64)
    media = media_source_base64(face_bytes)

    try:
        embedding = embed_image(media)
    except Exception:
        return jsonify({"error": "Internal server error"}), 500

    entity_id = name.strip().lower().replace(" ", "-")
    rec = index_add(
        id=entity_id,
        embedding=embedding,
        metadata={"name": name.strip(), "face_snap_base64": face_b64},
        type="entity",
    )

    return jsonify(
        {
            "indexId": FIXED_INDEX_ID,
            "entity": {"id": rec["id"], "name": name.strip()},
            "face_snap_base64": face_b64,
        }
    )

정밀 전처리 단계: OpenCV 라이브러리의 ResNet10 SSD 얼굴 모듈을 얹어 배경 노이즈를 쳐내고 실제 인물 페이스 구역만 지능형 크롭하여 Marengo에 밀어 넣습니다. 흐릿한 대규모 원경 풍경을 정제해 주므로 정확도 매칭 성공률이 극한으로 올라갑니다. 신뢰성이 높은 상위 고품격 얼굴 데이터만 가공되도록 임계치 필터 필터링도 활성화했습니다.

비디오 인덱스 저장 패턴 장점: 인물 구조 임베딩과 연관 영상을 동일한 데이터베이스 저장소 공간에 병치하기 때문에, 다회 회전 연산 필요 없이 대단히 빠른 원패스 비교 매칭이 실행됩니다. 수사관이 검색어 하나를 대는 그 즉시 유사 비교 판단이 끝나며 일치 장면을 일목요연하게 찾아냅니다.


파트 2: 멀티 소스 교차 수색 및 정보 추출

수집 완료 시 조서 파일과 촬영 영상물 전체를 유기적으로 한 검색란에서 넘나들 수 있습니다. 이것이 단일 인덱스 멀티 소스 기법이 안겨주는 독보적 사용자 경험 유용성입니다: 단 하나의 핵심 질의, 통합된 고속 탐지 결과.


2.1 - 복합 임베딩 기반 비디오 수치 검색 구현

하나의 탐색 상자 안에서 세 유형의 직관적 검색 경험 방식을 함께 제공합니다:

  1. 텍스트 기반 수색: 자연스러운 언어로 표현할 수 있는 인물 행동 묘사 ("붉은 패딩을 입은 사람")

  2. 이미지 업로드 검색: 확보한 용무 인물 사진이나 일치 단서 파편 등록 및 흔적 추적

  3. 메타 엔티티 조회: 이미 백엔드 환경에 사전 프로필 저장 완료된 키워드나 식별 인물 매칭

참조 소스 파일: backend/app/routes/search.py (Line 30)

def search_video_index(
    data: dict,
    *,
    request_query: str = "",
    request_top_k: int | None = None,
    image_bytes: bytes | None = None,
) -> tuple[list[dict], str, str | None]:

    query_emb, display_query, is_entity_search, err = get_search_embedding_from_request(
        data,
        request_query=request_query,
        image_bytes=image_bytes,
    )

질의 형태 정규화(Normalization): get_search_embedding_from_request() 메소드는 입력 질의 수단이 무엇이건 상관없이, 백엔드 내부 연산용 통합 비교 벡터 값으로 변환 처리해 줍니다. 텍스트 인제스천은 Marengo 텍스트 가속기를 타고 이미지 인풋은 비전 분석 수치로 변환되며, 엔티티 ID 역시 사상된 메모리 벡터 값을 곧바로 인용합니다. 아래 하류 검색 레이어는 그저 연산하기 편한 표준 단일 벡터 포맷만 바라보므로 유연하고 탄탄한 아키텍처가 유지됩니다.

타겟 인물 고속 매칭 조율 로직:

for r in results:
    meta = r.get("metadata", {})
    clips = []
    output_uri = meta.get("output_s3_uri") or f"{S3_EMBEDDINGS_OUTPUT}/{r['id']}"

    if is_entity_search:
        clips = clips_above_threshold(
            query_emb,
            output_uri,
            min_score=ENTITY_CLIP_MIN_SCORE,
            visual_only=True,
            max_clips=clips_per_video,
        )

    if not clips:
        clips = clip_search(
            query_emb,
            output_uri,
            top_n=clips_per_video,
            min_score=clip_min_score,
            visual_only=is_entity_search,
        )

결과 유사도 가중치 변별점: 얼굴 인식 매칭 작업은 visual_only=True 매개변수와 다소 높은 문턱 수준을 유지합니다. 흐리게 스쳐 지나간 다른 행인에 대한 오인 탐지를 엄밀히 차단하기 위함입니다. 문자 기반 텍스트 질의는 해당 대화 음성 자막 내용이나 전체 분위기에서 다각도로 힌트를 파악할 수 있지만, 인물 스물 한두 장면 비교는 오직 명확한 형태 보정값 비교(Visual-matching) 영역 내에서 수치 신뢰도가 검증되어야 정당한 법적 증거력이 유효하기 때문입니다.

마이크로 비디오 클립 지상 검증(Grounding):

out.append({
        "id": r["id"],
        "score": r["score"],
        "metadata": meta,
        "clips": clips,
    })

return out, display_query, None

최종 리턴 객체에는 정확히 어느 구간에서 그 용무 차량이나 도주 방향이 마킹되었는지 세밀하게 짚어 보여줍니다. 수조 관리가 "타겟 인물, 차량 정차 구간 포착"을 입력하면 다음과 같이 실시간 반환 처리가 끝납니다.

  • 영상 채널: "전면 도로 감시카메라 2A" → 연관 포착 장면 00:03:42-00:03:48, 00:07:15-00:07:21

  • 영상 채널: "주차장 측면 감시카메라 4B" → 연관 포착 장면 00:12:03-00:12:09

동영상 소스 전체를 미련하게 모두 돌려보며 인생을 지름길 없이 낭비하던 악몽에서 벗어나, 필요한 보조 썸네일과 일치 구간으로 날아갈 수 있는 놀라운 타임라인 핀포인트 탐지가 기동되는 찰나입니다.


2.2 - 얼굴 엔티티 맞춤형 비디오 수색: 다중 채널을 통한 인물 탐지

인공지능 다중 지능형 안면 분류 기법을 넣으면, 비전문가 조사관이더라도 단 한 번 인물 자료를 프로필에 올리는 수고만으로 모든 저장 경로 속 화면을 유기적으로 무중단 수색할 수 있게 됩니다.

전체 작동 개념:

  1. 인물 등록 단계에서 만들어둔 얼굴 특징 벡터 프로필 정보를 색인 영역(Index)에서 즉시 조회

  2. 클라우드 S3 저장 장소 내 준비된 전체 비디오 개별 클립 임베딩 가속 리스트 로드

  3. 매트릭스 연산을 활용해 인물 픽셀과 가장 높은 상관 비중을 나타내는 정확한 연관 구간 산출

  4. 이후 해당 탐지 매칭 결과 성공률을 계통 분포로 세우고 조사 보고서 연관 순위 전면 순차 정렬

수사관 런타임 수동 탐지보다 더 압도적으로 가속되는 특별한 이유: 업로드 및 수집 타임에 이미 동영상 6초 단위 핵심 벡터 가공 연산이 끝나 있으므로, 조사 화면에서 특정 피의자를 검색할 때는 오로지 단 몇 밀리초(ms) 단위의 팩터 유사도 계산만 일어납니다. 만 제곱 단위의 미세 픽셀들을 매번 인물 스티칭하며 고달프게 연산 연쇄 반응에 가두는 대신 한 손에 쥐어지는 벡터 정합 판단으로 우회할 수 있습니다.

신뢰성 컷오프(Threshold) 밸런싱 세부 팁: 감지 민감도를 직접 조정하는 ENTITY_CLIP_MIN_SCORE를 너무 엄격하게 지정하면 구도나 날씨 음영, 밤낮 시간에 따라 일부분 생김새가 가려진 핵심 단서를 모조리 흘리게 됩니다. 반대로 너무 느슨히 조절하면 옷 무늬가 좀 예스런 전혀 무관한 승객들이 오탐지에 가득차게 됩니다. 당사 기본 제안 설계 값은 균형 미가 돋보이는 0.75 포인트 라인이며, 현업 수사망 환경에서는 기획에 맞춘 수동 필터 슬라이더를 구성하는 것이 현명합니다.


2.3 - 하이브리드 검색: 영상 피드와 법적 진술 문서 조각의 통합 입체 정보 추출

증거자료란 미디어가 전부가 아닙니다. 형사의 필기 보고서, 주민 증언 전언, 손해사정서 일치 문서들이 그 옆을 영리하게 메워야 합니다. 본 프레임워크는 병렬 코루틴 구조를 활용해 비디오와 사건 텍스트 조사를 지체 없이 동시에 타격합니다.


문헌 조회 파트 세부 코드 소스:

def search_document_index(text_query: str, doc_top_k: int) -> list[dict]:
    from app.services.nemo_retriever import embed_query, search_docs
    t0 = time.perf_counter()
    log.info("[DOC_SEARCH] Started doc search top_k=%d", doc_top_k)
    query_emb = embed_query(text_query)
    docs = search_docs(query_emb, top_k=doc_top_k)
    return docs

동시 처리(Parallel processing) 설계 지향점: 하이브리드 수색 작동 루프는 파이썬 스레딩 기술을 십분 활용하여 문장 분석과 비전 연산을 낭비 시간 없이 동시에 발사 처리한 후, 둘 모두 로드되는 완결 즈음에 한곳에 유려히 모아 내보냅니다. 통상 둘의 대기 시간이 중첩되지 않으므로, 유저는 둘의 처리 시간을 단순히 합쳐서 기다리는 답답함 대신 둘 중 더 무거운 로직의 미세 구동 클록 수준으로 고속 반환된 화면 응답 결과를 전면 패널로 전달받습니다.

유려한 정보 병합 구성: 텍스트 정보 수색 결과와 미디어 검색 구역은 강제 병합되어 난수로 엉키지 않습니다. 성정이 다르기 때문에 UI 레이블에서 유용하게 구역을 쪼개 배치하도록 메타 객체를 예쁘게 보존해 리턴합니다. 영상은 객력 증명 요소로 살리며, 조서는 맥락을 밝히는 논거 흐름으로 각각 구분하여 모니터링해야 효율적 검안 분석이 원활히 이어지기 때문입니다.

이 하이브리드 검색의 심층 통합 전개 코드: 전체 아키텍처 보기


파트 3: 구조적 보안 준수 판단서 생성 및 전송

검색이 단서를 잡는 일이라면, 보고서 생성은 의미를 담아 규율에 보충하는 완성 프로세스입니다. 당사 플랫폼은 AWS Bedrock 하단 Pegasus 고속 인터프리터 모델을 결합하여, 유저가 마우스 한 번 올리는 명령만으로 고수준 보고서 데이터를 구조적 자산으로 즉각 수식해 가공해 줍니다.


3.1 - 동영상 정형 보고서 데이터 가공 기능 구상

Pegasus 가속 추론 프레임워크는 원초적인 픽셀 흐름을 법조인 눈높이에 적합한 '사법 지표'로 가꿔줍니다. 발견 피의자 리스트, 이상 징후 단계 분류, 전후 맥락 발언 일치 정형 테이블 등 알맹이 단서들의 완벽한 정리입니다.

참조 소스 파일: backend/app/services/bedrock_pegasus.py (Line 72)

body: dict = {
    "inputPrompt": prompt[:4000],
    "mediaSource": {
        "s3Location": {
            "uri": s3_uri,
            "bucketOwner": owner,
        }
    },
}
if temperature is not None:
    body["temperature"] = temperature
if response_schema is not None:
    body["responseFormat"] = {"jsonSchema": response_schema}

창의 비조정 세팅: 사건 분석 조사에서 temperature: 0 상수를 고정 부여하는 구조는 대단히 근본적이며 강한 가치를 안겨줍니다. 동일한 조사 대상 영상을 반복 진급 분석 시킬 때 매번 엉뚱하거나 요약 구조가 바뀌어 신뢰도가 파괴되는 상황을 완벽히 방탄 보호해 주고 일치된 사법 증거 해석 일관성을 선사합니다.

원형 스키마 억제(Schema Enforcement): jsonSchema 제어를 활용해 Pegasus로 하여금 난해하게 풀어진 장문의 자유 문단 대신 엄밀한 프레임워크 규산 JSON 테이블을 강제 반환하게 지령합니다. 연산 반환 속도가 월등히 정연해져 마켓에 투입 가능한 앱 프로덕트 개발 편의를 배가시킵니다.

Bedrock 플랫폼 Pegasus 인터프리터 런타임 활성 구현:

response = client.invoke_model(
    modelId=model_id,
    body=payload,
    contentType="application/json",
    accept="application/json",
)

반환된 결괏값 구조에는 AWS Bedrock 리치 응답 스트림 속에서 온전히 가공 처리된 고급 지식 원문이 깔끔히 매핑된 상태로 적대 제공됩니다. Pegasus가 사전에 학습된 비전 추론 모델 능력을 극대화하여 영상 현안을 조리 있고 입체적인 문장과 기호 단서로 치환하는 장면입니다.

분석 촉진 조건 구성 코드:

참조 소스 파일: backend/app/routes/videos.py (Line 335)

raw_text = pegasus_analyze_video(
    s3_uri,
    get_video_analysis_prompt(),
    temperature=0,
)
log.info("[ANALYSIS] Pegasus response received in %.1fs (len=%d)", time.perf_counter() - t0, len(raw_text or ""))
analysis_dict = parse_video_analysis_response(raw_text)

배치된 추론 전용 지령(전체 선언 원문 보기)은 Pegasus에 다음과 같이 디테일하게 행동 요강을 매깁니다:

  • 영상 전개 흐름 분류 수립 (교통 상해 사건, 작업장 안전 불이행, 주거 침입 범죄 유형 매칭 등)

  • 사건 현장 위험 정도 진단서 및 가중 불안 요소 선별 기재

  • 정확히 시간 마크와 연계된 소장 자막 데이터 스트림 정리

  • 등장 핵심 수색 대상 가용한 형태 세부 외형 특색 주석화

  • 법적 고발 소장에 당장 마크해 명시할 수 있는 고품격 사실적 사건 정황 복구 요약

예외 방어 가공 로직 구현: parse_video_analysis_response() 는 혹시 다중 텍스트 해석 진행 단계에서 깨진 문자 백틱 기호(```)나 이포크 처리 꼬리가 틀어진 JSON 불완전 수트 등을 세련된 내부 정규 필터로 자가 교정 및 방어(Regex recovery)하여 백엔드가 뚝 끊기거나 다운되는 버그들을 완전 보증 차단해 줍니다.

음성 정보 타임라인 자막 추출: 미디어 전체 음향 음역에서 수다스런 현장 발화 분석 전반을 완전 전용 Pegasus 모듈로 가속해 내고, 구조적 타임스탬프 JSON 포맷으로 완결 추출하므로 조사관이 클릭 한 번에 피의자 주요 육성 순간을 청취 확인하도록 배려합니다.


3.2 - 현장 감지 물체 일치 확인 및 인물 중요 프레임(Keyframe) 인텔리전트 가공

단순 스크립트 작성에 그치지 않고, 당 플랫폼은 인공지능 영상 분석기로 가장 가치 유효한 인물 중요 프레임(얼굴이 또렷하게 잡혀 피의자 특정이 가장 뛰어난 소중한 결정적 인물 컷)을 영리하게 선점하여 알려줍니다.

참조 소스 파일: backend/app/routes/videos.py (Line 707)

raw_response = pegasus_analyze_video(s3_uri, get_detect_prompt())
log.info("[INSIGHTS] Pegasus response received in %.1fs (%d chars)", time.perf_counter() - t0, len(raw_response or ""))

detect_data = parse_detect_response(raw_response)
objects_raw = detect_data["objects"]
face_keyframes = detect_data["face_keyframes"]

중요 추출 촉진 지령(전체 선언 원문 보기)은 Pegasus 개발 모델에 다음 핵심 가치를 연쇄 수집하게 주문합니다:

  • 현장 물건 단서: 도주 용무 차량 모델, 살상 가능 둔기/물건, 잔해 조각, 날씨 시안성 등

  • 또렷한 얼굴 사진 프레임 타취: 미묘한 흔들림이나 그림자가 걷혀 당장 수배 전단에 올려도 신원 대조가 완벽한 결정적 노출 시점을 타임 마킹

키프레임(Keyframe) 가치 극대화가 필요한 확실한 설계 근거: 얼굴이 지나간 수천 개 무비 시퀀스가 다 쓸모 있진 않습니다. 뒷모습만 남았거나 뒤집어진 화면, 안개가 잔뜩 낀 뿌연 프레임은 전혀 법적 증명용 대조 사진 자격이 없습니다. Pegasus 인공지능이 영리하게 광원 분포와 윤곽 정향성을 파악해 전면 주시, 무노이즈 스냅숏 순간만 마크해 기재해 줍니다. 수사진이 돋보기로 타임라인 수천 리를 직접 들여다보며 스크린샷 노고를 반복하던 굴레가 대폭 해결됩니다.

결과 가공 보증: 타격 확인된 대상 얼굴 키프레임과 물건 데이터셋이 떨어지면, 백엔드 내부 워커 즉시 해당 영상 해당 마이크로 단위 프레임 이미지 조각을 오프라인 기기 공간에 크롭 추출하고 썸네일 파일로 저장 처리해 줍니다. 조사원이 타임 무비를 켤 때 매 프레임 재연산해야 하던 소모적 하드웨어 오버헤드가 단숨에 완전 사멸됩니다.


3.3 - 안면 포착 구간 시간선: 대상자가 언제 어디에서 발견되었는가?

추출 완료된 인물들의 얼굴 데이터를 바탕으로, 각 감시 인물이 동영상 처음부터 끝까지 구체적으로 어느 영역 시간 고리마다 나타나 머물렀는지 시각적인 상태 전개 시간선 그래프를 그려낼 수 있게 만듭니다.

참조 소스 파일: backend/app/routes/videos.py (Line 1027)

if use_marengo:
    # Marengo-based presence, match each face embedding to clip embeddings
    for j, emb in enumerate(face_embeddings):
        if not emb:
            continue
        clips = clips_above_threshold(
            emb,
            output_uri,
            min_score=FACE_PRESENCE_MATCH_THRESHOLD,
            visual_only=True,
            max_clips=50,
        )
        for clip in clips:
            c_start = float(clip.get("start", 0.0))
            c_end = float(clip.get("end", c_start + 0.5))
            for i in range(n_segments):
                s0 = i * seg_dur
                s1 = (i + 1) * seg_dur
                if c_end > s0 and c_start < s1:
                    presence_by_face[j]["segment_presence"][i] = 1

시간선 타임라인 지도 수립 구조 체계:

  1. 원 미디어 소스를 탐지하기 편하도록 일정 등분 기준(예: 30초 단위 인터벌 정합)으로 캡슐 분리

  2. 검출 후보 얼굴 임베딩 값들을 전체 감시 미세 비디오 클립 데이터들과 병행 연산

  3. 유사도 컷오프를 능가하는 우수 등급 검증 클립들을 "인물 탐지 성립"으로 참 분류

  4. 유효 일치 마킹된 조각들을 앞서 그어둔 30초 등분 배열 시간 척도 구간 위에 사상 매핑

  5. 결과물: 특정 피의자가 언제 들어왔다 사라졌는지 한눈에 뵈는 이진 온/오프 상태 시간 그래프 완성

이것이 왜 실무 수색 업무 효율성을 바꾸는가: 수사진은 더는 답답하게 자리를 지키며 타임라인을 몌움선처럼 더듬지 않아도 됩니다. 직관적으로 "피의자는 3구간, 7구간, 12구간 그리고 18구간에서만 도합 4회 잡혔습니다"를 먼저 읽고, 해당 슬롯인 7구간을 터치 이동해 곧장 30초간의 결정적 비주얼 검증을 마무리 지으면 탐지가 완결되기 때문입니다.

민감 필터의 조화로운 구성: FACE_PRESENCE_MATCH_THRESHOLD가 수사 감도를 칼날같이 통제합니다. 임계값을 지나치게 옭아매면 빛 노출 변경에 시달린 유효한 찰나를 다 누락해 내고, 느슨히 주면 허수가 치솟습니다. 이번 제공 소프트웨어 기본값은 0.70으로 매핑 배치되었으며, 엔터프라이즈 환경에서는 케이스 사안별로 수사진이 유연하고 정밀히 보정 조정 가능하도록 설계하는 것이 옳습니다.


엔터프라이즈 런칭을 위한 운영 실무 제언

이 자습서 데모 앱은 기술의 실제 완벽성을 성공적으로 검증했습니다. 제품 상용 시장(Production)에 대동하며 시스템을 구축할 때는 아래 세밀한 현실 지표들을 영리하게 공략해야 합니다:

  1. 대용량 확장 아키텍처(Scalability): 단일 인덱싱 구성은 데모 레벨(영상 12개)에선 민첩하지만, 일반 경찰서 대규모 수사(단일 사건에도 비디오 1,000개 이상)가 쇄도하면 설계 변경이 요구됩니다. 인덱스 단계를 지능적으로 파티셔닝 구조로 쪼개거나, 전문적인 엔터프라이즈 벡터 데이터베이스를 하단에 긴밀히 연결해 분절된 미세 클립들을 유효 수렴 전적 보존하도록 고도화하십시오.

  2. 연산 인프라 지출 조율(Cost management): Bedrock 환경은 가공되는 임베딩 건수만큼 자이언트한 비용 산정 모델이 엮입니다. 2시간짜리 하나에도 1,200여 임베딩 묶음이 나오니 한 케이스에 100시간씩 대기한다면 6만 개 전개가 도래합니다. 유연한 배치 그룹 전개 루틴 마련과 검증 완료된 대형 임베딩들의 로컬 캐싱 재활용 기법을 타이트하게 활성화해야 실 운영비를 절감합니다.

  3. 사법 보안 준수 체계 수립(Security and compliance): 사법 처리에 활용되는 일체의 정보 파일들은 훼손 없는 추적 이력(Chain-of-custody), 엑세스 차단 정책 및 무단 위변조 감지 로그 파일 유지가 생명과도 같습니다. S3 버킷 내 정물이 보존될 때 강력하게 종단간 암호화(Encryption at rest) 조치 적용과 세분화된 권한 통제 롤(IAM Role Level), 한 번 쓰이면 변조 불가능한 감사 이력 블록 체계(WORM, immutable audit trail)를 함께 덧끼우십시오.

  4. 검출 신뢰성 이중 휴먼 인증 장치 마련: 자동 산출된 얼굴 데이터나 완성 타임라인 전개도는 결정적 조서 보완 수배용 법적 공식 문서에 오르기 전 '분류 확정도(Confidence score)' 단계 표기와 수사 전문가의 마우스 수동 확인/컨펌 워크플로를 반드시 징검다리로 끼고 작동해야 합니다. 인공지능 영상 분석기는 업무 수고를 극적으로 돕는 비서이지, 최종 결과에 책임을 정해 법을 내리는 주체가 결코 아닙니다.

  5. 다양한 동영상 규격 무중단 변환 관리: 실 데모 제품은 온전한 비디오 코덱(Standard format) 구동을 근거해 달립니다. 하지만 상용 망에서는 깨지거나 전송 상태가 왜곡된 기괴한 레거시 카메라 녹화본, 인코딩이 비정상적인 독점 보안 전용 형식, 저해상도로 뭉개진 증거 수집물들도 매끄럽게 소프트 변환할 수 있는 트랜스코딩 중화 파이프라인 처리가 필수 전제입니다.


맺음말

이번 완성도 높은 자습서 애플리케이션은 첨단 비디오 지능형 분석 기법이 시간 낭비에 가깝던 전통 사법 분석 수작업 단계를 스마트 선별 수사 작업으로 전폭 대전환 시키는 실질 패러다임을 극명히 증명합니다. AWS Bedrock을 거친 지능 화신 TwelveLabs 비전 아키텍처와 NeMo Retriever 도서 탐지 기법의 슬기로운 멀티 결합으로, 일선 수사 전문팀은 이제 즉각적으로 다음과 같은 미래형 성능을 누립니다:

  • 자연어 타이핑 한 번만으로, 12가지 다른 기종 기기 감시 영상들을 동시 통합 섭렵 조사

  • 단 하나의 전면 얼굴 사진으로 다른 채널 상의 이동 동선을 연속적 일치 검출

  • 파편화된 채널 영상물로부터 일사불란한 전개 타임라인을 원패스 기동 및 복각

  • 위험 범주 진단이 적용된 고품격 시정 조치 보고서 기획 및 일괄 자동 완성 수립

  • 클릭 즉시 발화 시점으로 뛰어넘는 고효율 인터 타임스탬프 인공지능 음성 추적 자막 획득

성공적 효율성 지표의 대격변: 단 한 단서 발굴을 목적하더라도 과거 40시간 이상 한 자리에 붙박혀 관찰하던 피로 수하 경로가 약 4시간의 신속 지목 조사 형태로 전폭 압축되어 환골탈태합니다. 무가치한 시간 낭비는 사라지고, 수사진은 식별해 낸 핵심 결점 단서의 적합성을 유려히 재확인하는 정량 가치 판단 업무 본질에 온전한 열정을 귀속할 수 있습니다.

사법 증거 통제 솔루션을 개발 중인 보안 및 리걸테크 소프트웨어 선도 벤더사(ISVs)에 이르기까지, 이 고급 설계 매뉴얼은 기존 개발 아키텍처를 뒤흔들거나 처음부터 완전히 다시 쓰지 않고도 세련되게 TwelveLabs의 위대한 영상 정밀 독해 기능을 온전히 스며들게 하는 실전에 가장 유용한 청사진이 됩니다. 단일 인덱스로 풀어낸 멀티 촬영 데이터 수렴과 비디오에 보고서 문서를 결착한 하이브리드 지식 발췌의 모든 능력은 비즈니스 출시 법률 시장 제품에서 곧바로 최강의 위용을 선사할 것입니다.


추가 참조 도움 문서 리스트

  1. AWS Bedrock 상의 TwelveLabs 솔루션 가이드: 전용 추론 모델 연결 매뉴얼 자세히 알아보기

  2. NeMo Retriever 개발 문서 라이브러리: 풍부한 대규모 조서 파일 하이브리드 검색 기법 알아보기

  3. TwelveLabs 우수 활용 실무 구현 사례집: 다른 버티컬 엔터프라이즈 모범 성공 방안들 더 둘러보기

  4. TwelveLabs 글로벌 오픈 개발자 교류회: 공식 Discord 커뮤니티 참여하기


지금 시작해야 할 다음 실행 스텝:

  1. 전체 코드가 예쁘게 안착한 핵심 완성 레퍼런스 코드 소스 저장소 클론받기

  2. 보유 세팅 완료된 AWS Bedrock를 가동한 뒤 테스트 미디어 클립을 주입하여 기동성 테스트

  3. 유려한 단일 인덱스 멀티 피드 패턴 설계를 지향하는 실무 수색 기획에 커스텀 적용

  4. 실제 사용 중인 경찰 수사/법무 법인 법률 사건 관리 파이프라인에 영리하게 최종 배포

소개

영상 증거 자료를 처리하는 법률 팀은 날로 심각해지는 문제에 직면해 있습니다. 단 하나의 사건만 하더라도 대시캠, 바디캠, CCTV 시스템, 도어벨 카메라, 보험 제출 자료 등에서 확보한 40시간 이상의 영상이 포함될 수 있으며, 형식이 다르고 해상도도 제각각이며 타임스탬프도 일치하지 않습니다. 조사관들은 이 수많은 콘텐츠를 수동으로 검토하기 위해 보조 법률 전문 인력 비용으로 시간당 200~500달러를 사용합니다. 7번 카메라 피드의 23시간째 분량에 묻혀 있는 결정적인 10초짜리 클립 하나를 놓친다면 사건의 결과가 완전히 바뀔 수 있습니다.

기존의 방식(수동 검토, 기본적인 메타데이터 태깅, 프레임 단위 분석)으로는 감당이 되지 않습니다. 법률 팀은 서로 다른 소스 전반에서 동시에 검색하고 파편화된 영상에서 타임라인을 재구성하며, 모든 비디오를 일일이 시청하지 않고도 핵심적인 순간을 식별할 수 있어야 합니다.

본 자습서에서는 비디오 인텔리전스를 위한 AWS Bedrock 기반 TwelveLabs 기법과 문서 검색용 NVIDIA NeMo Retriever 모델을 사용하여 법적 증거 조사 플랫폼을 구축하는 방법을 설명합니다. 결과적으로 조사관은 자연어 쿼리(예: "빨간색 세단 차를 찾아줘" 또는 "인물이 건물로 들어온 시점을 보여줘")를 가지고 12개 비디오 소스를 동시에 검색하고, 정확한 타임스탬프가 매겨진 검색 결과 목록을 받아보며, 며칠씩 걸리던 구체적인 규정 주소 준수 분석서 작성을 단 수분 만에 완료할 수 있습니다.

개발 결과물: 복합 형식 폐쇄회로 화면(CCTV)을 수집하고, 다중 소스 간 시맨틱 검색을 제공하며, 보안 규정 분석을 자동 수행할 뿐만 아니라 서로 다른 비디오 소스로부터 시간순 타임라인을 결합해 내는 다중 소스 증거 분석 조사 시스템을 완성하게 됩니다.

중요 효율성 개선: 40시간이 소요되던 증거 자료 수동 검토 시간이 단 4시간의 표적 조사로 대폭 축소됩니다.

여기에서 관련 데모 버전을 먼저 체험해 보실 수 있습니다: 법가 증거 분석 조사 서비스 데모 애플리케이션

아래에서 소스 코드를 확인해 볼 수 있습니다: GitHub 소스 저장소


데모 애플리케이션

이번 데모는 여러 비디오 소스의 통합 검색, 정밀한 타임스탬프 기반 탐지, 정규 양식에 맞춘 보안 위험 규정 분석, 상세 조사를 돕는 양방향 질의응답 기능 활용 등 실무 분석 작업을 본 플랫폼이 어떻게 구체적으로 수행하는지 제시합니다.

구현된 주요 핵심 기능:

  • 12가지 이상 혼합된 형식 속 멀티 소스 통합 검색 지원

  • 개체 추적 (전체 자료에서 특정 피의자나 도주 차량을 추적 검색)

  • 위험 범주 분류를 포함한 법규 분석 보고서 자동 생성

  • 시간 흐름에 따른 사건 전개 단계별 정밀 타임라인 재구성

  • 타임스탬프 연계를 갖춘 지능형 비디오 대화식 Q&A 기능


시스템 아키텍처: 단일 인덱스 멀티 소스 설계가 중요한 이유

본 개발 시스템의 설계 구조 결정 시 다음 사항의 해결이 핵심이었습니다. TwelveLabs 검색 엔진은 인덱싱 레벨 단위로 작동합니다. 즉 특정 비디오가 아닌 하나의 인덱스(색인 공간)를 통째로 검색한다는 의미이며, 이 부분이 전체 설계를 좌우합니다.

그다지 좋지 못한 접근 방식은 개별 비디오 파일마다 인덱스를 하나씩 생성하여 관리하는 것입니다. 이 경우 당장 한 인물을 12개 채널 카메라에서 찾으려 한다면 12개의 검색을 실행한 후 결과 값을 애플리케이션 내에서 수작업으로 머지하고 조율해야 하므로 속도가 무척 느려지고, 유지 관리가 취약해집니다.

훨씬 정교한 모범적 방식은 '단일 인덱스 기반 멀티 소스 통합 전략'입니다. 전체 분석용 증거 비디오를 단 하나의 TwelveLabs 인덱스에 넣되, 메타데이터 태그를 풍부히 엮어 고유의 출처를 확보하는 방법입니다. 검색창에 질의 한 번이면 복수 채널 전체가 동시에 기동됩니다. 영상별 연관성에 맞게 정렬된 결과 값이 나오며 메타데이터 필터를 응용해 세부 검색("바디캠 영상만 검색" 혹은 "메인 스트리트 위치 카메라 검색")도 곧바로 적용할 수 있습니다.

핵심 아키텍처 모듈:

  1. 비디오 인제스천 파이프라인: 복수 촬영본 S3에 저장 → Bedrock을 거쳐 twelvelabs.marengo-embed-3-0-v1:0 모델로 색인 생성 → 식별 메타데이터와 결합해 멀티모달 임베딩 형태로 저장

  2. 문서 인제스천 파이프라인: 사건 조서 PDF 텍스트 추출 → 스마트 분절 수행 → nvidia/llama-nemotron-embed-vl-1b-v2 기반 임베딩 → 문서 인덱스로 적재

  3. 하이브리드 정보 추출 레이어: 비디오 임베딩(Marengo)과 문서 조각(NeMo) 병렬 입체 검색 → 검색 결과의 조화로운 결합 → 사용자 화면에 맞춘 단일 응답 표출

  4. 분석 및 평가 엔진: twelvelabs.pegasus-1-2-v1:0 기반 보고서 작성. 영상 제목, 위험 등급, 탐지 차량/개체 종류, 인물 포착 구간, 음성 텍스트 자막 포함

  5. 인터랙티브 대화 프레임: 타임스탬프 클릭 이동이 지원되는 정밀 비디오 Q&A 레이아웃

단일 검색 시 반응 속도는 12개의 중밀도 비디오 연산 환경에서도 3초 미만으로 단축됩니다. 인덱스 검색 최적화로 처리 시간을 극적으로 줄였습니다.


사전 준비: 개발 시작하기 전에


1 - TwelveLabs 모델 이용을 위한 AWS Bedrock 활성화

다음 구성을 충족하는 AWS 사용자 권한(Credentials)을 발급받으십시오:

  • Amazon Bedrock 사용 권한과 특정 모델 활성화 상태

  • 비디오 전용 스토리지 및 Bedrock 비동기 처리 파일 아웃풋 설정을 위한 S3 권한

  • Bedrock으로 호출 가능한 아래 TwelveLabs 인공지능 모델 엑세스 권한:

    • twelvelabs.marengo-embed-3-0-v1:0 (멀티모달 비디오 분석용 임베딩 모델)

    • twelvelabs.pegasus-1-2-v1:0 (고등 영상 분석 및 서사 추론 기능)

이 전용 모델들이 귀중한 이유: Marengo는 영상 이미지 구조를 정확한 벡터 표현 공간으로 전환하는 훌륭한 엔코더 역할을 하고, Pegasus는 이를 구조화하여 지적 해석을 덧붙이는 인터프리터 임무를 맡습니다. 비디오 구조화와 시각 데이터 번역 및 인물 심층 인식이 동시에 균형을 이루어야 법률 조사 업무에 바로 투입될 수 있습니다.


2 - S3 버킷 설정 및 구조화

다음 용도로 사용할 동일 S3 버킷 환경을 준비해주십시오:

  • 사건 영상 분석 아카이브 및 원본 스토리지

  • Bedrock 비동기식 임베딩 생성을 위한 전용 아웃풋 폴더 (일괄 업로드 처리 시 강제 필수 요건)

  • 자동 추출된 썸네일 파일 및 분석 중간 산출물 보관

  • 참조가 필요한 텍스트 및 조서 문서 스토리지

S3 스토리지 연관 중요성: Bedrock 비동기 API 모델은 기본 입출력을 직접 S3 버킷 디렉터리를 통해 수행합니다. 또한 이는 하드웨어 부하 걱정 없는 대용량 멀티 인제스천 환경의 단단한 주춧돌이 됩니다.


3 - NVIDIA 개발 포털 인증키 발급

아래 모델 개발 접근을 위해 NVIDIA API Key를 발급받으십시오:

  • nvidia/llama-nemotron-embed-vl-1b-v2 (다양한 텍스트 파트 조각화 임베딩 전용 개발)

왜 NeMo Retriever인가: 완벽한 법적 증거는 영상만으로 입증되지 않습니다. 보조 경찰 보고서, 현장 자술서, 진술 기록 등이 영상 데이터와 입체적으로 결합해야 합니다. TwelveLabs를 거친 동영상 비전과 NeMo의 대형 문서 검색을 종합 매칭하여 진정한 픽셀-문헌 다차원 하이브리드 검색망을 실현합니다.


4 - 저장소 클론 및 설정 복제

git clone https://github.com/Hrishikesh332/tl-compliance-intelligence
cd

우선 백엔드 런타임 환경 구성 파일인 .env.example 문서를 그대로 복제해 세팅하십시오:

  1. AWS 접근 인증 정보 입력 (Access Key ID, Secret Access Key 및 활성화 리전 정보)

  2. 대상 S3 버킷 설정 이름 및 Bedrock 출력 위치 폴더 경로 지정

  3. 발급된 NVIDIA API Key 등록

  4. 인덱스 설정 및 정합 정확성 유사도 컷오프 값(Threshold) 등 어플리케이션 옵션 값 입력


핵심 코드 구현 심층 탐구


파트 1: 비디오 적재 및 다차원 임베딩 생성

이 인제스천 파이프라인은 업로드된 감시 카메라 화면 데이터를 검색 가능한 최적의 임베딩 데이터로 변환합니다. 수 시간 분량 영상의 긴 분석 시간 동안 사용자 인터페이스가 멈추지 않도록 비동기 배치 형태로 작동하게 설계합니다.


1.1 - Marengo 비동기 임베딩 생성 명령 호출

비디오 파일 업로드가 완료되면 본 백엔드가 파일 자체를 즉각 S3에 넣고 Bedrock 비동기 프로세스 처리 요청을 바로 전송합니다.

참조 소스 파일: backend/app/services/bedrock_marengo.py (Line 111)

def start_video_embedding(
    s3_uri: str,
    output_s3_uri: str,
    bucket_owner: str | None = None,
) -> dict:
    client = get_bedrock_client()
    owner = bucket_owner
    body = {
        "inputType": "video",
        "video": {
            "mediaSource": media_source_s3(s3_uri, owner),
            "embeddingOption": ["visual", "audio"],
            "embeddingScope": ["clip", "asset"],
        },
    }
    resp = client.start_async_invoke(
        modelId=MARENGO_MODEL_ID,
        modelInput=body,
        outputDataConfig={"s3OutputDataConfig": {"s3Uri": output_s3_uri}},
    )
    return {
        "invocation_arn": resp.get("invocationArn", ""),
        "status": "pending",
    }

파라미터 embeddingScope: ["clip", "asset"] 설정의 핵심 의미: 이 구조는 다음과 같이 두 갈래 차원에서 정밀 임베딩 벡터를 함께 만듭니다.

  • 클립형 임베딩 (단위: 6초 미세 세그먼트): 고도로 현미경 타임라인을 파고들어 대상자가 포착된 8초짜리 짧은 순간을 기가 막히게 추적해 줍니다.

  • 에셋형 임베딩 (전체 소스 요약본): 멀리서 숲을 보듯, 비디오의 구조적 특징과 전개 흐름 자체를 대변하는 유사도 검출 기능을 지원합니다.

두 구조 모두 필요합니다. 클립 단위 검색은 정교한 시간대 추적을, 에셋 임베딩은 '유사 행동 유형을 보유한 연관 감시 파일 찾기' 업무를 가속화합니다.

이 비동기 연산 기법의 타당성: 2시간 상당의 영상에서 무려 1,200개의 세세한 클립 벡터(2시간을 6초 단위 분할)가 추출됩니다. 대단히 무거운 작업이기에 백그라운드 환경에서 유연히 전개되어야 수십 개 파일이 동시 투입되어도 앱 오류 없이 부드럽게 임베딩 작업을 마무리할 수 있습니다.


1.2 - 백그라운드 로직 큐와 실행 상태 중단점 폴링

완료 확인 스레드는 메모리 대기 흐름(Queue)을 늘 매끄럽게 관리하며 Bedrock 처리 서버에 연산이 끝났는지 상시 무중단 확인을 시도합니다.

참조 소스 파일: backend/app/utils/video_helpers.py (Line 104)

while True:
        job = bedrock_queue.get()
        task_id = job["task_id"]
        s3_uri = job["s3_uri"]
        output_uri = job["output_uri"]
        filename = job["filename"]
        meta = job["meta"]
        log.info("[QUEUE] Processing Bedrock start for %s (%s)", filename, task_id)
        success = False
        for attempt in range(1, max_retries + 1):
            try:
                result = start_video_embedding(s3_uri, output_uri)
                arn = result.get("invocation_arn", "")
                log.info("[QUEUE] Bedrock started for task_id=%s", task_id)
                video_tasks[task_id]["status"] = "indexing"
                video_tasks[task_id]["invocation_arn"] = arn
                video_tasks[task_id]["output_s3_uri"] = output_uri
                for rec in vs_index():
                    if rec.get("id") == task_id:
                        rec.setdefault("metadata", {})["status"] = "indexing"
                        break
                vs_save()
                with bedrock_poller_lock:
                    bedrock_poller_jobs.append({
                        "task_id": task_id,
                        "invocation_arn": arn,
                        "output_s3_uri": output_uri,
                        "started_at": time.monotonic(),
                    })
                success = True
                break

해당 구현 소스의 기능: 대기열 연산 모듈이 진행 상태를 "색인 중(indexing)"으로 치환하고 분석 추적에 꼭 필요한 AWS Bedrock 고유 고리인 ARN 값을 캐싱 보관 처리합니다. 이후 모니터링 폴링 루프 스레드가 30초의 여유 주기마다 점검하며 S3 결과 객체가 무사 복원되면 상태를 최종 "ready"로 변경합니다.

재시도(Retry) 설계가 특히 중요한 이유: 클라우드 연산 처리에는 일정한 사용량 제한과 호출 임계치가 있습니다. 지수 백오프 방식의 우아한 안전장치는 업로드 피크 상황이 집중되더라도 작업들이 버려지지 않고 뒤이어 순차 수행되도록 견고히 잡아줍니다.

데이터 설계 패턴 장점: 촬영 인물 얼굴 정보와 동영상 자원 임베딩은 모두 복합 단일 인덱스 한 군데 저장하되 다형 속성 태깅 분류 기법을 넣습니다. 다만 대규모 조서 텍스트 데이터는 별도의 조각화 전담 인덱스로 이화합니다. 이로써 영상과 용무 인물 검색 연산 속도는 한 번에 끌어올리고 대용량 문서 처리는 간소하게 우회할 수 있습니다.


1.3 - 지능형 문단 의미 분석을 적용한 PDF 텍스트 주입

보고서 문서는 비디오 파일과는 다릅니다. 이 시스템은 법률 조서 문서들을 의미론적인 세부 문단(텍스트 단락 단위)으로 입체 구조 분할한 뒤, NeMo 로직을 적용해 검색 가능한 레코드로 차곡차곡 임베딩 처리합니다.

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 688)

def ingest_document(file_path: str, doc_id: str, filename: str) -> dict:
    extra: dict = {}
    try:
        pdf_info = store_pdf_document(file_path, doc_id)
        extra.update(pdf_info)
    except Exception as exc:
        log.warning("Could not persist PDF for %s (%s)", doc_id, type(exc).__name__)
    ext = os.path.splitext(file_path)[1].lower()
    chunks: list[str] = []
    sections: list[str] = []
    if ext == ".pdf":
        try:
            pairs = split_into_semantic_chunks(file_path)
            sections = [s for s, _ in pairs]
            chunks = [t for _, t in pairs]
            log.info("Smart PDF chunking produced %d chunks for doc %s", len(chunks), doc_id)
        except Exception as exc:
            log.warning("Smart PDF extraction failed for doc %s, falling back to NeMo (%s)", doc_id, type(exc).__name__)
    if not chunks:
        chunks = extract_document(file_path)
    if not chunks:
        log.warning("No content extracted for doc %s", doc_id)
        return {"doc_id": doc_id, "chunks": 0, "status": "empty"}
    embeddings = embed_texts(chunks)
    add_chunks(
        doc_id, filename, chunks, embeddings,
        sections=sections or None,
        extra_metadata=extra or None,
    )
    return {"doc_id": doc_id, "chunks": len(chunks), "status": "ready"}

스마트 분할 전략: 먼저 단락 및 타이틀 마킹 기준으로 세부 내용을 구분하는 '섹션 분해 분절 기법'을 씁니다. 이게 불가능한 평문 문서 등은 문장 및 단락 카운트 방식으로 완충 분할합니다. 이는 문서 자체의 계통 정보("사건 타임라인 일지", "증언 발췌록" 등)가 추적 시 고도로 가치 있는 맥락 단서가 되는 사법 증거 분류 환경에서 필수입니다.

AI 임베딩 모델 선택: nvidia/llama-nemotron-embed-vl-1b-v2 기법은 각 개별 문단에 가장 깊은 차원의 특징 벡터 값을 매겨내어 파일 전체 매치 대신 맥락 단위의 정교한 매칭 적합성을 확실하게 확보합니다.

메타데이터의 완전한 보전: 추출 완료된 각 주입 조각은 원본 PDF 소스 파일 경로 및 소제목 정보가 함께 꼬리표로 묶입니다. 따라서 조사관이 질의창에 검색하면 실제 조작문 속 원본 단락 위치로 한 클릭 이동이 가능해집니다.

NVIDIA API 전송 임베딩 구현 구문:

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 515)

def embed_via_requests(texts: list[str], input_type: str) -> list[list[float]]:
    """Call NVIDIA embeddings API directly with requests"""
    import requests
    t0 = time.perf_counter()

    resp = requests.post(
        "https://integrate.api.nvidia.com/v1/embeddings",
        headers={
            "Authorization": f"Bearer {NVIDIA_API_KEY}",
            "Content-Type": "application/json",
        },
        json={
            "input": texts,
            "model": EMBED_MODEL,
            "encoding_format": "float",
            "input_type": input_type,
        },
        timeout=60,
    )
    resp.raise_for_status()
    data = resp.json()
    vectors = [d["embedding"] for d in data["data"]]
    first_dim = len(vectors[0]) if vectors else 0
    return vectors

핵심적인 input_type 제어 요소: NeMo 기술은 백엔드에 영구 색인하는 데이터인 "passage"와 일반 조사관이 타이핑하는 "query" 요소를 정확히 갈라 설계합니다. 데이터의 본 사용 목적과 쓰임 규격에 맞게 임베딩 공간 가중치를 보정해 주므로 훨씬 정합도 높은 정밀 비교 검색이 구현될 수 있습니다.


1.4 - 감시 대상 용무 인물 사진 기반 검색 레코드 확보

현장 수사용 기능에는 특정 용무 인물(CCTV 포착 대상)을 여러 감시카메라 화면에서 통시 검색하는 기능이 중추를 이룹니다. 대상자 단 한 장면의 얼굴 스냅샷 사진으로부터 검색용 임베딩 코드를 가공해 냅니다.

얼굴 이미지 임베딩 처리 루틴:

def embed_image(media_source: dict) -> list[float]:
    return invoke_embedding_model({
        "inputType": "image",
        "image": {"mediaSource": media_source},
    })

Marengo의 전용 이미지 임베딩 파이프라인은 얼굴 형상 및 실루엣 세부 특징을 비주얼 지표 형태로 번역해 줍니다. 텍스트 정보가 전무하더라도 이 정합적 수치들 덕에 어둡거나 구도가 틀어진 실제 고해상도 CCTV 무비 프레임 속 한가운데서도 동일 대상을 놀라울 만큼 민첩하게 매칭시킵니다.


얼굴 조각 이미지 수집 엔드포인트:

@entities_bp.route("/entities/from-image", methods=["POST"])
def api_entities_from_image():
    if "image" not in request.files:
        return jsonify({"error": "No 'image' file provided"}), 400

    file = request.files["image"]
    if file.filename == "":
        return jsonify({"error": "Empty filename"}), 400

    data = request.form or {}
    name = data.get("name") or (request.get_json(silent=True) or {}).get("name") or ""
    if not name.strip():
        return jsonify({"error": "Missing 'name'"}), 400

    image_bytes = file.read()
    faces = detect_and_crop_faces(image_bytes, min_confidence=ENTITY_FACE_MIN_CONFIDENCE)
    if not faces:
        return jsonify(
            {"error": "No face detected in image. Use a clear, front-facing photo with good lighting."}
        ), 404

    best = faces[0]
    face_b64 = best["image_base64"]
    embed_b64 = best.get("embedding_crop_base64") or face_b64

    import base64

    face_bytes = base64.b64decode(embed_b64)
    media = media_source_base64(face_bytes)

    try:
        embedding = embed_image(media)
    except Exception:
        return jsonify({"error": "Internal server error"}), 500

    entity_id = name.strip().lower().replace(" ", "-")
    rec = index_add(
        id=entity_id,
        embedding=embedding,
        metadata={"name": name.strip(), "face_snap_base64": face_b64},
        type="entity",
    )

    return jsonify(
        {
            "indexId": FIXED_INDEX_ID,
            "entity": {"id": rec["id"], "name": name.strip()},
            "face_snap_base64": face_b64,
        }
    )

정밀 전처리 단계: OpenCV 라이브러리의 ResNet10 SSD 얼굴 모듈을 얹어 배경 노이즈를 쳐내고 실제 인물 페이스 구역만 지능형 크롭하여 Marengo에 밀어 넣습니다. 흐릿한 대규모 원경 풍경을 정제해 주므로 정확도 매칭 성공률이 극한으로 올라갑니다. 신뢰성이 높은 상위 고품격 얼굴 데이터만 가공되도록 임계치 필터 필터링도 활성화했습니다.

비디오 인덱스 저장 패턴 장점: 인물 구조 임베딩과 연관 영상을 동일한 데이터베이스 저장소 공간에 병치하기 때문에, 다회 회전 연산 필요 없이 대단히 빠른 원패스 비교 매칭이 실행됩니다. 수사관이 검색어 하나를 대는 그 즉시 유사 비교 판단이 끝나며 일치 장면을 일목요연하게 찾아냅니다.


파트 2: 멀티 소스 교차 수색 및 정보 추출

수집 완료 시 조서 파일과 촬영 영상물 전체를 유기적으로 한 검색란에서 넘나들 수 있습니다. 이것이 단일 인덱스 멀티 소스 기법이 안겨주는 독보적 사용자 경험 유용성입니다: 단 하나의 핵심 질의, 통합된 고속 탐지 결과.


2.1 - 복합 임베딩 기반 비디오 수치 검색 구현

하나의 탐색 상자 안에서 세 유형의 직관적 검색 경험 방식을 함께 제공합니다:

  1. 텍스트 기반 수색: 자연스러운 언어로 표현할 수 있는 인물 행동 묘사 ("붉은 패딩을 입은 사람")

  2. 이미지 업로드 검색: 확보한 용무 인물 사진이나 일치 단서 파편 등록 및 흔적 추적

  3. 메타 엔티티 조회: 이미 백엔드 환경에 사전 프로필 저장 완료된 키워드나 식별 인물 매칭

참조 소스 파일: backend/app/routes/search.py (Line 30)

def search_video_index(
    data: dict,
    *,
    request_query: str = "",
    request_top_k: int | None = None,
    image_bytes: bytes | None = None,
) -> tuple[list[dict], str, str | None]:

    query_emb, display_query, is_entity_search, err = get_search_embedding_from_request(
        data,
        request_query=request_query,
        image_bytes=image_bytes,
    )

질의 형태 정규화(Normalization): get_search_embedding_from_request() 메소드는 입력 질의 수단이 무엇이건 상관없이, 백엔드 내부 연산용 통합 비교 벡터 값으로 변환 처리해 줍니다. 텍스트 인제스천은 Marengo 텍스트 가속기를 타고 이미지 인풋은 비전 분석 수치로 변환되며, 엔티티 ID 역시 사상된 메모리 벡터 값을 곧바로 인용합니다. 아래 하류 검색 레이어는 그저 연산하기 편한 표준 단일 벡터 포맷만 바라보므로 유연하고 탄탄한 아키텍처가 유지됩니다.

타겟 인물 고속 매칭 조율 로직:

for r in results:
    meta = r.get("metadata", {})
    clips = []
    output_uri = meta.get("output_s3_uri") or f"{S3_EMBEDDINGS_OUTPUT}/{r['id']}"

    if is_entity_search:
        clips = clips_above_threshold(
            query_emb,
            output_uri,
            min_score=ENTITY_CLIP_MIN_SCORE,
            visual_only=True,
            max_clips=clips_per_video,
        )

    if not clips:
        clips = clip_search(
            query_emb,
            output_uri,
            top_n=clips_per_video,
            min_score=clip_min_score,
            visual_only=is_entity_search,
        )

결과 유사도 가중치 변별점: 얼굴 인식 매칭 작업은 visual_only=True 매개변수와 다소 높은 문턱 수준을 유지합니다. 흐리게 스쳐 지나간 다른 행인에 대한 오인 탐지를 엄밀히 차단하기 위함입니다. 문자 기반 텍스트 질의는 해당 대화 음성 자막 내용이나 전체 분위기에서 다각도로 힌트를 파악할 수 있지만, 인물 스물 한두 장면 비교는 오직 명확한 형태 보정값 비교(Visual-matching) 영역 내에서 수치 신뢰도가 검증되어야 정당한 법적 증거력이 유효하기 때문입니다.

마이크로 비디오 클립 지상 검증(Grounding):

out.append({
        "id": r["id"],
        "score": r["score"],
        "metadata": meta,
        "clips": clips,
    })

return out, display_query, None

최종 리턴 객체에는 정확히 어느 구간에서 그 용무 차량이나 도주 방향이 마킹되었는지 세밀하게 짚어 보여줍니다. 수조 관리가 "타겟 인물, 차량 정차 구간 포착"을 입력하면 다음과 같이 실시간 반환 처리가 끝납니다.

  • 영상 채널: "전면 도로 감시카메라 2A" → 연관 포착 장면 00:03:42-00:03:48, 00:07:15-00:07:21

  • 영상 채널: "주차장 측면 감시카메라 4B" → 연관 포착 장면 00:12:03-00:12:09

동영상 소스 전체를 미련하게 모두 돌려보며 인생을 지름길 없이 낭비하던 악몽에서 벗어나, 필요한 보조 썸네일과 일치 구간으로 날아갈 수 있는 놀라운 타임라인 핀포인트 탐지가 기동되는 찰나입니다.


2.2 - 얼굴 엔티티 맞춤형 비디오 수색: 다중 채널을 통한 인물 탐지

인공지능 다중 지능형 안면 분류 기법을 넣으면, 비전문가 조사관이더라도 단 한 번 인물 자료를 프로필에 올리는 수고만으로 모든 저장 경로 속 화면을 유기적으로 무중단 수색할 수 있게 됩니다.

전체 작동 개념:

  1. 인물 등록 단계에서 만들어둔 얼굴 특징 벡터 프로필 정보를 색인 영역(Index)에서 즉시 조회

  2. 클라우드 S3 저장 장소 내 준비된 전체 비디오 개별 클립 임베딩 가속 리스트 로드

  3. 매트릭스 연산을 활용해 인물 픽셀과 가장 높은 상관 비중을 나타내는 정확한 연관 구간 산출

  4. 이후 해당 탐지 매칭 결과 성공률을 계통 분포로 세우고 조사 보고서 연관 순위 전면 순차 정렬

수사관 런타임 수동 탐지보다 더 압도적으로 가속되는 특별한 이유: 업로드 및 수집 타임에 이미 동영상 6초 단위 핵심 벡터 가공 연산이 끝나 있으므로, 조사 화면에서 특정 피의자를 검색할 때는 오로지 단 몇 밀리초(ms) 단위의 팩터 유사도 계산만 일어납니다. 만 제곱 단위의 미세 픽셀들을 매번 인물 스티칭하며 고달프게 연산 연쇄 반응에 가두는 대신 한 손에 쥐어지는 벡터 정합 판단으로 우회할 수 있습니다.

신뢰성 컷오프(Threshold) 밸런싱 세부 팁: 감지 민감도를 직접 조정하는 ENTITY_CLIP_MIN_SCORE를 너무 엄격하게 지정하면 구도나 날씨 음영, 밤낮 시간에 따라 일부분 생김새가 가려진 핵심 단서를 모조리 흘리게 됩니다. 반대로 너무 느슨히 조절하면 옷 무늬가 좀 예스런 전혀 무관한 승객들이 오탐지에 가득차게 됩니다. 당사 기본 제안 설계 값은 균형 미가 돋보이는 0.75 포인트 라인이며, 현업 수사망 환경에서는 기획에 맞춘 수동 필터 슬라이더를 구성하는 것이 현명합니다.


2.3 - 하이브리드 검색: 영상 피드와 법적 진술 문서 조각의 통합 입체 정보 추출

증거자료란 미디어가 전부가 아닙니다. 형사의 필기 보고서, 주민 증언 전언, 손해사정서 일치 문서들이 그 옆을 영리하게 메워야 합니다. 본 프레임워크는 병렬 코루틴 구조를 활용해 비디오와 사건 텍스트 조사를 지체 없이 동시에 타격합니다.


문헌 조회 파트 세부 코드 소스:

def search_document_index(text_query: str, doc_top_k: int) -> list[dict]:
    from app.services.nemo_retriever import embed_query, search_docs
    t0 = time.perf_counter()
    log.info("[DOC_SEARCH] Started doc search top_k=%d", doc_top_k)
    query_emb = embed_query(text_query)
    docs = search_docs(query_emb, top_k=doc_top_k)
    return docs

동시 처리(Parallel processing) 설계 지향점: 하이브리드 수색 작동 루프는 파이썬 스레딩 기술을 십분 활용하여 문장 분석과 비전 연산을 낭비 시간 없이 동시에 발사 처리한 후, 둘 모두 로드되는 완결 즈음에 한곳에 유려히 모아 내보냅니다. 통상 둘의 대기 시간이 중첩되지 않으므로, 유저는 둘의 처리 시간을 단순히 합쳐서 기다리는 답답함 대신 둘 중 더 무거운 로직의 미세 구동 클록 수준으로 고속 반환된 화면 응답 결과를 전면 패널로 전달받습니다.

유려한 정보 병합 구성: 텍스트 정보 수색 결과와 미디어 검색 구역은 강제 병합되어 난수로 엉키지 않습니다. 성정이 다르기 때문에 UI 레이블에서 유용하게 구역을 쪼개 배치하도록 메타 객체를 예쁘게 보존해 리턴합니다. 영상은 객력 증명 요소로 살리며, 조서는 맥락을 밝히는 논거 흐름으로 각각 구분하여 모니터링해야 효율적 검안 분석이 원활히 이어지기 때문입니다.

이 하이브리드 검색의 심층 통합 전개 코드: 전체 아키텍처 보기


파트 3: 구조적 보안 준수 판단서 생성 및 전송

검색이 단서를 잡는 일이라면, 보고서 생성은 의미를 담아 규율에 보충하는 완성 프로세스입니다. 당사 플랫폼은 AWS Bedrock 하단 Pegasus 고속 인터프리터 모델을 결합하여, 유저가 마우스 한 번 올리는 명령만으로 고수준 보고서 데이터를 구조적 자산으로 즉각 수식해 가공해 줍니다.


3.1 - 동영상 정형 보고서 데이터 가공 기능 구상

Pegasus 가속 추론 프레임워크는 원초적인 픽셀 흐름을 법조인 눈높이에 적합한 '사법 지표'로 가꿔줍니다. 발견 피의자 리스트, 이상 징후 단계 분류, 전후 맥락 발언 일치 정형 테이블 등 알맹이 단서들의 완벽한 정리입니다.

참조 소스 파일: backend/app/services/bedrock_pegasus.py (Line 72)

body: dict = {
    "inputPrompt": prompt[:4000],
    "mediaSource": {
        "s3Location": {
            "uri": s3_uri,
            "bucketOwner": owner,
        }
    },
}
if temperature is not None:
    body["temperature"] = temperature
if response_schema is not None:
    body["responseFormat"] = {"jsonSchema": response_schema}

창의 비조정 세팅: 사건 분석 조사에서 temperature: 0 상수를 고정 부여하는 구조는 대단히 근본적이며 강한 가치를 안겨줍니다. 동일한 조사 대상 영상을 반복 진급 분석 시킬 때 매번 엉뚱하거나 요약 구조가 바뀌어 신뢰도가 파괴되는 상황을 완벽히 방탄 보호해 주고 일치된 사법 증거 해석 일관성을 선사합니다.

원형 스키마 억제(Schema Enforcement): jsonSchema 제어를 활용해 Pegasus로 하여금 난해하게 풀어진 장문의 자유 문단 대신 엄밀한 프레임워크 규산 JSON 테이블을 강제 반환하게 지령합니다. 연산 반환 속도가 월등히 정연해져 마켓에 투입 가능한 앱 프로덕트 개발 편의를 배가시킵니다.

Bedrock 플랫폼 Pegasus 인터프리터 런타임 활성 구현:

response = client.invoke_model(
    modelId=model_id,
    body=payload,
    contentType="application/json",
    accept="application/json",
)

반환된 결괏값 구조에는 AWS Bedrock 리치 응답 스트림 속에서 온전히 가공 처리된 고급 지식 원문이 깔끔히 매핑된 상태로 적대 제공됩니다. Pegasus가 사전에 학습된 비전 추론 모델 능력을 극대화하여 영상 현안을 조리 있고 입체적인 문장과 기호 단서로 치환하는 장면입니다.

분석 촉진 조건 구성 코드:

참조 소스 파일: backend/app/routes/videos.py (Line 335)

raw_text = pegasus_analyze_video(
    s3_uri,
    get_video_analysis_prompt(),
    temperature=0,
)
log.info("[ANALYSIS] Pegasus response received in %.1fs (len=%d)", time.perf_counter() - t0, len(raw_text or ""))
analysis_dict = parse_video_analysis_response(raw_text)

배치된 추론 전용 지령(전체 선언 원문 보기)은 Pegasus에 다음과 같이 디테일하게 행동 요강을 매깁니다:

  • 영상 전개 흐름 분류 수립 (교통 상해 사건, 작업장 안전 불이행, 주거 침입 범죄 유형 매칭 등)

  • 사건 현장 위험 정도 진단서 및 가중 불안 요소 선별 기재

  • 정확히 시간 마크와 연계된 소장 자막 데이터 스트림 정리

  • 등장 핵심 수색 대상 가용한 형태 세부 외형 특색 주석화

  • 법적 고발 소장에 당장 마크해 명시할 수 있는 고품격 사실적 사건 정황 복구 요약

예외 방어 가공 로직 구현: parse_video_analysis_response() 는 혹시 다중 텍스트 해석 진행 단계에서 깨진 문자 백틱 기호(```)나 이포크 처리 꼬리가 틀어진 JSON 불완전 수트 등을 세련된 내부 정규 필터로 자가 교정 및 방어(Regex recovery)하여 백엔드가 뚝 끊기거나 다운되는 버그들을 완전 보증 차단해 줍니다.

음성 정보 타임라인 자막 추출: 미디어 전체 음향 음역에서 수다스런 현장 발화 분석 전반을 완전 전용 Pegasus 모듈로 가속해 내고, 구조적 타임스탬프 JSON 포맷으로 완결 추출하므로 조사관이 클릭 한 번에 피의자 주요 육성 순간을 청취 확인하도록 배려합니다.


3.2 - 현장 감지 물체 일치 확인 및 인물 중요 프레임(Keyframe) 인텔리전트 가공

단순 스크립트 작성에 그치지 않고, 당 플랫폼은 인공지능 영상 분석기로 가장 가치 유효한 인물 중요 프레임(얼굴이 또렷하게 잡혀 피의자 특정이 가장 뛰어난 소중한 결정적 인물 컷)을 영리하게 선점하여 알려줍니다.

참조 소스 파일: backend/app/routes/videos.py (Line 707)

raw_response = pegasus_analyze_video(s3_uri, get_detect_prompt())
log.info("[INSIGHTS] Pegasus response received in %.1fs (%d chars)", time.perf_counter() - t0, len(raw_response or ""))

detect_data = parse_detect_response(raw_response)
objects_raw = detect_data["objects"]
face_keyframes = detect_data["face_keyframes"]

중요 추출 촉진 지령(전체 선언 원문 보기)은 Pegasus 개발 모델에 다음 핵심 가치를 연쇄 수집하게 주문합니다:

  • 현장 물건 단서: 도주 용무 차량 모델, 살상 가능 둔기/물건, 잔해 조각, 날씨 시안성 등

  • 또렷한 얼굴 사진 프레임 타취: 미묘한 흔들림이나 그림자가 걷혀 당장 수배 전단에 올려도 신원 대조가 완벽한 결정적 노출 시점을 타임 마킹

키프레임(Keyframe) 가치 극대화가 필요한 확실한 설계 근거: 얼굴이 지나간 수천 개 무비 시퀀스가 다 쓸모 있진 않습니다. 뒷모습만 남았거나 뒤집어진 화면, 안개가 잔뜩 낀 뿌연 프레임은 전혀 법적 증명용 대조 사진 자격이 없습니다. Pegasus 인공지능이 영리하게 광원 분포와 윤곽 정향성을 파악해 전면 주시, 무노이즈 스냅숏 순간만 마크해 기재해 줍니다. 수사진이 돋보기로 타임라인 수천 리를 직접 들여다보며 스크린샷 노고를 반복하던 굴레가 대폭 해결됩니다.

결과 가공 보증: 타격 확인된 대상 얼굴 키프레임과 물건 데이터셋이 떨어지면, 백엔드 내부 워커 즉시 해당 영상 해당 마이크로 단위 프레임 이미지 조각을 오프라인 기기 공간에 크롭 추출하고 썸네일 파일로 저장 처리해 줍니다. 조사원이 타임 무비를 켤 때 매 프레임 재연산해야 하던 소모적 하드웨어 오버헤드가 단숨에 완전 사멸됩니다.


3.3 - 안면 포착 구간 시간선: 대상자가 언제 어디에서 발견되었는가?

추출 완료된 인물들의 얼굴 데이터를 바탕으로, 각 감시 인물이 동영상 처음부터 끝까지 구체적으로 어느 영역 시간 고리마다 나타나 머물렀는지 시각적인 상태 전개 시간선 그래프를 그려낼 수 있게 만듭니다.

참조 소스 파일: backend/app/routes/videos.py (Line 1027)

if use_marengo:
    # Marengo-based presence, match each face embedding to clip embeddings
    for j, emb in enumerate(face_embeddings):
        if not emb:
            continue
        clips = clips_above_threshold(
            emb,
            output_uri,
            min_score=FACE_PRESENCE_MATCH_THRESHOLD,
            visual_only=True,
            max_clips=50,
        )
        for clip in clips:
            c_start = float(clip.get("start", 0.0))
            c_end = float(clip.get("end", c_start + 0.5))
            for i in range(n_segments):
                s0 = i * seg_dur
                s1 = (i + 1) * seg_dur
                if c_end > s0 and c_start < s1:
                    presence_by_face[j]["segment_presence"][i] = 1

시간선 타임라인 지도 수립 구조 체계:

  1. 원 미디어 소스를 탐지하기 편하도록 일정 등분 기준(예: 30초 단위 인터벌 정합)으로 캡슐 분리

  2. 검출 후보 얼굴 임베딩 값들을 전체 감시 미세 비디오 클립 데이터들과 병행 연산

  3. 유사도 컷오프를 능가하는 우수 등급 검증 클립들을 "인물 탐지 성립"으로 참 분류

  4. 유효 일치 마킹된 조각들을 앞서 그어둔 30초 등분 배열 시간 척도 구간 위에 사상 매핑

  5. 결과물: 특정 피의자가 언제 들어왔다 사라졌는지 한눈에 뵈는 이진 온/오프 상태 시간 그래프 완성

이것이 왜 실무 수색 업무 효율성을 바꾸는가: 수사진은 더는 답답하게 자리를 지키며 타임라인을 몌움선처럼 더듬지 않아도 됩니다. 직관적으로 "피의자는 3구간, 7구간, 12구간 그리고 18구간에서만 도합 4회 잡혔습니다"를 먼저 읽고, 해당 슬롯인 7구간을 터치 이동해 곧장 30초간의 결정적 비주얼 검증을 마무리 지으면 탐지가 완결되기 때문입니다.

민감 필터의 조화로운 구성: FACE_PRESENCE_MATCH_THRESHOLD가 수사 감도를 칼날같이 통제합니다. 임계값을 지나치게 옭아매면 빛 노출 변경에 시달린 유효한 찰나를 다 누락해 내고, 느슨히 주면 허수가 치솟습니다. 이번 제공 소프트웨어 기본값은 0.70으로 매핑 배치되었으며, 엔터프라이즈 환경에서는 케이스 사안별로 수사진이 유연하고 정밀히 보정 조정 가능하도록 설계하는 것이 옳습니다.


엔터프라이즈 런칭을 위한 운영 실무 제언

이 자습서 데모 앱은 기술의 실제 완벽성을 성공적으로 검증했습니다. 제품 상용 시장(Production)에 대동하며 시스템을 구축할 때는 아래 세밀한 현실 지표들을 영리하게 공략해야 합니다:

  1. 대용량 확장 아키텍처(Scalability): 단일 인덱싱 구성은 데모 레벨(영상 12개)에선 민첩하지만, 일반 경찰서 대규모 수사(단일 사건에도 비디오 1,000개 이상)가 쇄도하면 설계 변경이 요구됩니다. 인덱스 단계를 지능적으로 파티셔닝 구조로 쪼개거나, 전문적인 엔터프라이즈 벡터 데이터베이스를 하단에 긴밀히 연결해 분절된 미세 클립들을 유효 수렴 전적 보존하도록 고도화하십시오.

  2. 연산 인프라 지출 조율(Cost management): Bedrock 환경은 가공되는 임베딩 건수만큼 자이언트한 비용 산정 모델이 엮입니다. 2시간짜리 하나에도 1,200여 임베딩 묶음이 나오니 한 케이스에 100시간씩 대기한다면 6만 개 전개가 도래합니다. 유연한 배치 그룹 전개 루틴 마련과 검증 완료된 대형 임베딩들의 로컬 캐싱 재활용 기법을 타이트하게 활성화해야 실 운영비를 절감합니다.

  3. 사법 보안 준수 체계 수립(Security and compliance): 사법 처리에 활용되는 일체의 정보 파일들은 훼손 없는 추적 이력(Chain-of-custody), 엑세스 차단 정책 및 무단 위변조 감지 로그 파일 유지가 생명과도 같습니다. S3 버킷 내 정물이 보존될 때 강력하게 종단간 암호화(Encryption at rest) 조치 적용과 세분화된 권한 통제 롤(IAM Role Level), 한 번 쓰이면 변조 불가능한 감사 이력 블록 체계(WORM, immutable audit trail)를 함께 덧끼우십시오.

  4. 검출 신뢰성 이중 휴먼 인증 장치 마련: 자동 산출된 얼굴 데이터나 완성 타임라인 전개도는 결정적 조서 보완 수배용 법적 공식 문서에 오르기 전 '분류 확정도(Confidence score)' 단계 표기와 수사 전문가의 마우스 수동 확인/컨펌 워크플로를 반드시 징검다리로 끼고 작동해야 합니다. 인공지능 영상 분석기는 업무 수고를 극적으로 돕는 비서이지, 최종 결과에 책임을 정해 법을 내리는 주체가 결코 아닙니다.

  5. 다양한 동영상 규격 무중단 변환 관리: 실 데모 제품은 온전한 비디오 코덱(Standard format) 구동을 근거해 달립니다. 하지만 상용 망에서는 깨지거나 전송 상태가 왜곡된 기괴한 레거시 카메라 녹화본, 인코딩이 비정상적인 독점 보안 전용 형식, 저해상도로 뭉개진 증거 수집물들도 매끄럽게 소프트 변환할 수 있는 트랜스코딩 중화 파이프라인 처리가 필수 전제입니다.


맺음말

이번 완성도 높은 자습서 애플리케이션은 첨단 비디오 지능형 분석 기법이 시간 낭비에 가깝던 전통 사법 분석 수작업 단계를 스마트 선별 수사 작업으로 전폭 대전환 시키는 실질 패러다임을 극명히 증명합니다. AWS Bedrock을 거친 지능 화신 TwelveLabs 비전 아키텍처와 NeMo Retriever 도서 탐지 기법의 슬기로운 멀티 결합으로, 일선 수사 전문팀은 이제 즉각적으로 다음과 같은 미래형 성능을 누립니다:

  • 자연어 타이핑 한 번만으로, 12가지 다른 기종 기기 감시 영상들을 동시 통합 섭렵 조사

  • 단 하나의 전면 얼굴 사진으로 다른 채널 상의 이동 동선을 연속적 일치 검출

  • 파편화된 채널 영상물로부터 일사불란한 전개 타임라인을 원패스 기동 및 복각

  • 위험 범주 진단이 적용된 고품격 시정 조치 보고서 기획 및 일괄 자동 완성 수립

  • 클릭 즉시 발화 시점으로 뛰어넘는 고효율 인터 타임스탬프 인공지능 음성 추적 자막 획득

성공적 효율성 지표의 대격변: 단 한 단서 발굴을 목적하더라도 과거 40시간 이상 한 자리에 붙박혀 관찰하던 피로 수하 경로가 약 4시간의 신속 지목 조사 형태로 전폭 압축되어 환골탈태합니다. 무가치한 시간 낭비는 사라지고, 수사진은 식별해 낸 핵심 결점 단서의 적합성을 유려히 재확인하는 정량 가치 판단 업무 본질에 온전한 열정을 귀속할 수 있습니다.

사법 증거 통제 솔루션을 개발 중인 보안 및 리걸테크 소프트웨어 선도 벤더사(ISVs)에 이르기까지, 이 고급 설계 매뉴얼은 기존 개발 아키텍처를 뒤흔들거나 처음부터 완전히 다시 쓰지 않고도 세련되게 TwelveLabs의 위대한 영상 정밀 독해 기능을 온전히 스며들게 하는 실전에 가장 유용한 청사진이 됩니다. 단일 인덱스로 풀어낸 멀티 촬영 데이터 수렴과 비디오에 보고서 문서를 결착한 하이브리드 지식 발췌의 모든 능력은 비즈니스 출시 법률 시장 제품에서 곧바로 최강의 위용을 선사할 것입니다.


추가 참조 도움 문서 리스트

  1. AWS Bedrock 상의 TwelveLabs 솔루션 가이드: 전용 추론 모델 연결 매뉴얼 자세히 알아보기

  2. NeMo Retriever 개발 문서 라이브러리: 풍부한 대규모 조서 파일 하이브리드 검색 기법 알아보기

  3. TwelveLabs 우수 활용 실무 구현 사례집: 다른 버티컬 엔터프라이즈 모범 성공 방안들 더 둘러보기

  4. TwelveLabs 글로벌 오픈 개발자 교류회: 공식 Discord 커뮤니티 참여하기


지금 시작해야 할 다음 실행 스텝:

  1. 전체 코드가 예쁘게 안착한 핵심 완성 레퍼런스 코드 소스 저장소 클론받기

  2. 보유 세팅 완료된 AWS Bedrock를 가동한 뒤 테스트 미디어 클립을 주입하여 기동성 테스트

  3. 유려한 단일 인덱스 멀티 피드 패턴 설계를 지향하는 실무 수색 기획에 커스텀 적용

  4. 실제 사용 중인 경찰 수사/법무 법인 법률 사건 관리 파이프라인에 영리하게 최종 배포

소개

영상 증거 자료를 처리하는 법률 팀은 날로 심각해지는 문제에 직면해 있습니다. 단 하나의 사건만 하더라도 대시캠, 바디캠, CCTV 시스템, 도어벨 카메라, 보험 제출 자료 등에서 확보한 40시간 이상의 영상이 포함될 수 있으며, 형식이 다르고 해상도도 제각각이며 타임스탬프도 일치하지 않습니다. 조사관들은 이 수많은 콘텐츠를 수동으로 검토하기 위해 보조 법률 전문 인력 비용으로 시간당 200~500달러를 사용합니다. 7번 카메라 피드의 23시간째 분량에 묻혀 있는 결정적인 10초짜리 클립 하나를 놓친다면 사건의 결과가 완전히 바뀔 수 있습니다.

기존의 방식(수동 검토, 기본적인 메타데이터 태깅, 프레임 단위 분석)으로는 감당이 되지 않습니다. 법률 팀은 서로 다른 소스 전반에서 동시에 검색하고 파편화된 영상에서 타임라인을 재구성하며, 모든 비디오를 일일이 시청하지 않고도 핵심적인 순간을 식별할 수 있어야 합니다.

본 자습서에서는 비디오 인텔리전스를 위한 AWS Bedrock 기반 TwelveLabs 기법과 문서 검색용 NVIDIA NeMo Retriever 모델을 사용하여 법적 증거 조사 플랫폼을 구축하는 방법을 설명합니다. 결과적으로 조사관은 자연어 쿼리(예: "빨간색 세단 차를 찾아줘" 또는 "인물이 건물로 들어온 시점을 보여줘")를 가지고 12개 비디오 소스를 동시에 검색하고, 정확한 타임스탬프가 매겨진 검색 결과 목록을 받아보며, 며칠씩 걸리던 구체적인 규정 주소 준수 분석서 작성을 단 수분 만에 완료할 수 있습니다.

개발 결과물: 복합 형식 폐쇄회로 화면(CCTV)을 수집하고, 다중 소스 간 시맨틱 검색을 제공하며, 보안 규정 분석을 자동 수행할 뿐만 아니라 서로 다른 비디오 소스로부터 시간순 타임라인을 결합해 내는 다중 소스 증거 분석 조사 시스템을 완성하게 됩니다.

중요 효율성 개선: 40시간이 소요되던 증거 자료 수동 검토 시간이 단 4시간의 표적 조사로 대폭 축소됩니다.

여기에서 관련 데모 버전을 먼저 체험해 보실 수 있습니다: 법가 증거 분석 조사 서비스 데모 애플리케이션

아래에서 소스 코드를 확인해 볼 수 있습니다: GitHub 소스 저장소


데모 애플리케이션

이번 데모는 여러 비디오 소스의 통합 검색, 정밀한 타임스탬프 기반 탐지, 정규 양식에 맞춘 보안 위험 규정 분석, 상세 조사를 돕는 양방향 질의응답 기능 활용 등 실무 분석 작업을 본 플랫폼이 어떻게 구체적으로 수행하는지 제시합니다.

구현된 주요 핵심 기능:

  • 12가지 이상 혼합된 형식 속 멀티 소스 통합 검색 지원

  • 개체 추적 (전체 자료에서 특정 피의자나 도주 차량을 추적 검색)

  • 위험 범주 분류를 포함한 법규 분석 보고서 자동 생성

  • 시간 흐름에 따른 사건 전개 단계별 정밀 타임라인 재구성

  • 타임스탬프 연계를 갖춘 지능형 비디오 대화식 Q&A 기능


시스템 아키텍처: 단일 인덱스 멀티 소스 설계가 중요한 이유

본 개발 시스템의 설계 구조 결정 시 다음 사항의 해결이 핵심이었습니다. TwelveLabs 검색 엔진은 인덱싱 레벨 단위로 작동합니다. 즉 특정 비디오가 아닌 하나의 인덱스(색인 공간)를 통째로 검색한다는 의미이며, 이 부분이 전체 설계를 좌우합니다.

그다지 좋지 못한 접근 방식은 개별 비디오 파일마다 인덱스를 하나씩 생성하여 관리하는 것입니다. 이 경우 당장 한 인물을 12개 채널 카메라에서 찾으려 한다면 12개의 검색을 실행한 후 결과 값을 애플리케이션 내에서 수작업으로 머지하고 조율해야 하므로 속도가 무척 느려지고, 유지 관리가 취약해집니다.

훨씬 정교한 모범적 방식은 '단일 인덱스 기반 멀티 소스 통합 전략'입니다. 전체 분석용 증거 비디오를 단 하나의 TwelveLabs 인덱스에 넣되, 메타데이터 태그를 풍부히 엮어 고유의 출처를 확보하는 방법입니다. 검색창에 질의 한 번이면 복수 채널 전체가 동시에 기동됩니다. 영상별 연관성에 맞게 정렬된 결과 값이 나오며 메타데이터 필터를 응용해 세부 검색("바디캠 영상만 검색" 혹은 "메인 스트리트 위치 카메라 검색")도 곧바로 적용할 수 있습니다.

핵심 아키텍처 모듈:

  1. 비디오 인제스천 파이프라인: 복수 촬영본 S3에 저장 → Bedrock을 거쳐 twelvelabs.marengo-embed-3-0-v1:0 모델로 색인 생성 → 식별 메타데이터와 결합해 멀티모달 임베딩 형태로 저장

  2. 문서 인제스천 파이프라인: 사건 조서 PDF 텍스트 추출 → 스마트 분절 수행 → nvidia/llama-nemotron-embed-vl-1b-v2 기반 임베딩 → 문서 인덱스로 적재

  3. 하이브리드 정보 추출 레이어: 비디오 임베딩(Marengo)과 문서 조각(NeMo) 병렬 입체 검색 → 검색 결과의 조화로운 결합 → 사용자 화면에 맞춘 단일 응답 표출

  4. 분석 및 평가 엔진: twelvelabs.pegasus-1-2-v1:0 기반 보고서 작성. 영상 제목, 위험 등급, 탐지 차량/개체 종류, 인물 포착 구간, 음성 텍스트 자막 포함

  5. 인터랙티브 대화 프레임: 타임스탬프 클릭 이동이 지원되는 정밀 비디오 Q&A 레이아웃

단일 검색 시 반응 속도는 12개의 중밀도 비디오 연산 환경에서도 3초 미만으로 단축됩니다. 인덱스 검색 최적화로 처리 시간을 극적으로 줄였습니다.


사전 준비: 개발 시작하기 전에


1 - TwelveLabs 모델 이용을 위한 AWS Bedrock 활성화

다음 구성을 충족하는 AWS 사용자 권한(Credentials)을 발급받으십시오:

  • Amazon Bedrock 사용 권한과 특정 모델 활성화 상태

  • 비디오 전용 스토리지 및 Bedrock 비동기 처리 파일 아웃풋 설정을 위한 S3 권한

  • Bedrock으로 호출 가능한 아래 TwelveLabs 인공지능 모델 엑세스 권한:

    • twelvelabs.marengo-embed-3-0-v1:0 (멀티모달 비디오 분석용 임베딩 모델)

    • twelvelabs.pegasus-1-2-v1:0 (고등 영상 분석 및 서사 추론 기능)

이 전용 모델들이 귀중한 이유: Marengo는 영상 이미지 구조를 정확한 벡터 표현 공간으로 전환하는 훌륭한 엔코더 역할을 하고, Pegasus는 이를 구조화하여 지적 해석을 덧붙이는 인터프리터 임무를 맡습니다. 비디오 구조화와 시각 데이터 번역 및 인물 심층 인식이 동시에 균형을 이루어야 법률 조사 업무에 바로 투입될 수 있습니다.


2 - S3 버킷 설정 및 구조화

다음 용도로 사용할 동일 S3 버킷 환경을 준비해주십시오:

  • 사건 영상 분석 아카이브 및 원본 스토리지

  • Bedrock 비동기식 임베딩 생성을 위한 전용 아웃풋 폴더 (일괄 업로드 처리 시 강제 필수 요건)

  • 자동 추출된 썸네일 파일 및 분석 중간 산출물 보관

  • 참조가 필요한 텍스트 및 조서 문서 스토리지

S3 스토리지 연관 중요성: Bedrock 비동기 API 모델은 기본 입출력을 직접 S3 버킷 디렉터리를 통해 수행합니다. 또한 이는 하드웨어 부하 걱정 없는 대용량 멀티 인제스천 환경의 단단한 주춧돌이 됩니다.


3 - NVIDIA 개발 포털 인증키 발급

아래 모델 개발 접근을 위해 NVIDIA API Key를 발급받으십시오:

  • nvidia/llama-nemotron-embed-vl-1b-v2 (다양한 텍스트 파트 조각화 임베딩 전용 개발)

왜 NeMo Retriever인가: 완벽한 법적 증거는 영상만으로 입증되지 않습니다. 보조 경찰 보고서, 현장 자술서, 진술 기록 등이 영상 데이터와 입체적으로 결합해야 합니다. TwelveLabs를 거친 동영상 비전과 NeMo의 대형 문서 검색을 종합 매칭하여 진정한 픽셀-문헌 다차원 하이브리드 검색망을 실현합니다.


4 - 저장소 클론 및 설정 복제

git clone https://github.com/Hrishikesh332/tl-compliance-intelligence
cd

우선 백엔드 런타임 환경 구성 파일인 .env.example 문서를 그대로 복제해 세팅하십시오:

  1. AWS 접근 인증 정보 입력 (Access Key ID, Secret Access Key 및 활성화 리전 정보)

  2. 대상 S3 버킷 설정 이름 및 Bedrock 출력 위치 폴더 경로 지정

  3. 발급된 NVIDIA API Key 등록

  4. 인덱스 설정 및 정합 정확성 유사도 컷오프 값(Threshold) 등 어플리케이션 옵션 값 입력


핵심 코드 구현 심층 탐구


파트 1: 비디오 적재 및 다차원 임베딩 생성

이 인제스천 파이프라인은 업로드된 감시 카메라 화면 데이터를 검색 가능한 최적의 임베딩 데이터로 변환합니다. 수 시간 분량 영상의 긴 분석 시간 동안 사용자 인터페이스가 멈추지 않도록 비동기 배치 형태로 작동하게 설계합니다.


1.1 - Marengo 비동기 임베딩 생성 명령 호출

비디오 파일 업로드가 완료되면 본 백엔드가 파일 자체를 즉각 S3에 넣고 Bedrock 비동기 프로세스 처리 요청을 바로 전송합니다.

참조 소스 파일: backend/app/services/bedrock_marengo.py (Line 111)

def start_video_embedding(
    s3_uri: str,
    output_s3_uri: str,
    bucket_owner: str | None = None,
) -> dict:
    client = get_bedrock_client()
    owner = bucket_owner
    body = {
        "inputType": "video",
        "video": {
            "mediaSource": media_source_s3(s3_uri, owner),
            "embeddingOption": ["visual", "audio"],
            "embeddingScope": ["clip", "asset"],
        },
    }
    resp = client.start_async_invoke(
        modelId=MARENGO_MODEL_ID,
        modelInput=body,
        outputDataConfig={"s3OutputDataConfig": {"s3Uri": output_s3_uri}},
    )
    return {
        "invocation_arn": resp.get("invocationArn", ""),
        "status": "pending",
    }

파라미터 embeddingScope: ["clip", "asset"] 설정의 핵심 의미: 이 구조는 다음과 같이 두 갈래 차원에서 정밀 임베딩 벡터를 함께 만듭니다.

  • 클립형 임베딩 (단위: 6초 미세 세그먼트): 고도로 현미경 타임라인을 파고들어 대상자가 포착된 8초짜리 짧은 순간을 기가 막히게 추적해 줍니다.

  • 에셋형 임베딩 (전체 소스 요약본): 멀리서 숲을 보듯, 비디오의 구조적 특징과 전개 흐름 자체를 대변하는 유사도 검출 기능을 지원합니다.

두 구조 모두 필요합니다. 클립 단위 검색은 정교한 시간대 추적을, 에셋 임베딩은 '유사 행동 유형을 보유한 연관 감시 파일 찾기' 업무를 가속화합니다.

이 비동기 연산 기법의 타당성: 2시간 상당의 영상에서 무려 1,200개의 세세한 클립 벡터(2시간을 6초 단위 분할)가 추출됩니다. 대단히 무거운 작업이기에 백그라운드 환경에서 유연히 전개되어야 수십 개 파일이 동시 투입되어도 앱 오류 없이 부드럽게 임베딩 작업을 마무리할 수 있습니다.


1.2 - 백그라운드 로직 큐와 실행 상태 중단점 폴링

완료 확인 스레드는 메모리 대기 흐름(Queue)을 늘 매끄럽게 관리하며 Bedrock 처리 서버에 연산이 끝났는지 상시 무중단 확인을 시도합니다.

참조 소스 파일: backend/app/utils/video_helpers.py (Line 104)

while True:
        job = bedrock_queue.get()
        task_id = job["task_id"]
        s3_uri = job["s3_uri"]
        output_uri = job["output_uri"]
        filename = job["filename"]
        meta = job["meta"]
        log.info("[QUEUE] Processing Bedrock start for %s (%s)", filename, task_id)
        success = False
        for attempt in range(1, max_retries + 1):
            try:
                result = start_video_embedding(s3_uri, output_uri)
                arn = result.get("invocation_arn", "")
                log.info("[QUEUE] Bedrock started for task_id=%s", task_id)
                video_tasks[task_id]["status"] = "indexing"
                video_tasks[task_id]["invocation_arn"] = arn
                video_tasks[task_id]["output_s3_uri"] = output_uri
                for rec in vs_index():
                    if rec.get("id") == task_id:
                        rec.setdefault("metadata", {})["status"] = "indexing"
                        break
                vs_save()
                with bedrock_poller_lock:
                    bedrock_poller_jobs.append({
                        "task_id": task_id,
                        "invocation_arn": arn,
                        "output_s3_uri": output_uri,
                        "started_at": time.monotonic(),
                    })
                success = True
                break

해당 구현 소스의 기능: 대기열 연산 모듈이 진행 상태를 "색인 중(indexing)"으로 치환하고 분석 추적에 꼭 필요한 AWS Bedrock 고유 고리인 ARN 값을 캐싱 보관 처리합니다. 이후 모니터링 폴링 루프 스레드가 30초의 여유 주기마다 점검하며 S3 결과 객체가 무사 복원되면 상태를 최종 "ready"로 변경합니다.

재시도(Retry) 설계가 특히 중요한 이유: 클라우드 연산 처리에는 일정한 사용량 제한과 호출 임계치가 있습니다. 지수 백오프 방식의 우아한 안전장치는 업로드 피크 상황이 집중되더라도 작업들이 버려지지 않고 뒤이어 순차 수행되도록 견고히 잡아줍니다.

데이터 설계 패턴 장점: 촬영 인물 얼굴 정보와 동영상 자원 임베딩은 모두 복합 단일 인덱스 한 군데 저장하되 다형 속성 태깅 분류 기법을 넣습니다. 다만 대규모 조서 텍스트 데이터는 별도의 조각화 전담 인덱스로 이화합니다. 이로써 영상과 용무 인물 검색 연산 속도는 한 번에 끌어올리고 대용량 문서 처리는 간소하게 우회할 수 있습니다.


1.3 - 지능형 문단 의미 분석을 적용한 PDF 텍스트 주입

보고서 문서는 비디오 파일과는 다릅니다. 이 시스템은 법률 조서 문서들을 의미론적인 세부 문단(텍스트 단락 단위)으로 입체 구조 분할한 뒤, NeMo 로직을 적용해 검색 가능한 레코드로 차곡차곡 임베딩 처리합니다.

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 688)

def ingest_document(file_path: str, doc_id: str, filename: str) -> dict:
    extra: dict = {}
    try:
        pdf_info = store_pdf_document(file_path, doc_id)
        extra.update(pdf_info)
    except Exception as exc:
        log.warning("Could not persist PDF for %s (%s)", doc_id, type(exc).__name__)
    ext = os.path.splitext(file_path)[1].lower()
    chunks: list[str] = []
    sections: list[str] = []
    if ext == ".pdf":
        try:
            pairs = split_into_semantic_chunks(file_path)
            sections = [s for s, _ in pairs]
            chunks = [t for _, t in pairs]
            log.info("Smart PDF chunking produced %d chunks for doc %s", len(chunks), doc_id)
        except Exception as exc:
            log.warning("Smart PDF extraction failed for doc %s, falling back to NeMo (%s)", doc_id, type(exc).__name__)
    if not chunks:
        chunks = extract_document(file_path)
    if not chunks:
        log.warning("No content extracted for doc %s", doc_id)
        return {"doc_id": doc_id, "chunks": 0, "status": "empty"}
    embeddings = embed_texts(chunks)
    add_chunks(
        doc_id, filename, chunks, embeddings,
        sections=sections or None,
        extra_metadata=extra or None,
    )
    return {"doc_id": doc_id, "chunks": len(chunks), "status": "ready"}

스마트 분할 전략: 먼저 단락 및 타이틀 마킹 기준으로 세부 내용을 구분하는 '섹션 분해 분절 기법'을 씁니다. 이게 불가능한 평문 문서 등은 문장 및 단락 카운트 방식으로 완충 분할합니다. 이는 문서 자체의 계통 정보("사건 타임라인 일지", "증언 발췌록" 등)가 추적 시 고도로 가치 있는 맥락 단서가 되는 사법 증거 분류 환경에서 필수입니다.

AI 임베딩 모델 선택: nvidia/llama-nemotron-embed-vl-1b-v2 기법은 각 개별 문단에 가장 깊은 차원의 특징 벡터 값을 매겨내어 파일 전체 매치 대신 맥락 단위의 정교한 매칭 적합성을 확실하게 확보합니다.

메타데이터의 완전한 보전: 추출 완료된 각 주입 조각은 원본 PDF 소스 파일 경로 및 소제목 정보가 함께 꼬리표로 묶입니다. 따라서 조사관이 질의창에 검색하면 실제 조작문 속 원본 단락 위치로 한 클릭 이동이 가능해집니다.

NVIDIA API 전송 임베딩 구현 구문:

참조 소스 파일: backend/app/services/nemo_retriever.py (Line 515)

def embed_via_requests(texts: list[str], input_type: str) -> list[list[float]]:
    """Call NVIDIA embeddings API directly with requests"""
    import requests
    t0 = time.perf_counter()

    resp = requests.post(
        "https://integrate.api.nvidia.com/v1/embeddings",
        headers={
            "Authorization": f"Bearer {NVIDIA_API_KEY}",
            "Content-Type": "application/json",
        },
        json={
            "input": texts,
            "model": EMBED_MODEL,
            "encoding_format": "float",
            "input_type": input_type,
        },
        timeout=60,
    )
    resp.raise_for_status()
    data = resp.json()
    vectors = [d["embedding"] for d in data["data"]]
    first_dim = len(vectors[0]) if vectors else 0
    return vectors

핵심적인 input_type 제어 요소: NeMo 기술은 백엔드에 영구 색인하는 데이터인 "passage"와 일반 조사관이 타이핑하는 "query" 요소를 정확히 갈라 설계합니다. 데이터의 본 사용 목적과 쓰임 규격에 맞게 임베딩 공간 가중치를 보정해 주므로 훨씬 정합도 높은 정밀 비교 검색이 구현될 수 있습니다.


1.4 - 감시 대상 용무 인물 사진 기반 검색 레코드 확보

현장 수사용 기능에는 특정 용무 인물(CCTV 포착 대상)을 여러 감시카메라 화면에서 통시 검색하는 기능이 중추를 이룹니다. 대상자 단 한 장면의 얼굴 스냅샷 사진으로부터 검색용 임베딩 코드를 가공해 냅니다.

얼굴 이미지 임베딩 처리 루틴:

def embed_image(media_source: dict) -> list[float]:
    return invoke_embedding_model({
        "inputType": "image",
        "image": {"mediaSource": media_source},
    })

Marengo의 전용 이미지 임베딩 파이프라인은 얼굴 형상 및 실루엣 세부 특징을 비주얼 지표 형태로 번역해 줍니다. 텍스트 정보가 전무하더라도 이 정합적 수치들 덕에 어둡거나 구도가 틀어진 실제 고해상도 CCTV 무비 프레임 속 한가운데서도 동일 대상을 놀라울 만큼 민첩하게 매칭시킵니다.


얼굴 조각 이미지 수집 엔드포인트:

@entities_bp.route("/entities/from-image", methods=["POST"])
def api_entities_from_image():
    if "image" not in request.files:
        return jsonify({"error": "No 'image' file provided"}), 400

    file = request.files["image"]
    if file.filename == "":
        return jsonify({"error": "Empty filename"}), 400

    data = request.form or {}
    name = data.get("name") or (request.get_json(silent=True) or {}).get("name") or ""
    if not name.strip():
        return jsonify({"error": "Missing 'name'"}), 400

    image_bytes = file.read()
    faces = detect_and_crop_faces(image_bytes, min_confidence=ENTITY_FACE_MIN_CONFIDENCE)
    if not faces:
        return jsonify(
            {"error": "No face detected in image. Use a clear, front-facing photo with good lighting."}
        ), 404

    best = faces[0]
    face_b64 = best["image_base64"]
    embed_b64 = best.get("embedding_crop_base64") or face_b64

    import base64

    face_bytes = base64.b64decode(embed_b64)
    media = media_source_base64(face_bytes)

    try:
        embedding = embed_image(media)
    except Exception:
        return jsonify({"error": "Internal server error"}), 500

    entity_id = name.strip().lower().replace(" ", "-")
    rec = index_add(
        id=entity_id,
        embedding=embedding,
        metadata={"name": name.strip(), "face_snap_base64": face_b64},
        type="entity",
    )

    return jsonify(
        {
            "indexId": FIXED_INDEX_ID,
            "entity": {"id": rec["id"], "name": name.strip()},
            "face_snap_base64": face_b64,
        }
    )

정밀 전처리 단계: OpenCV 라이브러리의 ResNet10 SSD 얼굴 모듈을 얹어 배경 노이즈를 쳐내고 실제 인물 페이스 구역만 지능형 크롭하여 Marengo에 밀어 넣습니다. 흐릿한 대규모 원경 풍경을 정제해 주므로 정확도 매칭 성공률이 극한으로 올라갑니다. 신뢰성이 높은 상위 고품격 얼굴 데이터만 가공되도록 임계치 필터 필터링도 활성화했습니다.

비디오 인덱스 저장 패턴 장점: 인물 구조 임베딩과 연관 영상을 동일한 데이터베이스 저장소 공간에 병치하기 때문에, 다회 회전 연산 필요 없이 대단히 빠른 원패스 비교 매칭이 실행됩니다. 수사관이 검색어 하나를 대는 그 즉시 유사 비교 판단이 끝나며 일치 장면을 일목요연하게 찾아냅니다.


파트 2: 멀티 소스 교차 수색 및 정보 추출

수집 완료 시 조서 파일과 촬영 영상물 전체를 유기적으로 한 검색란에서 넘나들 수 있습니다. 이것이 단일 인덱스 멀티 소스 기법이 안겨주는 독보적 사용자 경험 유용성입니다: 단 하나의 핵심 질의, 통합된 고속 탐지 결과.


2.1 - 복합 임베딩 기반 비디오 수치 검색 구현

하나의 탐색 상자 안에서 세 유형의 직관적 검색 경험 방식을 함께 제공합니다:

  1. 텍스트 기반 수색: 자연스러운 언어로 표현할 수 있는 인물 행동 묘사 ("붉은 패딩을 입은 사람")

  2. 이미지 업로드 검색: 확보한 용무 인물 사진이나 일치 단서 파편 등록 및 흔적 추적

  3. 메타 엔티티 조회: 이미 백엔드 환경에 사전 프로필 저장 완료된 키워드나 식별 인물 매칭

참조 소스 파일: backend/app/routes/search.py (Line 30)

def search_video_index(
    data: dict,
    *,
    request_query: str = "",
    request_top_k: int | None = None,
    image_bytes: bytes | None = None,
) -> tuple[list[dict], str, str | None]:

    query_emb, display_query, is_entity_search, err = get_search_embedding_from_request(
        data,
        request_query=request_query,
        image_bytes=image_bytes,
    )

질의 형태 정규화(Normalization): get_search_embedding_from_request() 메소드는 입력 질의 수단이 무엇이건 상관없이, 백엔드 내부 연산용 통합 비교 벡터 값으로 변환 처리해 줍니다. 텍스트 인제스천은 Marengo 텍스트 가속기를 타고 이미지 인풋은 비전 분석 수치로 변환되며, 엔티티 ID 역시 사상된 메모리 벡터 값을 곧바로 인용합니다. 아래 하류 검색 레이어는 그저 연산하기 편한 표준 단일 벡터 포맷만 바라보므로 유연하고 탄탄한 아키텍처가 유지됩니다.

타겟 인물 고속 매칭 조율 로직:

for r in results:
    meta = r.get("metadata", {})
    clips = []
    output_uri = meta.get("output_s3_uri") or f"{S3_EMBEDDINGS_OUTPUT}/{r['id']}"

    if is_entity_search:
        clips = clips_above_threshold(
            query_emb,
            output_uri,
            min_score=ENTITY_CLIP_MIN_SCORE,
            visual_only=True,
            max_clips=clips_per_video,
        )

    if not clips:
        clips = clip_search(
            query_emb,
            output_uri,
            top_n=clips_per_video,
            min_score=clip_min_score,
            visual_only=is_entity_search,
        )

결과 유사도 가중치 변별점: 얼굴 인식 매칭 작업은 visual_only=True 매개변수와 다소 높은 문턱 수준을 유지합니다. 흐리게 스쳐 지나간 다른 행인에 대한 오인 탐지를 엄밀히 차단하기 위함입니다. 문자 기반 텍스트 질의는 해당 대화 음성 자막 내용이나 전체 분위기에서 다각도로 힌트를 파악할 수 있지만, 인물 스물 한두 장면 비교는 오직 명확한 형태 보정값 비교(Visual-matching) 영역 내에서 수치 신뢰도가 검증되어야 정당한 법적 증거력이 유효하기 때문입니다.

마이크로 비디오 클립 지상 검증(Grounding):

out.append({
        "id": r["id"],
        "score": r["score"],
        "metadata": meta,
        "clips": clips,
    })

return out, display_query, None

최종 리턴 객체에는 정확히 어느 구간에서 그 용무 차량이나 도주 방향이 마킹되었는지 세밀하게 짚어 보여줍니다. 수조 관리가 "타겟 인물, 차량 정차 구간 포착"을 입력하면 다음과 같이 실시간 반환 처리가 끝납니다.

  • 영상 채널: "전면 도로 감시카메라 2A" → 연관 포착 장면 00:03:42-00:03:48, 00:07:15-00:07:21

  • 영상 채널: "주차장 측면 감시카메라 4B" → 연관 포착 장면 00:12:03-00:12:09

동영상 소스 전체를 미련하게 모두 돌려보며 인생을 지름길 없이 낭비하던 악몽에서 벗어나, 필요한 보조 썸네일과 일치 구간으로 날아갈 수 있는 놀라운 타임라인 핀포인트 탐지가 기동되는 찰나입니다.


2.2 - 얼굴 엔티티 맞춤형 비디오 수색: 다중 채널을 통한 인물 탐지

인공지능 다중 지능형 안면 분류 기법을 넣으면, 비전문가 조사관이더라도 단 한 번 인물 자료를 프로필에 올리는 수고만으로 모든 저장 경로 속 화면을 유기적으로 무중단 수색할 수 있게 됩니다.

전체 작동 개념:

  1. 인물 등록 단계에서 만들어둔 얼굴 특징 벡터 프로필 정보를 색인 영역(Index)에서 즉시 조회

  2. 클라우드 S3 저장 장소 내 준비된 전체 비디오 개별 클립 임베딩 가속 리스트 로드

  3. 매트릭스 연산을 활용해 인물 픽셀과 가장 높은 상관 비중을 나타내는 정확한 연관 구간 산출

  4. 이후 해당 탐지 매칭 결과 성공률을 계통 분포로 세우고 조사 보고서 연관 순위 전면 순차 정렬

수사관 런타임 수동 탐지보다 더 압도적으로 가속되는 특별한 이유: 업로드 및 수집 타임에 이미 동영상 6초 단위 핵심 벡터 가공 연산이 끝나 있으므로, 조사 화면에서 특정 피의자를 검색할 때는 오로지 단 몇 밀리초(ms) 단위의 팩터 유사도 계산만 일어납니다. 만 제곱 단위의 미세 픽셀들을 매번 인물 스티칭하며 고달프게 연산 연쇄 반응에 가두는 대신 한 손에 쥐어지는 벡터 정합 판단으로 우회할 수 있습니다.

신뢰성 컷오프(Threshold) 밸런싱 세부 팁: 감지 민감도를 직접 조정하는 ENTITY_CLIP_MIN_SCORE를 너무 엄격하게 지정하면 구도나 날씨 음영, 밤낮 시간에 따라 일부분 생김새가 가려진 핵심 단서를 모조리 흘리게 됩니다. 반대로 너무 느슨히 조절하면 옷 무늬가 좀 예스런 전혀 무관한 승객들이 오탐지에 가득차게 됩니다. 당사 기본 제안 설계 값은 균형 미가 돋보이는 0.75 포인트 라인이며, 현업 수사망 환경에서는 기획에 맞춘 수동 필터 슬라이더를 구성하는 것이 현명합니다.


2.3 - 하이브리드 검색: 영상 피드와 법적 진술 문서 조각의 통합 입체 정보 추출

증거자료란 미디어가 전부가 아닙니다. 형사의 필기 보고서, 주민 증언 전언, 손해사정서 일치 문서들이 그 옆을 영리하게 메워야 합니다. 본 프레임워크는 병렬 코루틴 구조를 활용해 비디오와 사건 텍스트 조사를 지체 없이 동시에 타격합니다.


문헌 조회 파트 세부 코드 소스:

def search_document_index(text_query: str, doc_top_k: int) -> list[dict]:
    from app.services.nemo_retriever import embed_query, search_docs
    t0 = time.perf_counter()
    log.info("[DOC_SEARCH] Started doc search top_k=%d", doc_top_k)
    query_emb = embed_query(text_query)
    docs = search_docs(query_emb, top_k=doc_top_k)
    return docs

동시 처리(Parallel processing) 설계 지향점: 하이브리드 수색 작동 루프는 파이썬 스레딩 기술을 십분 활용하여 문장 분석과 비전 연산을 낭비 시간 없이 동시에 발사 처리한 후, 둘 모두 로드되는 완결 즈음에 한곳에 유려히 모아 내보냅니다. 통상 둘의 대기 시간이 중첩되지 않으므로, 유저는 둘의 처리 시간을 단순히 합쳐서 기다리는 답답함 대신 둘 중 더 무거운 로직의 미세 구동 클록 수준으로 고속 반환된 화면 응답 결과를 전면 패널로 전달받습니다.

유려한 정보 병합 구성: 텍스트 정보 수색 결과와 미디어 검색 구역은 강제 병합되어 난수로 엉키지 않습니다. 성정이 다르기 때문에 UI 레이블에서 유용하게 구역을 쪼개 배치하도록 메타 객체를 예쁘게 보존해 리턴합니다. 영상은 객력 증명 요소로 살리며, 조서는 맥락을 밝히는 논거 흐름으로 각각 구분하여 모니터링해야 효율적 검안 분석이 원활히 이어지기 때문입니다.

이 하이브리드 검색의 심층 통합 전개 코드: 전체 아키텍처 보기


파트 3: 구조적 보안 준수 판단서 생성 및 전송

검색이 단서를 잡는 일이라면, 보고서 생성은 의미를 담아 규율에 보충하는 완성 프로세스입니다. 당사 플랫폼은 AWS Bedrock 하단 Pegasus 고속 인터프리터 모델을 결합하여, 유저가 마우스 한 번 올리는 명령만으로 고수준 보고서 데이터를 구조적 자산으로 즉각 수식해 가공해 줍니다.


3.1 - 동영상 정형 보고서 데이터 가공 기능 구상

Pegasus 가속 추론 프레임워크는 원초적인 픽셀 흐름을 법조인 눈높이에 적합한 '사법 지표'로 가꿔줍니다. 발견 피의자 리스트, 이상 징후 단계 분류, 전후 맥락 발언 일치 정형 테이블 등 알맹이 단서들의 완벽한 정리입니다.

참조 소스 파일: backend/app/services/bedrock_pegasus.py (Line 72)

body: dict = {
    "inputPrompt": prompt[:4000],
    "mediaSource": {
        "s3Location": {
            "uri": s3_uri,
            "bucketOwner": owner,
        }
    },
}
if temperature is not None:
    body["temperature"] = temperature
if response_schema is not None:
    body["responseFormat"] = {"jsonSchema": response_schema}

창의 비조정 세팅: 사건 분석 조사에서 temperature: 0 상수를 고정 부여하는 구조는 대단히 근본적이며 강한 가치를 안겨줍니다. 동일한 조사 대상 영상을 반복 진급 분석 시킬 때 매번 엉뚱하거나 요약 구조가 바뀌어 신뢰도가 파괴되는 상황을 완벽히 방탄 보호해 주고 일치된 사법 증거 해석 일관성을 선사합니다.

원형 스키마 억제(Schema Enforcement): jsonSchema 제어를 활용해 Pegasus로 하여금 난해하게 풀어진 장문의 자유 문단 대신 엄밀한 프레임워크 규산 JSON 테이블을 강제 반환하게 지령합니다. 연산 반환 속도가 월등히 정연해져 마켓에 투입 가능한 앱 프로덕트 개발 편의를 배가시킵니다.

Bedrock 플랫폼 Pegasus 인터프리터 런타임 활성 구현:

response = client.invoke_model(
    modelId=model_id,
    body=payload,
    contentType="application/json",
    accept="application/json",
)

반환된 결괏값 구조에는 AWS Bedrock 리치 응답 스트림 속에서 온전히 가공 처리된 고급 지식 원문이 깔끔히 매핑된 상태로 적대 제공됩니다. Pegasus가 사전에 학습된 비전 추론 모델 능력을 극대화하여 영상 현안을 조리 있고 입체적인 문장과 기호 단서로 치환하는 장면입니다.

분석 촉진 조건 구성 코드:

참조 소스 파일: backend/app/routes/videos.py (Line 335)

raw_text = pegasus_analyze_video(
    s3_uri,
    get_video_analysis_prompt(),
    temperature=0,
)
log.info("[ANALYSIS] Pegasus response received in %.1fs (len=%d)", time.perf_counter() - t0, len(raw_text or ""))
analysis_dict = parse_video_analysis_response(raw_text)

배치된 추론 전용 지령(전체 선언 원문 보기)은 Pegasus에 다음과 같이 디테일하게 행동 요강을 매깁니다:

  • 영상 전개 흐름 분류 수립 (교통 상해 사건, 작업장 안전 불이행, 주거 침입 범죄 유형 매칭 등)

  • 사건 현장 위험 정도 진단서 및 가중 불안 요소 선별 기재

  • 정확히 시간 마크와 연계된 소장 자막 데이터 스트림 정리

  • 등장 핵심 수색 대상 가용한 형태 세부 외형 특색 주석화

  • 법적 고발 소장에 당장 마크해 명시할 수 있는 고품격 사실적 사건 정황 복구 요약

예외 방어 가공 로직 구현: parse_video_analysis_response() 는 혹시 다중 텍스트 해석 진행 단계에서 깨진 문자 백틱 기호(```)나 이포크 처리 꼬리가 틀어진 JSON 불완전 수트 등을 세련된 내부 정규 필터로 자가 교정 및 방어(Regex recovery)하여 백엔드가 뚝 끊기거나 다운되는 버그들을 완전 보증 차단해 줍니다.

음성 정보 타임라인 자막 추출: 미디어 전체 음향 음역에서 수다스런 현장 발화 분석 전반을 완전 전용 Pegasus 모듈로 가속해 내고, 구조적 타임스탬프 JSON 포맷으로 완결 추출하므로 조사관이 클릭 한 번에 피의자 주요 육성 순간을 청취 확인하도록 배려합니다.


3.2 - 현장 감지 물체 일치 확인 및 인물 중요 프레임(Keyframe) 인텔리전트 가공

단순 스크립트 작성에 그치지 않고, 당 플랫폼은 인공지능 영상 분석기로 가장 가치 유효한 인물 중요 프레임(얼굴이 또렷하게 잡혀 피의자 특정이 가장 뛰어난 소중한 결정적 인물 컷)을 영리하게 선점하여 알려줍니다.

참조 소스 파일: backend/app/routes/videos.py (Line 707)

raw_response = pegasus_analyze_video(s3_uri, get_detect_prompt())
log.info("[INSIGHTS] Pegasus response received in %.1fs (%d chars)", time.perf_counter() - t0, len(raw_response or ""))

detect_data = parse_detect_response(raw_response)
objects_raw = detect_data["objects"]
face_keyframes = detect_data["face_keyframes"]

중요 추출 촉진 지령(전체 선언 원문 보기)은 Pegasus 개발 모델에 다음 핵심 가치를 연쇄 수집하게 주문합니다:

  • 현장 물건 단서: 도주 용무 차량 모델, 살상 가능 둔기/물건, 잔해 조각, 날씨 시안성 등

  • 또렷한 얼굴 사진 프레임 타취: 미묘한 흔들림이나 그림자가 걷혀 당장 수배 전단에 올려도 신원 대조가 완벽한 결정적 노출 시점을 타임 마킹

키프레임(Keyframe) 가치 극대화가 필요한 확실한 설계 근거: 얼굴이 지나간 수천 개 무비 시퀀스가 다 쓸모 있진 않습니다. 뒷모습만 남았거나 뒤집어진 화면, 안개가 잔뜩 낀 뿌연 프레임은 전혀 법적 증명용 대조 사진 자격이 없습니다. Pegasus 인공지능이 영리하게 광원 분포와 윤곽 정향성을 파악해 전면 주시, 무노이즈 스냅숏 순간만 마크해 기재해 줍니다. 수사진이 돋보기로 타임라인 수천 리를 직접 들여다보며 스크린샷 노고를 반복하던 굴레가 대폭 해결됩니다.

결과 가공 보증: 타격 확인된 대상 얼굴 키프레임과 물건 데이터셋이 떨어지면, 백엔드 내부 워커 즉시 해당 영상 해당 마이크로 단위 프레임 이미지 조각을 오프라인 기기 공간에 크롭 추출하고 썸네일 파일로 저장 처리해 줍니다. 조사원이 타임 무비를 켤 때 매 프레임 재연산해야 하던 소모적 하드웨어 오버헤드가 단숨에 완전 사멸됩니다.


3.3 - 안면 포착 구간 시간선: 대상자가 언제 어디에서 발견되었는가?

추출 완료된 인물들의 얼굴 데이터를 바탕으로, 각 감시 인물이 동영상 처음부터 끝까지 구체적으로 어느 영역 시간 고리마다 나타나 머물렀는지 시각적인 상태 전개 시간선 그래프를 그려낼 수 있게 만듭니다.

참조 소스 파일: backend/app/routes/videos.py (Line 1027)

if use_marengo:
    # Marengo-based presence, match each face embedding to clip embeddings
    for j, emb in enumerate(face_embeddings):
        if not emb:
            continue
        clips = clips_above_threshold(
            emb,
            output_uri,
            min_score=FACE_PRESENCE_MATCH_THRESHOLD,
            visual_only=True,
            max_clips=50,
        )
        for clip in clips:
            c_start = float(clip.get("start", 0.0))
            c_end = float(clip.get("end", c_start + 0.5))
            for i in range(n_segments):
                s0 = i * seg_dur
                s1 = (i + 1) * seg_dur
                if c_end > s0 and c_start < s1:
                    presence_by_face[j]["segment_presence"][i] = 1

시간선 타임라인 지도 수립 구조 체계:

  1. 원 미디어 소스를 탐지하기 편하도록 일정 등분 기준(예: 30초 단위 인터벌 정합)으로 캡슐 분리

  2. 검출 후보 얼굴 임베딩 값들을 전체 감시 미세 비디오 클립 데이터들과 병행 연산

  3. 유사도 컷오프를 능가하는 우수 등급 검증 클립들을 "인물 탐지 성립"으로 참 분류

  4. 유효 일치 마킹된 조각들을 앞서 그어둔 30초 등분 배열 시간 척도 구간 위에 사상 매핑

  5. 결과물: 특정 피의자가 언제 들어왔다 사라졌는지 한눈에 뵈는 이진 온/오프 상태 시간 그래프 완성

이것이 왜 실무 수색 업무 효율성을 바꾸는가: 수사진은 더는 답답하게 자리를 지키며 타임라인을 몌움선처럼 더듬지 않아도 됩니다. 직관적으로 "피의자는 3구간, 7구간, 12구간 그리고 18구간에서만 도합 4회 잡혔습니다"를 먼저 읽고, 해당 슬롯인 7구간을 터치 이동해 곧장 30초간의 결정적 비주얼 검증을 마무리 지으면 탐지가 완결되기 때문입니다.

민감 필터의 조화로운 구성: FACE_PRESENCE_MATCH_THRESHOLD가 수사 감도를 칼날같이 통제합니다. 임계값을 지나치게 옭아매면 빛 노출 변경에 시달린 유효한 찰나를 다 누락해 내고, 느슨히 주면 허수가 치솟습니다. 이번 제공 소프트웨어 기본값은 0.70으로 매핑 배치되었으며, 엔터프라이즈 환경에서는 케이스 사안별로 수사진이 유연하고 정밀히 보정 조정 가능하도록 설계하는 것이 옳습니다.


엔터프라이즈 런칭을 위한 운영 실무 제언

이 자습서 데모 앱은 기술의 실제 완벽성을 성공적으로 검증했습니다. 제품 상용 시장(Production)에 대동하며 시스템을 구축할 때는 아래 세밀한 현실 지표들을 영리하게 공략해야 합니다:

  1. 대용량 확장 아키텍처(Scalability): 단일 인덱싱 구성은 데모 레벨(영상 12개)에선 민첩하지만, 일반 경찰서 대규모 수사(단일 사건에도 비디오 1,000개 이상)가 쇄도하면 설계 변경이 요구됩니다. 인덱스 단계를 지능적으로 파티셔닝 구조로 쪼개거나, 전문적인 엔터프라이즈 벡터 데이터베이스를 하단에 긴밀히 연결해 분절된 미세 클립들을 유효 수렴 전적 보존하도록 고도화하십시오.

  2. 연산 인프라 지출 조율(Cost management): Bedrock 환경은 가공되는 임베딩 건수만큼 자이언트한 비용 산정 모델이 엮입니다. 2시간짜리 하나에도 1,200여 임베딩 묶음이 나오니 한 케이스에 100시간씩 대기한다면 6만 개 전개가 도래합니다. 유연한 배치 그룹 전개 루틴 마련과 검증 완료된 대형 임베딩들의 로컬 캐싱 재활용 기법을 타이트하게 활성화해야 실 운영비를 절감합니다.

  3. 사법 보안 준수 체계 수립(Security and compliance): 사법 처리에 활용되는 일체의 정보 파일들은 훼손 없는 추적 이력(Chain-of-custody), 엑세스 차단 정책 및 무단 위변조 감지 로그 파일 유지가 생명과도 같습니다. S3 버킷 내 정물이 보존될 때 강력하게 종단간 암호화(Encryption at rest) 조치 적용과 세분화된 권한 통제 롤(IAM Role Level), 한 번 쓰이면 변조 불가능한 감사 이력 블록 체계(WORM, immutable audit trail)를 함께 덧끼우십시오.

  4. 검출 신뢰성 이중 휴먼 인증 장치 마련: 자동 산출된 얼굴 데이터나 완성 타임라인 전개도는 결정적 조서 보완 수배용 법적 공식 문서에 오르기 전 '분류 확정도(Confidence score)' 단계 표기와 수사 전문가의 마우스 수동 확인/컨펌 워크플로를 반드시 징검다리로 끼고 작동해야 합니다. 인공지능 영상 분석기는 업무 수고를 극적으로 돕는 비서이지, 최종 결과에 책임을 정해 법을 내리는 주체가 결코 아닙니다.

  5. 다양한 동영상 규격 무중단 변환 관리: 실 데모 제품은 온전한 비디오 코덱(Standard format) 구동을 근거해 달립니다. 하지만 상용 망에서는 깨지거나 전송 상태가 왜곡된 기괴한 레거시 카메라 녹화본, 인코딩이 비정상적인 독점 보안 전용 형식, 저해상도로 뭉개진 증거 수집물들도 매끄럽게 소프트 변환할 수 있는 트랜스코딩 중화 파이프라인 처리가 필수 전제입니다.


맺음말

이번 완성도 높은 자습서 애플리케이션은 첨단 비디오 지능형 분석 기법이 시간 낭비에 가깝던 전통 사법 분석 수작업 단계를 스마트 선별 수사 작업으로 전폭 대전환 시키는 실질 패러다임을 극명히 증명합니다. AWS Bedrock을 거친 지능 화신 TwelveLabs 비전 아키텍처와 NeMo Retriever 도서 탐지 기법의 슬기로운 멀티 결합으로, 일선 수사 전문팀은 이제 즉각적으로 다음과 같은 미래형 성능을 누립니다:

  • 자연어 타이핑 한 번만으로, 12가지 다른 기종 기기 감시 영상들을 동시 통합 섭렵 조사

  • 단 하나의 전면 얼굴 사진으로 다른 채널 상의 이동 동선을 연속적 일치 검출

  • 파편화된 채널 영상물로부터 일사불란한 전개 타임라인을 원패스 기동 및 복각

  • 위험 범주 진단이 적용된 고품격 시정 조치 보고서 기획 및 일괄 자동 완성 수립

  • 클릭 즉시 발화 시점으로 뛰어넘는 고효율 인터 타임스탬프 인공지능 음성 추적 자막 획득

성공적 효율성 지표의 대격변: 단 한 단서 발굴을 목적하더라도 과거 40시간 이상 한 자리에 붙박혀 관찰하던 피로 수하 경로가 약 4시간의 신속 지목 조사 형태로 전폭 압축되어 환골탈태합니다. 무가치한 시간 낭비는 사라지고, 수사진은 식별해 낸 핵심 결점 단서의 적합성을 유려히 재확인하는 정량 가치 판단 업무 본질에 온전한 열정을 귀속할 수 있습니다.

사법 증거 통제 솔루션을 개발 중인 보안 및 리걸테크 소프트웨어 선도 벤더사(ISVs)에 이르기까지, 이 고급 설계 매뉴얼은 기존 개발 아키텍처를 뒤흔들거나 처음부터 완전히 다시 쓰지 않고도 세련되게 TwelveLabs의 위대한 영상 정밀 독해 기능을 온전히 스며들게 하는 실전에 가장 유용한 청사진이 됩니다. 단일 인덱스로 풀어낸 멀티 촬영 데이터 수렴과 비디오에 보고서 문서를 결착한 하이브리드 지식 발췌의 모든 능력은 비즈니스 출시 법률 시장 제품에서 곧바로 최강의 위용을 선사할 것입니다.


추가 참조 도움 문서 리스트

  1. AWS Bedrock 상의 TwelveLabs 솔루션 가이드: 전용 추론 모델 연결 매뉴얼 자세히 알아보기

  2. NeMo Retriever 개발 문서 라이브러리: 풍부한 대규모 조서 파일 하이브리드 검색 기법 알아보기

  3. TwelveLabs 우수 활용 실무 구현 사례집: 다른 버티컬 엔터프라이즈 모범 성공 방안들 더 둘러보기

  4. TwelveLabs 글로벌 오픈 개발자 교류회: 공식 Discord 커뮤니티 참여하기


지금 시작해야 할 다음 실행 스텝:

  1. 전체 코드가 예쁘게 안착한 핵심 완성 레퍼런스 코드 소스 저장소 클론받기

  2. 보유 세팅 완료된 AWS Bedrock를 가동한 뒤 테스트 미디어 클립을 주입하여 기동성 테스트

  3. 유려한 단일 인덱스 멀티 피드 패턴 설계를 지향하는 실무 수색 기획에 커스텀 적용

  4. 실제 사용 중인 경찰 수사/법무 법인 법률 사건 관리 파이프라인에 영리하게 최종 배포