<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cost-Optimization on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/cost-optimization/</link><description>Recent content in Cost-Optimization on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Wed, 08 Apr 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/cost-optimization/index.xml" rel="self" type="application/rss+xml"/><item><title>PopCon 개발기 #4 — SAM 2.1 인터랙티브 배경 제거와 비용 최적화</title><link>https://ice-ice-bear.github.io/ko/posts/2026-04-08-popcon-dev4/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-04-08-popcon-dev4/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post PopCon 개발기 #4 — SAM 2.1 인터랙티브 배경 제거와 비용 최적화" /&gt;&lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/ko/posts/2026-04-07-popcon-dev3/" &gt;이전 글: PopCon 개발기 #3&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;PopCon 개발기 네 번째 글이다. 이번에는 두 가지 큰 변화가 있었다. 첫째, VEO 3의 비용 문제로 영상 생성 모델을 Alibaba DashScope Wan 2.2로 교체했다. 둘째, rembg의 배경 제거 품질이 만족스럽지 않아서 SAM 2.1 기반 인터랙티브 세그멘테이션을 직접 구현했다. 사용자가 클릭으로 전경 객체를 지정하면 SAM이 정밀하게 마스크를 생성하는 방식이다.&lt;/p&gt;
&lt;h2 id="영상-생성-모델-교체-veo-3--dashscope-wan-22"&gt;영상 생성 모델 교체: VEO 3 → DashScope Wan 2.2
&lt;/h2&gt;&lt;h3 id="비용-문제"&gt;비용 문제
&lt;/h3&gt;&lt;p&gt;VEO 3는 품질은 좋지만 비용이 너무 높았다. 이모지 하나에 여러 액션을 생성해야 하는 PopCon 특성상, 영상 생성 비용이 빠르게 누적된다.&lt;/p&gt;
&lt;p&gt;대안을 조사했다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;옵션&lt;/th&gt;
 &lt;th&gt;장점&lt;/th&gt;
 &lt;th&gt;단점&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;fal.ai Wan 2.1&lt;/td&gt;
 &lt;td&gt;간편한 API&lt;/td&gt;
 &lt;td&gt;가격 대비 품질 애매&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RunPod GPU&lt;/td&gt;
 &lt;td&gt;자유도 높음&lt;/td&gt;
 &lt;td&gt;인프라 관리 필요&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Alibaba DashScope Wan 2.2&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;가격 최저, 품질 양호&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;중국 API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;결국 DashScope Wan 2.2를 선택했다. 가격 대비 품질이 가장 좋았다.&lt;/p&gt;
&lt;h3 id="함께-진행한-개선"&gt;함께 진행한 개선
&lt;/h3&gt;&lt;p&gt;모델 교체와 함께 여러 개선을 진행했다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프론트엔드에서 액션 선택&lt;/strong&gt;: 사용자가 원하는 액션만 골라서 생성할 수 있게 변경&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;backbone 생성 제거&lt;/strong&gt;: Wan 2.2 전환으로 불필요해진 중간 단계 삭제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;end pose 생성 제거&lt;/strong&gt;: 불필요한 단계를 없애 전체 처리 시간 단축&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;액션 간 throttle 제거&lt;/strong&gt;: 불필요한 대기 시간 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="캐릭터-생성-개선"&gt;캐릭터 생성 개선
&lt;/h2&gt;&lt;h3 id="전신-캐릭터-강제"&gt;전신 캐릭터 강제
&lt;/h3&gt;&lt;p&gt;AI 캐릭터 생성 시 상반신만 나오는 경우가 있었다. 이러면 액션별로 하반신이 달라져서 일관성이 떨어진다. 프롬프트를 수정해서 항상 전신이 나오도록 강제했다.&lt;/p&gt;
&lt;h3 id="레퍼런스-이미지-지원"&gt;레퍼런스 이미지 지원
&lt;/h3&gt;&lt;p&gt;캐릭터 생성 시 참고할 이미지를 업로드할 수 있게 했다. 기존 캐릭터나 스타일을 기반으로 새 캐릭터를 만들 때 유용하다.&lt;/p&gt;
&lt;h3 id="기타-개선"&gt;기타 개선
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;다양한 이미지 포맷 지원&lt;/strong&gt;: WebP, GIF, BMP, TIFF 업로드 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;업로드 캐릭터 배경 제거 옵션&lt;/strong&gt;: 직접 업로드한 이미지에도 배경 제거 적용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;미디어 프리뷰 모달&lt;/strong&gt;: 이모지 카드 클릭 시 원본 크기로 미리보기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에셋 다운로드 링크&lt;/strong&gt;: 생성된 에셋을 바로 다운로드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="성능-최적화"&gt;성능 최적화
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 subgraph Before["기존 방식"]
 A1["포즈 1 생성"] --&gt; A2["포즈 2 생성"] --&gt; A3["포즈 3 생성"]
 end
 subgraph After["개선 후"]
 B1["포즈 1 생성"]
 B2["포즈 2 생성"]
 B3["포즈 3 생성"]
 end
 Before --&gt;|"순차 → 병렬"| After&lt;/pre&gt;&lt;p&gt;포즈 생성을 순차에서 병렬로 변경하고, 불필요한 시작 지연과 액션 간 throttle을 제거했다. end pose 생성도 없앴다. 체감 속도가 크게 개선되었다.&lt;/p&gt;
