← README · 4절 1 · 2 · 3 · 4 · English
설정 “누끼 모델”이 켜져 있고 그림에 투명한 픽셀이 없으면, 아래 배경 단계 대신 이것으로 캐릭터를 정합니다. 그림 $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 · 이 프로그램에서 정한 규칙
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 2003F_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\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$는 픽셀 가운데를 기준으로 한 반 칸 여유입니다. 참고: 이 프로그램에서 정한 규칙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$(기울지 않은 여백 · 레터박스)이면 쓰지 않습니다.
(\cos 4\alpha, \sin 4\alpha)$를 더해 atan2로 방향을 구하고 4로 나누는 것이 원형(방향) 통계의 평균 방향입니다. 각도를 그냥 평균하면 −44°와 44°가 0°로 잘못 평균됩니다. 결과는 90° 주기라 𝜃와 $\theta \mp 90^\circ$를 가를 수 없어, 얼굴 찾기가 세 가설을 다 봅니다. 참고: R83 Fisher 1993B = 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기울기 가설이 있을 때(돌린 캔버스 또는 설정 “기울어진 그림”), 이름용 얼굴(좌우 합의)의 아래 방향 𝑓를 $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
(0, -1)$ · 오른쪽 $(1, 0)$ · 아래 $(0, 1)$ · 왼쪽 $(-1, 0)$, 모서리는 둘 다)에서 $n \cdot g \ge 0.5$인 쪽을 “아래” 테두리로 봅니다.
단색 배경의 아래 테두리 규칙(1)과 장면 배경의 씨앗(1단계는 “아래” 테두리를 빼고 출발)이 이 테두리를 씁니다.
n \cdot g$는 사이각의 코사인이라, 0.5 이상이면 사이각이 60° 이하, 즉 그 테두리의 바깥쪽이 대체로 아래를 향합니다. 참고: R35 Strang 2016(s_x, s_y) \in \lbrace\pm 1\rbrace^2$에서 $(s_x g_x + s_y g_y) / \sqrt 2 < -0.4$인 모서리입니다.
(s_x, s_y)/\sqrt 2$는 모서리를 가리키는 단위 벡터이고, 𝑔와의 내적이 −0.4 미만이면 사이각이 약 114°보다 커서 모서리가 아래 방향의 반대쪽(위)을 향합니다. 참고: R35 Strang 2016\lvert \Delta y\rvert \le 0.8\Delta x$, 38.7°)보다 커서, 기울기 가설이 없는 똑바른 그림에는 쓰이지 않습니다.
\lvert \Delta y\rvert \le 0.8\Delta x$는 눈을 잇는 선의 기울기가 $\arctan 0.8 \approx 38.7^\circ$ 이하라는 뜻이라, 그보다 큰 40°는 그 상황에서 생기지 않습니다. 참고: 이 프로그램에서 정한 규칙\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% 미만이면 포기합니다.\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% 이상인 것은 배경에서 뺍니다.
그림 아래 끝에 걸친 흰 옷 · 치마는 배경과 같은 흰색이어도 명암 · 주름이 있고, 아래 테두리의 흰 바닥 · 여백은 거의 한 색입니다.
\max_c$ 차이 $< 0.05$인 $\mathrm{known}$ 픽셀을
새 씨앗(자기 색이 기준)으로 더하고 허용치 0.12로 다시 퍼집니다(새 씨앗이 없을 때까지, 최대 3회). 선($\mathrm{known}$이 아닌 픽셀)을 만나면 걷기를 끊습니다.
\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
\mathrm{known} \land D_a < \tau_a \land \varepsilon < 0.9$. 후보를 $r = \max(2, \mathrm{round}(3s))$만큼 침식한 뒤 위 · 왼쪽 · 오른쪽 테두리에서 채우고, 침식한 만큼(+1) 원래 후보 안에서 되살립니다. 좁은 틈으로는 새지 않습니다.
2r$ 이하의 좁은 목이 끊깁니다. 테두리에서 채운 뒤 침식한 만큼(+1) 원래 후보 안에서만 되살리면(조건부 팽창, 모폴로지 재구성) 넓은 영역의 모양은 돌아오고 끊긴 목 너머는 돌아오지 않습니다. $r = \max(2, \mathrm{round}(3s))$는 길이 문턱이라 크기 비율 𝑠를 곱합니다. 참고: R15 Soille 2003 · R14 Gonzalez · Woods 2018B_1$(위)과, 거기서 4-이웃으로 3걸음 안에서 이어지며 출발한 $B_1$ 픽셀과 $\max_c\lvert \Delta U_c\rvert < 0.06$인 픽셀을
“배경 같은 픽셀” $\tilde B$로 둡니다(단색 배경은 선명한 경계 앞 2px에서 멈추므로, 그 사이도 넣기 위해).
1 · 2단계의 채우기(침식한 후보에서 채우기와 되살리기 모두)에서 $p \to q$ 걸음은 $q \notin \tilde B$이고, $p \in \tilde B$이거나 한 칸 앞 $p' = 2p - q$가 $\tilde B$이면서
그 픽셀과 𝑞의 $\max_c\lvert \Delta U_c\rvert$가 0.1 이상이면 막습니다(1~2px 섞인 가장자리까지). $B_1$이 없으면 하지 않고, 여백 넓히기 · 색 모델은 그대로입니다.
p \to q$에서 출발 𝑝나 한 칸 뒤 $p' = 2p - q$(𝑞에서 𝑝로 가는 벡터를 𝑝에서 한 번 더 늘인 점)가 배경 같은 픽셀이고, 도착 𝑞는 아니며, 색이 채널 최대 0.1 이상 바뀌면 배경에서 다른 물체로 넘어가는 경계입니다. 한 칸 뒤까지 보는 것은 안티에일리어싱으로 1~2px 섞인 가장자리에서도 막기 위해서입니다. 참고: 이 프로그램에서 정한 규칙L^*_q \le 35$이면서 $\Delta E(p, q) \ge 20$이거나
한 칸 앞 $p' = 2p - q$(그림 안이고 줄을 넘지 않을 때)와 𝑞의 $\Delta E(p', q) \ge 20$인 걸음 $p \to q$도 막습니다. $B_1$이 없어도 하고, 있으면 위의 막기와 함께 씁니다.
도착 픽셀이 어두운지만 봅니다. 출발 픽셀이 어두워도 막게 하면 정답 그림 한 장에서 $\mathrm{BER}$이 0.226 나빠졌습니다(12의 0.42).
\Delta E$는 Lab 거리(CIE76)이고 20은 확실히 다른 색입니다. 도착 픽셀만 어두운지($L^*_q \le 35$) 보는 것은 배경에서 어두운 캐릭터로 들어가는 방향만 막고, 어두운 곳에서 밝은 곳으로 나가는 걸음은 막지 않기 위해서입니다. 나가는 걸음까지 막으면 정답 그림에서 결과가 나빠졌습니다. 참고: R7 CIE 2004 · 이 프로그램의 실험(12)p'' = 3p - 2q$(그림 안이고 줄을 넘지 않을 때)와 𝑞의 $\Delta E(p'', q) \ge 20$도 더해 1 · 2단계를 한 번 더 채웁니다.
둘 다 넓이 기준 · 삼켜진 캐릭터 되돌리기 전의 결과 $S$와 $S_3$에서, $S \land \lnot S_3$ 중 단색 배경이 아닌 픽셀을 기억해 두었다가 배경 단계가 모두 끝난 뒤 틈(아래)이 아니면 캐릭터로 돌려놓습니다.
다른 단계는 $S$로 그대로 돌므로 바뀌는 것은 이 픽셀뿐입니다(장면 배경 자체를 바꾸면 뒤 단계의 색 통계가 바뀌어 다른 곳이 흔들렸음, 12의 0.43). 장면 배경을 한 번 더 찾는 만큼 시간이 늘어, AI 생성 그림 8장에서 2.7%였습니다.
p'' = 3p - 2q = p + 2(p - q)$는 𝑞에서 𝑝로 가는 방향으로 두 칸 뒤의 점입니다. 다른 단계는 원래 결과 𝑆로 돌리고, 차이 $S \land \lnot S_3$만 맨 끝에 캐릭터로 돌리는 것은 바뀌는 범위를 그 픽셀로만 묶어 뒤 단계의 색 통계를 흔들지 않기 위해서입니다. 참고: 이 프로그램에서 정한 규칙 · 이 프로그램의 실험(12)B_1$이 있으면 다 찾은 장면 배경 𝑆(삼켜진 캐릭터를 되돌리고 넓이 기준을 통과한 뒤)에서 $S \land \lnot \tilde B$의 4-이웃 연결 성분(섬)을 나누고,
위 · 왼쪽 · 오른쪽 테두리 픽셀을 품지 않는 섬들을 $\mathcal I$로 둡니다(그림의 아래 방향이 정해졌으면 그 방향의 아래 테두리가 아닌 테두리 픽셀, 4.5).
캐릭터 덩어리 $C = \lnot(B_1 \lor S) \lor \bigcup \mathcal I$를 4-이웃 연결 성분으로 나눠 가장 큰 넓이를 $\lvert C_\max \rvert$라 하면, 섬 $I \in \mathcal I$가 든 성분 $C(I)$가
$\lvert C(I)\rvert/ \lvert C_\max \rvert \ge 0.25$이거나 찾은 얼굴(4.5)의 가운데 $(\mathrm{round}(c_x), \mathrm{round}(c_y))$를 품을 때 𝐼를 𝑆에서 뺍니다(삼켜진 캐릭터를 되돌리기 전의 장면 배경에서도 뺌).
그다음 𝑆를 $B_1$에 합칩니다. 떠 있는 글자 · 문양의 성분은 AI 생성 그림에서 $\lvert C(I)\rvert/ \lvert C_\max \rvert \le 0.04$였습니다.
\lvert C(I)\rvert / \lvert C_\max\rvert$가 0.25 이상이면 주된 캐릭터에 속한 섬이고, 떠 있는 글자 · 문양은 0.04 이하라 갈립니다. 얼굴 가운데를 품는 덩어리도 캐릭터로 봅니다. 참고: R14 Gonzalez · Woods 2018 · 이 프로그램에서 정한 규칙\text{1단계 후보} \cup (D_c < \tau_c \land D_s \ge 0.085 \land(\mathrm{known} \lor \text{흐린 선}))$. 1단계 배경과 위 · 옆 테두리에서 같은 방식으로 채웁니다.
D_s \ge 0.085$는 둘레의 8.5% 이상이 흐린 선이라는 뜻입니다. 참고: 이 프로그램에서 정한 규칙\mathrm{round}(0.05 \cdot \max(W, H))$ 걸음까지, 이웃 간 변화 $\max_c\lvert \Delta U_c\rvert < 0.03 \cdot k$(𝑘는 위 단색 배경과 같음)이고 출발색과 $\max_c$ 차이 $< 0.1$이고 $\varepsilon < 0.9$인 $\mathrm{known}$ 픽셀로 넓힙니다.
$k < 1$이고 넓힌 뒤 넓이가 $0.05N$ 미만이면 넓히기 전으로 되돌려 $k = 1$로 다시 넓힙니다.
< 0.03k$(천천히 바뀌는 그라데이션은 지나감), 출발색과의 차이 $< 0.1$(멀리 가며 색이 떠내려가지 않게), $\varepsilon < 0.9$(둘러싸인 곳은 들어가지 않음) 세 조건의 너비 우선 채우기입니다. 걸음 수를 긴 변의 5%로 묶습니다. 𝑘는 큰 그림에서 한 걸음의 색 변화가 작아지는 것을 맞추는 크기 비율입니다. 참고: R14 Gonzalez · Woods 2018\varepsilon < 0.9$를 빼고) 한 번 더 찾습니다.
색 모델 · 얼굴 기준 넓히기는 그대로 𝜀을 씁니다. 윤곽선이 보이지 않는 캐릭터를 통째로 삼켜 90%를 넘던 그림(그라데이션 하늘 위의 검은 머리 캐릭터)도 되돌린 뒤에는 씁니다.
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 · 이 프로그램에서 정한 규칙
\mathrm{known}$ 픽셀에서 k-평균(24색, 표본 4만 개)으로 나누고, 같은 색의 4-연결 성분 중 40px 이상을 영역 𝑟로, 나머지는 라벨 채우기로 붙입니다.
$\mathrm{known}$ 픽셀이 $0.2N$ 미만이면 이 단계와 얼굴 기준 넓히기를 하지 않습니다.
\sum \lVert x - \mu\rVert^2$을 줄입니다(로이드 알고리즘). Lab에서 하므로 거리가 지각 색 차에 가깝고, 표본 4만 개로 중심을 배워 시간을 묶습니다. 40px 미만 성분은 잡음이라 이웃 라벨로 채웁니다. 참고: R22 Lloyd 1982 · R7 CIE 2004A_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 · 이 프로그램에서 정한 규칙\mathrm{inMask}$이면 선으로 맞닿은 길이 𝑙에, 아니면 선 없이 맞닿은 길이 𝑜에 1을 더하고,
하나라도 선명한 선이면 선명한 선 길이 𝑘에도 1을 더합니다.색 분포: 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)$
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 · 이 프로그램에서 정한 규칙\sum \min(p_{F^0}, p_{B^0}) \ge 0.3$이면 하지 않습니다.
\sum \min(p, q)$는 두 정규화 히스토그램의 교집합(히스토그램 인터섹션)으로, 0이면 전혀 겹치지 않고 1이면 같은 분포입니다. 0.3 이상이면 30% 넘게 겹칩니다. 참고: R84 Swain · Ballard 1991에너지: 캐릭터를 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$)합니다.
[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\theta_r^{+} = \max(\theta_r, 0)$, 영역 → 싱크(배경) 용량 $\theta_r^{-} = \max(-\theta_r, 0)$, 영역 쌍은 양방향 $w_{rq}$인 그래프에서 Dinic 최대 흐름을 구하고
(너비 우선으로 층을 매긴 뒤 층이 하나씩 늘어나는 증가 경로를 깊이 우선으로 막힐 때까지 흘리기를 반복, 남은 용량 $10^{-9}$ 이하는 0으로 봄),
잔여 그래프에서 소스로부터 닿는 영역을 캐릭터로 둡니다. 최대 흐름과 최소 컷의 값이 같으므로 이것이 $E(x)$를 가장 작게 하는 나누기입니다.
2^{\text{영역 수}}$)을 보지 않고 정확히 구합니다. 원리: 두 라벨 에너지에서 매끄러움 무게가 음수가 아니면(서브모듈러) 소스 · 싱크 그래프의 컷 값이 곧 에너지라, 최소 컷이 최소 에너지입니다. 최대 흐름 = 최소 컷 정리(포드–풀커슨)에 따라 최대 흐름을 구한 뒤 잔여 그래프에서 소스로부터 닿는 쪽이 최소 컷의 한쪽입니다. Dinic은 너비 우선으로 층 그래프를 만들고 막힘 흐름을 깊이 우선으로 채우기를 되풀이해 $O(V^2E)$ 안에 끝납니다. $10^{-9}$ 이하 남은 용량을 0으로 보는 것은 실수 오차로 끝없이 도는 것을 막습니다. 참고: R26 Ford · Fulkerson 1956 · R27 Dinic 1970 · R24 Boykov · Jolly 2001B^0$)에서, 선명하지 않은 맞닿음 $o + l - k$가 $\max(3, 0.3(o + l))$ 이상인 경계만 건너 닿을 수 있어야 합니다. 닿지 못하면 캐릭터로 되돌립니다.
o + l - k$는 맞닿은 길이 중 선명한 선이 아닌 길이입니다. 그 길이가 전체 맞닿음의 30% 이상(최소 3px)인 경계만 건너 기준 배경에서 그래프 탐색으로 닿는 영역만 배경으로 둡니다. 참고: 이 프로그램에서 정한 규칙\mathrm{known}$ 픽셀과 흐린 선 픽셀을 배경에 더합니다(선명한 선은 더하지 않음).난수는 이 단계만의 고정 씨앗(777)을 써서, 이 단계가 동작하지 않는 그림의 결과를 한 비트도 바꾸지 않습니다. 영역 그래프는 처음 필요할 때 한 번 만들어 아래 얼굴 단계와 같이 씁니다.
\max(\Delta E(p-1, p + 1), \Delta E(p-W, p + W)) \ge 20$인 픽셀. 흐리게 번진 경계는 2px 사이 차이가 작아 들지 않습니다.
색 로그 우도비: 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)}$
(h + 1)/(n + K)$(𝐾 = 2560)는 한 번도 안 본 색의 확률이 0이 되지 않게 합니다. 배경 분포에서 조각 자신을 빼는 것은 한 개 빼기 교차 검증과 같은 생각으로, 조각이 자기 색으로 배경 분포를 부풀려 자신을 배경으로 판정하는 순환을 막습니다. 참고: R51 Manning et al. 2008 · R74 Stone 1974\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 이상은 조각이 거의 캐릭터에 둘러싸였다는 뜻입니다. 참고: 이 프로그램에서 정한 규칙어두운 캐릭터 부분(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
눈 후보: $\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개까지 둡니다.
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 2018d \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얼굴 틀: 두 눈 가운데를 원점, 눈 방향을 𝑢, 그에 수직인 아래 방향을 𝑣로 두고 𝑑를 단위로 격자 표본(쌍선형 보간, 그림 밖은 가장자리로)을 잽니다.
$\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점의 중앙값의 차로, 둘레보다 훨씬 밝은 작은 점을 잡는 국소 대비입니다. 참고: 이 프로그램에서 정한 규칙
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)$를 잽니다. 눈은 두 눈 중 작은 값입니다.
\mathrm{mean}(z\cdot T)$는 피어슨 상관계수(정규화 상호상관)라 −1~1입니다. 평균 무늬는 손으로 표시한 31개 얼굴의 𝑧 점수를 평균한 것입니다. 참고: R34 Lewis 1995 · R60 Pearson 1900점수: 근거마다 $[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)입니다. 참고: 이 프로그램에서 정한 규칙
\pm 0.12d$ 안(5×5 격자, 간격 $0.06d$, 𝑑는 다듬기 전 거리)에서 얼굴 무늬 상관이 가장 큰 곳으로 옮기기를
왼눈 → 오른눈 순서로 두 번 되풀이하고(지금보다 상관이 커질 때만 옮김) 다시 잽니다.
\max(d, d')$ 미만이거나 한 눈이 그 얼굴 눈의 $0.5 \max(d, d')$ 안이면 뺍니다.
\max(d, d')$로 해서 얼굴 크기에 맞춥니다. 참고: 이 프로그램에서 정한 규칙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의 타원입니다. 참고: 이 프로그램에서 정한 규칙문턱은 놓치는 얼굴이 적은 쪽으로 정했습니다. 가짜 얼굴(무릎, 손, 그릇, 옷 무늬)은 아래 단계에서 그 자리를 캐릭터 쪽으로 지킬 뿐 배경을 더하지 않지만, 놓친 얼굴의 캐릭터는 지켜지지 않기 때문입니다.
이름 · 캐릭터 폴더용 얼굴: 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).
좌우 합의(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을 적용해, 파츠 이름과 캐릭터 나누기에 씁니다.
윤곽선이 머리카락 · 배경과 같은 색이라 보이지 않고 머리카락 · 옷을 선 없이 칠한 그림은, 선 밀도로 찾는 장면 배경이 캐릭터 경계를 그대로 넘어갑니다.
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% 이하). 참고: 이 프로그램에서 정한 규칙\Delta E \ge 20$, 선)으로 지금의 배경을 조각 𝑘로 나눕니다.색이 드묾: 위 · 왼쪽 · 오른쪽 테두리에 닿은 조각들의 픽셀 $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\nu_k > 0$인 조각과 그 조각 쪽 경계 · 선 띠, 캐릭터 쪽 경계 띠(3px까지)를 캐릭터로 되돌립니다.
머리카락과 목 사이로 보이는 배경 틈은 배경색이라 남습니다.
\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 차이가 다른 칸에 들어가 드문 색으로 잡힙니다. 참고: 이 프로그램에서 정한 규칙\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 · 이 프로그램에서 정한 규칙배경이 거의 한 색이면 하지 않기: 지금까지 찾은 배경 픽셀 $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 2004o, l$, 색 분포)를 씁니다. 두 단계가 한 번 만든 그래프를 같이 씁니다.자리 확률(캐릭터일 확률) $\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$입니다.
\ln(\pi/(1 - \pi))$로 들어가는데, 베이즈 규칙에서 로그 사후 오즈 = 로그 우도비 + 로그 사전 오즈이므로 색 항(로그 우도비)에 그대로 더할 수 있습니다. 영역 그래프(맞닿은 길이 𝑜, 𝑙)는 색 모델과 같이 씁니다. 참고: R25 Rother et al. 2004 · 이 프로그램에서 정한 규칙\bar \pi_r \ge 0.8 \land \beta_r < 0.5$인 영역(머리 · 몸 자리), 배경은 $\beta_r > 0.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\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%)의 두 문턱입니다. 참고: 이 프로그램에서 정한 규칙
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$이면 하지 않습니다(장면 배경은 틈으로 보이는 곳의 색도 제각각이라 이 규칙으로 가를 수 없음).후보: 배경이 아닌 칠한 픽셀 중 배경 대표색과 거의 같은 색인 픽셀(되돌린 캐릭터 부분은 빼고)을 4-연결 조각 𝑟로 나눕니다.
$\displaystyle (L_p-m_L)^2+(a_p-m_a)^2+(b_p-m_b)^2\le 5^2$
5^2$과 견주는 것은 제곱근을 피한 $\Delta E \le 5$(같은 색으로 보이는 작은 차이)입니다. 참고: R7 CIE 2004조각 조건: 조각 밖의 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$
둘레가 거의 선과 배경뿐이고(다른 색 칠에 닿은 흰 옷 · 흰 머리카락은 대개 그림자 · 음영에 닿아 있음), 얼굴의 머리 타원(배경 판정에 쓰는 얼굴) 밖이어야 합니다(흰자위 · 이).
|R^c_r| / |R_r| \le 0.1$(둘레가 거의 선과 배경뿐), 그리고 모든 얼굴(∀𝑓)의 머리 타원 밖이어야 합니다. 참고: 이 프로그램에서 정한 규칙그림 조건: 조건에 맞는 조각의 넓이 합이 캐릭터 쪽 칠한 픽셀 수 $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)틈 다음에 합니다. 캐릭터 쪽에 남은 칠한 픽셀(배경 · 선 · 되돌린 캐릭터 부분이 아님)의 4-연결 성분 𝑟마다 넓이 $A_r$와 경계 상자 $w_r \times h_r$를 잽니다.
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 · 이 프로그램에서 정한 규칙d = 2\,\mathrm{lw} + 6$px(lw는 선 굵기) 넓힌 고리의 칠한 픽셀 중 직사각형 후보가 아닌 것의 절반 이상이 배경이면 받아들입니다(창틀로 나뉜 유리 여러 장은 서로를 고리에서 빼고 봄).
받아들인 것이 생기면 더 받아들일 것이 없을 때까지 다시 봅니다.
\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.002N$ 이상인 것마다 두 점수를 냅니다.
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})
\mu_j$ · 표준편차 $\sigma_j$로 표준화한 뒤 로지스틱 회귀(정칙화 $\lambda = 30$)로 무게 $b_j$를 맞췄고, $s_r$은 “배경일 로그 오즈”입니다. 문턱 0.358은 개발 그림 영역 정답에서 지운 넓이의 80%가 배경이 되는 값입니다. 참고: R69 Cox 1958
I = L^*/100$의 소벨 기울기 $I_x, I_y$로 구조 텐서를 만들어 $\sigma = 2$ 가우스 $G_\sigma$로 모읍니다.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을 넘는 픽셀의 몫, 영역 밝기의 표준편차입니다.
\lambda_1 \ge \lambda_2$는 둘레의 기울기가 한 방향으로 모인 정도를 나타내, $c$가 1이면 한 방향의 결, 0이면 방향 없음입니다. 텐서 에너지 $J_{xx} + J_{yy}$로 가중해 평균하므로 평평한 곳의 잡음 방향은 거의 세지 않습니다. 결 특징만으로는 머리카락 대 배경 AUC 0.78이라 혼자 쓰지 않고 통계식에 넣었습니다. 참고: R89 Bigün · Granlund 1987
[-0.5, 0.5]$로 넣으면, 1/2 해상도의 캐릭터 로짓 $z$를 냅니다.
얼굴 자리 판은 얼굴마다 얼굴 틀 좌표 $(u, v)$에서 $\max\bigl(0,\ 1 - \sqrt{(u/1.3)^2 + ((v + 0.2)/1.5)^2}\,/\,2.5\bigr)$의 최댓값입니다.
구조는 3×3 합성곱(ReLU) 두 겹씩의 세 층(채널 8 · 16 · 32, 층 사이 2×2 평균으로 줄임), 가장 깊은 층(48채널)의 팽창 2 · 4 · 8 합성곱, 2배로 늘려 같은 크기 층과 잇는 두 층, 끝의 1×1 합성곱입니다(가중치 109,073개, 4:3 그림에서 곱셈-덧셈 약 2.4억 번).
합성 그림에서는 정답 캐릭터 몫, 개발 그림에서는 영역 정답이 덮은 칸에 대해 이진 교차 엔트로피를 Adam으로 줄였습니다(AI 생성 그림 칸 무게 8, 15번 돌림).\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
선 픽셀은 바꾸지 않고(뒤의 선 정리 규칙이 정함), 배경을 캐릭터로 되돌리지는 않습니다.
s_r \ge 0.358 \land \bar z_r < -1.25$) 정밀도를 올렸습니다(80.4%, 지우는 양 17.6%). 0.50은 두 점수를 2개짜리 로지스틱 식 하나로 묶어, 한쪽이 아주 확실하면 다른 쪽이 조금 덜 확실해도 지웁니다. 통계식 · 묶는 식 · 문턱을 모두 바깥 겹을 보지 않고 맞춘 겹 안 겹 바깥 점수에서 지운 넓이 중 배경이 76%(0.49 규칙)에서 90%로 오르고 지우는 양은 28%에서 27%로 비슷했습니다. 신경망은 U-Net처럼 줄였다 늘리며 같은 크기 층을 이어 위치를 잃지 않고, 가장 깊은 층의 팽창 합성곱으로 넓은 둘레를 봅니다. 묶는 식의 계수는 두 점수의 바깥 점수로 로지스틱 회귀를 맞춘 값이고, 문턱 0.8은 캐릭터 손실을 3배로 친 넓이 가중 손실이 가장 작은 값입니다. 신경망 가중치는 0.49와 같습니다. 참고: R86 Ronneberger et al. 2015 · R87 Kingma · Ba 2015 · R88 Yu · Koltun 2016 · 이 프로그램에서 정한 규칙학습 · 추론 코드는 이 프로그램을 위해 처음부터 짰습니다(학습은 numpy 행렬 계산, 추론은 순수 JS). 가중치는 float32로 앱 파일 안에 들어 있고, 추론은 덧셈 · 곱셈 · 최댓값 · 평균만 씁니다. 근거와 시험 결과는 12의 0.49 · 0.50에 있습니다.
캐릭터 둘레에 두른 채도 높고 밝은 띠(네온 글로우, 형광 테두리)를 따로 뺍니다.
배경이 전체의 2~95%인 그림에서만 봅니다.
\mathrm{known}$, 선이 아닌) 픽셀을 깊이 1로 두고, 캐릭터 쪽으로 선을 넘지 않고 $D = \max(12, \mathrm{round}(0.025\cdot \max(W, H)))$ 걸음 안에 닿는 픽셀(4-이웃 너비 우선 탐색, 깊이는 걸음 수).
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(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\le D$인 픽셀(배경과 윤곽선 사이에 끼인 띠) 중 글로우 색($L^* > 45,\ C^* > 25$, 글로우 칸)이나 흰 심($L^* > 80$)\le D$인 글로우 색\le 1.5$) 중 글로우에서 3px 안(반지름 3 정사각형 팽창)인 것이 35% 이상일 때만 씁니다.
\le D$”는 그 픽셀이 배경과 윤곽선 사이 폭 𝐷 이하의 띠 안에 있다는 조건입니다. 반지름 3 정사각형 팽창으로 글로우에서 3px 안을 잡고, 캐릭터와 맞닿은 배경의 35% 이상이 그 안이어야 둘레를 두른 것으로 봅니다. 참고: R21 Borgefors 1986 · R15 Soille 2003배경이 아닌($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
캐릭터를 뺀 자리를 배경 메꿈 신경망과 패치 맞춤으로 추정해 채운 ‘배경 메꿈’ 층을 ‘배경’ 층 바로 위에 둡니다(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).
선 연결 조각마다
\mathrm{inMask}$ 밖)의 85% 이상이 배경일 때: 캐릭터(배경이 아닌 $\mathrm{known}$)에서 $\max(10, \mathrm{round}(20s))$ 걸음 밖이면, 전체 선 픽셀의 0.5% 미만인 작은 조각이면,
선의 원본 평균색과 옆 배경(맞닿은 배경 픽셀의 𝑈) 평균색의 $\Delta E < 15$이면 뺍니다.
\max(10, \mathrm{round}(20s))$걸음 밖, 크기 비율 𝑠를 곱한 길이), 작은 조각이거나, 옆 배경과 색이 비슷한($\Delta E < 15$) 선은 배경에 속한 선으로 봅니다. 참고: R7 CIE 2004 · 이 프로그램에서 정한 규칙뺀 선 픽셀은 원본 색으로 되돌려 배경 그림에 남깁니다.
← README · 다음: 4.6 영역과 재질