Illustracy

Illustracy — 4. 알고리즘과 수식 (2/4): 배경

← README · 4절 1 · 2 · 3 · 4 · English


4.5 배경

누끼 모델(0.51 ~ 0.55, 기본)

설정 “누끼 모델”이 켜져 있고 그림에 투명한 픽셀이 없으면, 아래 배경 단계 대신 이것으로 캐릭터를 정합니다. 그림 $I$(처리 해상도 $W \times H$)를 긴 변 1024px로 줄여 1024×1024 칸 가운데에 놓고(남는 곳 0), 신경망 $f_\theta$의 시그모이드 출력을 같은 방식으로 원래 크기로 되돌립니다. 줄이고 늘리는 것은 픽셀 가운데를 맞춘 쌍선형 보간(가장자리는 끝 픽셀)입니다.

x = \mathrm{pad}_{1024}\!\left(\mathrm{resize}\!\left(\tfrac{I}{255},\ \tfrac{1024}{\max(W,H)}\right)\right),\qquad m = \mathrm{resize}^{-1}\!\left(\sigma(f_\theta(x))\right),\qquad p \text{는 캐릭터} \iff m(p) \ge 0.5

$f_\theta$는 SkyTNT의 anime-segmentation이 공개한 ISNet 모델(skytnt/anime-seg, Apache-2.0, 합성곱 114개 · 가중치 44,004,873개)입니다R90 Qin 외 2022 · R91 SkyTNT anime-segmentation. 앱 파일에 넣으려고 합성곱 가중치를 출력 채널 $c$마다 대칭 8비트로 줄였습니다R92 Krishnamoorthi 2018.

s_c = \frac{\max_k \lvert W_{c,k}\rvert}{127},\qquad q_{c,k} = \mathrm{round}\!\left(\frac{W_{c,k}}{s_c}\right) \in [-127, 127],\qquad \hat W_{c,k} = s_c\, q_{c,k}

앱은 처음 쓸 때 $q$와 $s$로 $\hat W$를 다시 만들어 ONNX Runtime Web(1.29.0, MIT, R93 ONNX Runtime Web)의 WASM 실행기(스레드 1개)로 별도 워커에서 돌립니다. 외곽 글로우 · 배경 효과 · 보정 칠하기는 이 결과 위에 그대로 적용합니다.

풀이 — 왜: 테두리에서 채워 들어가는 배경 찾기는 선이 없는 경계를 막지 못해, 테두리빛으로 처리한 팔이 배경과 한 덩어리가 됩니다. 색 · 넓이 · 경계 단서로 그런 조각을 가려내는 규칙은 개발 그림 207장에서 AUC 0.69를 넘지 못했습니다(README 7.5의 0.51 준비). 누끼 모델은 몸의 모양을 보고 캐릭터 전체를 한 번에 고릅니다. 원리: ISNet은 이미지를 여러 해상도로 줄였다 늘이며 전경 · 배경 경계를 세밀하게 맞추는 분할 신경망입니다. 8비트 줄이기는 채널마다 최대 절댓값을 127에 맞추는 대칭 양자화라 가중치 오차가 채널 최댓값의 0.4% 이하이고, 정답 185장에서 32비트 모델과 다른 픽셀이 0.035%였습니다. 참고: R90 Qin 외 2022 · R91 SkyTNT anime-segmentation · R92 Krishnamoorthi 2018 · R93 ONNX Runtime Web.

기존 방식과 더하기(0.52): 누끼 모델을 쓸 때도 아래 배경 단계(단색 · 장면 · 색 모델 · 얼굴 기준 · 틈 · 신경망 보조)를 그대로 돌려 판정 $c(p)$(캐릭터 1 · 배경 0)를 얻고, 모델 확률에 더해 정합니다.

p \text{는 캐릭터} \iff m(p) + \alpha\,\bigl(c(p) - \tfrac12\bigr) \ge \tfrac12,\qquad \alpha = 0.4

두 방법이 같으면 그대로 따르고, 엇갈리면 $m(p) \ge 0.3$(기존 방식이 캐릭터) 또는 $m(p) \ge 0.7$(기존 방식이 배경)으로 정합니다. 이 결과가 그대로 배경 층이 되며 외곽 글로우 · 배경 위 작은 조각 규칙은 거치지 않습니다. α는 합성 498장(setA 299장으로 0.2 · 0.4 · 0.6 중 고르고 setB 199장으로 확인)과 게시물에 함께 올라온 누끼 14장으로 정했습니다(README 7.5 · 12의 0.52).

풀이 — 왜: 모델만 쓰면(0.51) AI 생성 그림에서 기존 방식이 찾던 배경 일부를 놓치고(게시물 누끼 14장 찾은 배경 94.7%), 기존 방식만 쓰면 선 없는 팔을 배경에 넘깁니다. 두 판정이 엇갈리는 픽셀에서만 모델의 확신을 보게 하면 각자의 실수를 서로 메웁니다. 원리: 두 분류기의 점수를 더한 선형 결합으로, α는 기존 방식의 한 표가 모델 확률 0.2만큼의 값을 갖게 하는 무게입니다.

모델이 놓친 그림은 기존 방식으로(0.53): 모델이 캐릭터라 한 넓이가 그림의 1% 미만인데 기존 방식은 5% 이상을 캐릭터라 하면, 모델이 캐릭터를 통째로 놓친 것으로 보고 그 그림은 기존 방식의 판정을 그대로 씁니다($N$은 그림의 픽셀 수).

\frac1N\,\bigl|\{p : m(p) \ge \tfrac12\}\bigr| < 0.01 \ \text{그리고}\ \frac1N\,\bigl|\{p : c(p) = 1\}\bigr| \ge 0.05 \quad\Rightarrow\quad p \text{는 캐릭터} \iff c(p) = 1

무게를 조금씩 바꾸는 식이 아니라 그림 단위로 켜고 끄는 규칙이라, 조건에 걸리지 않는 그림은 0.52와 같습니다.

풀이 — 왜: 모델은 사람 모양이 아닌 캐릭터(동물 · 몬스터 팬아트)를 통째로 놓칠 수 있고, 그러면 더하기에서도 기존 방식의 한 표(0.2)가 0에 가까운 모델 확률을 넘지 못해 캐릭터가 사라집니다. 이런 그림에서만 기존 방식을 그대로 따르게 했습니다. 원리: 두 판정의 넓이를 견주어 한쪽이 거의 비었을 때만 다른 쪽으로 넘깁니다. 이 규칙은 결과를 본 뒤 만든 것이고(게시물에 함께 올라온 누끼 14장 중 이상해씨 팬아트), 1% · 5%는 처음 정한 값 그대로입니다. 모델이 부족한 정도에 따라 기존 방식의 무게를 로그 눈금으로 늘리는 식도 쟀지만 합성 그림에서 나빠진 그림이 더 많아 넣지 않았습니다(README 7.5 · 12의 0.53).

미세 학습 모델과 평균(0.54): 원래 누끼 모델의 확률 $p_0$와, 같은 신경망을 합성 그림 290장(픽셀 정답)과 픽시브 AI 생성 개발용 그림 292장(원래 모델의 검정 · 반사 채우기 확률 평균을 부드러운 정답으로)으로 12 에포크 더 학습한 판의 확률 $p_1$을 0.6 · 0.4로 가중 평균해 모델 확률로 쓰고, 더하기의 문턱을 0.55로 올리며 0.53의 규칙은 그대로 둡니다.

m(p) = 0.6\,p_0(p) + 0.4\,p_1(p),\qquad p \text{는 캐릭터} \iff m(p) + 0.4\,\bigl(c(p) - \tfrac12\bigr) \ge 0.55

앱에는 더 학습한 판의 8비트 값을 원래 8비트 값과의 차이(256 나머지)로 넣고(배율은 원래 것), 두 모델을 차례로 돌립니다.

풀이 — 왜: 0.53에 남은 손실의 두 까닭(배경과 색이 비슷한 경계 · 테두리에 잘린 몸)은 모델이 낮은 확률로 확신하고 틀리는 곳이라 문턱 · 채우기 · 응집 같은 규칙으로는 줄지 않았습니다(README 7.5). 그래서 모델 자체를 더 학습했습니다. 원리: 더 학습한 판만 쓰면 캐릭터는 더 잘 지키지만(게시물 누끼 14장 지킨 캐릭터 97.6 → 99.4%) 기 · 불꽃 효과와 캐릭터에 붙은 배경을 캐릭터로 넣는 쪽이 늘어 평균 BER이 높아졌고(찾은 배경 92.5 → 89.3%), 원래 모델은 그런 곳을 배경이라 확신하므로 두 확률을 평균하면 서로의 확신 오류를 누그러뜨립니다. 이 섞기 무게 · 문턱은 더 학습한 판의 결과를 본 뒤 판정 규칙 후보 34개와 무게 · 문턱 1,089조합을 적어 두고 게시물 누끼 14장 · 합성 setB로 고른 것이라(사후 선택) 짝 14장의 값은 바깥 추정이 아닙니다(README 12의 0.54).

효과 학습 판과 평균(0.55): 0.54의 더 학습한 판 자리에, 효과(글로우 · 파티클 · 빛줄기 · 오라)를 배경으로 세도록 다시 학습한 판을 넣고 두 확률을 같은 무게로 평균합니다.

m(p) = 0.5\,p_0(p) + 0.5\,p_1(p),\qquad p \text{는 캐릭터} \iff m(p) + 0.4\,\bigl(c(p) - \tfrac12\bigr) \ge 0.55

학습 자료는 합성 setA 290장(픽셀 정답) · 효과 합성 300장(학습 중 즉석 생성, 효과 픽셀은 배경 정답) · 픽시브 AI 생성 개발용 292장(부드러운 정답)이고, 0.54의 판에서 학습률 5e-6로 6 에포크 더 학습한 여섯 에포크의 가중치 균일 평균을 씁니다. 앱에는 원래 8비트 배율로 줄여 원래 값과의 차이로 넣습니다(잘린 가중치 0.0175%).

풀이 — 왜: 0.54의 더 학습한 판은 효과와 캐릭터에 붙은 배경을 캐릭터로 넣는 쪽이라, 효과를 배경으로 세는 판으로 바꿔 한 모델로 돌아가려 했습니다. 원리: 효과 학습 판 하나만 쓰면 효과 합성(rceB) BER이 0.54의 0.0383에서 0.0179로, 합성 setB가 0.0200에서 0.0117로 크게 좋아지지만, 픽시브 AI 생성 개발용 176장의 영역 정답에서는 그릇 · 소품 같은 배경 물건을 캐릭터로 넣어 ΔW -0.131로 미달했습니다(캐릭터 영역 +0.001 · 배경 영역 -0.133). 0.54의 섞기에서는 원래 모델이 배경이라 확신하면 캐릭터가 될 수 없어(거부권) 그런 물건이 걸러지므로, 더 학습한 판만 효과 학습 판으로 바꾸고 무게 w ∈ {0.4, 0.5, 0.6}을 같은 관문으로 봤습니다. 규칙이 고른 w 0.6은 앱이 싣는 8비트로 다시 채점하니 176장 그림 수 조건이 뒤집혀 멈췄고, 결과를 본 뒤 w 0.5를 등록해 두 양자화에서 모두 관문 넷을 넘었습니다(README 12의 0.55).

줄여서 찾기(설정, 기본 꺼짐)

“배경 · 얼굴만 줄여서 찾기”이고 $\max(W, H) > S$(줄일 크기)이면, 각 채널을 면적 평균으로 $k = S / \max(W, H)$배 줄인 그림에서 아래 배경 단계와 얼굴 찾기까지만 돌립니다 (선 굵기는 사용자가 고른 값에 𝑘를 곱하고, 자동이면 줄인 그림에서 다시 잽니다). 배경 · 되돌린 부분 지도는 쌍선형으로 원래 크기로 키워 $\ge 0.5$이면 켜되, 원래 크기의 선(+ 가장자리 1px) 위에서는 키운 값이 1일 때만 켭니다. 얼굴은 위치 · 크기를 $1/k$배 합니다. “전부 줄여서 나누기”는 처리 해상도를 $\min(\text{처리 해상도}, S)$로 낮추는 것과 같습니다.

풀이 — 왜: 배경 · 얼굴 단계는 픽셀 수에 비례해 오래 걸리므로, 큰 그림은 줄인 그림에서 판정만 하고 결과를 원래 크기로 옮겨 시간을 줄입니다. 원래 크기의 선 위에서는 키운 값이 1일 때만 켜서, 줄이며 섞인 경계가 캐릭터의 선을 배경으로 끌고 가지 않게 합니다. 원리: 면적 평균 축소는 원래 픽셀이 새 칸을 덮는 넓이만큼 가중 평균하므로 앨리어싱이 적습니다. 0/1 지도를 쌍선형으로 키우면 경계에서 0~1 사이 값이 나오고, $\ge 0.5$ 문턱은 둘 중 가까운 쪽을 고르는 것과 같습니다. 얼굴 위치 · 크기는 길이라 $1/k$배로 되돌립니다. 참고: R14 Gonzalez · Woods 2018

액자

테두리를 한 바퀴 도는 고리(깊이 𝑑의 고리 = 가장자리에서 𝑑px 안쪽 사각형 둘레)에서 $\mathrm{known}$ 픽셀의 비율을 $\kappa(d)$로 둡니다. $\kappa(0) < 0.05$이고 긴 변 · 짧은 변이 16px보다 크면, $d = 1 \dots \max(3, \mathrm{round}(0.01 \cdot \max(W, H)))$에서 $\kappa(d) \ge 0.5$인 첫 𝑑를 액자 두께 𝑓로 둡니다. $f > 0$이면 배경 단계(아래 모두와 얼굴 찾기) 동안만 가장자리 𝑓px 안의 픽셀마다 𝑈, 원본, $\mathrm{known}$, 선, 선명한 선, $\mathrm{inMask}$를 가장 가까운 안쪽 픽셀($(\mathrm{clamp}(x, f, W - 1 - f), \mathrm{clamp}(y, f, H - 1 - f))$)의 값으로 바꿔 두고, 끝나면 되돌립니다. 투명한 그림은 하지 않습니다. 666장 중 3장이 $\kappa(0) < 0.05$였고, 그중 2장에서 액자를 찾았습니다($f = 2\,\mathrm{px}$).

풀이 — 왜: 그림 둘레에 액자선(검은 · 흰 테두리)이 있으면 테두리에서 출발하는 배경 채우기가 처음부터 막힙니다. 액자 두께를 재서 그 안을 안쪽 픽셀 값으로 덮어 두면 테두리에서 바로 배경을 찾을 수 있습니다. 원리: 깊이 𝑑의 고리에서 칠한 픽셀 비율 $\kappa(d)$는 액자 안에서는 0에 가깝고 액자를 벗어나면 커지므로, 처음으로 절반을 넘는 깊이가 두께입니다. 좌표를 $[f, W - 1 - f]$로 자르는 clamp는 액자 안 픽셀을 가장 가까운 안쪽 픽셀로 보내는 가장자리 복제입니다. 찾는 깊이를 긴 변의 1%로 묶어 그림 내용을 액자로 보지 않게 합니다. 참고: R14 Gonzalez · Woods 2018 · 이 프로그램에서 정한 규칙

