<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Matting-Benchmark on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/matting-benchmark/</link><description>Recent content in Matting-Benchmark on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/matting-benchmark/index.xml" rel="self" type="application/rss+xml"/><item><title>PopCon 개발기 #5 — SAM2 인터랙티브 리파인과 영상 모델 업그레이드</title><link>https://ice-ice-bear.github.io/ko/posts/2026-04-10-popcon-dev5/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-04-10-popcon-dev5/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post PopCon 개발기 #5 — SAM2 인터랙티브 리파인과 영상 모델 업그레이드" /&gt;&lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/ko/posts/2026-04-08-popcon-dev4/" &gt;이전 글: PopCon 개발기 #4&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;PopCon 개발기 #4에서 SAM 2.1 인터랙티브 세그멘테이션과 비용 최적화를 다뤘다. 이번 글에서는 그 위에 &lt;strong&gt;리파인 페이지를 전면 구축&lt;/strong&gt;하고, rembg 일괄 처리 후 SAM2로 터치업하는 &lt;strong&gt;하이브리드 파이프라인&lt;/strong&gt;을 완성한 과정을 정리한다. 영상 생성 쪽에서는 wan2.6-i2v-flash 720P로 모델을 업그레이드하고, 모션 프롬프트를 물리적 바디 메커닉스 기반으로 전면 리라이트했다.&lt;/p&gt;
&lt;h2 id="1-하이브리드-배경-제거-파이프라인"&gt;1. 하이브리드 배경 제거 파이프라인
&lt;/h2&gt;&lt;h3 id="문제-rembg만으로는-부족하다"&gt;문제: rembg만으로는 부족하다
&lt;/h3&gt;&lt;p&gt;rembg는 빠르고 일괄 처리에 좋지만, 이모지 프레임처럼 경계가 복잡한 이미지에서는 잔여 배경이 남거나 캐릭터 일부가 잘려나가는 경우가 잦았다. 반대로 SAM2는 정밀하지만 모든 프레임을 하나씩 클릭하기엔 시간이 너무 걸린다.&lt;/p&gt;
&lt;h3 id="해결-rembg-일괄--sam2-터치업"&gt;해결: rembg 일괄 → SAM2 터치업
&lt;/h3&gt;&lt;p&gt;두 도구의 장점을 합치는 하이브리드 접근을 택했다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 A["이모지 프레임 업로드"] --&gt; B["rembg 일괄 처리&amp;lt;br/&amp;gt;(자동 실행)"]
 B --&gt; C{"결과 확인"}
 C --&gt;|"깔끔함"| D["완료"]
 C --&gt;|"잔여 배경/잘림"| E["SAM2 리파인&amp;lt;br/&amp;gt;erase/restore 클릭"]
 E --&gt; F["Apply 후&amp;lt;br/&amp;gt;프레임 업데이트"]
 F --&gt; C&lt;/pre&gt;&lt;p&gt;핵심은 &lt;code&gt;/refine&lt;/code&gt; 페이지 진입 시 &lt;strong&gt;rembg를 자동 실행&lt;/strong&gt;하고, 사용자는 결과만 확인한 뒤 문제가 있는 프레임만 SAM2로 터치업하는 흐름이다. 로딩 화면을 표시하면서 auto-rembg를 돌리고, 완료되면 바로 리파인 캔버스로 넘어가도록 했다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// refine/page.tsx — 페이지 로드 시 자동 rembg 실행
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;rembgComplete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;runRembgOnAllFrames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setRembgComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="sam2-eraserestore-리파인"&gt;SAM2 erase/restore 리파인
&lt;/h3&gt;&lt;p&gt;rembg 결과 위에서 SAM2를 사용하는 방식은 두 가지 모드로 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Erase&lt;/strong&gt;: 남아 있는 배경 잔여물을 클릭하면 해당 영역이 마스킹되어 제거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restore&lt;/strong&gt;: rembg가 잘라낸 캐릭터 부분을 클릭하면 원본에서 복원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;RembgRefineCanvas.tsx&lt;/code&gt;에서 캔버스 클릭 좌표를 수집하고, 백엔드 SAM2 엔드포인트에 포인트 리스트를 전송한다. 한 가지 까다로운 점은 &lt;strong&gt;multi-point 입력을 단일 오브젝트로 래핑&lt;/strong&gt;해야 한다는 것이었다. SAM2 API가 포인트 배열을 개별 오브젝트로 해석하면 각 포인트마다 별도 마스크가 생성되어 의도와 달라진다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# backend/main.py — multi-point를 단일 오브젝트로 래핑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;input_points&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;input_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;label&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 1=foreground, 0=background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 단일 오브젝트로 전달해야 하나의 통합 마스크 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;masks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;predictor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;point_coords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;input_points&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;point_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;input_labels&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;multimask_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-캐릭터-이미지-전용-리파인-캔버스"&gt;2. 캐릭터 이미지 전용 리파인 캔버스
&lt;/h2&gt;&lt;p&gt;이모지 프레임뿐 아니라 &lt;strong&gt;캐릭터 원본 이미지&lt;/strong&gt;에도 SAM2 리파인이 필요했다. 캐릭터 업로드 단계에서 배경이 깔끔하지 않으면 이후 모든 파이프라인에 영향을 미치기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CharacterRefineCanvas.tsx&lt;/code&gt;를 별도로 만들어 &lt;code&gt;CharacterUpload.tsx&lt;/code&gt;에서 호출하는 구조로 분리했다. erase/restore 로직은 이모지 쪽과 동일하지만, 프레임 네비게이션 없이 단일 이미지에 집중하는 UI다.&lt;/p&gt;
&lt;h2 id="3-리파인-ux-다듬기"&gt;3. 리파인 UX 다듬기
&lt;/h2&gt;&lt;p&gt;파이프라인은 완성됐지만 실제로 써보니 UX 문제가 산적했다. 24개 커밋 중 상당수가 이 UX 개선에 할애됐다.&lt;/p&gt;
&lt;h3 id="side-by-side-원본-참조"&gt;Side-by-side 원본 참조
&lt;/h3&gt;&lt;p&gt;리파인 작업 중 &amp;ldquo;이 부분이 원래 배경인지 캐릭터인지&amp;rdquo; 판단하려면 원본을 봐야 한다. 원본과 리파인 캔버스를 나란히 배치하고, &lt;strong&gt;crosshair를 동기화&lt;/strong&gt;해서 마우스 위치가 양쪽에 동시에 표시되도록 했다.&lt;/p&gt;
&lt;h3 id="프레임-네비게이션"&gt;프레임 네비게이션
&lt;/h3&gt;&lt;p&gt;이모지는 보통 수십 프레임이다. 화살표 키로 프레임 간 이동을 지원하고, 하단에 클릭 가능한 썸네일 스트립을 배치했다. per-frame SAM2 세그멘테이션도 프레임 전환 시 자동으로 초기화된다.&lt;/p&gt;
&lt;h3 id="툴바-정리"&gt;툴바 정리
&lt;/h3&gt;&lt;p&gt;초기 버전은 버튼이 여기저기 흩어져 있었다. undo/reset/apply 버튼을 캔버스 위에 모으고, 전체 툴바를 단일 컴팩트 행으로 통합했다. Tabbed UI로 rembg 결과 보기와 SAM2 리파인 모드를 전환할 수 있게 했다.&lt;/p&gt;
&lt;h3 id="소소한-버그-수정들"&gt;소소한 버그 수정들
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Apply 후 캔버스에 남아있던 &lt;strong&gt;클릭 도트 지우기&lt;/strong&gt; — apply 이벤트 핸들러에서 dots 배열 초기화&lt;/li&gt;
&lt;li&gt;Canvas &lt;code&gt;Image&lt;/code&gt; 객체에 &lt;code&gt;crossOrigin&lt;/code&gt; 속성을 설정하면 &lt;strong&gt;same-origin 이미지도 CORS 프리플라이트&lt;/strong&gt;를 타는 문제 — 불필요한 &lt;code&gt;crossOrigin&lt;/code&gt; 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-영상-생성-업그레이드"&gt;4. 영상 생성 업그레이드
&lt;/h2&gt;&lt;h3 id="wan26-i2v-flash-720p"&gt;wan2.6-i2v-flash 720P
&lt;/h3&gt;&lt;p&gt;기존 영상 생성 모델을 &lt;strong&gt;wan2.6-i2v-flash&lt;/strong&gt;로 업그레이드하고 해상도를 720P로 올렸다. 모델 파라미터 변경 과정에서 API 필드명이 달라진 부분이 있었다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# prompt_extend → extend_prompt 필드명 수정, negative_prompt 추가&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wan2.6-i2v-flash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;motion_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extend_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 기존: prompt_extend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;negative_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;blurry, low quality, distorted&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;720P&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="모션-프롬프트-리라이트"&gt;모션 프롬프트 리라이트
&lt;/h3&gt;&lt;p&gt;기존 모션 프리셋은 &amp;ldquo;wave hand&amp;rdquo;, &amp;ldquo;nod head&amp;rdquo; 같은 단순한 지시였다. 이를 &lt;strong&gt;물리적 바디 메커닉스&lt;/strong&gt;를 기술하는 상세 프롬프트로 리라이트했다. 예를 들어:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존: &lt;code&gt;&amp;quot;wave hand&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;변경: &lt;code&gt;&amp;quot;character raises right arm from resting position, forearm rotates at elbow joint, hand pivots at wrist with fingers spread, smooth pendulum motion&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="배경-관련-프롬프트-보정"&gt;배경 관련 프롬프트 보정
&lt;/h3&gt;&lt;p&gt;영상 생성에서 이펙트(파티클, 빛 등)가 캐릭터에 달라붙는 문제가 있었다. 이펙트를 캐릭터와 분리하라는 지시를 추가하고, &lt;strong&gt;solid white background&lt;/strong&gt;를 강제하는 프롬프트를 넣었다.&lt;/p&gt;
&lt;h2 id="5-matting-모델-벤치마크"&gt;5. Matting 모델 벤치마크
&lt;/h2&gt;&lt;h3 id="왜-별도-벤치마크가-필요했나"&gt;왜 별도 벤치마크가 필요했나
&lt;/h3&gt;&lt;p&gt;rembg가 &amp;ldquo;대부분&amp;rdquo; 잘 동작한다고는 했지만, 얼마나 잘 동작하는지 정량적으로 비교할 근거가 없었다. LINE 애니메이션 이모지 프레임이라는 특수한 도메인에서 어떤 matting 모델이 최적인지 체계적으로 비교하기 위해 &lt;strong&gt;popcon-matting-bench&lt;/strong&gt; 별도 레포지토리를 만들었다.&lt;/p&gt;
&lt;h3 id="테스트-조건"&gt;테스트 조건
&lt;/h3&gt;&lt;p&gt;6가지 모델/설정을 비교했다:&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;rembg&lt;/td&gt;
 &lt;td&gt;기본 U2-Net 기반 (베이스라인)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;rembg_enhanced&lt;/td&gt;
 &lt;td&gt;rembg 후처리 강화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MODNet ONNX&lt;/td&gt;
 &lt;td&gt;경량 25MB 포트레이트 matting&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_5&lt;/td&gt;
 &lt;td&gt;trimap 폭 5px&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_10&lt;/td&gt;
 &lt;td&gt;trimap 폭 10px&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_20&lt;/td&gt;
 &lt;td&gt;trimap 폭 20px&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RVM&lt;/td&gt;
 &lt;td&gt;Robust Video Matting (실사 영상용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="평가-지표"&gt;평가 지표
&lt;/h3&gt;&lt;p&gt;두 가지 지표로 측정했다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Halo Score&lt;/strong&gt;: 알파 경계에서 검정 배경 합성 시 흰색 프린지(halo) 강도. 낮을수록 좋다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coverage Ratio&lt;/strong&gt;: rembg 베이스라인 대비 전경 면적 비율. 1.0이 베이스라인과 동일.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Halo Score 계산 — 알파 경계의 흰색 프린지 측정&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_halo_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;검정 배경 합성 후 알파 경계에서 밝기 누출을 측정.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 알파 경계 추출 (0 &amp;lt; alpha &amp;lt; 255인 픽셀)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;edge_mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;edge_mask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 검정 배경 합성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;composite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 경계 영역의 평균 밝기&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;edge_brightness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edge_mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edge_brightness&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="결과-만화-곰-캐릭터-24-프레임"&gt;결과: 만화 곰 캐릭터 (24 프레임)
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;모델&lt;/th&gt;
 &lt;th&gt;Clean 비율&lt;/th&gt;
 &lt;th&gt;Halo Score&lt;/th&gt;
 &lt;th&gt;Coverage Ratio&lt;/th&gt;
 &lt;th&gt;비고&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;rembg&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;0.000&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;1.000&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;고대비 만화에 최적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;rembg_enhanced&lt;/td&gt;
 &lt;td&gt;100%&lt;/td&gt;
 &lt;td&gt;0.000&lt;/td&gt;
 &lt;td&gt;1.000&lt;/td&gt;
 &lt;td&gt;rembg와 동일&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_20&lt;/td&gt;
 &lt;td&gt;100%&lt;/td&gt;
 &lt;td&gt;0.031&lt;/td&gt;
 &lt;td&gt;1.016&lt;/td&gt;
 &lt;td&gt;디테일 보존 최고 (모션 라인, 이펙트)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_10&lt;/td&gt;
 &lt;td&gt;100%&lt;/td&gt;
 &lt;td&gt;0.024&lt;/td&gt;
 &lt;td&gt;1.008&lt;/td&gt;
 &lt;td&gt;안정적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ViTMatte_5&lt;/td&gt;
 &lt;td&gt;100%&lt;/td&gt;
 &lt;td&gt;0.018&lt;/td&gt;
 &lt;td&gt;1.002&lt;/td&gt;
 &lt;td&gt;보수적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MODNet&lt;/td&gt;
 &lt;td&gt;96%&lt;/td&gt;
 &lt;td&gt;0.045&lt;/td&gt;
 &lt;td&gt;0.860&lt;/td&gt;
 &lt;td&gt;전경 14% 손실 (포트레이트 특화)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RVM&lt;/td&gt;
 &lt;td&gt;42%&lt;/td&gt;
 &lt;td&gt;0.089&lt;/td&gt;
 &lt;td&gt;0.630&lt;/td&gt;
 &lt;td&gt;만화 콘텐츠 파괴 (실사 영상 특화)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="결론"&gt;결론
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rembg&lt;/strong&gt;: 두꺼운 외곽선의 고대비 만화 캐릭터에는 halo 0, coverage 100%로 최적. 추가 모델이 필요 없다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ViTMatte_20&lt;/strong&gt;: 얇은 선, 파스텔 톤, 모션 블러가 있는 프레임에서는 rembg보다 디테일을 1.6% 더 보존한다. 복잡한 이모지에 적합.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MODNet / RVM&lt;/strong&gt;: 포트레이트나 실사 영상에 최적화되어 있어 만화 이모지에는 부적합. MODNet은 전경의 14%를, RVM은 37%를 잃는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 벤치마크 결과가 하이브리드 파이프라인의 설계 근거가 됐다 — 단순한 캐릭터는 rembg 자동 처리로 충분하고, 복잡한 프레임만 SAM2로 터치업하면 된다.&lt;/p&gt;
&lt;h2 id="6-기타-개선"&gt;6. 기타 개선
&lt;/h2&gt;&lt;h3 id="커스텀-프롬프트-에디터"&gt;커스텀 프롬프트 에디터
&lt;/h3&gt;&lt;p&gt;사용자가 직접 프롬프트를 수정할 수 있는 에디터를 추가했다. 에디터 상태는 페이지 이동 후에도 유지되도록 persistence를 구현했다.&lt;/p&gt;
&lt;h3 id="다운로드-버튼"&gt;다운로드 버튼
&lt;/h3&gt;&lt;p&gt;리파인된 프레임과 생성된 영상을 개별 다운로드할 수 있는 버튼을 추가했다.&lt;/p&gt;
&lt;h2 id="정리"&gt;정리
&lt;/h2&gt;&lt;p&gt;이번 스프린트의 핵심은 &lt;strong&gt;&amp;ldquo;자동화 + 수동 터치업&amp;quot;의 균형&lt;/strong&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;배경 제거&lt;/td&gt;
 &lt;td&gt;rembg 자동 → SAM2 수동 터치업 하이브리드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Matting 벤치마크&lt;/td&gt;
 &lt;td&gt;6개 모델 비교 — rembg가 고대비 만화에 최적, ViTMatte_20이 디테일 보존 최고&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;리파인 UX&lt;/td&gt;
 &lt;td&gt;side-by-side 참조, 키보드 네비게이션, tabbed UI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;캐릭터 리파인&lt;/td&gt;
 &lt;td&gt;전용 SAM2 캔버스 분리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;영상 생성&lt;/td&gt;
 &lt;td&gt;wan2.6-i2v-flash 720P, 바디 메커닉스 프롬프트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;편의 기능&lt;/td&gt;
 &lt;td&gt;커스텀 프롬프트, 다운로드, 상태 persistence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;rembg가 90%를 처리하고 SAM2가 나머지 10%를 잡아주는 구조 덕분에, 수십 프레임의 이모지 배경 제거 작업 시간이 체감상 절반 이하로 줄었다. 다음 글에서는 이렇게 만든 에셋을 실제 스티커/이모지 플랫폼에 배포하는 과정을 다룰 예정이다.&lt;/p&gt;</description></item></channel></rss>