윈도우 기반 SAM3 모델 로컬 배포 및 텍스트 기반 분할 구현 가이드

SAM3 모델을 이용한 정밀 객체 분할 환경 구축

Meta 가 발표한 최신 시맨틱 분할 모델인 SAM3 는 단순한 시각적 입력을 넘어 자연어 텍스트 프롬프트를 통해 타겟 영역을 정확히 식별하는 능력을 제공합니다. 기존의 점 또는 박스 상호작용에 의존하던 방식에서 진화하여, 텍스트 명령만으로 이미지 내의 특정 객체를 분리하고 ID 를 부여하며 예측 신뢰도를 확인할 수 있습니다.

시스템 사양 및 사전 조건

로컬 머신에서 효율적인 추론을 수행하기 위해서는 다음과 같은 하드웨어 및 소프트웨어 환경이 필수적으로 갖춰져야 합니다.

  • CUDA 코어 탑재 NVIDIA 그래픽카드 (AMD 또는 통합 그래픽은 지원 불가)
  • CUDA 도구킷 버전 12.6 이상 (최신 드라이버 권장)
  • 패키지 관리 도구 Conda (Anaconda 또는 Miniconda 포함)

개발 환경 설정 절차

  1. 가상 환경 초기화
    고립된 파이썬 환경을 생성하여 종속성 충돌을 방지합니다.

    conda create -n sam3_project python=3.12 -y
    conda activate sam3_project
    
  2. Deep Learning 프레임워크 설치
    CUDA 12.6 에 최적화된 PyTorch 버전을 명시하여 다운로드합니다.

    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
    
  3. 소스 코드 및 라이브러리 획득
    공식 저장소에서 아카이브 파일을 직접 내려받는 것이 안정적입니다.

    cd sam3-main
    pip install -e .
    
  4. 추가 유틸리티 패키지 로드
    비주얼라이제이션 및 데이터 처리를 위한 보조 라이브러리를 추가합니다.

    pip install opencv-python matplotlib pandas tqdm
    

주요 호환성 문제 해결

Triton 컴파일러 미발견 오류

Windows 플랫폼에서는 공식 Triton 패키지가 제한적으로 지원됩니다. 추론 과정에서 모듈NotFoundError 가 발생할 경우, 커뮤니티에서 제공하는 포팅 버전을 수동으로 설치해야 합니다.

pip install triton-windows==3.3.0.post19

모델 가중치 접근 차단 우회

Hugging Face Hub 에서 모델 파일에 대한 접근 권한이 승인되지 않을 수 있으며, 이 경우 네트워크 연결 중추 오작동이 발생합니다. 해당 경로는 로컬 파일 경로를 지정하도록 소스를 수정하는 것이 효과적입니다.

다음 파일 내부의 설정 값을 변경하십시오: sam3/model_builder.py

  • load_from_hf 변수의 값을 True에서 False로 수정합니다.
  • checkpoint_path 변수에 로컬에 준비된 sam3.pt 파일의 상대 경로를 할당합니다.

추론 엔진 구현 코드

설정이 완료된 후, 다음 스크립트를 통해 모델이 정상 작동하는지 검증합니다. 구조를 클래스 기반으로 재정의하여 관리성을 높였습니다.

<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image

<span class="hljs-keyword">from</span> sam3.model_builder <span class="hljs-keyword">import</span> build_sam3_image_model
<span class="hljs-keyword">from</span> sam3.model.sam3_image_processor <span class="hljs-keyword">import</span> Sam3Processor
<span class="hljs-keyword">from</span> sam3.visualization_utils <span class="hljs-keyword">import</span> plot_results

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ImageSegmenter</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self</span>):</span>
        <span class="hljs-comment"># 모델 인스턴스 초기화 (로컬 가중치 자동 로딩)</span>
        self.nn_architecture = build_sam3_image_model()
        self.data_handler = Sam3Processor(self.nn_architecture)
    
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">prepare_frame</span>(<span class="hljs-params">self, img_path</span>):</span>
        target_img = Image.open(img_path)
        <span class="hljs-comment"># 전처리를 위해 상태 컨텍스트 생성</span>
        session_context = self.data_handler.set_image(target_img)
        <span class="hljs-keyword">return</span> target_img, session_context

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">apply_text_query</span>(<span class="hljs-params">self, current_context, keyword</span>):</span>
        <span class="hljs-comment"># 텍스트 프롬프트 반영하여 분할 마스크 업데이트</span>
        updated_context = self.data_handler.set_text_prompt(
            state=current_context, 
            prompt=keyword
        )
        <span class="hljs-keyword">return</span> updated_context

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">display_mask</span>(<span class="hljs-params">self, original_img, final_context</span>):</span>
        plot_results(original_img, final_context)
        plt.show()

<span class="hljs-keyword">def</span> <span class="hljs-function"><span class="hljs-title">main_execution</span>():</span>
    engine = ImageSegmenter()
    
    <span class="hljs-comment"># 테스트 자산 경로 지정</span>
    asset_location = "assets/images/test_image.jpg"
    
    raw_image, initial_state = engine.prepare_frame(asset_location)
    
    <span class="hljs-comment"># 쿼리 텍스트 변경 가능 (예: shoe, person, vehicle)</span>
    search_term = "child"
    processed_state = engine.apply_text_query(initial_state, search_term)
    
    engine.display_mask(raw_image, processed_state)

<span class="hljs-keyword">if</span> __name__ == "__main__":
    main_execution()

스크립트 실행 시 모델 가중치가 메모리에 로드되므로 첫 번째 런타임에는 지연이 발생할 수 있으나, 이후 요청은 즉각적으로 처리됩니다. 이를 통해 텍스트 지시어를 활용한 고수준의 영상 분할 작업이 로컬 환경에서 구현되었음을 확인할 수 있습니다.

태그: SAM3 PyTorch ObjectSegmentation ComputerVision NVIDIA

5월 21일 19:53에 게시됨