돌린 캔버스(0.37)

  1. 네 모서리 픽셀 중 셋 이상이 같은 채움이면 채움으로 봅니다: 셋 이상이 투명($A \le 0.02$)하거나, 셋 이상이 불투명($A \ge 0.98$)하고 서로 $\max_c$ 차이 $\le 4/255$. 채움과 같은 픽셀을 모서리에서부터 4-이웃으로 따라가 $F_0$를 잡습니다.
    • 풀이 — 왜: 돌려서 저장한 그림은 네 모서리에 투명하거나 한 색인 삼각형 채움이 생깁니다. 이것을 그림 내용으로 보면 배경 찾기가 엉뚱한 곳에서 출발합니다. 원리: 네 모서리 중 셋 이상이 같으면 채움으로 봅니다(한 모서리는 캐릭터가 닿아도 됨). 불투명이면 채널 최대 차 $4/255$(8비트로 4단계) 안을 같은 색으로 보아 JPEG 잡음을 견딥니다. 모서리에서 4-이웃 채우기(플러드 필)로 이어진 같은 채움을 $F_0$로 모읍니다. 참고: R14 Gonzalez · Woods 2018 · R15 Soille 2003
  2. 줄 𝑦마다 $F_0$가 아닌 첫 · 끝 𝑥($x_l(y),\ x_r(y)$), 칸 𝑥마다 첫 · 끝 𝑦($y_t(x),\ y_b(x)$)를 모읍니다. 돌린 직사각형이면 $x_l$은 가장 작은 곳에서 꺾이는 두 직선, $x_r$은 가장 큰 곳에서 꺾이는 두 직선입니다($y_t,\ y_b$도 같음). 꺾인 곳 후보(가장 작은 · 큰 곳과 고르게 나눈 15곳)마다 양쪽을 최소제곱 직선으로 맞추고, 직선에서 $\tau = 1.5 + 0.002 \cdot \max(W, H)$px 넘게 벗어난 점을 빼고 두 번 다시 맞춥니다. 맞는 점(𝜏 안)이 가장 많은 후보를 고르고, 맞는 점이 85% 미만이면 돌린 캔버스가 아닙니다(그림 끝에 닿은 흰 칠은 채움과 이어져 벗어난 점이 됨).
    • 풀이 — 왜: 돌린 직사각형의 경계를 변마다 직선으로 맞춰야 내용 영역을 정확히 그릴 수 있습니다. 경계에 닿은 캐릭터 · 흰 칠처럼 벗어난 점은 맞춤을 흔들므로 걸러야 합니다. 원리: 돌린 사각형에서 줄마다의 왼쪽 끝 $x_l(y)$는 가장 작은 곳에서 꺾이는 V자(직선 둘)입니다. 꺾인 곳 후보마다 양쪽을 최소제곱 직선 $x = my + c$(잔차 제곱합이 가장 작은, 정규방정식의 닫힌 해)로 맞추고, 𝜏보다 멀리 벗어난 점을 빼고 다시 맞추어 이상값의 영향을 줄입니다. 맞는 점이 가장 많은 후보를 고르는 것은 RANSAC처럼 지지하는 점의 수로 모형을 고르는 방식입니다. 𝜏는 1.5px에 긴 변의 0.2%를 더해 큰 그림의 계단 · 안티에일리어싱을 견딥니다. 참고: R43 Björck 1996 · R44 Fischler · Bolles 1981
  3. 내용 = $\max(l_1(y), l_2(y)) - 0.5 \le x \le \min(r_1(y), r_2(y)) + 0.5$이고 $\max(t_1(x), t_2(x)) - 0.5 \le y \le \min(b_1(x), b_2(x)) + 0.5$인 픽셀, 채움 영역 𝐹 = 나머지. 𝐹가 그림의 1~70%이고 𝐹의 97% 이상이 실제로 채움 색일 때만 씁니다.
    • 풀이 — 왜: 네 직선 안쪽만 그림 내용이고 나머지가 돌릴 때 생긴 채움입니다. 채움이 지나치게 작거나 크거나 실제로 채움 색이 아니면 돌린 캔버스로 잘못 본 것이므로 쓰지 않습니다. 원리: 볼록 사각형의 안쪽은 네 반평면의 교집합이라, 줄 𝑦에서 내용은 왼쪽 두 직선 중 큰 값부터 오른쪽 두 직선 중 작은 값까지입니다(칸 𝑥도 같음). $\pm 0.5$는 픽셀 가운데를 기준으로 한 반 칸 여유입니다. 참고: 이 프로그램에서 정한 규칙
  4. 기울기 𝜃: 여덟 직선의 방향각 𝛼(줄 끝은 기울기 $m = dx/dy$에서 $\alpha = \mathrm{atan2}(1, m)$, 칸 끝은 $\alpha = \mathrm{atan2}(m, 1)$)를 4배 각으로 평균한 $\theta = 1/4 \cdot \mathrm{atan2}(\sum \sin 4\alpha, \sum \cos 4\alpha)$(−45°~45°, 시계 방향 양수). 직사각형의 변만으로는 𝜃와 $\theta \mp 90^\circ$를 가를 수 없습니다. $\lvert \theta \rvert < 1^\circ$(기울지 않은 여백 · 레터박스)이면 쓰지 않습니다.
    • 풀이 — 왜: 여덟 직선의 기울기를 하나로 모아 그림이 얼마나 돌았는지 알아야, 뒤의 얼굴 찾기에서 기울기 가설로 씁니다. 원리: 직사각형의 변 방향은 90°마다 같으므로(가로변 · 세로변) 각도를 4배 하면 네 방향이 한 점으로 모입니다. 단위 벡터 $(\cos 4\alpha, \sin 4\alpha)$를 더해 atan2로 방향을 구하고 4로 나누는 것이 원형(방향) 통계의 평균 방향입니다. 각도를 그냥 평균하면 −44°와 44°가 0°로 잘못 평균됩니다. 결과는 90° 주기라 𝜃와 $\theta \mp 90^\circ$를 가를 수 없어, 얼굴 찾기가 세 가설을 다 봅니다. 참고: R83 Fisher 1993
  5. 배경 단계(아래 모두와 얼굴 찾기 뒤의 단계) 동안만 띠 $B = F \oplus 7\times 7$(𝐹를 3px 넓힌 것: 돌릴 때 생긴 경계의 섞인 색 · 튄 값)의 픽셀마다 𝑈, 원본, 알파, $\mathrm{known}$, 선, 선명한 선, $\mathrm{inMask}$를 𝐵 밖에서 4-이웃 너비 우선으로 가장 가까운 픽셀의 값으로 바꿔 두고, 끝나면 되돌립니다. 그 뒤 𝐹를 배경(되돌린 부분에서는 뺌)으로 둡니다. 모서리가 투명해도 배경을 찾고, “배경으로 보내기”도 씁니다. 배경 층의 알파는 원본 알파입니다(불투명 그림은 255 그대로).
    • 풀이 — 왜: 채움과 그림이 맞닿은 경계에는 돌릴 때 보간으로 섞인 색 · 튄 값이 있어 그대로 두면 선이나 캐릭터로 잡힙니다. 배경 단계 동안만 이 띠를 바깥 그림 값으로 덮어 두면 테두리에서 배경 찾기가 자연스럽게 시작됩니다. 원리: $F \oplus 7\times 7$은 7×7 정사각형 구조 요소로 팽창(민코프스키 합)한 것이라 𝐹가 사방으로 3px 넓어집니다. 띠 밖에서 4-이웃 너비 우선 탐색으로 퍼지면 띠의 각 픽셀은 걸음 수(맨해튼 거리)로 가장 가까운 바깥 픽셀의 값을 받습니다. 참고: R15 Soille 2003 · R14 Gonzalez · Woods 2018
  6. 얼굴은 채우기 전 그림에서 찾습니다.

그림의 아래 방향(0.37)

기울기 가설이 있을 때(돌린 캔버스 또는 설정 “기울어진 그림”), 이름용 얼굴(좌우 합의)의 아래 방향 𝑓를 $w = \max(0, s - 10)^2$로 무게 매겨 평균한 $\bar g = \sum w f / \sum w$가 $\lvert \bar g\rvert \ge 0.8$(얼굴들이 서로 맞음)이고 세로에서 40° 넘게 기울었으면 $g = \bar g / \lvert \bar g\rvert$를 아래 방향으로 씁니다.

풀이 — 왜: 돌린 그림에서는 “아래 테두리”가 그림 파일의 아래쪽이 아닐 수 있습니다. 얼굴들이 가리키는 아래 방향을 모아 진짜 아래를 정합니다. 원리: 얼굴마다 아래 방향 단위 벡터 𝑓를 점수로 무게를 매겨 평균합니다. $w = \max(0, s - 10)^2$은 문턱 10 근처의 약한 얼굴은 거의 0, 점수가 높을수록 크게 칩니다. 단위 벡터 평균의 길이 $\lvert \bar g\rvert$는 방향들이 얼마나 모였는지(원형 통계의 평균 결과 길이)라 0.8 이상이면 얼굴들이 서로 맞습니다. $\bar g / \lvert \bar g\rvert$로 길이를 1로 맞춰 방향만 씁니다. 참고: R83 Fisher 1993

단색 · 그라데이션 배경

  1. 테두리의 $\mathrm{known}$ 픽셀 색을 채널별 16단계 칸 $q(U) = 256\lfloor 15.99U_R\rfloor + 16\lfloor 15.99U_G\rfloor + \lfloor 15.99U_B\rfloor$(4096칸)로 세어 가장 많은 칸의 평균을 기준색 𝑟로 둡니다. $\mathrm{known}$인 테두리 픽셀이 16개 미만이거나, 그중 $\max_c\lvert U_c - r_c\rvert < 0.1$인 픽셀이 45% 미만이면 포기합니다.
  2. $\max_c\lvert U - r\rvert < 0.12$인 테두리 픽셀에서 출발해, 이웃 간 변화 $< 0.035 \cdot k$이고 출발 기준색과의 차이 $< 0.3$인 $\mathrm{known}$ 픽셀로 퍼집니다(픽셀마다 자기 기준색을 들고 퍼짐). $k = \min(1, 1200 / \max(W, H))$는 크기 비율입니다(긴 변 1200px 이하는 1). $k < 1$인데 4의 넓이 조건에 걸리면 $k = 1$로 1~4를 다시 합니다. 위 · 오른쪽 · 왼쪽 테두리에서 먼저 퍼진 뒤 아래 테두리에서 퍼지고, 아래 테두리에서만 새로 닿은 4-연결 성분 중 $\max_c\lvert U - r\rvert > 0.04$인 픽셀이 5% 이상인 것은 배경에서 뺍니다. 그림 아래 끝에 걸친 흰 옷 · 치마는 배경과 같은 흰색이어도 명암 · 주름이 있고, 아래 테두리의 흰 바닥 · 여백은 거의 한 색입니다.
    • 풀이 — 왜: 테두리에서 이어진 거의 한 색의 영역을 배경으로 잡는 단계입니다. 원리: 테두리의 가장 흔한 색을 기준으로, 이웃끼리 비슷한 색을 따라 퍼지는 채우기(플러드 필)입니다. 참고: R14 Gonzalez · Woods 2018
  3. 테두리(위 → 오른쪽 → 아래 → 왼쪽으로 한 바퀴 도는 경로)를 양방향으로 두 바퀴씩 걸으며, 경로상 마지막 배경 픽셀에서 64칸 이내이고 그 색과 $\max_c$ 차이 $< 0.05$인 $\mathrm{known}$ 픽셀을 새 씨앗(자기 색이 기준)으로 더하고 허용치 0.12로 다시 퍼집니다(새 씨앗이 없을 때까지, 최대 3회). 선($\mathrm{known}$이 아닌 픽셀)을 만나면 걷기를 끊습니다.
    • 풀이 — 왜: 그라데이션처럼 테두리를 따라 색이 천천히 바뀌는 배경을 이어 잡습니다. 원리: 테두리를 걸으며 마지막 배경 색에 가까운 픽셀을 새 씨앗으로 더해 다시 채웁니다. 참고: R14 Gonzalez · Woods 2018
    • 바닥 띠(0.40): 왼쪽 · 오른쪽 · 아래 테두리의 known 픽셀 중 아직 배경이 아닌 것을 1과 같은 4096칸으로 세어, 가장 많은 칸이 테두리 known 픽셀의 10% 이상이면 그 칸의 평균을 둘째 기준색 r₂로 둡니다. r₂와의 채널 최대 차이가 0.12 미만인 테두리 픽셀이 왼쪽 · 오른쪽에 각각 높이의 3% 이상, 아래에 너비의 30% 이상 있으면, 그 픽셀에서 2와 같은 조건(이웃 간 변화 < 0.035k, r₂와의 차이 < 0.3)으로 퍼진 곳을 띠 F로 둡니다. 열 x마다 F의 가장 위 픽셀 t(x)를 모으고, 고르게 고른 64열에서 두 열마다의 기울기의 중앙값 a와 절편 t(x) − a·x의 중앙값 b로 직선 y = a·x + b를 맞춥니다(테일-센 추정. 캐릭터가 가린 열은 t(x)가 아래로 처져도 중앙값은 흔들리지 않음). F가 그림의 3% 이상 60% 이하이고, 직선에서 τ = max(3, 0.01H)px 안의 열이 너비의 60% 이상이며, 직선보다 τ 넘게 위에 있는 F 픽셀이 F의 2% 이하이면 F를 배경에 더합니다. 돌린 그림(아래 방향이 정해진 그림)에서는 하지 않습니다. 벽과 색이 다른 바닥(선으로 그린 방)이 여기서 잡히고, 그림 아래를 가로지르는 옷 · 머리카락은 윗변이 굽어 있어 직선에 붙는 열이 모자랍니다. 픽시브 AI 생성 그림 666장에서는 이 검사까지 간 그림 7장이 모두 곧은 윗변 조건에서 걸러졌습니다. 대체 직선(0.43): 위 조건이 맞지 않고 F가 그림의 3% 이상 60% 이하이면(캐릭터가 바닥을 넓게 가려 테일-센 직선이 흔들림), 64열에서 두 열을 지나는 직선 중 직선보다 τ 넘게 위에 있는 열이 하나 이하이면서 τ 안의 열이 가장 많은 직선을 고릅니다. 그 직선에서 τ 안의 열이 너비의 25% 이상이고, 왼쪽 · 오른쪽 끝 10% 열에서 각각 절반 이상이 τ 안이며 (벽과 바닥이 만나는 선이 그림을 가로지름), 직선보다 τ 넘게 위인 F 픽셀이 F의 2% 이하이면 F를 배경에 더합니다. AI 생성 그림 777장에서는 이 직선으로 바뀐 그림이 없었습니다.
      • 풀이 — 왜: 벽과 색이 다른 바닥을 곧은 윗변으로 가려냅니다. 원리: 테일-센 추정은 두 점 기울기들의 중앙값이라 캐릭터가 가린 열(이상값)에 흔들리지 않는 직선 맞춤입니다. 참고: R45 Theil 1950 · R46 Sen 1968
  4. 넓이가 전체의 3~97%일 때만 씁니다.
  5. 좁은 틈 막기(0.34): 1~4로 찾은 배경이 밝고 거의 한 색이면(배경 $\mathrm{known}$ 픽셀 최대 약 2만 개의 $L^*$ 중앙값 $\ge 70$, 그 중앙값 색에서 $\Delta E < 10$인 비율 $\ge 0.6$, 얼굴 기준 넓히기의 “거의 한 색”과 같은 식) 같은 문턱으로 1~4를 다시 하되, 벽 $B = \lnot\mathrm{known} \lor(\text{오른쪽 · 아래 이웃과의 변화} \ge 0.035k)$를 $g = \max(2, \mathrm{round}(2 \cdot \max(W, H)/1200))$만큼 팽창한 곳 $\mathrm{dilate}_g(B)$로는 퍼지지 않습니다. 다 퍼진 뒤 배경에서 $g + 1$걸음까지, 원래 퍼지는 조건(이웃 간 변화 $< 0.035k$, 기준색과 $< 0.3$)으로 $\mathrm{known}$ 픽셀을 되살립니다. 폭 $2g$ 이하로 끊긴 윤곽선(옅은 선, 안티에일리어싱 틈)으로는 채우기가 넘어가지 못하고, 벽 둘레의 배경은 되살리기로 다시 찹니다. 다시 한 결과가 4의 넓이 조건에 걸리면 처음 결과를 씁니다. 장면 · 무늬 배경은 한 걸음 색 차가 여기저기 벽이 되어 채우기가 끊기고, 어두운 한 색 배경(밤 장면)은 막힌 틈 너머의 배경 물건이 캐릭터로 돌아와 하지 않습니다(7.5).
    • 풀이 — 왜: 끊긴 윤곽선 틈으로 배경 채우기가 캐릭터 안으로 새는 것을 막습니다. 원리: 벽을 𝑔만큼 팽창해 폭 $2g$ 이하의 틈을 닫고, 채운 뒤 $g + 1$걸음 되살려 벽 둘레의 배경을 되찾습니다(모폴로지 닫힘과 같은 생각). 참고: R15 Soille 2003

장면 배경

선 밀도는 $\sigma = 0.02 \cdot \max(W, H)$로 흐린 값입니다. 선 픽셀이 $0.002N$ 미만이면 장면 배경을 찾지 않습니다.

