SAM3 모델을 이용한 정밀 객체 분할 환경 구축
Meta 가 발표한 최신 시맨틱 분할 모델인 SAM3 는 단순한 시각적 입력을 넘어 자연어 텍스트 프롬프트를 통해 타겟 영역을 정확히 식별하는 능력을 제공합니다. 기존의 점 또는 박스 상호작용에 의존하던 방식에서 진화하여, 텍스트 명령만으로 이미지 내의 특정 객체를 분리하고 ID 를 부여하며 예측 신뢰도를 확인할 수 있습니다.
시스템 사양 및 사전 조건
로컬 머신에서 효율적인 추론을 수행하기 위해서는 다음과 같은 하드웨어 및 소프트웨어 환경이 필수적으로 갖춰져야 합니다.
- CUDA 코어 탑재 NVIDIA 그래픽카드 (AMD 또는 통합 그래픽은 지원 불가)
- CUDA 도구킷 버전 12.6 이상 (최신 드라이버 권장)
- 패키지 관리 도구 Conda (Anaconda 또는 Miniconda 포함)
개발 환경 설정 절차
-
가상 환경 초기화
고립된 파이썬 환경을 생성하여 종속성 충돌을 방지합니다.conda create -n sam3_project python=3.12 -y conda activate sam3_project -
Deep Learning 프레임워크 설치
CUDA 12.6 에 최적화된 PyTorch 버전을 명시하여 다운로드합니다.pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 -
소스 코드 및 라이브러리 획득
공식 저장소에서 아카이브 파일을 직접 내려받는 것이 안정적입니다.cd sam3-main pip install -e . -
추가 유틸리티 패키지 로드
비주얼라이제이션 및 데이터 처리를 위한 보조 라이브러리를 추가합니다.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()
스크립트 실행 시 모델 가중치가 메모리에 로드되므로 첫 번째 런타임에는 지연이 발생할 수 있으나, 이후 요청은 즉각적으로 처리됩니다. 이를 통해 텍스트 지시어를 활용한 고수준의 영상 분할 작업이 로컬 환경에서 구현되었음을 확인할 수 있습니다.