&lt;h2 id="sam-21-인터랙티브-배경-제거"&gt;SAM 2.1 인터랙티브 배경 제거
&lt;/h2&gt;&lt;h3 id="rembg의-한계"&gt;rembg의 한계
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/ko/posts/2026-04-07-popcon-dev3/" &gt;이전 글&lt;/a&gt;에서 rembg로 배경 제거를 구현했지만, 품질 문제가 있었다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;복잡한 배경에서 전경 경계가 부정확&lt;/li&gt;
&lt;li&gt;캐릭터의 일부가 잘리거나, 배경이 남는 경우 빈번&lt;/li&gt;
&lt;li&gt;자동화된 방식의 한계 — 어떤 부분이 전경인지 모델이 판단하기 어려운 케이스 다수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sam-21-선택-이유"&gt;SAM 2.1 선택 이유
&lt;/h3&gt;&lt;p&gt;Meta의 SAM 2.1(Segment Anything Model)은 사용자가 클릭한 포인트를 기반으로 세그멘테이션하는 모델이다. 핵심 장점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인터랙티브&lt;/strong&gt;: 사용자가 전경/배경을 직접 지정 → 정확도 향상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M1 Mac에서 동작&lt;/strong&gt;: 처음에는 RunPod 같은 클라우드 GPU를 고려했지만, PyTorch MPS 백엔드로 M1 Mac에서도 충분히 동작한다는 걸 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ultralytics 통합&lt;/strong&gt;: &lt;code&gt;ultralytics&lt;/code&gt; 패키지를 통해 간편하게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="아키텍처"&gt;아키텍처
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 subgraph Frontend["Next.js /refine 페이지"]
 F1["프레임 이미지 로드"]
 F2["SegmentCanvas 컴포넌트&amp;lt;br/&amp;gt;클릭으로 포인트 지정"]
 F3["마스크 미리보기"]
 F4["마스크 적용"]
 end
 subgraph Backend["FastAPI SAM2 엔드포인트"]
 B1["GET /raw-frame&amp;lt;br/&amp;gt;원본 프레임 제공"]
 B2["POST /sam/predict&amp;lt;br/&amp;gt;포인트 → 마스크 예측"]
 B3["POST /sam/apply&amp;lt;br/&amp;gt;마스크 적용 → RGBA 결과"]
 end
 subgraph Model["SAMSegmenter 클래스"]
 M1["predict: 포인트 기반 마스크 생성"]
 M2["apply_mask: 마스크 → RGBA 변환"]
 M3["predict_and_apply_all&amp;lt;br/&amp;gt;전체 프레임 일괄 처리"]
 end
 F1 --&gt; B1
 F2 --&gt; B2
 B2 --&gt; M1
 F4 --&gt; B3
 B3 --&gt; M2&lt;/pre&gt;&lt;h3 id="워크플로우-변경"&gt;워크플로우 변경