풀이 — 왜: 장면 배경은 선이 드문 곳(빈 하늘 · 벽)이고 캐릭터는 선이 빽빽한 곳이라는 차이를 씁니다. 선 픽셀이 거의 없는 그림은 이 차이로 가를 수 없어 건너뜁니다. 원리: 0/1 선 지도를 가우시안으로 흐리면 각 픽셀 둘레 약 𝜎 반경 안의 선 비율(커널 밀도 추정)이 됩니다. 𝜎를 긴 변의 2%로 두어 그림 크기와 상관없이 같은 비율의 둘레를 봅니다. 선 픽셀이 $0.002N$(전체의 0.2%) 미만이면 밀도 차이가 없습니다. 참고: R14 Gonzalez · Woods 2018

선으로 둘러싸인 정도 $\varepsilon(p)$: 선 지도를 긴 변 $S = 240$칸으로 줄입니다($w = \max(2, \mathrm{round}(240W / \max(W, H)))$, ℎ도 같게, 픽셀 $(x, y)$는 칸 $(\min(w - 1, \lfloor xw/W\rfloor), \min(h - 1, \lfloor yh/H\rfloor))$에 들고, 칸 안에 선 픽셀이 하나라도 있으면 벽). 칸마다 16방향 $\theta_k = 2\pi k/16$으로 $t = 1 \dots 60$(긴 변의 25%)칸을 곧게 나아가며($(\mathrm{round}(x + t \cos \theta_k), \mathrm{round}(y + t \sin \theta_k))$) 처음 만나는 것이 벽이면 막힌 방향, 그림 밖이거나 60칸 안에 벽이 없으면 트인 방향입니다. 𝜀은 막힌 방향의 비율이고 픽셀 값은 그 픽셀이 든 칸의 값입니다. 둘러싸인 곳은 $\varepsilon \ge 0.9$(16방향 중 15방향 이상)입니다. 칸 수가 그림 크기와 상관없어 어느 그림이든 0.1~0.3초 걸립니다(선이 드물수록 오래 걸림).

풀이 — 왜: 캐릭터 안의 넓은 빈 칠(얼굴 · 옷)은 선 밀도가 낮아 배경처럼 보이지만 사방이 선으로 둘러싸여 있습니다. 둘러싸인 정도로 이런 곳을 배경 후보에서 뺍니다. 원리: 칸마다 16방향(22.5° 간격)으로 곧은 줄을 쏘아(광선 투사) 60칸 안에서 벽을 먼저 만나는 방향의 비율을 잽니다. 줄 위의 점은 $(x + t\cos\theta_k,\ y + t\sin\theta_k)$를 반올림한 격자점입니다. 15/16 이상이면 거의 닫힌 곳입니다. 선 지도를 긴 변 240칸으로 줄일 때 칸 안에 선이 하나라도 있으면 벽으로 두므로(최댓값 축소) 가는 선이 사라지지 않고, 계산량은 그림 크기와 상관없이 $240^2 \times 16 \times 60$ 이하로 묶입니다. 참고: R14 Gonzalez · Woods 2018 · 이 프로그램에서 정한 규칙

D_a=G_\sigma(\mathbb 1_{line}),\quad D_c=G_\sigma(\mathbb 1_{crisp}),\quad D_s=G_\sigma(\mathbb 1_{line\wedge\neg crisp}),\qquad
\tau_a=\tfrac14\,\mathrm{median}_{line}D_a,\quad \tau_c=\tfrac14\,\mathrm{median}_{crisp}D_c

풀이 — 왜: “선 밀도가 낮다”의 기준은 그림마다 다릅니다(굵고 빽빽한 선, 가늘고 성긴 선). 그림 자신의 선 위 밀도로 문턱을 정하면 그림마다 맞춰집니다. 원리: $\mathbb 1_{line}$은 선 픽셀에서 1인 지시 함수이고 $G_\sigma$는 가우시안 흐림이라 𝐷는 둘레의 선 비율입니다. 선 위 밀도의 중앙값은 “선이 있는 곳의 전형적인 밀도”이고, 그 1/4 아래를 선이 드문 곳으로 봅니다. 중앙값은 몇몇 아주 빽빽한 곳에 흔들리지 않는 대푯값입니다. 선명한 선과 흐린 선($line \wedge \neg crisp$)을 나눠, 뭉개 칠한 배경을 2단계에서 따로 봅니다. 참고: R14 Gonzalez · Woods 2018 · R50 Hyndman · Fan 1996

중앙값은 $\mathrm{round}(1000D)$의 1001칸 히스토그램에서 누적이 절반 이상이 되는 첫 칸 𝑖의 $i/1000$입니다(선명한 선이 없으면 $\tau_c = 0$).

풀이 — 왜: 수십만 개 값을 정렬하지 않고 중앙값을 빠르고 늘 같게 구합니다. 원리: 0~1 값을 0.001 단위 칸에 세고 누적 개수가 처음으로 절반 이상이 되는 칸을 찾으면, 정렬한 값의 가운데와 0.001 안에서 같습니다(히스토그램으로 구한 분위수). 참고: R50 Hyndman · Fan 1996

잘린 캐릭터 부분

1단계 배경의 연결 조각에 대해 테두리 경로를 한 바퀴 걸으며 구간(run)을 만듭니다. 0.3% 미만 조각은 틈으로 봅니다. 가장 넓은 조각, 15%를 넘는 조각, 위쪽 두 모서리 근처(위 테두리를 따라 모서리에서 $\max(3, \mathrm{round}(0.05W))$, 옆 테두리를 따라 $\max(3, \mathrm{round}(0.05H))$ 안)에 닿은 조각은 대상에서 뺍니다. 어떤 조각의 모든 구간에서, 양옆으로 틈 구간을 건너 처음 만나는 다른 조각까지 가는 사이에 선명한 선이 있고 두 조각의 평균색(𝑈의 Lab) 차이가 $\Delta E \ge 25$이면 그 조각을 캐릭터로 되돌립니다.

풀이 — 왜: 그림 테두리에 걸린 캐릭터 부분(잘린 팔 · 머리카락)은 테두리에서 출발한 1단계 배경에 들어갑니다. 테두리를 따라 선명한 선으로 갈리고 색이 크게 다른 조각은 배경이 아니라 잘린 캐릭터입니다. 원리: 테두리 경로를 걷는 구간 단위로 이웃 조각과 견줍니다. 평균색의 $\Delta E \ge 25$는 확실히 다른 색입니다. 위쪽 두 모서리 근처 조각을 빼는 것은 하늘 · 천장처럼 모서리에 닿은 배경을 지키기 위해서이고, 그 범위를 너비 · 높이의 5%(최소 3px)로 둡니다. 참고: R7 CIE 2004 · 이 프로그램에서 정한 규칙

색 모델로 넓히기 (GrabCut 방식)

  1. 영역: 원본의 Lab을 $\mathrm{known}$ 픽셀에서 k-평균(24색, 표본 4만 개)으로 나누고, 같은 색의 4-연결 성분 중 40px 이상을 영역 𝑟로, 나머지는 라벨 채우기로 붙입니다. $\mathrm{known}$ 픽셀이 $0.2N$ 미만이면 이 단계와 얼굴 기준 넓히기를 하지 않습니다.
    • 풀이 — 왜: 픽셀 수십만 개로 그래프 컷을 하면 느리므로, 비슷한 색의 이어진 픽셀을 영역 하나로 묶어(슈퍼픽셀) 영역 단위로 나눕니다. 원리: k-평균은 각 점을 가장 가까운 중심에 배정하고 중심을 배정된 점의 평균으로 옮기기를 되풀이해 제곱 오차 합 $\sum \lVert x - \mu\rVert^2$을 줄입니다(로이드 알고리즘). Lab에서 하므로 거리가 지각 색 차에 가깝고, 표본 4만 개로 중심을 배워 시간을 묶습니다. 40px 미만 성분은 잡음이라 이웃 라벨로 채웁니다. 참고: R22 Lloyd 1982 · R7 CIE 2004
  2. 영역 특성: 넓이 $A_r$, 평균 Lab($\mathrm{known}$ 픽셀), 선명한 선 밀도 비 $\rho_r = \mathrm{mean}_r(D_c)/\tau_c$(여기서는 $\tau_c \ge 10^{-4}$), 기존 배경 비율 $\beta_r$, 위 · 왼쪽 · 오른쪽 테두리 픽셀 중 𝑟인 것의 수 $F_r$, 둘레 중 선명한 선의 비율 $\kappa_r = (\text{선명한 선에 걸친 경계 픽셀 쌍 수})/(\text{다른 영역과 맞닿은 경계 픽셀 쌍 수})$.
    • 풀이 — 왜: 영역이 캐릭터인지 배경인지 가를 단서(넓이, 색, 선명한 선 밀도, 기존 배경 비율, 테두리 닿음, 선명한 선으로 둘러싸인 정도)를 영역마다 모읍니다. 원리: $\rho_r$는 영역의 평균 선명한 선 밀도를 그림의 기준 $\tau_c$로 나눈 비라 그림마다 다른 선 굵기 · 밀도가 지워집니다(1이면 기준과 같음). $\kappa_r$은 영역 경계 중 선명한 선에 걸친 비율로, 윤곽선으로 둘러싸인 캐릭터 부분에서 큽니다. $\tau_c \ge 10^{-4}$는 0으로 나누기를 막습니다. 참고: R25 Rother et al. 2004 · 이 프로그램에서 정한 규칙
  3. 맞닿음: 가로 · 세로로 이웃한 픽셀 쌍이 다른 영역이면, 둘 중 하나라도 $\mathrm{inMask}$이면 선으로 맞닿은 길이 𝑙에, 아니면 선 없이 맞닿은 길이 𝑜에 1을 더하고, 하나라도 선명한 선이면 선명한 선 길이 𝑘에도 1을 더합니다.
  4. 색 분포: Lab을 $13 \times 32 \times 32$칸($\lfloor L/8\rfloor,\ \lfloor(a + 128)/8\rfloor,\ \lfloor(b + 128)/8\rfloor$, 범위 밖은 끝 칸)으로 세고, 이웃 $3 \times 3 \times 3$칸을 합쳐 부드럽게 한 뒤 정규화합니다.

    $\displaystyle p(i)=\frac{\tilde h(i)}{\sum_j \tilde h(j)},\qquad \tilde h(l,a,b)=\sum_{|\delta_l|,|\delta_a|,|\delta_b|\le1}h(l+\delta_l,\,a+\delta_a,\,b+\delta_b)$

    • 풀이 — 왜: 영역이 캐릭터 색인지 배경 색인지 확률로 재려면 두 쪽의 색 분포가 필요합니다. 칸이 곱고 표본이 적으면 빈 칸이 많아 확률이 0이 되므로 이웃 칸을 합쳐 부드럽게 합니다. 원리: Lab을 8 단위로 나눈 3차원 색 히스토그램(13 × 32 × 32 = 13,312칸)입니다. 3×3×3 이웃 합은 상자 커널로 히스토그램을 흐리는 커널 밀도 추정과 같고, 전체 합으로 나누면 합이 1인 확률 분포 𝑝가 됩니다. GrabCut의 가우시안 혼합 대신 히스토그램을 쓰면 반복 추정이 없어 빠르고 결과가 늘 같습니다. 참고: R84 Swain · Ballard 1991 · R25 Rother et al. 2004
  5. 초기값: 배경 $B^0 = \lbrace\beta_r > 0.5\rbrace \cup \lbrace F_r > 0 \land \rho_r < 1\rbrace$, 캐릭터 핵심 $F^0 = \lbrace\rho_r > 3 \land F_r = 0\rbrace \setminus B^0$. $F^0$는 아래 겹침 검사에만 쓰고, 첫 번째 컷의 캐릭터 분포는 $B^0$ 밖의 모든 영역에서 배웁니다.
    • 풀이 — 왜: 그래프 컷은 처음 두 색 분포가 있어야 시작할 수 있습니다. 확실한 배경(기존 배경이 절반 넘음, 테두리에 닿고 선이 드묾)과 확실한 캐릭터(선명한 선이 빽빽하고 테두리에 안 닿음)로 출발점을 잡습니다. 원리: $\lbrace\text{조건}\rbrace$은 조건을 만족하는 영역의 집합, ∪는 합집합, ∖는 차집합입니다. $\rho_r > 3$은 기준보다 선명한 선이 세 배 넘게 빽빽하다는 뜻입니다. 참고: R25 Rother et al. 2004 · 이 프로그램에서 정한 규칙
  6. 안전장치:
    • 두 분포의 겹침 $\sum \min(p_{F^0}, p_{B^0}) \ge 0.3$이면 하지 않습니다.
      • 풀이 — 왜: 캐릭터와 배경의 색 분포가 많이 겹치면 색으로 가를 수 없어, 색 모델이 엉뚱한 곳을 배경으로 보낼 위험이 큽니다. 원리: $\sum \min(p, q)$는 두 정규화 히스토그램의 교집합(히스토그램 인터섹션)으로, 0이면 전혀 겹치지 않고 1이면 같은 분포입니다. 0.3 이상이면 30% 넘게 겹칩니다. 참고: R84 Swain · Ballard 1991
    • 기존 배경이 위 · 왼쪽 · 오른쪽 테두리의 90% 이상을 덮으면 하지 않습니다.
  7. 에너지: 캐릭터를 1, 배경을 0으로 둔 라벨 $x_r$에 대해

    $\displaystyle E(x)=\sum_r \theta_r\,[x_r=0]\;+\;\sum_{(r,q)} w_{rq}\,[x_r\ne x_q]$

    $\displaystyle \theta_r=\sum_{p\in r,\,known}\mathrm{clip}_{[-3,3]}\ln\frac{p_F(c_p)+10^{-6}}{p_B(c_p)+10^{-6}} +A_r\,\mathrm{clip}_{[0,2]}\ln\frac{\max(\rho_r,\,10^{-3})}2 -A_r\,\beta_r-20F_r +A_r\,\mathrm{clip}_{[0,2]}\frac{\kappa_r-0.3}{0.15}$

    첫째 항은 색, 둘째 항은 선명한 선 밀도가 $2\tau_c$(선명한 선 위 밀도 중앙값의 절반)를 넘는 정도($\rho_r = 2e^2 \approx 14.8$에서 최대 2), 셋째 · 넷째 항은 기존 배경과 테두리, 다섯째 항은 선명한 선으로 둘러싸인 정도($\kappa_r$ 30%에서 0, 60%에서 2)입니다.

    $\displaystyle w_{rq}=8\,o\,\exp\!\left(-\frac{\Delta E_{rq}^2}{2\cdot 12^2}\right)+0.3\,l$

    $\theta_r > 0$이면 캐릭터 쪽 비용입니다. $\beta_r > 0.5$인 영역은 배경으로 고정($\theta = -\infty$), 평균 $L^* < 30$이고 $C^* < 12$인 영역(검정에 가까운 무채색)과 영역 평균 $\bar \varepsilon_r \ge 0.9$인 영역(선으로 둘러싸인 곳)은 캐릭터로 고정($\theta = +\infty$)합니다.

    • 풀이 — 왜: 영역마다 “캐릭터일 근거”(색, 선 밀도, 둘러싸임)와 “배경일 근거”(기존 배경, 테두리)를 하나의 비용으로 모으고, 비슷한 색으로 선 없이 맞닿은 영역끼리는 같은 쪽이 되도록 비용을 더해, 전체 비용이 가장 작은 나누기를 찾습니다. 원리: 𝐸는 GrabCut과 같은 꼴의 에너지(데이터 항 + 매끄러움 항)입니다. $[x_r = 0]$은 참이면 1인 아이버슨 괄호라 $\theta_r > 0$인 영역을 배경으로 보내면 $\theta_r$만큼 비용이 듭니다. 색 항은 두 분포의 로그 우도비 $\ln(p_F/p_B)$(베이즈 판별에서 두 가설의 증거)를 픽셀마다 더한 것이고, $10^{-6}$은 로그 0을 막고 ±3 자르기는 드문 색 몇 픽셀이 판정을 좌우하지 않게 합니다. 선 밀도 항 $\ln(\rho/2)$는 𝜌 = 2에서 0이고 $2e^2$에서 2로 잘리며, 𝜅 항은 30%에서 0, 60%에서 2인 램프입니다. $w_{rq}$는 색이 비슷할수록 큰 가우시안 무게 $\exp(-\Delta E^2/2\sigma^2)$(𝜎 = 12)를 선 없이 맞닿은 길이 𝑜에 곱하고, 선으로 맞닿은 길이 𝑙에는 작은 무게 0.3을 주어 선을 따라 자르기 쉽게 합니다. $\theta = \pm\infty$는 그 영역의 라벨을 고정합니다. 참고: R25 Rother et al. 2004 · R24 Boykov · Jolly 2001 · R7 CIE 2004
  8. 최소 컷: 소스(캐릭터) → 영역 용량 $\theta_r^{+} = \max(\theta_r, 0)$, 영역 → 싱크(배경) 용량 $\theta_r^{-} = \max(-\theta_r, 0)$, 영역 쌍은 양방향 $w_{rq}$인 그래프에서 Dinic 최대 흐름을 구하고 (너비 우선으로 층을 매긴 뒤 층이 하나씩 늘어나는 증가 경로를 깊이 우선으로 막힐 때까지 흘리기를 반복, 남은 용량 $10^{-9}$ 이하는 0으로 봄), 잔여 그래프에서 소스로부터 닿는 영역을 캐릭터로 둡니다. 최대 흐름과 최소 컷의 값이 같으므로 이것이 $E(x)$를 가장 작게 하는 나누기입니다.
    • 풀이 — 왜: 위 에너지를 가장 작게 하는 0/1 라벨을, 모든 조합($2^{\text{영역 수}}$)을 보지 않고 정확히 구합니다. 원리: 두 라벨 에너지에서 매끄러움 무게가 음수가 아니면(서브모듈러) 소스 · 싱크 그래프의 컷 값이 곧 에너지라, 최소 컷이 최소 에너지입니다. 최대 흐름 = 최소 컷 정리(포드–풀커슨)에 따라 최대 흐름을 구한 뒤 잔여 그래프에서 소스로부터 닿는 쪽이 최소 컷의 한쪽입니다. Dinic은 너비 우선으로 층 그래프를 만들고 막힘 흐름을 깊이 우선으로 채우기를 되풀이해 $O(V^2E)$ 안에 끝납니다. $10^{-9}$ 이하 남은 용량을 0으로 보는 것은 실수 오차로 끝없이 도는 것을 막습니다. 참고: R26 Ford · Fulkerson 1956 · R27 Dinic 1970 · R24 Boykov · Jolly 2001
  9. 연결 조건: 새 배경 영역은 기준 배경($B^0$)에서, 선명하지 않은 맞닿음 $o + l - k$가 $\max(3, 0.3(o + l))$ 이상인 경계만 건너 닿을 수 있어야 합니다. 닿지 못하면 캐릭터로 되돌립니다.
    • 풀이 — 왜: 새로 배경이 된 영역이 기존 배경과 선명한 선으로만 맞닿아 있으면 윤곽선 너머의 캐릭터 영역일 가능성이 큽니다. 원리: $o + l - k$는 맞닿은 길이 중 선명한 선이 아닌 길이입니다. 그 길이가 전체 맞닿음의 30% 이상(최소 3px)인 경계만 건너 기준 배경에서 그래프 탐색으로 닿는 영역만 배경으로 둡니다. 참고: 이 프로그램에서 정한 규칙
  10. 나눈 결과로 두 색 분포를 다시 배워 7~9를 4번 반복합니다. 배경이 된 영역의 $\mathrm{known}$ 픽셀과 흐린 선 픽셀을 배경에 더합니다(선명한 선은 더하지 않음).

난수는 이 단계만의 고정 씨앗(777)을 써서, 이 단계가 동작하지 않는 그림의 결과를 한 비트도 바꾸지 않습니다. 영역 그래프는 처음 필요할 때 한 번 만들어 아래 얼굴 단계와 같이 씁니다.

딸려 들어간 캐릭터 부분

  1. 선명한 경계: 𝑈(선 아래 색을 복원한 그림)의 Lab에서 $\max(\Delta E(p-1, p + 1), \Delta E(p-W, p + W)) \ge 20$인 픽셀. 흐리게 번진 경계는 2px 사이 차이가 작아 들지 않습니다.
    • 풀이 — 왜: 선 없이 색만 바뀌는 캐릭터 경계(선 없는 채색)를 잡기 위해서입니다. 원리: 양옆 두 픽셀(2px 사이)의 Lab 거리는 중심 차분으로 잰 색 기울기의 크기입니다. 가로 · 세로 중 큰 값이 20 이상이면 급한 색 경계이고, 2px 사이를 보므로 흐리게 번진 경계(그라데이션)는 한 걸음 차이가 작아 들지 않습니다. 참고: R7 CIE 2004 · R14 Gonzalez · Woods 2018
  2. 조각: 1~5단계 배경 중 선명한 경계도 선도 아닌 픽셀의 4-연결 성분 𝑘. 경계 · 선 픽셀은 가장 가까운 조각이나 캐릭터의 라벨로 채운 뒤, 라벨이 다른 이웃 쌍으로 맞닿은 길이를 잽니다.
  3. 색 로그 우도비: Lab을 $10 \times 16 \times 16 = 2560$칸($\lfloor L/10\rfloor,\ \lfloor(a + 128)/16\rfloor,\ \lfloor(b + 128)/16\rfloor$, 범위 밖은 끝 칸)으로 세어, 캐릭터(배경이 아닌 $\mathrm{known}$, $n_C$개) 분포 $h_C$와 배경($\mathrm{known}$, $n_B$개) 분포 $h_B$에서 조각 자신 $h_k$를 뺀 분포를 비교합니다(칸마다 1을 더하는 라플라스 평활, $n_B - \lvert k\rvert$는 1 이상으로).

    $\displaystyle \bar\ell_k=\frac1{|k|}\sum_{p\in k,\,known}\mathrm{clip}_{[-4,4]}\ln\frac{(h_C(c_p)+1)/(n_C+2560)}{(h_B(c_p)-h_k(c_p)+1)/(n_B-|k|+2560)}$

    • 풀이 — 왜: 배경으로 들어간 조각이 캐릭터 색에 가까운지 배경 색에 가까운지 재서, 캐릭터 색이면 되돌립니다. 원리: 조각의 픽셀마다 캐릭터 분포와 배경 분포에서 그 색이 나올 확률 비의 로그(로그 우도비)를 더해 넓이로 나눈 평균입니다. 양수면 캐릭터 쪽이 더 그럴듯합니다. 칸마다 1을 더하는 라플라스 평활 $(h + 1)/(n + K)$(𝐾 = 2560)는 한 번도 안 본 색의 확률이 0이 되지 않게 합니다. 배경 분포에서 조각 자신을 빼는 것은 한 개 빼기 교차 검증과 같은 생각으로, 조각이 자기 색으로 배경 분포를 부풀려 자신을 배경으로 판정하는 순환을 막습니다. 참고: R51 Manning et al. 2008 · R74 Stone 1974
  4. 조건: 넓이가 전체의 0.1% 이상, 위 · 왼쪽 · 오른쪽 테두리에 닿지 않음, 캐릭터와 맞닿은 길이가 전체 맞닿은 길이의 0.8배 이상, $\bar \ell_k \ge 0.8$. 테두리 조각(0.41): 위 · 왼쪽 · 오른쪽 테두리에 닿은 조각은, 점수 11 이상인 얼굴의 얼굴 틀 $(u, v)$(얼굴 찾기의 3)에서 머리 타원 $(u/2.2)^2 + ((v + 0.3)/2)^2 \le 1$이나 몸 기둥($-1.2 \le v \le 8$, $\lvert u\rvert \le 1.2 + 0.35 \cdot \max(v - 1.5, 0)$)에 넓이(2px 간격 격자로 셈)의 절반 이상이 들고, 가장 큰 조각이 아니고, 넓이가 전체의 0.1% 이상 6% 이하, 캐릭터와 맞닿은 길이가 0.75배 이상, $\bar \ell_k \ge 0.75$이면 고릅니다. 화면 밖으로 잘린 머리카락 끝 · 소매 · 팔이 이 조건으로 돌아오고, 얼굴에서 먼 테두리 배경과 가장 큰 배경 조각은 그대로 남습니다.
    • 풀이 — 왜: 우도비만으로는 배경의 작은 조각도 되돌릴 수 있어 넓이 · 맞닿음 조건을 더합니다. 테두리에 닿은 조각은 배경일 가능성이 높아 얼굴 가까이 있을 때만 되돌립니다. 원리: 머리 타원 $(u/2.2)^2 + ((v + 0.3)/2)^2 \le 1$은 얼굴 틀 좌표(눈 사이 거리 𝑑 단위)에서 가로 반지름 2.2, 세로 반지름 2, 가운데가 눈 위 0.3인 타원입니다. 몸 기둥은 $v = 1.5$ 아래로 기울기 0.35로 넓어지는 사다리꼴(어깨 · 치마가 퍼지는 모양)입니다. 캐릭터와 맞닿은 길이 비 0.8 이상은 조각이 거의 캐릭터에 둘러싸였다는 뜻입니다. 참고: 이 프로그램에서 정한 규칙
  5. 고른 조각과, 그 조각 쪽 경계 · 선 띠, 캐릭터 쪽 경계 띠(3px까지)를 배경에서 뺍니다. 색 모델은 되돌리기 전 배경으로 계산하고, 되돌린 픽셀은 색 모델이 더한 배경에서도 빼며, 아래의 배경 효과 후보에서도 뺍니다.
  6. 장면 배경 단계에서 삼켜진 캐릭터를 되돌린 그림(아래)은, 조각 나누기와 색 비교를 되돌리기 전의 배경으로 합니다. 되돌린 캐릭터 색이 캐릭터 쪽 분포에 들어가면 다른 조각(같은 색 계열의 머리카락)의 우도비가 바뀌어 판정이 흔들리기 때문입니다.
  7. 어두운 캐릭터 부분(0.43): 4의 조건으로 되돌린 조각을 뺀 같은 배경을, 이번에는 2px 사이 $\Delta E \ge 5$인 옅은 경계와 선에서 잘라 조각 𝑘로 나눕니다(라벨 채우기 · 맞닿은 길이는 2와 같음). 위 · 왼쪽 · 오른쪽 테두리에 닿은 조각의 픽셀로 Lab을 $25 \times 64 \times 64 = 102400$칸($\lfloor L/4\rfloor,\ \lfloor(a + 128)/4\rfloor,\ \lfloor(b + 128)/4\rfloor$, 범위 밖은 끝 칸)으로 세어 $h_T$(합 $n_T$)로 두고, 테두리에 닿지 않은 조각마다

    $\displaystyle \nu_k=\frac1{|k|}\sum_{p\in k}\mathrm{clip}_{[-4,4]}\Big(\ln\frac{n_T+102400}{102400}-\ln\big(h_T(c_p)+1\big)\Big),\qquad \bar L_k=\frac1{|k|}\sum_{p\in k}L^*_p$

    를 잽니다. $2\times10^{-5}N \le |k| \le 0.15N$, $\bar L_k \le 35$, $\nu_k > 0$(테두리 배경에서 평균보다 드문 색)인 조각이 후보이고, 후보 중 캐릭터와 맞닿은 길이와 이미 받아들인 후보와 맞닿은 길이의 합이 전체 맞닿은 길이의 0.1배 이상이거나 $0.25\sqrt{|k|}$ 이상인 조각을, 더 받아들일 것이 없을 때까지 되풀이해 받아들입니다(다리 → 치마 → 몸처럼 이어진 조각). 받아들인 조각과 캐릭터 사이 띠(3px)도 함께 되돌립니다. 어두운 배경 자체는 테두리 배경과 색이 같아 돌아오지 않고, 어두운 배경 위에 칠한 검은 머리카락 · 치마 · 다리처럼 배경과 색이 조금 다른 부분이 돌아옵니다.

    • 풀이 — 왜: 어두운 배경 위의 검은 머리카락 · 옷은 배경과 색이 가까워 위의 우도비로는 돌아오지 않습니다. 테두리 배경에서 드문 색인지로 가릅니다. 원리: $\nu_k$의 각 항 $\ln\frac{n_T + K}{K} - \ln(h_T + 1) = \ln\frac{1/K}{(h_T + 1)/(n_T + K)}$는 균등 분포 $1/K$에 대한 라플라스 평활 테두리 분포의 로그 비라, 테두리 배경에서 그 색이 평균보다 드물면 양수입니다. 칸을 4 단위로 곱게(102,400칸) 나눠 비슷한 어두운 색도 구별합니다. 맞닿은 길이 $\ge 0.25\sqrt{|k|}$는 둘레가 넓이의 제곱근에 비례한다는 점을 써서 큰 조각의 기준을 넓이에 맞춘 것이고, 받아들인 조각에 맞닿은 조각을 되풀이해 받는 것은 영역 성장입니다. 참고: R51 Manning et al. 2008 · 이 프로그램에서 정한 규칙

얼굴 찾기

학습한 모델 없이, 손으로 정한 규칙과 평균 무늬로 찾습니다. 그림을 $k_f = 800 / \max(W, H)$배($w = \max(2, \mathrm{round}(k_f W))$, ℎ도 같게)로 맞추고 (줄일 때는 면적 평균, 투명한 곳은 흰 바탕 $A\cdot O + 1 - A$), Lab에서 잽니다. 찾은 위치 · 크기는 $1/k_f$배해 처리 해상도로 돌려놓습니다.