&lt;/h3&gt;&lt;p&gt;기존에는 영상 생성 → 프레임 추출 → 배경 제거가 자동으로 이어졌다. SAM 도입 후에는 중간에 사용자 개입 단계가 추가된다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;영상 생성 → 프레임 추출 (worker stage 3에서 완료)&lt;/li&gt;
&lt;li&gt;상태가 &lt;code&gt;awaiting_refinement&lt;/code&gt;으로 변경&lt;/li&gt;
&lt;li&gt;사용자가 &lt;code&gt;/refine&lt;/code&gt; 페이지에서 클릭으로 배경 제거&lt;/li&gt;
&lt;li&gt;완료 후 최종 에셋 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;awaiting_refinement&lt;/code&gt; 상태를 새로 추가해서 프론트엔드에서 &amp;ldquo;배경 제거 대기 중&amp;rdquo; 상태를 표시하고, Refine Backgrounds 링크를 노출한다. ProgressTracker에서는 이 상태를 생성 완료로 취급한다.&lt;/p&gt;
&lt;h3 id="구현-세부사항"&gt;구현 세부사항
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;백엔드 — SAMSegmenter 클래스&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;predict&lt;/code&gt;: 클릭 포인트를 받아 마스크 예측&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apply_mask&lt;/code&gt;: 예측된 마스크를 원본 이미지에 적용하여 RGBA 이미지 생성&lt;/li&gt;
&lt;li&gt;&lt;code&gt;predict_and_apply_all&lt;/code&gt;: 전체 프레임에 대해 일괄 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;백엔드 — API 엔드포인트&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /raw-frame&lt;/code&gt;: 원본 프레임 이미지 제공&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /sam/predict&lt;/code&gt;: 포인트 기반 마스크 예측, RGBA 마스크 반환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /sam/apply&lt;/code&gt;: 마스크를 프레임에 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;프론트엔드 — SegmentCanvas 컴포넌트&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;캔버스에 프레임 이미지를 렌더링&lt;/li&gt;
&lt;li&gt;클릭 이벤트로 포인트 좌표를 수집&lt;/li&gt;
&lt;li&gt;SAM API를 호출해서 마스크 미리보기 표시&lt;/li&gt;
&lt;li&gt;확정 시 마스크 적용 API 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="커밋-로그"&gt;커밋 로그
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;메시지&lt;/th&gt;
 &lt;th&gt;변경 사항&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: replace VEO 3 with DashScope Wan 2.2 and remove backbone generation&lt;/td&gt;
 &lt;td&gt;영상 생성 모델 교체, backbone 단계 제거&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: pass selected action names from frontend to backend&lt;/td&gt;
 &lt;td&gt;프론트엔드에서 액션 선택 전달&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix: clear character preview when switching between upload and generate modes&lt;/td&gt;
 &lt;td&gt;모드 전환 시 프리뷰 초기화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add optional reference image support for AI character generation&lt;/td&gt;
 &lt;td&gt;레퍼런스 이미지 업로드 지원&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: support WebP, GIF, BMP, and TIFF image uploads&lt;/td&gt;
 &lt;td&gt;다양한 이미지 포맷 지원&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add background removal option for uploaded character images&lt;/td&gt;
 &lt;td&gt;업로드 이미지 배경 제거 옵션&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;perf: remove end pose generation and inter-action throttles&lt;/td&gt;
 &lt;td&gt;불필요한 단계 및 대기 제거&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: enforce full-body character generation and add asset download links&lt;/td&gt;
 &lt;td&gt;전신 생성 강제, 다운로드 링크&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix: add media preview modal with close button to emoji cards&lt;/td&gt;
 &lt;td&gt;미디어 프리뷰 모달 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;perf: parallelize pose generation and eliminate startup delay&lt;/td&gt;
 &lt;td&gt;포즈 생성 병렬화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;docs: add SAM2 interactive background removal design spec&lt;/td&gt;
 &lt;td&gt;SAM2 설계 문서&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;docs: add SAM2 interactive background removal implementation plan&lt;/td&gt;
 &lt;td&gt;SAM2 구현 계획 문서&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add ultralytics SAM 2.1 dependency and sam_model config&lt;/td&gt;
 &lt;td&gt;SAM 2.1 의존성 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add awaiting_refinement status to models&lt;/td&gt;
 &lt;td&gt;awaiting_refinement 상태 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;refactor: simplify process_video to extract-only (no bg removal)&lt;/td&gt;
 &lt;td&gt;영상 처리를 추출만으로 단순화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;refactor: worker stage 3 extracts frames only, ends at awaiting_refinement&lt;/td&gt;
 &lt;td&gt;worker 3단계를 프레임 추출까지만&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add SAMSegmenter class with predict, apply_mask, predict_and_apply_all&lt;/td&gt;
 &lt;td&gt;SAMSegmenter 핵심 클래스 구현&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add SAM2 endpoints and raw frame serving to FastAPI&lt;/td&gt;
 &lt;td&gt;SAM2 API 엔드포인트 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add SAM embed/predict/apply API functions&lt;/td&gt;
 &lt;td&gt;프론트엔드 SAM API 함수&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add SegmentCanvas click-to-segment component&lt;/td&gt;
 &lt;td&gt;클릭 세그멘테이션 캔버스 컴포넌트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add /refine page for interactive SAM2 background removal&lt;/td&gt;
 &lt;td&gt;/refine 페이지 구현&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: add Refine Backgrounds link and awaiting_refinement status display&lt;/td&gt;
 &lt;td&gt;Refine 링크 및 상태 표시&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat: treat awaiting_refinement as generation-complete in ProgressTracker&lt;/td&gt;
 &lt;td&gt;ProgressTracker 상태 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix: address code review findings&lt;/td&gt;
 &lt;td&gt;코드 리뷰 반영&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;merge: integrate main refactors with SAM2 interactive bg removal&lt;/td&gt;
 &lt;td&gt;메인 브랜치 리팩토링 통합&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;merge: integrate main branch changes with SAM2 implementation&lt;/td&gt;
 &lt;td&gt;메인 브랜치 변경사항 통합&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix: return RGBA mask from SAM predict endpoint&lt;/td&gt;
 &lt;td&gt;SAM predict에서 RGBA 마스크 반환&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="다음-단계"&gt;다음 단계
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;SAM 세그멘테이션 결과를 전체 프레임에 일괄 적용하는 UX 개선&lt;/li&gt;
&lt;li&gt;최종 APNG/GIF 에셋 생성 파이프라인 연결&lt;/li&gt;
&lt;li&gt;배포 환경에서의 SAM 모델 로딩 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;이 글은 PopCon 시리즈의 네 번째 글입니다. 다음 글에서 계속됩니다.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>