풀이 — 왜: 얼굴 찾기를 늘 같은 크기(긴 변 800px)에서 하면 문턱 · 반지름 목록이 그림 크기와 상관없이 맞고 시간도 일정합니다. 원리: 면적 평균 축소와 흰 바탕 합성 $A\cdot O + 1 - A$(4.0)을 쓰고, 찾은 위치 · 길이는 $1/k_f$배해 돌려놓습니다. 참고: R14 Gonzalez · Woods 2018 · R1 Porter · Duff 1984

  1. 눈 후보: $\ell = L^*/100$을 상자 흐림 3회(반지름 $\rho \in \lbrace1, 2, 3, 4, 5, 7, 9, 12, 15, 20\rbrace$, $\sigma^2 = \rho^2 + \rho$: 4.2의 상자 흐림 분산식을 거꾸로 푼 값)로 흐리고 2차 차분으로 헤세 행렬을 구해,

    $\displaystyle L_{xx}=\ell_{x-1,y}-2\ell_{x,y}+\ell_{x+1,y},\quad L_{yy}=\ell_{x,y-1}-2\ell_{x,y}+\ell_{x,y+1},\quad L_{xy}=\tfrac14\left(\ell_{x+1,y+1}-\ell_{x-1,y+1}-\ell_{x+1,y-1}+\ell_{x-1,y-1}\right)$

    $\displaystyle D_\sigma=\sigma^4\left(L_{xx}L_{yy}-L_{xy}^2\right)\quad(L_{xx}+L_{yy}>0)$

    헤세 행렬식이 양수이면 둥근 덩어리이고, $L_{xx} + L_{yy} > 0$(가운데가 둘레보다 어두움)인 것만 봅니다. $\sigma^4$는 크기가 달라도 값을 견줄 수 있게 하는 크기 정규화입니다. 이웃한 두 크기와 5×5 안에서 가장 크고 $D > 0.004$인 점을 반지름 $r = 1.414\sigma$의 후보로, 큰 순서로 3000개까지 둡니다.

    • 풀이 — 왜: 애니메이션 그림의 눈은 둘레보다 어두운 둥근 덩어리입니다. 여러 크기의 둥근 어두운 덩어리를 찾는 표준 방법이 헤세 행렬식 덩어리 검출입니다. 원리: 흐린 밝기의 2차 도함수를 차분으로 근사합니다($L_{xx}$는 중심 2차 차분, $L_{xy}$는 대각 네 점의 혼합 차분). 헤세 행렬의 행렬식 $L_{xx}L_{yy} - L_{xy}^2$은 두 고유값(두 방향 곡률)의 곱이라, 양수이면 두 방향이 같은 쪽으로 휘는 둥근 덩어리이고 한 방향만 휘는 선은 0에 가깝습니다. 대각합 $L_{xx} + L_{yy} > 0$(라플라시안 양수)은 가운데가 둘레보다 어두운 쪽입니다. $\sigma^4$는 린데버그의 크기 정규화(2차 도함수마다 $\sigma^2$)라 여러 크기의 값을 견줄 수 있고, 반지름 약 $\sqrt 2\sigma$의 덩어리에서 가장 커집니다. 상자 흐림 3회는 가우시안 근사이고, 반지름 𝜌 상자 한 번의 분산 $\rho(\rho + 1)/3$을 세 번 더해 $\sigma^2 = \rho^2 + \rho$입니다. 크기 · 위치 모두에서 이웃보다 큰 점만 남깁니다(비최대 억제). 참고: R33 Lindeberg 1998 · R17 Wells 1986 · R14 Gonzalez · Woods 2018
  2. 짝: 두 후보(왼쪽 𝑎, 오른쪽 𝑏) 사이 거리 $d \ge 16,\ 4 \le d / \bar r \le 24$($\bar r$은 두 반지름의 평균), $\lvert \Delta y\rvert \le 0.8\Delta x$, 반지름 비 $\le 1.7$. 기울기 가설(0.37): 돌린 캔버스(기울기 𝜃)이면 가설 $\varphi \in \lbrace\theta, \theta \mp 90^\circ \rbrace$마다 따로 찾습니다. 짝 거르기는 눈을 잇는 방향과 𝜑의 차 𝛿(−90°~90°로 접음)에서 $\lvert \tan \delta \rvert \le 0.8$, 기울기 근거(5의 “많이 기울지 않음”)는 $t = \lvert \tan(\angle e - \varphi)\rvert$이고, 6의 위치 다듬기와 7의 고르기도 가설마다 합니다. 옆으로 누운 얼굴은 아래가 어느 쪽인지 모르므로 눈을 잇는 선이 가파른 짝은 180° 돌린 틀(𝑒, 𝑓의 부호를 모두 바꿈)로도 잽니다. 이름용 얼굴(좌우 합의: 뒤집은 그림은 $-\varphi$)의 가장 높은 점수가 큰 가설을 쓰고, 같으면 𝜃입니다. 설정 “기울어진 그림”을 켜면 돌린 캔버스가 아닌 그림도 $\varphi \in \lbrace0, -30, 30, -60, 60, -90, 90\rbrace^\circ$로 같은 방법으로 찾습니다(0°를 우대하지 않음). 둘 다 아니면 $\varphi = 0$ 하나이고 0.36과 같습니다.
    • 풀이 — 왜: 두 눈은 크기가 비슷하고 적당히 떨어져 있으며 대체로 가로로 놓입니다. 이 기하 조건으로 수천 개 후보의 짝 수백만 개 중 얼굴이 될 만한 것만 남깁니다. 원리: $4 \le d/\bar r \le 24$는 눈 사이 거리가 눈 반지름의 4~24배, $\lvert \Delta y\rvert \le 0.8\Delta x$는 눈을 잇는 선이 $\arctan 0.8 \approx 38.7^\circ$ 안, 반지름 비 $\le 1.7$은 두 눈의 크기가 비슷하다는 조건입니다. 돌린 그림에서는 기준 방향을 𝜑만큼 돌려 같은 조건을 $\lvert\tan\delta\rvert \le 0.8$로 쓰고, 각도 차를 −90°~90°로 접는 것은 눈을 잇는 선이 방향 없는 축이기 때문입니다. 참고: 이 프로그램에서 정한 규칙 · R83 Fisher 1993
  3. 얼굴 틀: 두 눈 가운데를 원점, 눈 방향을 𝑢, 그에 수직인 아래 방향을 𝑣로 두고 𝑑를 단위로 격자 표본(쌍선형 보간, 그림 밖은 가장자리로)을 잽니다.

    $\displaystyle \mathbf c=\tfrac12(\mathbf a+\mathbf b),\quad d=|\mathbf b-\mathbf a|,\quad \mathbf e=\frac{\mathbf b-\mathbf a}d,\quad \mathbf f=\pm(-e_y,\,e_x)\ (f_y\ge0),\qquad \mathbf x(u,v)=\mathbf c+d\,(u\,\mathbf e+v\,\mathbf f)$

    거꾸로 픽셀 𝑥의 틀 좌표는 $u = (x - c)\cdot e / d,\ v = (x - c)\cdot f / d$입니다. 기울기는 $t = \lvert b_y - a_y\rvert/ \max(\lvert b_x - a_x\rvert, 10^{-6})$입니다. 격자는 범위 양 끝을 포함해 고르게 나눈 $n_u \times n_v$점입니다.

    • 풀이 — 왜: 눈 위치와 거리를 기준으로 좌표를 잡으면 얼굴 크기 · 기울기와 상관없이 같은 자리(볼, 콧등, 속눈썹)를 같은 좌표로 잴 수 있습니다. 원리: 가운데 𝑐, 눈 거리 𝑑, 눈 방향 단위 벡터 𝑒와 그에 수직인 𝑓로 만든 닮음 변환 $\mathbf x(u, v) = \mathbf c + d(u\mathbf e + v\mathbf f)$(이동 · 회전 · 크기)입니다. $(-e_y, e_x)$는 𝑒를 90° 돌린 벡터이고 부호는 아래($f_y \ge 0$)를 향하게 고릅니다. 𝑒, 𝑓가 정규 직교 기저라 거꾸로는 내적 $u = (x - c)\cdot e / d$로 구합니다. 정수가 아닌 위치의 값은 쌍선형 보간으로 얻습니다. 참고: R35 Strang 2016 · R14 Gonzalez · Woods 2018
    칸 범위 격자
    눈 칸(두 눈 각각) $0.28 \le \lvert u\rvert \le 0.72,\ \lvert v\rvert \le 0.18$ 8 × 6
    속눈썹 띠(두 눈 각각) $0.25 \le \lvert u\rvert \le 0.75,\ -0.32 \le v \le -0.14$ 8 × 3
    콧등 $\lvert u\rvert \le 0.12,\ 0.05 \le v \le 0.45$ 4 × 6
    볼(두 볼 각각) $0.3 \le \lvert u\rvert \le 0.7,\ 0.35 \le v \le 0.7$ 5 × 5
    눈 속 반짝임(두 눈 각각) $\lvert u \mp 0.5\rvert \le 0.2,\ \lvert v\rvert \le 0.2$ 17 × 17
    입 아래 볼 · 코 아래(9의 조정) $\lvert u\rvert \le 0.9,\ 0.4 \le v \le 0.8$ · $\lvert u\rvert \le 0.25,\ 0.8 \le v \le 1.3$ 9 × 5 · 7 × 7
    위 · 아래 눈꺼풀 띠(9의 조정) $\lvert u\rvert \le 0.7,\ -0.3 \le v \le -0.12$ · $0.12 \le v \le 0.3$ 15 × 4

    피부 밝기 𝑆는 콧등 · 두 볼 표본 74개 $L^*$의 중앙값입니다. 눈 칸의 홍채 색은 $L^*$이 중앙값 이하인 표본의 평균 Lab, 속눈썹 띠 값은 3줄마다의 최솟값의 평균, 눈 칸 최솟값은 두 눈 칸 최솟값의 평균입니다. 반짝임 ℎ는 17 × 17 격자(간격 $0.025d$)에서 가장 밝은 점과, 그 점에서 격자 3칸 떨어진 4점 $(\pm 3, 0),\ (0, \pm 3)$과 대각선 2칸 떨어진 4점 $(\pm 2, \pm 2)$, 모두 8점(격자 밖은 가장자리)의 중앙값의 차이입니다.

    풀이 — 왜: 애니메이션 얼굴의 공통 특징(피부는 밝고 고르며 눈은 어둡고 속눈썹은 진하고 눈 속에 반짝임이 있음)을 얼굴 틀의 정해진 칸에서 잽니다. 원리: 칸 범위는 눈 사이 거리 𝑑 단위라 얼굴 크기와 상관없습니다. 피부 밝기는 74개 표본의 중앙값이라 머리카락 · 그림자가 몇 표본에 섞여도 흔들리지 않습니다. 홍채 색은 눈 칸에서 어두운 절반만 평균해 흰자위 · 반짝임을 뺍니다. 반짝임 ℎ는 가장 밝은 점과 둘레 8점의 중앙값의 차로, 둘레보다 훨씬 밝은 작은 점을 잡는 국소 대비입니다. 참고: 이 프로그램에서 정한 규칙

  4. 평균 무늬: 눈 무늬(12×12, $0.2 \le \lvert u\rvert \le 0.8,\ \lvert v\rvert \le 0.3$, 오른눈은 좌우를 뒤집음)와 얼굴 무늬(16×16, $\lvert u\rvert \le 1.1,\ -0.9 \le v \le 1.3$)는 시험 그림 24장의 얼굴 31개를 사람이 표시한 두 눈 위치로 맞춰 잰 밝기를, 평균 0 · 표준편차 1로 맞춘 뒤 평균한 것입니다(프로그램 안의 숫자 400개). 후보도 같은 격자를 평균 0 · 표준편차 1로 맞춰 상관 $c = \mathrm{mean}(z \cdot T)$를 잽니다. 눈은 두 눈 중 작은 값입니다.
    • 풀이 — 왜: 규칙만으로는 얼굴 같은 무늬(옷 무늬)와 진짜 얼굴을 가르기 어려워, 실제 얼굴의 평균 밝기 무늬와 얼마나 닮았는지 잽니다. 원리: 밝기를 평균 0 · 표준편차 1로 맞추면(𝑧 점수) 밝기 · 대비 차이가 사라지고, 두 𝑧 점수 격자의 곱의 평균 $\mathrm{mean}(z\cdot T)$는 피어슨 상관계수(정규화 상호상관)라 −1~1입니다. 평균 무늬는 손으로 표시한 31개 얼굴의 𝑧 점수를 평균한 것입니다. 참고: R34 Lewis 1995 · R60 Pearson 1900
  5. 점수: 근거마다 $[0, 1]$로 자른 값의 가중 합(최대 15)입니다.

    근거 값(0~1로 자름) 무게
    눈이 피부보다 어두움 $(S - \text{눈 칸 평균 }L^* - 8)/16$ 1
    피부가 밝음 $(S - 60) / 25$ 1
    콧등이 고름 $(16 - \text{콧등 }L^*\text{ 표준편차})/12$ 1
    콧등 · 두 볼의 색이 같음 $(32 - \text{세 평균색의 최대 }\Delta E)/22$ 1
    두 홍채의 색이 같음 $(28 - \text{두 눈 칸 어두운 절반의 평균색 }\Delta E)/20$ 1
    속눈썹이 진함 $(S - \text{속눈썹 띠 줄별 최솟값의 평균} - 20)/30$ 1
    눈동자가 어두움 $(25 - \text{눈 칸 최솟값})/18$ 1
    볼이 고름 $(22 - \text{볼 }L^*\text{ 표준편차})/14$ 1
    많이 기울지 않음 $(0.7 - t) / 0.5$, $t = \lvert b_y - a_y \rvert/ \lvert b_x - a_x \rvert$(두 눈의 세로 차를 가로 차로 나눈 값) 1
    얼굴 무늬 $(c_{face} - 0.2) / 0.3$ 3
    눈 무늬 $(c_{eye} - 0.1) / 0.4$ 1
    눈 속 반짝임 $(h - 2) / 8$, ℎ = 눈 칸($0.4d \times 0.4d$, 17×17 격자)에서 가장 밝은 점과 약 $0.07d$ 떨어진 둘레 8점의 중앙값의 차(두 눈 중 작은 값) 2

    풀이 — 왜: 근거 하나하나는 약하므로, 여러 근거를 0~1로 맞춰 무게를 두고 더한 점수로 얼굴인지 정합니다. 원리: 각 근거는 $(\text{값} - \text{하한})/\text{폭}$을 0~1로 자른 직선 램프라, 하한 아래는 0, 하한 + 폭 이상은 1입니다(예: 피부 밝기 $(S - 60)/25$는 $L^*$ 60에서 0, 85에서 1). 무게 합의 최대는 15이고, 얼굴 전체를 보는 얼굴 무늬 상관에 가장 큰 무게 3을 줍니다. 기울기 𝑡는 두 눈의 세로 차를 가로 차로 나눈 값(tan)입니다. 참고: 이 프로그램에서 정한 규칙

  6. 위치 다듬기: 점수 상위 40개 짝은 한 눈씩 $\pm 0.12d$ 안(5×5 격자, 간격 $0.06d$, 𝑑는 다듬기 전 거리)에서 얼굴 무늬 상관이 가장 큰 곳으로 옮기기를 왼눈 → 오른눈 순서로 두 번 되풀이하고(지금보다 상관이 커질 때만 옮김) 다시 잽니다.
    • 풀이 — 왜: 덩어리 검출의 눈 위치는 크기 칸 때문에 몇 픽셀 어긋날 수 있어, 얼굴 무늬와 가장 잘 맞는 자리로 옮깁니다. 원리: 한 눈씩 번갈아 5×5 격자에서 상관이 가장 큰 자리로 옮기는 좌표 하강입니다. 상관이 커질 때만 옮기므로 맞춤이 나빠지지 않습니다. 참고: R34 Lewis 1995
  7. 고르기: 점수 11 이상을 높은 순서로 고르되, 이미 고른 얼굴과 가운데 거리가 $\max(d, d')$ 미만이거나 한 눈이 그 얼굴 눈의 $0.5 \max(d, d')$ 안이면 뺍니다.
    • 풀이 — 왜: 같은 얼굴이 여러 짝으로 겹쳐 나오므로 하나만 남깁니다. 원리: 점수 높은 순서로 고르고 가까운 것은 버리는 비최대 억제입니다. 거리 기준을 두 얼굴 눈 거리의 큰 값 $\max(d, d')$로 해서 얼굴 크기에 맞춥니다. 참고: 이 프로그램에서 정한 규칙
  8. 얼굴다운 자리인지: 진짜 얼굴은 머리가 거의 다 그림 안에 있고, 얼굴 자체는 이미 찾은 배경 위에 있지 않습니다. 머리 타원(아래)의 80% 이상이 그림 안이고, 그 안에서 이미 찾은 배경이 30% 이하이거나 얼굴 타원(눈 · 볼, $u^2 + ((v - 0.2)/0.8)^2 \le 1$)의 배경이 5% 이하인 얼굴만 남깁니다. 가운데에서 $2.4d$ 안의 그림 속 픽셀을 가로 · 세로 4px 간격(4의 배수 좌표)으로 보고, 표본 하나를 $16\,\mathrm{px}^2$로 쳐서 “80% 이상이 그림 안”은 머리 타원 안 표본 수 $n \ge 0.8 \cdot \pi \cdot 2.2 \cdot 2 \cdot d^2 / 16$입니다. 점수가 가장 높은 얼굴은 얼굴 타원의 절반 넘게 배경일 때만 뺍니다. 무릎 · 쿠션을 크게 잡은 가짜 얼굴이 넓은 배경을 “머리 · 몸 자리”로 막던 것을 줄이면서, 머리가 작아 머리 타원 둘레가 배경인 캐릭터의 얼굴은 남깁니다. 시험 그림의 진짜 얼굴 30개는 모두 얼굴 타원의 배경이 0%, 머리 타원의 배경이 28% 이하였습니다.
    • 풀이 — 왜: 진짜 얼굴은 머리가 그림 안에 있고 배경 위에 떠 있지 않습니다. 이 조건으로 가짜 얼굴(무릎 · 쿠션)이 넓은 배경을 캐릭터 자리로 막는 것을 줄입니다. 원리: 타원 넓이는 $\pi ab$(반지름 $2.2d$, $2d$)이고, 4px 간격 표본 하나가 $16\,\mathrm{px}^2$를 대표하므로 “80% 이상이 그림 안”은 표본 수 $n \ge 0.8 \cdot \pi \cdot 2.2 \cdot 2 \cdot d^2 / 16$입니다. 얼굴 타원 $u^2 + ((v - 0.2)/0.8)^2 \le 1$은 눈 · 볼을 덮는 반지름 1 · 0.8의 타원입니다. 참고: 이 프로그램에서 정한 규칙

문턱은 놓치는 얼굴이 적은 쪽으로 정했습니다. 가짜 얼굴(무릎, 손, 그릇, 옷 무늬)은 아래 단계에서 그 자리를 캐릭터 쪽으로 지킬 뿐 배경을 더하지 않지만, 놓친 얼굴의 캐릭터는 지켜지지 않기 때문입니다.

  1. 이름 · 캐릭터 폴더용 얼굴: 6까지 잰 짝마다 점수에 아래 조정을 더해 7 · 8을 한 번 더 합니다(문턱 10.75). 배경 판정(아래 단계들)은 7의 얼굴을, 파츠 이름과 캐릭터 나누기는 이 얼굴을 씁니다.

    조정 값
    입이 보임 $\mathrm{clamp}((m - 15)/20) - 1$, 𝑚 = 볼 · 콧등 아래 칸($\lvert u\rvert \le 0.9,\ 0.4 \le v \le 0.8$)의 $L^*$ 중앙값에서 코 아래 칸($\lvert u\rvert \le 0.25,\ 0.8 \le v \le 1.3$)의 최솟값을 뺀 값
    눈 대비가 지나치게 진함 $-\mathrm{clamp}((S - \text{눈 칸 평균 }L^* - 40)/15)$
    아래 눈꺼풀이 지나치게 밝음 $-\mathrm{clamp}((\text{아래 띠 평균 }L^* - \text{위 띠 평균 }L^* - 35)/20)$, 위 띠 $\lvert u\rvert \le 0.7,\ -0.3 \le v \le -0.12$, 아래 띠 $\lvert u\rvert \le 0.7,\ 0.12 \le v \le 0.3$
    피부가 흰 바탕색 $-\mathrm{clamp}((S - 97)/3)$

    풀이 — 왜: 이름 · 캐릭터 폴더에는 가짜 얼굴이 더 해로워, 진짜 · 가짜를 표시한 자료에서 찾은 단서로 점수를 조정합니다. 원리: $\mathrm{clamp}((x - a)/b)$는 𝑎에서 0, $a + b$에서 1인 램프입니다. 입 단서는 −1~0(입이 보이지 않으면 −1), 나머지는 0~−1의 감점입니다. 참고: 이 프로그램의 실험(11)

    처음 보는 픽시브 AI 생성 그림 300장의 얼굴 후보에 사람이 진짜 · 가짜를 표시해 보니(11), 진짜 얼굴은 입이 보이고(점수 9 이상 후보의 𝑚 중앙값 57 대 가짜 38), 가짜(옷 무늬, 글자, 소품, 과자)는 눈 대비와 아래 눈꺼풀 밝기가 지나치게 크거나 피부 자리가 흰 바탕인 경우가 많았습니다. 점수 10 이상인 짝에서 조정의 평균은 진짜 −0.13(중앙값 0), 가짜 −0.41(4분의 1은 −0.85 이하)입니다. 두 가지 얼굴을 쓰는 것은, 이 조정으로 배경 판정의 얼굴까지 바꾸면 배경이 좋고 나쁘게 섞여 흔들렸기 때문입니다(7.5).

    머리 구조 단서(0.48): 설정 “기울어진 그림”을 끈 기본 경로에서는, 위 조정까지 더한 점수가 9 이상인 짝에 아래 가산점 𝐻(최대 7.5)를 더하고 문턱 16.5로 7 · 8을 합니다. 그래서 가산점이 없으면 이름용 얼굴로 고를 수 없습니다. 고른 얼굴이 내보내는 점수는 가산점을 더하기 전의 값이고, 배경 판정용 얼굴(7)은 그대로입니다. 얼굴 틀 격자($u$ −2~2, $v$ −2~2.6, 간격 $0.1d$, 쌍선형 보간)에서 콧등($\lvert u\rvert \le 0.12,\ 0.05 \le v \le 0.45$) · 볼($0.3 \le \lvert u\rvert \le 0.7,\ 0.35 \le v \le 0.7$) 격자점의 $L^*$ · $a^*$ · $b^*$ 채널별 가운데값을 피부 기준색($L^*_s, a^*_s, b^*_s$)으로 둡니다. 그림 안이고, $L^*$이 $L^*_s - 25$ 이상이며(선이 아님), 기준색과 $\Delta E \le 12$인 격자점을 살색으로 보고, 콧등 · 볼의 살색 점에서 4-이웃으로 번진 덩어리를 만듭니다. 볼 높이($v$ = 0.3, 0.4, …, 0.8)마다 가운데에서 바깥으로 $0.1$씩 가며 덩어리가 처음 끊기기 전의 $\lvert u\rvert$를 재고, 그 가운데값을 왼쪽 · 오른쪽에서 구해 작은 쪽을 볼 끝 𝑒로 둡니다.

    H = 3\,\mathrm{clamp}\!\left(\frac{a^*_s + 4}{8}\right) + 3\,\mathrm{clamp}\!\left(\frac{e}{0.3}\right) + 1.5\,\mathrm{clamp}\!\left(\frac{b^*_s}{5}\right)
    

    풀이 — 왜: 진짜 얼굴은 두 눈 아래 볼까지 한 덩어리의 살색이고 피부에 붉은 · 노란 기가 있습니다. 옷 주름 · 무늬 · 소품에서 우연히 나온 가짜 짝은 볼 높이에서 살색 덩어리가 바로 끊기거나 “피부” 자리 색이 회색 · 푸른색인 일이 많습니다. 원리: 얼굴 틀 좌표(𝑢, 𝑣, 𝑑 단위)로 재므로 얼굴 크기 · 기울기와 상관없이 같은 자리를 봅니다. $a^*_s$ · $b^*_s$는 피부 기준색의 붉은 · 노란 기, 𝑒는 볼의 살색이 눈 사이 거리의 몇 배 너비까지 이어지는지이고, 셋을 0~1 램프로 맞춰 무게 3 · 3 · 1.5로 더합니다. 무게 · 문턱은 개발용 픽시브 AI 생성 그림 293장 중 205장에서 골랐습니다. 참고: 이 프로그램의 실험(12의 0.48)

    고르기에 한 번도 쓰지 않은 개발용 그림 88장에서 찾은 얼굴 40 → 44개 · 가짜 얼굴 57 → 47개(둘 다 유의하지 않음, 방향은 고르기에 쓴 그림과 같음)였고, 피부가 고르고 넓은 자세 합성 그림 120장에서는 얼굴을 찾은 그림이 46 → 63장으로 늘면서 가짜 얼굴도 11 → 38개로 늘었습니다(손 · 다리 · 한 눈과 볼에서 가산점을 다 받음, 12의 0.48).

  2. 좌우 합의(0.34): 그림을 좌우로 뒤집어 1~9를 한 번 더 하고, 9의 얼굴 중 뒤집은 그림의 9에도 같은 자리 (뒤집은 쪽 가운데를 $x \mapsto W - 1 - x$로 되돌려 두 가운데 사이가 $\max(d, d')$ 미만)에 얼굴이 있는 것만 이름 · 캐릭터 폴더에 씁니다(자리 · 점수는 원래 그림 쪽 값). 진짜 얼굴은 뒤집어도 얼굴이지만, 옷 주름 · 무늬 · 글자에서 우연히 나온 가짜는 평균 무늬 · 속눈썹 띠 · 눈 위치 다듬기 순서의 비대칭 때문에 한쪽에서만 문턱을 넘는 일이 많습니다. 픽시브 AI 생성 그림에서 한쪽에서만 나온 이름용 얼굴을 표시해 보니 108개 중 101개가 가짜였습니다(11). 7의 얼굴(배경 판정용)은 그대로 둡니다 (배경 판정에도 쓰면 가짜 얼굴이 지키던 캐릭터 부분을 잃는 그림이 늘었음, 7.5). 얼굴 찾기를 두 번 하므로 그만큼 더 걸립니다(666장 처리 시간 중앙값 9.4초 → 10.8초).

    • 풀이 — 왜: 진짜 얼굴은 좌우를 뒤집어도 얼굴이지만 우연히 생긴 가짜는 한쪽에서만 문턱을 넘습니다. 원리: 뒤집은 그림의 좌표를 $x \mapsto W - 1 - x$로 되돌려 같은 자리에 얼굴이 있는지 보는 거울 대칭 일관성 검사입니다. 한쪽에서만 나온 얼굴 108개 중 101개가 가짜였다는 것이 이 검사가 거의 가짜만 거른다는 근거입니다. 참고: 이 프로그램의 실험(11)

얼굴 찾기는 배경과 상관없이 한 번 합니다. 배경을 찾지 않았거나 못 찾은 그림은 투명한 곳(알파 0.02 이하)을 배경으로 보고 8을 적용해, 파츠 이름과 캐릭터 나누기에 씁니다.

삼켜진 캐릭터 되돌리기

윤곽선이 머리카락 · 배경과 같은 색이라 보이지 않고 머리카락 · 옷을 선 없이 칠한 그림은, 선 밀도로 찾는 장면 배경이 캐릭터 경계를 그대로 넘어갑니다.

  1. 삼켜진 얼굴: 점수 13 이상인 얼굴(8의 조건과 상관없이 찾은 얼굴 모두) 중, 얼굴 타원($u^2 + ((v - 0.2)/0.8)^2 \le 1$)이나 정수리 칸($\lvert u\rvert \le 0.8,\ -1.6 \le v \le -0.45$)의 배경이 25%를 넘는 얼굴 (가운데에서 가로 · 세로 $1.7d$ 안의 모든 픽셀로 잼). 시험 그림의 진짜 얼굴은 둘 다 2% 이하였고, 얼굴 · 정수리가 배경 위에 있는 가짜 얼굴(배경 장식)은 모두 점수 12.6 이하였습니다.
    • 풀이 — 왜: 얼굴 타원이나 정수리 칸이 배경으로 덮였다면 장면 배경이 캐릭터를 삼킨 것입니다. 원리: 얼굴 틀 좌표에서 정수리 칸 $\lvert u\rvert \le 0.8,\ -1.6 \le v \le -0.45$는 눈 위 머리카락 자리입니다. 둘 중 하나의 배경 비율이 25%를 넘으면 삼켜진 얼굴로 봅니다(진짜 얼굴은 2% 이하). 참고: 이 프로그램에서 정한 규칙
  2. 조각: 딸려 들어간 캐릭터 부분과 같은 방법(선명한 경계 $\Delta E \ge 20$, 선)으로 지금의 배경을 조각 𝑘로 나눕니다.
  3. 색이 드묾: 위 · 왼쪽 · 오른쪽 테두리에 닿은 조각들의 픽셀 $n_B$개로 센 색 분포 $h_B$(Lab $10 \times 16 \times 16 = 2560$칸)에서, 테두리에 닿지 않은 조각 𝑘마다

    $\displaystyle \nu_k=\sum_{p\in k}\mathrm{clip}_{[-4,4]}\ln\frac{1/2560}{(h_B(c_p)+1)/(n_B+2560)}$

    분자는 균등 분포, 분모는 테두리 쪽 배경 분포(라플라스 평활)라, 색이 균등 분포보다 테두리 쪽 배경에서 드물수록 양수로 커집니다.

    • 풀이 — 왜: 삼켜진 캐릭터 조각은 테두리 쪽 배경에는 드문 색입니다. 조각마다 색이 테두리 배경에서 얼마나 드문지 잽니다. 원리: $\ln\frac{1/2560}{(h_B + 1)/(n_B + 2560)}$는 균등 분포에 대한 라플라스 평활 테두리 분포의 로그 비라, 테두리 배경에서 평균보다 드문 색이면 양수입니다. 평균이 아니라 합이므로 큰 조각일수록 근거가 쌓입니다. 조각은 딸려 들어간 부분과 같은 $\Delta E \ge 20$ 경계로 나눕니다. 참고: R51 Manning et al. 2008
  4. 되돌리기: 넓이의 절반 이상이 삼켜진 얼굴 중 하나의 머리 타원이나 몸 기둥(얼굴 기준 넓히기의 자리 확률과 같은 모양)에 들고, 위 · 왼쪽 · 오른쪽 테두리에 닿지 않으며, $\nu_k > 0$인 조각과 그 조각 쪽 경계 · 선 띠, 캐릭터 쪽 경계 띠(3px까지)를 캐릭터로 되돌립니다. 머리카락과 목 사이로 보이는 배경 틈은 배경색이라 남습니다.
    • 풀이 — 왜: 머리 타원 · 몸 기둥 안에 있고 테두리에 닿지 않으며 테두리 배경에서 드문 색인 조각은 삼켜진 캐릭터입니다. 원리: 세 조건을 모두 만족할 때만(논리곱) 되돌리고, 경계 띠 3px를 같이 되돌려 경계에 배경 테가 남지 않게 합니다. 참고: 이 프로그램에서 정한 규칙
  5. 되돌린 뒤에도 삼켜진 얼굴이 남으면(배경과 거의 같은 색의 검은 머리카락: 선명한 경계가 없음) 선명한 경계를 $\Delta E \ge 8$로 낮춰 1~4를 한 번 더 합니다. 그래도 남으면 $\Delta E \ge 5$로 낮추고, 3의 색 칸을 $L^*$ · $a^*$ · $b^*$ 모두 4 간격의 $25 \times 64 \times 64 = 102400$칸(분자 · 평활도 이 칸 수로)으로 곱게 나눠 한 번 더 합니다(0.34). 배경과 $\Delta E$ 6~9인 검은 머리카락은 2560칸에서는 배경과 같은 칸이라 드물지 않고, 고운 칸에서는 다른 칸이 됩니다.
    • 풀이 — 왜: 배경과 거의 같은 색의 검은 머리카락은 $\Delta E$ 20 경계가 없어 조각이 나뉘지 않습니다. 원리: 문턱을 8, 5로 낮추며 거친 것에서 고운 것으로 단계를 밟아 다시 합니다. 칸 간격을 10 · 16에서 4로 줄이면 $\Delta E$ 6~9 차이가 다른 칸에 들어가 드문 색으로 잡힙니다. 참고: 이 프로그램에서 정한 규칙
  6. 몸 자리 조각(1~5보다 먼저): 얼굴이 삼켜지지 않은 점수 13 이상 얼굴이 있으면, 같은 조각($\Delta E \ge 20$) 중 넓이의 절반 이상이 그 얼굴의 몸 기둥 아래쪽 ($1 \le v \le 8$, $\lvert u\rvert \le 1.2 + 0.35 \cdot \max(v - 1.5, 0)$)에 들고, 위 · 왼쪽 · 오른쪽 테두리에 닿지 않고, 넓이가 전체의 0.3% 이상인 조각을 봅니다. 흰 배경 위의 흰 옷은 배경과 같은 색이라 3의 드묾 조건을 쓰지 않고, 캐릭터(지금 배경이 아닌 픽셀) 분포와 나머지 배경 조각 분포의 색 로그 우도비(딸려 들어간 캐릭터 부분의 $\bar \ell_k$와 같은 식)가 $\bar \ell_k \ge -2$인 조각만 되돌립니다. 치마와 소매 사이로 보이는 배경 구멍($\bar \ell \approx -3.9$), 캐릭터 옆 글자 칸(−2.1)은 남고, 흰 옷 · 치마 조각은 −1.6 이상이었습니다.
    • 풀이 — 왜: 흰 배경 위의 흰 옷은 배경과 같은 색이라 드묾 조건을 못 씁니다. 대신 캐릭터 분포와 배경 분포를 견줘 뚜렷이 배경 쪽인 것만 거릅니다. 원리: $\bar\ell_k \ge -2$는 평균 로그 우도비가 −2 이상, 곧 배경 쪽이 $e^2 \approx 7.4$배 넘게 그럴듯하지는 않다는 뜻입니다. 배경 구멍은 −3.9, 흰 옷은 −1.6 이상이라 갈립니다. 참고: R51 Manning et al. 2008 · 이 프로그램에서 정한 규칙
  7. 장면 배경 단계의 넓이 확인 직전과, 색 모델 · 딸려 들어간 부분 되돌리기 뒤에 합니다. 되돌린 부분은 딸려 들어간 캐릭터 부분과 같이 다룹니다 (색 모델 · 얼굴 기준 넓히기가 다시 가져가지 않고, 배경 효과 후보에서도 뺌).

얼굴 기준으로 넓히기

  1. 배경이 거의 한 색이면 하지 않기: 지금까지 찾은 배경 픽셀 $n_b$개(100개 미만이면 평평도 0)에서 픽셀 순서대로 $t = \max(1, \lfloor n_b / 20000\rfloor)$개마다 하나씩 뽑아 원본 Lab $(L_i, a_i, b_i)$의 채널별 중앙값 $(m_L, m_a, m_b)$(정렬한 𝑛개 중 $\lfloor n/2\rfloor$번째, 0부터)을 구합니다.

    $\displaystyle \mathrm{flat}=\frac1n\left|\left\lbrace\,i:(L_i-m_L)^2+(a_i-m_a)^2+(b_i-m_b)^2<10^2\,\right\rbrace\right|$

    $\mathrm{flat} \ge 0.6$이면(흰 배경 · 단색 배경) 이 단계를 하지 않습니다. 666장에서 얼굴 단계 전의 배경으로 재면 흰 · 단색 배경 211장 중 171장(81%)이 0.6 이상이고, 선이나 칠로 그린 장면 배경은 173장 중 13장(8%)만 0.6 이상입니다(11). 바닥 띠(위 단색 · 그라데이션 배경 3, 0.40)가 있으면 표본을 띠 안과 밖으로 나눠 각자의 중앙값으로 세고 더합니다. 벽 · 바닥 두 색 배경도 한 색 배경으로 보아, 얼굴 기준 넓히기가 켜져 캐릭터를 가져가지 않게 합니다. 좁은 틈 막기(단색 · 그라데이션 배경 5)의 평평도도 같습니다.

    • 풀이 — 왜: 배경이 거의 한 색이면 이 단계를 하지 않습니다. 원리: 표본의 채널별 중앙값을 대표색으로 두고, 그 색에서 $\Delta E < 10$인 표본 비율을 평평도로 잽니다. 참고: R7 CIE 2004
  2. 색 모델과 같은 영역 그래프(24색 영역, 맞닿은 길이 $o, l$, 색 분포)를 씁니다. 두 단계가 한 번 만든 그래프를 같이 씁니다.
  3. 자리 확률(캐릭터일 확률) $\pi(p)$: 얼굴마다 원래 해상도의 $(u, v)$에서

    $\displaystyle \pi_f=\begin{cases}0.9 & -1.2\le v\le 8,\ |u|\le 1.2+0.35\max(v-1.5,\,0)\quad(\text{몸})\\ 0.85 & (u/2.2)^2+((v+0.3)/2)^2\le 1\quad(\text{머리})\\ 0.45 & \text{그 밖}\end{cases},\qquad \pi(p)=\max_f \pi_f(p)$

    영역 평균을 $\bar \pi_r$로 둡니다. 자리 항의 로그 오즈는 $\ln(0.9/0.1) = 2.197,\ \ln(0.85/0.15) = 1.735,\ \ln(0.45/0.55) = -0.201$입니다.

    • 풀이 — 왜: 얼굴이 있으면 그 아래 몸 · 머리 자리는 캐릭터일 가능성이 높다는 사전 지식을 확률로 넣습니다. 원리: 자리마다 사전 확률(몸 0.9, 머리 0.85, 그 밖 0.45)을 두고 여러 얼굴 중 가장 큰 값을 씁니다. 에너지에는 로그 오즈 $\ln(\pi/(1 - \pi))$로 들어가는데, 베이즈 규칙에서 로그 사후 오즈 = 로그 우도비 + 로그 사전 오즈이므로 색 항(로그 우도비)에 그대로 더할 수 있습니다. 영역 그래프(맞닿은 길이 𝑜, 𝑙)는 색 모델과 같이 씁니다. 참고: R25 Rother et al. 2004 · 이 프로그램에서 정한 규칙
  4. 처음 나누기: 캐릭터는 $\bar \pi_r \ge 0.8 \land \beta_r < 0.5$인 영역(머리 · 몸 자리), 배경은 $\beta_r > 0.5$인 영역(기존 배경)입니다. 그다음부터는 앞 컷의 결과(캐릭터 / 나머지 전부)로 배웁니다.
  5. 에너지와 최소 컷(색 모델과 같은 Dinic)을 4번 되풀이하며 색 분포를 다시 배웁니다.

    $\displaystyle \theta_r=\sum_{p\in r,\,known}\mathrm{clip}_{[-3,3]}\ln\frac{p_F(c_p)+10^{-6}}{p_B(c_p)+10^{-6}}+\sum_{p\in r}\ln\frac{\pi(p)}{1-\pi(p)}-2A_r\beta_r,\qquad w_{rq}=o\,\exp\!\left(-\frac{\Delta E_{rq}^2}{288}\right)+0.0375\,l$

    • 풀이 — 왜: 확실한 머리 · 몸 자리와 기존 배경에서 출발해 색 분포를 배우고, 자리 사전 확률과 함께 최소 컷으로 나누기를 되풀이합니다. 원리: $\theta_r$는 색 로그 우도비 + 자리 로그 오즈 − $2A_r\beta_r$(기존 배경이면 배경 쪽으로)입니다. $w_{rq}$는 색 모델과 같은 가우시안($2\cdot 12^2 = 288$)이고, 4번 되풀이는 GrabCut처럼 나누기 → 분포 다시 배우기를 번갈아 하는 반복 추정입니다. 참고: R25 Rother et al. 2004 · R24 Boykov · Jolly 2001 · R27 Dinic 1970
  6. 확실한 곳만: 배경 쪽이 된 영역 중 색 항의 평균($\mathrm{known}$ 픽셀당)이 −1 미만이고, 처음 색 분포로 잰 색 항의 평균도 −0.5 미만이고(0.42, 아래), $\bar \pi_r \le 0.5$인 영역이 후보입니다(되돌린 캐릭터 부분이 넓이의 절반을 넘는 영역과 $\bar \varepsilon_r \ge 0.9$인 영역은 빼고). 기존 배경($\beta_r > 0.5$)에서 출발해 $o \ge 0.5(o + l)$인 경계만 건너 후보 안으로 이어진 영역의 픽셀을 배경에 더합니다 (선명한 선 픽셀, 앞에서 되돌린 캐릭터 부분은 빼고). 처음 색 분포로 잰 색 항은 3의 처음 나누기로 센 분포 $p^0_F, p^0_B$(같은 색 칸)로 $\theta^0_r=\sum_{p\in r,\,known}\mathrm{clip}_{[-3,3]}\ln\frac{p^0_F(c_p)+10^{-4}}{p^0_B(c_p)+10^{-4}}$이고, 조건은 $\theta^0_r / k_r < -0.5$입니다($k_r$은 영역의 $\mathrm{known}$ 픽셀 수). 4의 되풀이는 그대로 $10^{-6}$을 씁니다. 되풀이하며 다시 배운 분포는 드물게 보인 색을 한쪽으로 몰아, 머리 · 몸 자리 가까이에서 처음엔 캐릭터 쪽이던 어두운 다리 · 옷이 후보가 되곤 했습니다.
    • 풀이 — 왜: 되풀이하며 다시 배운 분포는 드문 색을 한쪽으로 몰아 판정이 표류하므로, 처음 분포로 재도 배경 쪽인 영역만 받습니다(두 판정의 논리곱). 원리: $\theta^0_r / k_r$는 처음 분포로 잰 픽셀당 평균 로그 우도비이고, −0.5 미만이면 배경 쪽이 $e^{0.5} \approx 1.65$배 넘게 그럴듯합니다. $10^{-4}$ 평활은 $10^{-6}$보다 커서 드문 색의 비를 덜 극단적으로 만듭니다. $o \ge 0.5(o + l)$은 경계의 절반 이상이 선 없이 맞닿았다는 뜻입니다. 참고: R25 Rother et al. 2004 · 이 프로그램에서 정한 규칙

캐릭터 사이로 보이는 배경(틈)

얼굴 기준 넓히기 뒤에 합니다. 지금까지 찾은 배경의 칠한($\mathrm{known}$) 픽셀이 $0.02N$ 이상이고, 배경이 아닌 불투명 픽셀($A > 0.02$) $n_o$개 중 선 픽셀($\mathrm{lineMask}$)이 $0.3 n_o$ 미만일 때만 합니다(입자 · 망점 · 촘촘한 해칭이 선으로 잡힌 그림은 아래 4.6의 번짐이 커서 뺌).

풀이 — 왜: 배경 칠이 적거나 선이 지나치게 많은 그림(입자 · 망점 · 해칭)에서는 틈 판정이 틀리기 쉬워 건너뜁니다. 원리: 배경 칠 넓이(전체의 2%)와 선 비율(불투명 픽셀의 30%)의 두 문턱입니다. 참고: 이 프로그램에서 정한 규칙

  1. 배경 대표색: 배경의 칠한 픽셀 $n_b$개에서 픽셀 순서대로 $t = \max(1, \lfloor n_b / 20000\rfloor)$개마다 하나씩 뽑아 선 아래 색(𝑈)의 Lab 채널별 중앙값 $(m_L, m_a, m_b)$를 구하고, 얼굴 기준 넓히기의 0과 같은 식으로 평평도 $\mathrm{flat}$(중앙값에서 $\Delta E$ 10 안인 비율)을 잽니다. $\mathrm{flat} < 0.6$이면 하지 않습니다(장면 배경은 틈으로 보이는 곳의 색도 제각각이라 이 규칙으로 가를 수 없음).
  2. 후보: 배경이 아닌 칠한 픽셀 중 배경 대표색과 거의 같은 색인 픽셀(되돌린 캐릭터 부분은 빼고)을 4-연결 조각 𝑟로 나눕니다.

    $\displaystyle (L_p-m_L)^2+(a_p-m_a)^2+(b_p-m_b)^2\le 5^2$

    • 풀이 — 왜: 캐릭터 사이로 보이는 배경은 배경과 같은 색이므로, 배경 대표색과 아주 가까운 칠한 픽셀을 후보로 모읍니다. 원리: 대표색은 2만 개로 솎은 표본의 Lab 채널별 중앙값입니다. 제곱한 Lab 거리를 $5^2$과 견주는 것은 제곱근을 피한 $\Delta E \le 5$(같은 색으로 보이는 작은 차이)입니다. 참고: R7 CIE 2004
  3. 조각 조건: 조각 밖의 8-이웃 중 후보가 아닌 픽셀을 둘레 $R_r$, 그중 배경이 아닌 칠한 픽셀을 $R^c_r$라 할 때

    $\displaystyle 30\le A_r\le 0.02N,\qquad |R^c_r|\le 0.1\,|R_r|,\qquad \forall p\in r,\ \forall f:\ (u/2.2)^2+((v+0.3)/2)^2>1$

    둘레가 거의 선과 배경뿐이고(다른 색 칠에 닿은 흰 옷 · 흰 머리카락은 대개 그림자 · 음영에 닿아 있음), 얼굴의 머리 타원(배경 판정에 쓰는 얼굴) 밖이어야 합니다(흰자위 · 이).

    • 풀이 — 왜: 배경색과 같은 캐릭터 부분(흰 옷 · 흰자위 · 이)과 진짜 틈을 가릅니다. 원리: 넓이는 30px부터 전체의 2%까지, 둘레 중 다른 색 칠에 닿은 비율 $|R^c_r| / |R_r| \le 0.1$(둘레가 거의 선과 배경뿐), 그리고 모든 얼굴(∀𝑓)의 머리 타원 밖이어야 합니다. 참고: 이 프로그램에서 정한 규칙
  4. 그림 조건: 조건에 맞는 조각의 넓이 합이 캐릭터 쪽 칠한 픽셀 수 $n_c$의 5% 이하일 때만 그 조각을 모두 배경에 더합니다.

    $\displaystyle \sum_{r\ \text{조건 만족}} A_r\le 0.05\,n_c$

    흰 배경 위의 흰 옷, 흰 칠 흑백 선화처럼 캐릭터 자체가 배경색인 그림은 합이 커서 걸러집니다. 두 문턱(0.05 · 0.02)과 평평도 0.6은 조각을 느슨하게 모은 판(합 제한 없음, 조각 5%)이 바꾼 161장을 하나씩 보고 정했습니다(11). 보낸 픽셀은 틈 지도로 따로 기억해 영역 · 톤 채우기(4.6)에 씁니다.

    • 풀이 — 왜: 조각마다의 조건만으로는 캐릭터 자체가 배경색인 그림(흰 배경 위 흰 옷)을 거를 수 없어 그림 전체 조건을 더합니다. 원리: 조건에 맞는 조각 넓이의 합이 캐릭터 칠 넓이 $n_c$의 5% 이하일 때만 씁니다. 합이 크면 캐릭터 자체가 배경색이라는 신호입니다. 참고: 이 프로그램의 실험(11)

선으로 그린 네모난 배경 물건(0.43)

틈 다음에 합니다. 캐릭터 쪽에 남은 칠한 픽셀(배경 · 선 · 되돌린 캐릭터 부분이 아님)의 4-연결 성분 𝑟마다 넓이 $A_r$와 경계 상자 $w_r \times h_r$를 잽니다.

  1. 직사각형: 테두리에 닿지 않고, $w_r, h_r \ge \max(4, \mathrm{round}(0.015\max(W, H)))$, $0.97\,w_r h_r \le A_r \le 0.1N$이며 경계 상자의 네 모서리 픽셀이 모두 𝑟이고, 상자 가운데가 모든 얼굴(배경 판정에 쓰는 얼굴)의 머리 타원 $(u/2.2)^2 + ((v + 0.3)/2)^2 \le 1$과 몸 기둥($-1.2 \le v \le 8$, $\lvert u\rvert \le 1.2 + 0.35 \max(v - 1.5, 0)$) 밖인 조각.
    • 풀이 — 왜: 선으로 그린 방의 창유리 · 선반 · 책은 선으로 둘러싸인 거의 꽉 찬 직사각형입니다. 원리: 경계 상자 넓이에 대한 넓이 비(직사각도) $A_r / (w_r h_r) \ge 0.97$이면 거의 직사각형이고, 네 모서리 픽셀까지 있어야 해서 둥근 모양은 빠집니다. 크기 문턱은 긴 변의 1.5%(최소 4px)입니다. 머리 타원 · 몸 기둥 밖이어야 캐릭터의 네모난 옷 무늬를 건드리지 않습니다. 참고: R14 Gonzalez · Woods 2018 · 이 프로그램에서 정한 규칙
  2. 둘레: 상자를 $d = 2\,\mathrm{lw} + 6$px(lw는 선 굵기) 넓힌 고리의 칠한 픽셀 중 직사각형 후보가 아닌 것의 절반 이상이 배경이면 받아들입니다(창틀로 나뉜 유리 여러 장은 서로를 고리에서 빼고 봄). 받아들인 것이 생기면 더 받아들일 것이 없을 때까지 다시 봅니다.
    • 풀이 — 왜: 직사각형이 배경 속에 놓인 물건인지 둘레로 확인합니다. 원리: 상자를 선 굵기 두 배 + 6px 넓힌 고리(선 너머의 이웃)의 칠한 픽셀 절반 이상이 배경이면 배경 속 물건입니다. 받아들인 것을 고리에서 빼고 다시 보는 반복으로, 창틀로 나뉜 유리 칸들이 차례로 받아들여집니다. 참고: 이 프로그램에서 정한 규칙
  3. 가려진 칸: 받아들인 직사각형 중 한 색(픽셀의 90% 이상이 평균색과 $\Delta E \le 4$)인 것끼리, 평균색 차이가 $\Delta E < 4$이고 상자가 𝑑 안으로 가까우면 한 무리(창문)로 묶습니다. 무리의 경계 상자를 칸의 평균 너비 · 높이 + 𝑑만큼 넓힌 안에서, 무리 평균색과 $\Delta E \le 4$인 칠한 픽셀(얼굴 자리 · 되돌린 캐릭터 부분 밖)도 배경으로 보냅니다(캐릭터에 가려 직사각형이 아니게 된 유리 칸).
    • 풀이 — 왜: 캐릭터에 가려 직사각형이 아니게 된 유리 칸도 같은 창문에 속하면 배경으로 보냅니다. 원리: $\Delta E \le 4$는 같은 칠로 볼 수 있는 작은 차이입니다(CIELAB에서 겨우 구별되는 차이가 약 2.3). 같은 색 직사각형을 한 무리로 묶고, 무리 상자 안에서 같은 색 픽셀을 배경으로 보내 가려진 칸까지 잡습니다. 참고: R7 CIE 2004 · R8 Mahy et al. 1994

선으로 그린 방(합성 그림)의 창문 유리 · 선반 · 책이 여기서 잡힙니다. 이런 곳은 선으로 둘러싸여 장면 배경 · 색 모델 · 얼굴 기준 넓히기가 가져가지 않고, 배경이 거의 한 색이라 얼굴 기준 넓히기도 하지 않습니다. AI 생성 그림 777장에서는 1장만 바뀌었습니다(12의 0.43).

신경망 보조 지우기(0.49 · 0.50)

배경 찾기의 맨 끝(네모난 배경 물건 다음, 설정 “신경망 보조”가 켜졌을 때)에 합니다. 아직 캐릭터인 색 영역 𝑟 가운데 넓이가 $0.002N$ 이상인 것마다 두 점수를 냅니다.

  1. 통계식: 영역 특징 $x_{r,1}, \ldots, x_{r,45}$(평균 틀의 색 · 위치 · 얼굴 기준 좌표 로그 비, 둘레의 선 · 배경 몫, 넓이, 밝기 흩어짐 등 40개 + 결 특징 5개)와 앞 40개로 만든 더하기 로짓 $\ell_r$을 표준화해 더합니다.
s_r = b_0 + \sum_{j=1}^{46} b_j\,\frac{F_{r,j} - \mu_j}{\sigma_j},\qquad F_r = (\ell_r, x_{r,1}, \ldots, x_{r,45})
J_{ab} = G_\sigma \ast (I_a I_b),\qquad c = \frac{\sqrt{(J_{xx} - J_{yy})^2 + 4J_{xy}^2}}{J_{xx} + J_{yy}} = \frac{\lambda_1 - \lambda_2}{\lambda_1 + \lambda_2},\qquad \mathrm{coh}_r = \frac{\sum_{p \in r} c(p)\,(J_{xx} + J_{yy})(p)}{\sum_{p \in r} (J_{xx} + J_{yy})(p)}

나머지 넷은 기울기 세기 $\sqrt{I_x^2 + I_y^2}$의 평균, 국소 밝기 표준편차($\sigma = 2$)의 평균, 기울기가 0.3을 넘는 픽셀의 몫, 영역 밝기의 표준편차입니다.

\bar z_r = \frac{1}{\lvert r\rvert}\sum_{p \in r} z(p),\qquad p_r = \sigma\!\left(1.148\,\frac{s_r - 0.059}{1.492} - 0.466\,\frac{\bar z_r + 0.095}{1.662} + 0.055\right),\qquad r \text{를 배경으로} \quad\text{if}\quad p_r > 0.8

선 픽셀은 바꾸지 않고(뒤의 선 정리 규칙이 정함), 배경을 캐릭터로 되돌리지는 않습니다.

학습 · 추론 코드는 이 프로그램을 위해 처음부터 짰습니다(학습은 numpy 행렬 계산, 추론은 순수 JS). 가중치는 float32로 앱 파일 안에 들어 있고, 추론은 덧셈 · 곱셈 · 최댓값 · 평균만 씁니다. 근거와 시험 결과는 12의 0.49 · 0.50에 있습니다.

외곽 글로우

캐릭터 둘레에 두른 채도 높고 밝은 띠(네온 글로우, 형광 테두리)를 따로 뺍니다.

배경이 전체의 2~95%인 그림에서만 봅니다.

  1. 띠 후보: 배경과 4-이웃으로 맞닿은 칠한($\mathrm{known}$, 선이 아닌) 픽셀을 깊이 1로 두고, 캐릭터 쪽으로 선을 넘지 않고 $D = \max(12, \mathrm{round}(0.025\cdot \max(W, H)))$ 걸음 안에 닿는 픽셀(4-이웃 너비 우선 탐색, 깊이는 걸음 수).
    • 풀이 — 왜: 글로우는 캐릭터 둘레의 띠라, 배경 경계에서 캐릭터 쪽으로 일정 깊이 안만 봅니다. 원리: 4-이웃 너비 우선 탐색의 걸음 수가 깊이(맨해튼 거리)입니다. 𝐷는 긴 변의 2.5%(최소 12px)라 그림 크기에 맞춰집니다. 참고: R14 Gonzalez · Woods 2018
  2. 판정: 형광은 $L^* > 60$이고 $C^* > 45$인 픽셀입니다(선 아래 색을 복원한 𝑈에서). 띠 후보 $n_r$개 중 형광 $f_r$개, 캐릭터 안쪽(배경까지 체임퍼 거리 $> 2D$) $n_i$개 중 형광 $f_i$개일 때 $f_r \ge 0.18 n_r,\ f_r / n_r \ge 4 f_i / n_i,\ f_r \ge 0.002N$이어야 합니다.
    • 풀이 — 왜: 형광 띠가 캐릭터 둘레에만 있는지(캐릭터 자체가 형광 옷이 아닌지) 가려야 글로우로 뺄 수 있습니다. 원리: $C^* = \sqrt{a^{*2} + b^{*2}}$는 Lab의 채도(크로마)라 $L^* > 60$과 함께 밝고 진한 색을 형광으로 둡니다. 띠의 형광 비율이 18% 이상이면서 캐릭터 안쪽 비율의 4배 이상이어야 둘레에만 있는 형광입니다. 체임퍼 거리는 두 번 훑기로 구하는 근사 유클리드 거리(3-4 가중치)입니다. 참고: R7 CIE 2004 · R21 Borgefors 1986
  3. 글로우 색: 띠 후보의 형광 픽셀을 $(a^*, b^*)$ 16×16칸($\lfloor(a^* + 128)/16\rfloor,\ \lfloor(b^* + 128)/16\rfloor$)으로 세어, $0.005 f_r$ 이상인 칸.
    • 풀이 — 왜: 글로우의 색상만 골라 같은 색상의 픽셀로 넓히기 위해서입니다. 원리: 색상 평면 $(a^*, b^*)$의 2차원 히스토그램(16 단위, 16×16칸)에서 형광 픽셀의 0.5% 이상인 칸을 글로우 색으로 둡니다. 밝기를 빼고 보므로 글로우의 밝은 심과 흐려지는 끝이 같은 칸에 듭니다. 참고: R84 Swain · Ballard 1991
  4. 글로우: 띠 후보의 형광 픽셀에서 4-이웃으로 넓힙니다.
    • 캐릭터 쪽: 배경까지 깊이 + 가장 가까운 선까지 체임퍼 거리 $\le D$인 픽셀(배경과 윤곽선 사이에 끼인 띠) 중 글로우 색($L^* > 45,\ C^* > 25$, 글로우 칸)이나 흰 심($L^* > 80$)
    • 배경 쪽: 캐릭터까지 체임퍼 거리 $\le D$인 글로우 색
  5. 두르기: 캐릭터와 맞닿은 배경 픽셀(캐릭터까지 체임퍼 거리 $\le 1.5$) 중 글로우에서 3px 안(반지름 3 정사각형 팽창)인 것이 35% 이상일 때만 씁니다.
    • 풀이 — 왜: 형광 픽셀에서 넓혀 글로우 전체를 잡되, 캐릭터 쪽은 배경과 윤곽선 사이에 끼인 띠까지만, 배경 쪽은 캐릭터 가까이까지만 갑니다. 마지막으로 글로우가 실제로 캐릭터를 둘러싸는지 봅니다. 원리: “배경까지 깊이 + 선까지 거리 $\le D$”는 그 픽셀이 배경과 윤곽선 사이 폭 𝐷 이하의 띠 안에 있다는 조건입니다. 반지름 3 정사각형 팽창으로 글로우에서 3px 안을 잡고, 캐릭터와 맞닿은 배경의 35% 이상이 그 안이어야 둘레를 두른 것으로 봅니다. 참고: R21 Borgefors 1986 · R15 Soille 2003
  6. 글로우 픽셀은 배경 쪽으로 옮기고, “외곽 글로우” 층(표준, 불투명)에 원래 색 그대로 넣습니다. 그 아래 배경 층의 색은 나머지 배경에서 인페인팅한 값입니다. 사용자가 캐릭터로 되돌린 곳과 배경에서 되돌린 캐릭터 부분은 뺍니다.

배경 효과

배경이 아닌($A > 0.02$) 4-연결 조각 중 넓이가 $0.015N$ 미만인 것은 배경 효과 후보입니다(되돌린 캐릭터 부분 · 사용자가 캐릭터로 되돌린 곳이 든 조각은 빼고). 그 아래 배경색 $U^{bg}$를 나머지 배경에서 인페인팅하고(다른 캐릭터 픽셀은 건너뜀), 배경 층에는 $\mathrm{base}_c = \min(U_c, U^{bg}_c)$(외곽 글로우 자리는 $U^{bg}_c$), 배경 효과 층에는(외곽 글로우 자리는 빼고) $U_c > \mathrm{base}_c + 1.2/255$이고 $\mathrm{base}_c < 0.9999$일 때 스크린 값 $S_c = \mathrm{clamp}(1 - (1 - U_c)/(1 - \mathrm{base}_c))$를 넣습니다(4.12의 최소 알파로 저장).

풀이 — 왜: 배경 위에 얹힌 작은 빛 · 반짝이 효과를 배경 층과 따로 스크린 층으로 빼면, 배경을 고쳐도 효과가 남습니다. 원리: 스크린 합성은 $1 - (1 - a)(1 - b)$라, 아래색 base 위에 𝑆를 스크린으로 얹었을 때 𝑈가 되도록 $S = 1 - (1 - U)/(1 - \mathrm{base})$로 거꾸로 풉니다. $\mathrm{base} = \min(U, U^{bg})$로 두면 𝑆가 0 이상입니다. base가 1에 가까우면 나누기가 불안정해 0.9999 미만일 때만, 그리고 8비트 잡음을 빼려고 1.2/255 넘게 밝아진 곳만 넣습니다. $U^{bg}$는 둘레 배경에서 인페인팅한 값입니다. 참고: R3 ISO 32000-1 2008 · R20 Telea 2004

배경 메꿈(0.56)

캐릭터를 뺀 자리를 배경 메꿈 신경망과 패치 맞춤으로 추정해 채운 ‘배경 메꿈’ 층을 ‘배경’ 층 바로 위에 둡니다(3.5). 배경 층 자체는 바꾸지 않습니다.

구멍과 아는 영역: 구멍 $H$는 캐릭터 자리(배경이 아닌 불투명 픽셀)를 $r$픽셀 넓힌 것, 아는 영역 $K$는 $H$ 밖의 완전 불투명 배경 픽셀입니다(글로우 자리는 글로우 아래 밑색).

r = \operatorname{clamp}\bigl(\lfloor L/160 \rceil,\ 3,\ 12\bigr),\qquad L = \text{긴 변}

신경망 추정: 구멍을 비운 그림 $I\,(1 - M)$과 마스크 $M$을 $s = \min(1, 512/L)$로 줄여(아는 픽셀만 평균, 아는 비율이 0.8 미만인 칸은 구멍 1) 512×512 캔버스에 반사 패딩으로 놓고 big-lama(FFC ResNet: 푸리에 합성곱 ResNet 18블록, Suvorov et al. 2022; 가중치는 fp16으로 넣어 fp32로 돌림)에 넣습니다. 출력을 잘라 쌍삼차로 올린 것이 초기 추정 $G$입니다.

x = \operatorname{down}_s\bigl(I\,(1 - M)\bigr),\qquad m = \operatorname{down}_s M,\qquad G = \operatorname{up}\bigl(\mathrm{LaMa}(x, m)\bigr)

원본 질감(PatchMatch): 전해상도(긴 변 ≤ 1024)에서 구멍 픽셀을 $G$로 두고, 구멍 픽셀 $p$마다 아는 영역의 대응 $f(p) \in K$를 7×7 패치 거리가 가장 작도록 찾습니다(전파(이웃의 대응을 한 칸 옮김)와 반지름 32부터 반씩 줄이는 무작위 탐색을 3번, 투표 뒤 다시 한 번). 구멍 픽셀의 색은 자기를 덮는 모든 대응 패치의 거리 가중 평균(투표 $P$)이고, 대응 거리로 $P$와 $G$를 섞습니다.

D(p, q) = \sum_{\delta \in [-3,3]^2} \lVert I(p+\delta) - I(q+\delta) \rVert^2,\qquad
P(p) = \frac{\sum_{q:\,p \in N(q)} w_q\, I\bigl(f(q) + (p - q)\bigr)}{\sum_{q} w_q},\qquad w_q = \exp\!\Bigl(-\frac{D_q}{2\,\operatorname{med} D}\Bigr),\qquad I(p) = w_p\,P(p) + (1 - w_p)\,G(p),\qquad w_p = \exp\!\Bigl(-\frac{\max(0, D_p - \tau_0)}{2\max(\operatorname{med} D, \tau_1)}\Bigr)

$\tau_0$ · $\tau_1$은 채널당 RMS 0.02 · 0.05에 해당하는 거리($7^2 \cdot 3 \cdot \mathrm{RMS}^2$)입니다. 잡음 수준의 대응은 완전한 대응으로 보고, 그 위로는 중앙값과 $\tau_1$ 중 큰 쪽을 기준으로 감쇠합니다(중앙값만 쓰면 평탄한 배경에서 잡음만큼의 거리도 나쁜 대응이 되어 신경망의 회색 잡음이 남음).

이음매 막 보정: 구멍에 4방향으로 닿은 아는 픽셀의 링 $R$에서 채움이 예측하는 값(링 투표 $P(q)$와 $G(q)$를 이웃 구멍 픽셀의 가중치 평균 $\bar{w}_q$로 섞은 것)과 실제 값 $I(q)$의 차이 $b(q)$를 경계값으로, 구멍 안에서 조화인 막 $h$를 다중 격자(2×2 평균으로 16px까지 내려가 가우스-자이델 400회, 올라오며 층마다 24회)로 풀어 채움에 더합니다. Poisson 이음새 없는 합성(Pérez et al. 2003)에서 안내 기울기를 채움의 기울기로 둔 것과 같은 식입니다.

b(q) = I(q) - \bigl(\bar{w}_q\,P(q) + (1 - \bar{w}_q)\,G(q)\bigr),\qquad \Delta h = 0\ \text{on}\ H,\quad h = b\ \text{on}\ R,\qquad I \leftarrow \operatorname{clip}(I + h)

패치만(신경망 없이): 반씩 줄인 피라미드 $I_0 \supset I_1 \supset \cdots \supset I_n$($I_{l+1}$의 픽셀은 자식 네 픽셀 중 아는 픽셀의 평균, 아는 자식이 절반 미만이면 구멍; 짧은 변 24 이하에서 멈춤)의 가장 거친 층을 라플라스 확산(가우스-자이델 ≤ 2000회)으로 채우고, 층마다 위 층 대응을 2배로 물려받아 패치 맞춤을 한 뒤(가장 거친 층 투표 4회 · 탐색 6회, 중간 층 2 · 3, 가장 고운 층 1 · 2, 마지막 투표는 자기 대응 패치의 가운데 픽셀), 규칙성 $\rho = e_{80} / c_{80}$(긴 변 ≤ 320 층에서 아는 11×11 패치 1,500개를 6px 넘게 떨어진 다른 아는 패치와 맞춘 RMS 오차 $e$와 패치 안 표준편차 $c$의 80 백분위), $w_{\mathrm{reg}} = \operatorname{clamp}\bigl((0.7 - \rho) / 0.35,\ 0,\ 1\bigr)$로 구멍 픽셀마다 경계까지 거리 $d$에 따라 이웃한 두 층의 결과(거친 층은 올려서)를 삼각 가중으로 섞습니다.

s(p) = \log_2\!\Bigl(\frac{\max(d(p), r_0)}{r_0}\Bigr)\,(1 - w_{\mathrm{reg}}),\qquad r_0 = \max(6,\ L/60),\qquad
I(p) = \sum_{l} \max\bigl(0,\ 1 - \lvert s(p) - l \rvert\bigr)\, \uparrow\! I_l(p)

풀이 — 왜: 패치만으로는 구멍 깊숙한 곳에서 전파가 닿지 않아 엉뚱한 조각이 붙거나 뭉개지고, 창틀 · 나무처럼 끊긴 구조는 잇지 못합니다. 신경망은 그림 전체를 보고 구조를 잇지만 512로 줄여 돌리므로 질감이 흐립니다. 그래서 구조는 신경망, 질감은 원본 패치, 이음매는 막 보정이 맡습니다. 원리: 푸리에 합성곱은 주파수 영역에서 한 층으로 그림 전체의 주기 · 구조를 보므로 먼 곳의 무늬를 구멍 건너로 잇고, 막은 조화 함수라 경계에서 정한 값이 안쪽으로 가장 매끈하게 퍼지며 고주파(질감 · 선)를 더하지 않습니다. 합성 177장의 구멍 MAE는 흰색 84.20 · 패치만 3.94 · 신경망만 6.08 · 신경망 + 패치 2.82, 이음매 띠 MAE 2.91 · 3.99 · 1.96, 이음매 단차 초과 1.20 · 0.90 · 0.41이고(11.17), 픽시브 AI 생성 그림 120장 자연스러움 채점(0~100)은 44.7 · 60.2 · 59.2점입니다. 참고: Suvorov et al. 2022 (LaMa, WACV), Barnes et al. 2009 (PatchMatch), Pérez et al. 2003 (Poisson image editing).

배경 속 선 빼기

선 연결 조각마다

뺀 선 픽셀은 원본 색으로 되돌려 배경 그림에 남깁니다.


← README · 다음: 4.6 영역과 재질