Illustracy 도움말
Illustracy는 그림을 어떻게 층으로 나누나요?
다 그린 그림 한 장을 작업 파일처럼 선화 · 밑색 · 그림자 · 빛 · 배경 층으로 다시 나눠 PSD로 저장하는 법, 그 판단의 원리와 수식, 검증 결과, 그리고 틀린 곳을 바로잡는 방법을 정리했습니다.
1시작하기
쓰기 전에 꼭 읽어 주세요. Illustracy는 그린 층들을 실수로 합친 뒤 다시 나눌 수 없게 되었거나, 그림을 한 장으로 내보낸 뒤 원본 작업 파일을 저장하지 못했을 때를 위해 만든 프로그램입니다.
자신이 저작자가 아닌 그림은 절대 넣지 마세요. 사용권 위반이자 저작권법상 불법 행위로, 형사 처벌 대상입니다.
이게 뭔가요?
컴퓨터로 그림을 그릴 때는 보통 투명한 종이를 여러 장 겹쳐 그립니다. 맨 아래 종이에 색을 칠하고, 그 위 종이에 그림자를, 또 그 위에 반짝이는 빛을, 맨 위에 선을 그리는 식입니다. 그런데 다 그린 그림을 한 장으로 합쳐 저장하면 이 종이들이 사라지고 한 장만 남습니다.
Illustracy는 한 장으로 합쳐진 그림을 보고, 그림을 그렸던 순서대로 종이(층, 레이어)를 다시 나눠 포토샵 파일(PSD)로 저장합니다. 나눈 층을 다시 겹치면 원래 그림과 눈으로 구분할 수 없을 만큼 똑같이 보입니다(재현 PSNR 49~65 dB, 검증).
왼쪽은 합친 그림 한 장이 배경 · 밑색 · 그림자 · 선화 층으로 나뉘는 모습, 오른쪽은 앱의 층 목록입니다. 바둑판 무늬는 투명한 곳입니다.
나뉘는 층은 그림을 그리는 사람이 실제로 만드는 작업 파일의 구성을 따릅니다. 부분(파츠)마다 폴더가 따로 생기고, 폴더 안에 그 부분의 밑색 · 그림자 · 하이라이트가 들어 있습니다. 그림에서 얼굴을 찾으면(배경이 투명한 PNG도) 얼굴 둘레의 색으로 눈 · 피부 · 머리카락 폴더에 이름을 붙이고, 나머지 폴더는 색 이름(파랑, 검정 …)으로 붙습니다. 층마다 무엇이 들어 있는지는 층의 종류에 있습니다.
무엇이 필요한가요?
- 브라우저 하나(Chrome, Edge, Firefox, Safari)면 됩니다.
- 설치 · 인터넷 연결 · 계정 · 비용은 모두 필요 없습니다. 외부 라이브러리 · 서버 · 유료 서비스를 쓰지 않습니다.
- 그림은 내 컴퓨터 밖으로 나가지 않습니다. 브라우저의 외부 네트워크 요청을 모두 막은 상태에서도 그대로 동작함을 확인했습니다(외부 요청 0건).
- 프로그램은 HTML 파일 하나(
illustracy.html)이고, 이 도움말은 같은 폴더에 두는illustracy-help.html입니다. 두 파일을 같은 폴더에 두고illustracy.html을 두 번 누르면 인터넷 없이도 열립니다. 앱의 도움말 버튼은 이 파일을 새 창으로 열고, 파일이 없으면 "도움말 파일이 존재하지 않는다. 확인 바란다."를 띄웁니다(0.59h부터).
쓰는 법
- 프로그램을 브라우저로 엽니다.
- 그림을 넣습니다. 그림을 창에 끌어다 놓거나, 왼쪽 위 상자를 눌러 고르거나, 복사한 그림을 Ctrl+V로 붙여 넣습니다(PNG · JPG · WebP). 먼저 해 보고 싶으면 예제 그림을 누르세요. 앱에 넣어 둔 그림 10장 중 하나가 무작위로 열립니다(누를 때마다 바로 앞과 다른 그림).
- 몇 초 기다립니다. 계산은 화면과 따로 도는 계산 스레드(Web Worker)에서 하므로 기다리는 동안에도 화면이 멈추지 않습니다. 긴 변 1200px 안팎의 그림은 대개 4~9초, 2048px 그림은 15초 안팎입니다. 설정을 바꾼 뒤에는 레이어 분리로 다시 나눕니다.
- 오른쪽 층 목록에서 결과를 봅니다.
- 동그라미 버튼: 그 층을 켜고 끕니다.
- 층 이름 누르기: 섞는 방식(혼합 모드)과 진하기(불투명도)를 바꾸고, 그 층만 그림 파일로 저장합니다.
- 층 이름 두 번 누르기: 이름을 바꿉니다.
- 목록 위 눈 모양 버튼: 눈 뜬 모양을 누르면 모든 층과 폴더가 한 번에 꺼지고 눈 감은 모양으로 바뀝니다. 눈 감은 모양을 누르면 끄기 전 상태로 돌아옵니다. 모두 끈 뒤 층 하나를 켜면 그 층이 든 폴더도 함께 켜져 그 층만 보이고, 폴더를 켜면 그 안의 층들이 보입니다.
- 틀린 곳을 고칩니다. 배경의 물건이 캐릭터 쪽에 남았거나 캐릭터 일부가 배경으로 갔으면 보정 도구로 고칩니다.
- 저장합니다. PSD 다운로드를 누르면 포토샵에서 열 수 있는 파일이 저장됩니다. 목록에서 바꾼 이름 · 진하기 · 켜고 끈 상태도 그대로 들어갑니다.
화면 둘러보기
화면은 앱과 같이 세 칸입니다. 왼쪽은 입력과 설정, 가운데는 미리보기, 오른쪽은 층 목록입니다. 맨 위 줄 오른쪽에는 걸린 시간 · 파츠 수 · 재현 PSNR 같은 결과가 나오고, 그 옆의 도움말 버튼은 이 도움말을 새 창으로 엽니다(나눈 결과는 그대로). 맨 끝의 테마 막대는 화면 색을 시스템 설정 따름 · 밝게 · 어둡게 중에서 고릅니다. 고른 테마는 앱과 도움말이 함께 쓰고, 한쪽에서 바꾸면 열려 있는 다른 쪽도 따라 바뀝니다.
| 자리 | 하는 일 |
|---|---|
| ① 입력 | 그림 끌어다 놓기 · 고르기 · 붙여 넣기, 예제 그림, 레이어 분리. 예전에 저장한 PSD를 넣으면 층 이름을 지금 이름으로 고쳐 저장합니다(예전 PSD). |
| ② 설정 | 처리 · 선화 · 채색 · 명암 · 레이어 구성. 칸마다 아래에 짧은 설명이 있습니다(설정 한눈에 보기). |
| ③ 보기 막대 | 합성(나눈 층을 겹친 모습) · 원본 · 선택 레이어(고른 층만) · 차이 ×8(원본과 다른 곳을 8배로 강조). |
| ④ 도구 | 배경으로 보내기 · 캐릭터로 되돌리기(보정 도구), ↶ 되돌리기, 맞춤(화면에 맞춤), 1:1(100%), 오른쪽에 지금 배율. |
| ⑤ 층 목록 | 층 켜고 끄기, 혼합 모드 · 불투명도, 이름 바꾸기, 눈 모양 버튼(모두 끄기 · 되살리기). |
| ⑥ 저장 | PSD 다운로드, 합성 결과 PNG 저장. |
| 조작 | 하는 일 |
|---|---|
| 마우스 휠 | 미리보기를 크게 · 작게 |
| 끌기 | 미리보기 옮기기(보정 도구를 켠 동안에는 오른쪽 버튼으로 끌기) |
| Ctrl+V | 복사한 그림 붙여 넣기 |
| Ctrl+Z | 보정 되돌리기(↶와 같음) |
| 층 이름 누르기 · 두 번 누르기 | 혼합 모드 · 불투명도 · 그 층만 저장 / 이름 바꾸기 |
저장하기
- PSD 다운로드: 폴더 · 클리핑 · 혼합 모드 · 한글 층 이름 · 병합 이미지가 든 RGB 8비트 PSD입니다. 외부 라이브러리 없이 프로그램이 직접 씁니다. 목록에서 바꾼 이름 · 불투명도 · 켜고 끈 상태가 그대로 들어가고, 숨긴 [러프] 폴더와 실루엣 (선택용) 층도 함께 들어갑니다.
- 합성 결과 PNG 저장: 지금 켜 둔 층을 겹친 모습을 PNG로 저장합니다.
- 층 하나만: 층 이름을 누르면 나오는 칸에서 그 층만 그림 파일로 저장합니다.
PSD는 처리 해상도(기본 긴 변 2048px)로 저장됩니다. 원래 크기 그대로 나누려면 처리 해상도를 원본 크기로 고르세요(1600만 픽셀이 넘으면 경고가 나옵니다).
2실수할 수 있는 이유와 확인하는 법
Illustracy는 학습한 AI가 아니라 규칙으로 그림을 나누며, 실수할 수 있습니다. 나눈 층, 특히 캐릭터와 배경의 경계는 꼭 눈으로 확인해 주세요.
Illustracy는 미리 학습된 남의 인공지능 모델을 쓰지 않습니다. 빛과 물감이 겹치는 방식을 계산식으로 옮기고, 선 · 색 · 흐림 · 테두리 · 얼굴 같은 단서를 손으로 정한 규칙으로 엮어 판단합니다. 0.49부터는 배경 찾기 끝에서만, 이 프로그램을 위해 처음부터 짜서 학습한 통계식과 작은 신경망이 함께 동의할 때 남은 배경을 더 지웁니다. 그래서 "무엇이 모자이고 무엇이 단풍잎인지"처럼 그림의 뜻을 알아야 가를 수 있는 곳에서는 틀릴 수 있습니다.
대신 틀려도 그림은 상하지 않습니다. 층을 어떻게 나누든 겹친 결과는 원본과 같도록 계산하므로(원리), 틀린 것은 "어느 층에 들어갔는가"뿐입니다. 이런 실수는 대부분 보정 도구로 몇 번 문질러 고칠 수 있고, 고쳐도 겹친 결과는 원본 그대로입니다. 판단의 근거와 검증 결과는 이 도움말에 모두 적었습니다.
얼마나 자주 틀리는지: 처음 보는 그림을 섞은 650장을 엄격하게 재면 캐릭터가 한 조각도 빠짐없이 캐릭터 층에 남는 그림은 13%(95% 구간 11~16%), 배경까지 남김없이 떼는 그림은 4%(2~5%)입니다. 대부분의 그림은 보정 도구로 다듬어야 합니다(한계).
자주 틀리는 경우와 바로잡는 법
| 이렇게 보이면 | 왜 그런가요 | 이렇게 하세요 |
|---|---|---|
| 탁자 · 의자 · 바닥의 과자 같은 배경 물건이 캐릭터 쪽에 남았다 | 캐릭터와 같은 방식(진한 선 + 칠)으로 그린 배경 물건은 선 · 색 · 흐림 규칙만으로 캐릭터의 물건과 가를 수 없습니다. | 배경으로 보내기를 켜고 그 물건을 누르거나 문지르세요. 넓으면 빙 둘러 고리를 그립니다. |
| 잘린 모자 · 소매 · 다리 · 머리카락 끝이 배경 층에 들어갔다 | 선 없이 칠했거나 배경과 색이 비슷한 부분입니다. 그림 테두리에 닿은 부분은 확실히 찾은 얼굴의 머리 · 몸 자리 안에서만 자동으로 되돌립니다. | 캐릭터로 되돌리기로 그 부분을 따라 칠하세요. 팔 하나는 한 획이면 대부분 돌아옵니다. |
| 흰 옷 · 옅은 머리카락이 흰 배경과 함께 배경으로 갔다 | 옷 안에 선이 적으면 "선이 드문 곳 = 배경" 단서가 옅은 윤곽선을 넘어 들어갑니다. 윤곽선이 끊겨 한쪽이 트인 옷이 특히 그렇습니다. | 캐릭터로 되돌리기. 얼굴을 찾은 캐릭터는 몸 자리의 배경 조각을 자동으로 되돌리므로, 얼굴이 보이는 그림은 덜 생깁니다. |
| 검은 머리카락 · 옷 · 스타킹이 어두운 배경과 함께 배경으로 갔다 | 윤곽선이 옷과 같은 색이면 선으로도, 색 경계로도 잡히지 않는 곳이 남습니다. | 캐릭터로 되돌리기. |
| 팔과 몸 사이, 머리카락 사이로 보이는 배경이 캐릭터 층에 남았다 | 사방이 윤곽선인 곳은 캐릭터의 흰 옷처럼 보여 배경으로 가져가지 않습니다. 흰 · 단색 배경과 같은 색인 틈만 자동으로 배경으로 보냅니다. | 배경으로 보내기로 그 틈을 누르세요. |
| 배경 층이 아예 없다 | 화면 전체를 선으로 촘촘히 그렸거나(장식 · 스테인드글라스), 인물이 아주 작아 찾은 장면 배경이 그림의 90%를 넘으면 버립니다. | 배경으로 보내기로 배경을 고리로 두세 번 두르면 배경 층이 만들어집니다. |
| 파츠 이름이 색 이름(파랑, 검정 …)뿐이다 | 얼굴을 찾지 못했습니다. 옆얼굴 · 한 눈 · 감은 눈 · 아주 작은 얼굴 · 짙은 피부 · 누운 얼굴은 찾기 어렵습니다. | 층 이름을 두 번 눌러 바꾸세요. 그림 전체가 크게 기울었으면 기울어진 그림을 켭니다. |
| 한 사람 그림이 [캐릭터 1] · [캐릭터 2]로 나뉘었다 | 무릎 · 과자 · 꽃 · 소매 무늬를 얼굴로 본 가짜 얼굴입니다. | 포토샵에서 두 폴더를 합치세요. 폴더가 나뉘어도 겹친 결과는 같습니다. |
| 머리카락과 같은 색의 옷 · 리본이 "머리카락" 파츠에 들었다 | 파츠는 색으로 나누므로 같은 색의 다른 물건도 한 파츠에 들어갑니다. 머리와 이어져 있거나 가까우면(두 눈 사이의 2.5배 안) 이름도 함께 받습니다. | 이름을 바꾸거나 포토샵에서 옮기세요. |
| 밑색이 여러 톤으로 잘게 나뉘었다 | 선이 없는 그림, 붓 · 수채 그림, 장면 · 소품이 많은 그림은 색이 잘게 부서집니다. | 밑색 병합 강도를 올리거나 색상 군집 수를 줄여 보세요. |
| 옅은 선을 놓치거나 칠의 가장자리가 선으로 잡힌다 | 선은 "가늘고 주변보다 어두운 것"이라 옅기에 따라 경계가 갈립니다. | 선 감도를 올리거나 내리세요. 검은 옷처럼 두꺼운 면이 선이 되면 최대 선 굵기를 낮춥니다. |
| 옅은 그늘까지 그림자 층으로 가거나, 그림자가 명암 층으로 간다 | 그림자 톤과 밑색의 밝기 비로 가르기 때문입니다. | 그림자 판정 기준을 조절하세요(높이면 옅은 그늘도 그림자로). |
| 반짝임이 너무 많거나 적다 | 반짝임은 크기로 가립니다. | 반짝임 최대 크기를 조절하세요. |
| 파츠 폴더가 너무 많다 / 비슷한 색의 다른 부분이 합쳐졌다 | 파츠 수에 상한이 있고, 넘으면 비슷한 색의 이웃에 합칩니다. | 최대 파츠 수를 조절하세요. 넘치는 작은 부분은 [작은 파츠] 폴더로 갑니다. |
| 선 위에 칠한 빛이 색 트레이스에 들어갔다 | 선을 칠 색으로 물들인 것과 "검은 선 위의 빛"은 한 픽셀의 색으로 구별되지 않습니다. | 포토샵에서 그 부분을 빛 층으로 옮기세요. |
| 큰 그림이 오래 걸린다 | 계산량은 픽셀 수에 비례합니다. | 처리 해상도를 낮추거나 큰 그림은 줄여서 나누기를 켜세요(전부 줄여서 나누기: 시간 약 절반). |
보정한 내용은 설정을 바꿔 다시 나눠도 남아 있고, 새 그림을 열면 지워집니다. 자세한 원인은 한계에 있습니다.
보정 도구 쓰는 법
미리보기 위 막대의 두 도구로 캐릭터와 배경의 경계를 고칩니다. 도구를 켠 동안에는 마우스 왼쪽 버튼이 붓이 되고, 화면 이동은 오른쪽 버튼으로 끕니다.
| 도구 | 쓰는 법 | 안에서 일어나는 일 |
|---|---|---|
| 배경으로 보내기 | 캐릭터 쪽에 남은 배경 물건(탁자, 의자 …)을 누르거나 문지릅니다. | 획이 닿은 파츠와 그와 거의 같은 색의 파츠 안에서, 선을 넘지 않고 색이 이어지는 곳을 골라 배경 층으로 원본 색 그대로 옮기고 캐릭터 쪽 층에서 지웁니다. 다시 나누지 않아 곧바로 반영되고, 겹친 결과는 원본과 같습니다. |
| 캐릭터로 되돌리기 | 배경에 잘못 들어간 부분(잘린 모자, 소매, 다리 …)을 문지릅니다. | 배경에서 선을 넘지 않고 이어지는 곳을 "여기는 캐릭터"로 표시하고 그림을 다시 나눕니다(몇 초). 자동 배경 판정은 저장해 둔 것을 다시 쓰므로 처음보다 빠릅니다. |
| 고리(올가미) | 넓은 곳은 옮길 부분을 빙 둘러 그리고 끝을 시작점 근처로 돌아오게 합니다. | 고리 안이 옅게 채워지면 고리로 알아본 것입니다. 안쪽을 선으로 나뉜 조각 단위로 맞춰, 60% 이상 안에 든 조각은 통째로, 40% 이하로 든 조각은 빼고, 그 사이는 고리 안쪽만 옮깁니다. |
| 되돌리기 | ↶ 또는 Ctrl+Z | 바뀐 층의 사각형 줄과 표시(마스크)의 이전 상태를 저장해 두었다가 되돌립니다. |
- 붓 둘레에 옅게 보이는 띠는 한 번에 가져갈 수 있는 범위입니다(그림 긴 변의 5%, 적어도 24px).
- 보정은 그림 크기의 표시(마스크)로 남아, 설정을 바꿔 다시 나눠도 자동 판정보다 먼저 반영됩니다.
- 배경을 못 찾은 그림은 배경으로 보내기를 칠했을 때 비로소 배경 층이 생깁니다.
- 그림이나 선 설정(선 굵기 · 감도 · 선 색 방식 · 배경 분리)을 바꾸면 자동 배경 판정을 처음부터 다시 합니다. 그 밖의 설정은 저장해 둔 판정을 다시 쓰고, 결과는 처음부터 다시 계산한 것과 바이트 단위로 같습니다.
결과를 확인하는 가장 빠른 방법
- 배경 층만 켜 보기. 목록 위 눈 모양 버튼으로 모두 끈 뒤 [배경]의 배경 층만 켜면, 배경으로 간 것이 한눈에 보입니다. 캐릭터 조각이 보이면 캐릭터로 되돌리기로 고칩니다.
- 실루엣 켜 보기. 숨겨 둔 실루엣 (선택용) 층은 캐릭터 자리를 회색으로 칠한 층입니다. 켜면 캐릭터와 배경의 경계를, 포토샵에서는 선택 영역을 바로 얻을 수 있습니다.
- 원본 ↔ 합성 번갈아 보기. 보기 막대의 원본과 합성을 번갈아 누르면 달라진 곳이 눈에 띕니다. 정상이면 구분되지 않습니다.
- 차이 ×8. 원본과 합성이 다른 곳을 8배로 키워 보여 줍니다. 거의 검게 보여야 정상입니다. 맨 위 줄의 재현 PSNR이 49 dB 아래로 떨어지면 이상한 경우입니다.
- 선택 레이어. 층 하나를 고르고 선택 레이어를 누르면 그 층만 바둑판 위에 보입니다. 그림자 · 빛 층이 제대로 나뉘었는지 볼 때 씁니다.
잘 되는 그림, 어려운 그림
| 잘 되는 그림 | 어려운 그림 |
|---|---|
| 선이 있고, 색을 면으로 또렷하게 나눠 칠한 애니메이션풍 그림(셀 채색) 긴 변 900px 이상 캐릭터와 배경의 색이 다른 그림 |
선이 없는 그림, 붓 자국이 많은 그림 역광 · 어두운 장면, 얼굴이 손 · 물건에 가려진 그림, 작은(긴 변 900px 미만) 그림 배경의 물건도 캐릭터처럼 진한 선으로 그린 그림 캐릭터와 배경의 색이 거의 같은 그림(검은 옷 + 검은 배경, 흰 옷 + 흰 배경) 여러 사람이 나오는 단체 그림, 한 장에 여러 칸을 그린 그림 모서리 없이 꽉 찬 채로 크게(45° 넘게) 기운 그림 |
얼굴을 찾으면 눈 · 피부 · 머리카락 부분에 그 이름이 붙고, 나머지 부분은 색 이름으로 붙습니다. "옷", "리본" 같은 뜻은 알지 못합니다. 조건별로 얼마나 어려운지는 배경과 캐릭터 가르기에 있습니다(선 없는 그림 · 얼굴이 가려진 그림 · 저화질 · 어두운 장면 · 역광에서 캐릭터의 큰 부분을 잃는 일이 잦음).
3만들어지는 층
층은 그림을 그리는 사람이 실제로 쌓는 작업 파일의 구성을 따르고, 층마다 겹치는 방식(혼합 모드)이 정해져 있습니다. 내용이 거의 없는 층은 만들지 않습니다.
층의 종류
| 층 | 겹치는 방식 | 들어 있는 것 |
|---|---|---|
| 러프 1 · 러프 2 | 표준 45%, 숨김 | [러프] 폴더 안의 밑그림 두 장. 원래 그림에 없으므로 짐작해서 그린 것입니다(러프 두 장). |
| 선화 | 표준 | 그림의 선. 선의 흐린 가장자리(안티에일리어싱)까지 투명도로 담깁니다. |
| 색 트레이스 | 표준, 선화에 클리핑 | 선 중에서 색이 다른 부분(빛을 받은 선, 색깔 선). 선화의 알파 안에서 선 색만 바꿉니다. |
| 반짝임 · 빛 | 스크린 | 눈 속 반짝임, 별, 작고 아주 밝은 점 / 넓게 퍼진 빛 |
| 림라이트 · 반사광 | 스크린 | 몸 가장자리에 비친 빛 / 그림자 속에서 다시 밝아진 부분 |
| 명암 · 그라데이션 | 곱하기 | 부드럽게 어두워지는 부분 / 넓게 천천히 깔린 어두움 |
| 하이라이트 | 표준, 밑색에 클리핑 | 밑색보다 밝게 칠한 면(머리카락 윤기 등) |
| 1차 · 2차 그림자 | 곱하기, 밑색에 클리핑 | 밑색 위에 겹친 어두운 면. 2차는 1차 위에 한 번 더 곱해지는 더 어두운 곳 |
| 밑색 | 표준 | 머리카락 · 피부 · 옷처럼 부분마다 칠한 한 가지 색. 층 이름에 색값(#RRGGBB)이 붙습니다. |
| 실루엣 (선택용) | 표준, 숨김 | 캐릭터 자리를 회색으로 칠한 층. 선택 영역을 얻을 때 씁니다. |
| 배경 효과 | 스크린 | 배경 위에 떠 있는 작은 빛 조각 · 입자 |
| 외곽 글로우 | 표준 | 캐릭터 둘레에 두른 형광 띠(있는 그림만) |
| 배경 메꿈 | 표준 | 캐릭터를 뺀 자리(+ 둘레 띠)를 신경망과 패치 맞춤으로 추정해 채운 층(0.56). 배경 바로 위, 나머지는 투명 |
| 배경 | 표준 | 캐릭터 뒤의 배경. 선 아래 색까지 원본 색 그대로 |
곱하기 · 스크린 층은 가능한 가장 작은 알파로 저장해, 작가가 옅게 칠한 층처럼 보이고 이어서 손대기 쉽습니다(최소 알파 저장).
레이어 트리
층들은 작업 파일처럼 폴더로 묶입니다. 위에 있을수록 나중에 겹칩니다.
- 배경이 없는 불투명한 그림은 [캐릭터] · [배경] 폴더 없이 [선화] · [효과] · [채색]이 맨 위에 옵니다.
- 설정에서 채색을 파츠별로 나누기를 끄면 밑색 · 그림자 · 하이라이트가 부분 구분 없이 한 장씩 만들어집니다.
- 폴더 나누는 방식을 단계별 폴더로 고르면 위와 뒤집어서, [채색] 안에 [하이라이트] · [2차 그림자] · [1차 그림자] · [밑색] 폴더를 두고 폴더마다 파츠(피부, 머리카락 …) 레이어를 둡니다. 밑색 레이어 이름 뒤에는 색 코드가 붙고, 색이 비슷한 이웃이 없는 작은 파츠는 폴더마다 [작은 파츠 (n)]로 모입니다.
- 단계별 폴더에서는 밑색과 그림자가 다른 폴더라 클리핑을 쓰지 않습니다(클리핑 칸이 잠깁니다). 파츠끼리는 겹치지 않고 레이어마다 그 파츠 자리만 칠해져 있어, 불투명한 그림은 다시 겹친 결과가 파츠별 폴더와 같습니다. 가장자리가 반투명한 투명 배경 그림은 파츠별 폴더에서 클리핑을 끈 것과 같습니다(반투명 가장자리 픽셀만 조금 다릅니다).
- 그림자·하이라이트를 밑색에 클리핑을 끄면 그림자 · 하이라이트가 클리핑 없이 놓입니다.
- 층을 어떤 구성으로 나눠도 다시 겹친 결과는 원본과 같습니다. 다만 가장자리가 반투명한 투명 배경 그림에서 클리핑을 끄거나 단계별 폴더를 고르면 그 반투명 가장자리만 조금 다릅니다(부드러운 가장자리 시험 그림에서 전체의 0.8%).
파츠 이름과 캐릭터 폴더
- 이름 붙이기: 찾은 얼굴마다 얼굴 틀(두 눈 사이 거리를 단위로 한 좌표)로 콧등 · 볼 자리를 차지한 파츠에 피부, 앞머리 자리(이마가 드러났으면 그 위)에 머리카락, 두 눈 칸에 눈을 붙입니다. 나머지 파츠는 밑색의 색 이름(검정, 흰색, 파랑 …)으로 붙습니다. "피부"는 얼굴로 확인한 파츠에만 붙이고, 다른 살색 파츠는 "베이지 · 살구"로 부릅니다.
- 떨어진 머리카락 조각 떼기: 파츠는 같은 밑색을 그림 전체에서 모은 것이라, 머리카락과 같은 색의 치마 · 다리 · 소품도 "머리카락" 파츠에 들어 있습니다. 머리 자리에서 같은 파츠를 따라 이어진 곳과 그 가까이(두 눈 사이의 2.5배 안)만 "머리카락"으로 두고, 나머지는 같은 색의 따로 된 파츠로 뗍니다. 층의 픽셀은 바뀌지 않고 파츠 층만 나뉩니다.
- 캐릭터 폴더: 크기와 높이가 비슷하고 서로의 몸 자리 밖에 있는 얼굴들을 캐릭터로 보고, 왼쪽부터 [캐릭터 1] · [캐릭터 2] … 폴더를 만듭니다. 각 얼굴의 머리 · 몸 자리에서 출발해 윤곽선을 벽으로 삼아 픽셀을 나눕니다. 폴더마다 [선화] · [효과] · [채색]이 따로 들어 있고, 겹친 결과는 한 폴더일 때와 같습니다.
- 두 눈이 보이는 얼굴이 있는 캐릭터만 따로 나뉩니다. 옆얼굴 · 뒷모습 · 아주 작은 얼굴의 캐릭터는 가까운 캐릭터 폴더에 함께 들어갑니다.
러프 두 장
러프(선화를 긋기 전의 연필 밑그림)는 원래 그림에 남아 있지 않으므로 복원할 수 없습니다. 대신 "작가가 어떤 러프를 그렸기에 이 선화가 나왔을까"를 거꾸로 짐작해 두 장을 그립니다. 작가는 러프 1을 먼저 급하게 긋고, 러프 1을 대고 러프 2를 다듬어 긋고, 러프 2를 대고 선화를 긋습니다. Illustracy는 이 순서를 거꾸로 거슬러 올라갑니다.
작가가 긋는 순서(→). 짐작은 반대로 선화에서 러프 2, 러프 2에서 러프 1로 거슬러 올라갑니다.
- 러프 1(컨셉): 아이디어가 떠오르자마자 잡은 투박한 러프입니다. 큰 덩어리(머리카락 · 얼굴 · 몸 · 옷의 바깥 모양)를 크게 뭉뚱그려 긴 획으로 빠르게 2~3번 겹쳐 긋고, 얼굴에 두개골 원 · 가운데선 · 눈높이선을 진하게 긋고, 긴 선과 눈 · 입 · 손가락 같은 짧은 표시를 따라 긋습니다. 구도는 원본과 조금 어긋납니다(전체가 몇 도 돌고 몇 % 커지거나 작아지며, 캐릭터 크기의 3.5% 남짓 부드럽게 휨).
- 러프 2(다듬기): 러프 1을 대고 구도를 원본에 맞춰 다듬은 러프입니다. 선화가 대고 그을 선이 거의 다 들어 있습니다. 0.57부터 선화 가운데 둘레보다 뚜렷이 진한 곳만 선으로 보고(칠 · 음영 · 머리카락 결처럼 넓게 어두운 곳은 빠짐), 그 그림의 펜 굵기에 맞춘 G펜으로 한 번씩 따라 긋습니다(필압 · 손떨림 보정, 완만한 곡선은 한 획). 0.59부터 획마다 필압 곡선으로 굵기 · 진하기에 강약을 주고, 중요한 선은 진하게 · 약한 선은 옅게, 긴 획 일부는 덧긋습니다. 0.59e부터 얼굴 자리 안의 눈 · 입은 선화를 그대로 한 획으로 긋습니다. 레이스 · 꽃 장식처럼 촘촘한 장식 선은 아직 그대로 따라 그어 그물처럼 보일 수 있습니다. 배경으로 옮겨진 배경의 긴 밝기 경계를 옅게 그어 배경 구도도 잡습니다.
- 무엇인지 알아보는 것은 큰 덩어리와 찾은 얼굴뿐입니다. 눈 · 손 · 소품은 기호(타원 등)로 바꾸지 않고 선화를 따라 긋고, 칠한 눈동자처럼 두껍고 둥글게 칠한 모양은 바깥 둘레를 따라 긋습니다.
- 두 층은 [러프] 폴더 안에 숨김 · 불투명도 45%로 들어갑니다. 색은 설정의 러프 색상(기본 파랑
#2F6FE0)이고, 끄려면 러프 스케치 생성을 끕니다. 러프는 다른 층에 영향을 주지 않습니다.
러프는 짐작한 밑그림이라 실제 작가의 러프와 다를 수 있습니다. 처음 보는 그림으로 매긴 눈가림 결과는 러프 눈가림 짝 판정에 있습니다.
4설정
왼쪽 칸의 설정은 기본값으로 대부분의 그림에 맞춰 두었습니다. 기본값은 여러 그림으로 맞춘 값이고, 선 굵기만 그림을 재서 필요할 때 바꿉니다(아래). 설정을 바꾼 뒤 레이어 분리를 누르면 다시 나눕니다. 보정한 내용은 남아 있습니다.
설정 한눈에 보기
| 설정 | 기본값 · 범위 | 뜻 |
|---|---|---|
| 처리 | ||
| 처리 해상도 (긴 변) | 2048px · 1024 ~ 4096, 원본 크기 | 그림의 긴 변을 이 크기로 줄여서 처리합니다. 클수록 자세하지만 느립니다. PSD도 이 크기입니다. |
| 큰 그림은 줄여서 나누기 | 꺼짐 · 방식 2가지 · 줄일 크기 800 ~ 2000px(1200) | 긴 변이 줄일 크기보다 큰 그림을 줄여서 나눕니다(아래). |
| 기울어진 그림 | 꺼짐 | 그림 전체가 크게(45° 넘게) 기울었거나 옆으로 누웠으면 켭니다(아래). |
| 선화 | ||
| 선 감도 | 50 · 0 ~ 100 | 높이면 옅은 선도 선으로 봅니다. |
| 최대 선 굵기 | 0(자동) · 0 ~ 16 | 이보다 두꺼운 어두운 곳은 선이 아니라 칠한 면으로 봅니다. 0이면 그림에서 선 굵기를 재서 정하고, 고른 값과 잰 굵기가 옆에 나옵니다. |
| 선 색상 | 선화 + 색 트레이스 | 선화 + 색 트레이스(작가식) / 원본 선 색 그대로(한 장) / 검정 단색 |
| 채색 · 명암 | ||
| 색상 군집 수 | 18 · 6 ~ 40 | 처음에 색을 몇 가지로 나눠 볼지 |
| 밑색 병합 강도 | 50 · 0 ~ 100 | 높이면 밝기만 다른 색을 같은 부분으로 더 많이 묶습니다. |
| 그림자 판정 기준 | 50 · 0 ~ 100 | 높이면 옅게 어두워진 곳도 그림자 층으로 보냅니다. |
| 반짝임 최대 크기 | 0(자동) · 0 ~ 30 | 이보다 작은 밝은 점을 반짝임으로 봅니다. 0이면 해상도에 맞춰 자동입니다. |
| 최대 파츠 수 | 32 · 8 ~ 64 | 부분 폴더의 최대 개수. 넘치는 작은 부분은 [작은 파츠] 폴더로 갑니다. 색이 많은 그림은 높이면 비슷한 색의 다른 부분이 덜 합쳐집니다. |
| 레이어 구성 | ||
| 채색을 파츠별로 나누기 | 켜짐 | 끄면 밑색 · 그림자 · 하이라이트를 부분 구분 없이 한 장씩 |
| 폴더 나누는 방식 | 파츠별 폴더 | 파츠별 폴더: [피부] [머리카락] … 폴더마다 밑색 → 1차 · 2차 그림자 → 하이라이트. 단계별 폴더: [밑색] [1차 그림자] [2차 그림자] [하이라이트] 폴더마다 파츠 레이어(클리핑 없이. 불투명한 그림은 합친 결과가 같음). 파츠별로 나눌 때만 고를 수 있습니다. |
| 그림자·하이라이트를 밑색에 클리핑 | 켜짐 | 그림자와 하이라이트가 밑색 바깥으로 나가지 않게 묶습니다. |
| 단색 배경 자동 분리 | 켜짐 | 배경 찾기를 켜고 끕니다. 꺼도 얼굴은 찾아 이름 · 캐릭터 폴더에 씁니다. |
| 누끼 모델 | 켜짐 | 앱 안에 넣은 애니 캐릭터 누끼 모델이 낸 캐릭터 확률에 기존 방식(배경 찾기 단계 + 신경망 보조)의 판정을 더해 캐릭터를 정하고, 나머지를 배경 층으로 둡니다(누끼 모델, 0.52). 모델이 캐릭터를 거의 찾지 못한 그림(사람 모양이 아닌 캐릭터 등)은 기존 방식의 판정을 그대로 씁니다(0.53). 0.54부터는 원래 모델과 미세 학습한 모델을 함께 돌려 두 확률의 가중 평균(0.6 · 0.4)을 모델 확률로 쓰고 더하기의 문턱을 0.55로 둡니다. 0.55는 효과(글로우 · 파티클 · 빛줄기)를 배경으로 세도록 더 학습한 판을 쓰고 두 확률을 0.5 · 0.5로 평균합니다. 이때 외곽 글로우와 배경 위 작은 조각 규칙은 쓰지 않습니다. 그림당 십수 초 더 걸리고, 처음 쓸 때 모델을 펼치는 데 몇 초가 더 듭니다. 끄면 0.50과 같은 방식입니다. 투명한 픽셀이 있는 그림에는 쓰지 않습니다. |
| 신경망 보조 | 켜짐 | 배경 찾기 끝에서, 캐릭터 쪽에 남은 색 영역 가운데 통계식 점수와 신경망 점수를 한 식으로 묶어 배경일 확률이 0.8을 넘는 영역만 배경으로 더 보냅니다(신경망 보조). 끄면 0.48과 같은 결과입니다. |
| 캐릭터 자리 배경 메꾸기 | 신경망 + 패치 | 캐릭터를 뺀 자리를 배경으로 추정해 채운 '배경 메꿈' 층을 '배경' 층 바로 위에 넣습니다(0.56, 배경 층 자체는 그대로). 신경망 + 패치: 앱 안의 배경 메꿈 신경망(big-lama, 인터넷 필요 없음)이 끊긴 구조(창틀 · 바닥 · 나무 · 무늬)를 이어 그린 추정에 원본 질감을 패치 맞춤으로 입히고 이음매를 막 보정합니다. 그림당 약 23~29초(800×800 ~ 2048×2048, 신경망 약 20초 포함; 처음 한 번 모델 준비 2초). 패치만: 신경망 없이 주변 패치만 이어 붙임(1~5초, 끊긴 구조는 잇지 못함). 끄면 0.55와 같습니다. |
| 러프 스케치 생성 · 러프 색상 | 켜짐 · #2F6FE0 | 러프 두 장을 만들지, 무슨 색으로 그릴지 |
그림을 재서 정하는 선 굵기
작가는 같은 펜으로 선을 그으므로, 선의 굵기를 세면 한 굵기에 몰립니다. 이 "펜 굵기"를 재면 그림 크기와 상관없이 선을 담을 창의 크기를 알 수 있습니다. 최대 선 굵기가 0(자동)이면 그림을 열 때 펜 굵기를 재서, 기본값으로는 선을 다 담지 못하는 그림일 때만 선 검출 창을 넓힙니다. 예를 들어 작은 그림에 굵은 선으로 그렸으면 창을 넓히고(800px에 12px 선: 찾은 선 1% → 92%), 보통 그림은 기본값을 그대로 씁니다.
고른 값과 잰 굵기는 설정 옆에 "자동 · 8 px (이 그림 13 px)"처럼 나오고, 슬라이더를 움직이면 그 값으로 바뀝니다. 나머지 설정도 그림에서 재서 정해 봤지만 결과가 나빠지거나 나아지지 않아, 여러 그림으로 맞춘 기본값을 씁니다. 계산식은 선화 검출에 있습니다.
큰 그림은 줄여서 나누기
기본은 꺼져 있고, 꺼진 동안 방식 · 크기 칸도 움직이지 않습니다. 켜면 긴 변이 줄일 크기(기본 1200px)보다 큰 그림을 줄여서 나눕니다. 켜거나 방식을 바꾸면 그 방식의 설명과 검증 결과를 보여 주고, 확인하고 실행을 누르면 바로 다시 나눕니다.
| 방식 | 하는 일 | 결과 |
|---|---|---|
| 전부 줄여서 나누기 | 모든 단계를 줄인 크기로 합니다. PSD도 그 크기입니다. | 결과는 원래 크기와 비슷하고 시간은 약 절반입니다. 눈가림 판정 114장에서 줄임이 나음 25 · 원래 크기가 나음 29로 차이가 없었습니다. |
| 배경 · 얼굴만 줄여서 찾기 | 배경 · 얼굴만 줄인 그림에서 찾아 원래 크기로 키워 쓰고, 층은 처리 해상도로 만듭니다. | 캐릭터를 더 잃는 그림이 많아 권하지 않습니다. |
기울어진 그림
기본 꺼짐입니다. 그림 전체가 크게(45° 넘게) 기울었거나 옆으로 누운 그림에서 켜면, 얼굴을 여러 각도(0 · ±30 · ±60 · ±90°)로 찾아 가장 얼굴다운 각도로 이름 · 캐릭터 폴더 · 배경 규칙을 맞춥니다. 고른 기울기는 결과 줄에 "기울기 N°"로 나옵니다.
- 똑바른 그림에 켜면 얼굴을 조금 덜 찾고 가짜 얼굴이 조금 늘어(정답 그림 82장: 실제 얼굴 29/35 → 26/35, 가짜 얼굴 15 → 17개) 기울지 않은 그림에는 끄는 편이 낫습니다.
- 45° 안팎은 켜도 비슷할 때가 많습니다.
- 돌려 저장해 네 모서리가 흰색 · 한 색 · 투명으로 채워진 그림(돌린 캔버스)은 켜지 않아도 알아봅니다. 채움의 곧은 변에서 기울기를 재고, 배경을 찾는 동안만 채움을 가까운 그림 내용으로 메웁니다.
예전 PSD의 층 이름 고치기
0.34까지 저장한 PSD에는 선 색 층 이름이 색트레스로 적혀 있습니다. 그 PSD를 그림처럼 창에 끌어다 놓거나 왼쪽 위 상자를 눌러 고르면(여러 개 한꺼번에 됩니다)
층 이름을 색 트레이스로 고친 PSD가 같은 파일 이름으로 바로 저장됩니다.
- 그림 · 층 순서 · 폴더 · 클리핑은 그대로이고, 파일은 브라우저 밖으로 나가지 않습니다.
- PSB, 16 · 32비트로 바꿔 저장한 파일도 됩니다. 이미 고친 파일이면 고칠 층 이름이 없다고 알려 줍니다.
5원리
Illustracy가 그림을 나누는 판단은 열 가지 생각 위에 서 있습니다. 하나하나는 그림을 그리는 사람이라면 이미 알고 있는 것들입니다.
작가가 층을 쌓는 순서를 그대로 따른다
셀 채색 작업 파일은 대체로 이런 순서로 쌓입니다.
| 위에서부터 | 층 | 하는 일 |
|---|---|---|
| 1 | 선화 | 맨 위의 선 |
| 2 | 빛 · 반짝임 | 밝게 더하는 효과 |
| 3 | 명암 | 부드러운 음영 |
| 4 | 하이라이트 | 밑색보다 밝은 면 |
| 5 | 그림자 | 밑색 위에 겹쳐 어둡게 |
| 6 | 밑색 | 부분마다 한 가지 색 |
| 7 | 배경 | 맨 아래 |
층마다 겹치는 방식이 다릅니다.
- 표준: 위의 색이 아래를 덮습니다(밑색, 하이라이트, 선화).
- 곱하기: 색 셀로판을 겹친 것처럼 아래를 어둡게 합니다(그림자, 명암).
- 스크린: 조명을 하나 더 켠 것처럼 아래를 밝게 합니다(빛, 반짝임, 림라이트, 반사광).
Illustracy는 결과 파일이 이 구성을 따르도록 나눕니다.
겹친 결과가 원본이 되도록 거꾸로 푼다
겹치는 방식은 모두 간단한 계산식입니다(수식). 그래서 "원래 그림의 색"과 "밑색 · 그림자 색"을 알면, 나머지 층에 무엇이 들어가야 원래 그림이 나오는지를 픽셀마다 거꾸로 풀 수 있습니다.
같은 그림을 만드는 층 구성은 무수히 많습니다. 그중에서 작가가 실제로 만들 법한 것을 고릅니다.
- 밑색은 부분마다 한 가지 색
- 그림자도 부분마다 한 가지 색(1차, 필요하면 2차)
- 그 한 가지 색으로 설명되지 않고 남는 차이만 명암 · 빛 층으로
마지막에 남는 차이까지 층에 담기 때문에, 나눈 결과를 겹치면 원본으로 돌아옵니다. 오차는 파일이 색을 0~255 정수로 저장하면서 생기는 반올림 정도뿐입니다.
선은 "가늘고 주변보다 어두운 것"이다
어두운 가는 구조를 지운 그림을 만들고(주변의 밝은 색으로 메움), 원래 그림과의 차이를 보면 선만 남습니다. 두꺼운 어두운 면(검은 옷)은 지워지지 않으므로 선으로 잡히지 않습니다. 진하고, 살짝 흐리면 크게 약해지는 선은 선명한 선으로 따로 표시해 배경을 가를 때 씁니다.
선이 가린 색은 주변에서 짐작한다
선 아래에 칠해져 있었을 색은 선 바로 바깥 색을 안쪽으로 한 겹씩 채워 짐작합니다(양파 껍질 방식 인페인팅). 아래 색을 알면 "선 색이 몇 %의 진하기로 덮였는지"를 계산할 수 있고, 선의 흐린 가장자리(안티에일리어싱)까지 투명도로 표현됩니다.
배경은 일곱 가지 단서로 가른다
0.51부터 기본 설정에서는 이 단서들 대신 누끼 모델이 캐릭터를 한 번에 골라냅니다. 수많은 애니 캐릭터 그림과 그 누끼(캐릭터만 딴 그림)로 미리 학습한 신경망이라, 윤곽선 없이 밝게 처리한 팔이나 테두리에 닿은 머리카락처럼 아래 단서로는 배경과 구별되지 않던 부분도 몸의 모양으로 알아봅니다(누끼 모델). 0.52부터는 이 일곱 단서의 판정도 그대로 구해 모델의 확률에 더합니다(둘이 엇갈리는 픽셀은 모델의 확신으로 정함). 누끼 모델을 끄거나 쓸 수 없을 때는 일곱 단서만으로 나눕니다.
- 테두리와 이어짐: 배경은 그림 테두리에 닿아 있고, 캐릭터의 윤곽선을 넘지 않고 이어집니다.
- 선의 많고 적음: 캐릭터와 소품은 선으로 그리고, 배경은 선 없이 칠하는 경우가 많습니다.
- 또렷함: 배경은 초점이 나간 것처럼 흐리게 그리는 경우가 많아, 진하고 또렷한 선이 드뭅니다.
- 색의 차이: 배경까지 선으로 그린 그림은, 그림마다 배경의 색과 캐릭터의 색을 배워서 가릅니다.
- 선명한 색 경계: 선 없이 부드럽게 칠한 팔 · 손 · 소매도 초점이 맞은 물체라 둘레의 색이 또렷하게 바뀝니다. 선이 적어 배경에 딸려 들어간 조각이 이 경계로 떨어져 있고, 캐릭터에 붙어 있고, 색이 캐릭터 쪽이면 캐릭터로 되돌립니다.
- 얼굴: 애니풍 얼굴은 어두운 둥근 눈 두 개가 나란히 있고 그 아래가 밝고 고른 피부입니다. 얼굴을 찾으면 머리와 몸이 어디쯤 있는지 압니다. 머리 · 몸 자리 밖에서 색이 분명히 배경 쪽이고 이미 찾은 배경과 선 없이 이어진 곳만 배경에 더하고, 반대로 또렷한 얼굴 자리가 배경이 되어 있으면 캐릭터가 통째로 배경에 삼켜진 것이라 그 머리 · 몸 자리의 배경 조각을 캐릭터로 되돌립니다.
- 선으로 둘러싸임: 캐릭터는 윤곽선 · 옷 주름 · 머리카락 결에 사방이 둘러싸여 있어, 안에 선이 없는 흰 옷 · 치마 · 단색 머리도 어느 쪽으로 가든 곧 선에 닿습니다. 배경은 적어도 몇 방향으로는 선 없이 그림 밖까지 트여 있습니다. 선이 드물어도 거의 모든 방향이 선으로 막힌 곳은 배경으로 보지 않습니다. 다만 흰 · 단색 배경에서 팔과 몸 사이로 보이는 틈은 배경과 똑같은 색이고 둘레가 선과 배경뿐이라, 캐릭터의 흰 옷(둘레에 그림자 · 음영이 닿음)과 갈라 배경으로 보냅니다.
화면 아래 테두리는 캐릭터가 잘려 있는 경우(상반신 그림)가 많아서 배경 찾기의 출발점으로 쓰지 않습니다.
0.49부터는 이 단서들로 가른 뒤 캐릭터 쪽에 남은 배경을, 영역마다 색 · 위치 · 결을 보는 통계식과 줄인 그림 전체를 보는 작은 신경망으로 한 번 더 가려 지웁니다(신경망 보조). 0.50부터는 두 판정을 따로 자르지 않고 두 점수를 한 식으로 묶어, 한쪽이 아주 확실하면 다른 쪽이 조금 덜 확실해도 지우고 반대도 마찬가지입니다.
재질 경계에는 선이 있고, 그림자 경계에는 선이 없다
셀 채색에서 머리카락과 피부 사이에는 선을 긋지만, 머리카락의 밝은 면과 그림자 사이에는 선을 긋지 않습니다. 그래서 선 없이 맞닿아 있고 같은 색 계열이면 같은 재질의 명암으로, 선으로 막혀 있으면 다른 재질로 봅니다.
붓으로 칠한 그림에서는 붓 자국 · 머리카락 결이 선으로 잡히기도 합니다. 이런 결은 한 색 위에 그은 것이라 선 양쪽의 색이 같습니다. 그림의 선 대부분이 이런 결이면 결은 재질 경계로 보지 않습니다. 선화 그림은 옅은 피부와 옅은 머리카락처럼 색이 거의 같은 재질도 선으로 가르므로, 선을 그대로 경계로 봅니다.
같은 재질 안에서 가장 넓은 색이 밑색이다
한 재질 안의 색을 다시 몇 가지 톤으로 나누면, 가장 넓게 칠한 톤이 밑색입니다. 그보다 확실히 어두운 톤은 그림자, 확실히 밝은 톤은 하이라이트입니다. 그림자 톤이 밑색보다 채널별로 몇 배 어두운지가 곧 그림자 층의 곱하기 색입니다.
밝아진 곳은 위치와 모양으로 종류를 가린다
밑색 · 그림자로 설명되지 않고 더 밝아진 부분은 이렇게 나눕니다.
- 떨어져 있는 작고 아주 밝은 점 → 반짝임
- 캐릭터 실루엣 가장자리에만 몰린 빛 → 림라이트
- 그림자 안에서 다시 밝아진 부분 → 반사광
- 나머지 넓게 퍼진 밝아짐 → 빛
러프는 완성본에서 거꾸로 짐작한다
러프는 원래 그림에 남아 있지 않으므로 복원할 수 없습니다. 대신 "작가가 어떤 러프를 그렸기에 이 선화가 나왔을까"를 거꾸로 짐작해 밑그림 두 장을 그립니다. 작가는 러프 1을 먼저 급하게 긋고, 러프 1을 대고 러프 2를 다듬어 긋고, 러프 2를 대고 선화를 긋습니다. 거꾸로 짐작할 때도 이 순서가 맞도록 짓습니다. 러프 2에는 선화가 대고 그을 선이 거의 다 들어 있고, 러프 1은 그 가운데 큰 덩어리 · 긴 선 · 눈 · 입 같은 표시만 더 거칠게 줄인 것입니다.
무엇인지 알아보는 것은 큰 덩어리(파츠 지도)와 찾은 얼굴(짜임선)뿐입니다. 눈 · 손 · 소품처럼 알아보지 않는 것은 기호로 바꾸지 않고 선화를 따라 긋습니다.
- 획(러프 1): 꺾이는 곳에서 새로 긋고, 그 사이는 완만한 곡선으로 맞추고, 긴 곡선은 2~3획으로 나눠 조금씩 겹쳐 긋습니다. 획마다 1~3번 조금 어긋나게 긋고, 시작 · 끝은 가늘고 옅게, 가운데는 진하게 그립니다.
- G펜 획(러프 2, 0.57부터): 정말 꺾이는 곳(약 60° 넘게)에서만 펜을 떼고 완만한 곡선은 한 획으로 긋고, 그림 프로그램의 손떨림 보정처럼 획을 매끈하게 폅니다. 굵기는 그 자리 원래 선의 굵기를 따르고, 들어갈 때 짧게 · 빠질 때 길게 가늘어지며, 잉크 진하기는 한결같습니다.
- 펜 굵기(러프 2): 작가는 해상도와 상관없이 판형에 맞춘 같은 펜으로 그리므로, 그림마다 선화의 평균 굵기(잉크 넓이 ÷ 중심선 길이)를 재어 길이 문턱 · 펜 반지름을 맞춥니다.
- 필압 곡선(러프 2, 0.59부터): 획마다 들어간 뒤 올라가 가운데쯤(30~60% 자리) 가장 세고 천천히 풀리는 필압을 주고, 꺾이는 곳에서 조금 더 누릅니다. 굵기는 필압을 50%만, 잉크 진하기는 25%만 따라갑니다.
- 선의 중요도(러프 2, 0.59부터): 둘레보다 뚜렷이 진한 선 · 굵은 선 · 긴 선 · 얼굴 자리의 선은 진하게, 약한 선은 옅게(가장 옅은 선도 70%) 긋습니다. 긴 획 4개 중 1개쯤은 일부를 옆으로 조금 비껴 한 번 더 덧긋습니다.
- 눈 · 입 상자(러프 2, 0.59e부터): 얼굴 자리 안 눈 · 입 상자에서는 둘레와 견주지 않고 선화를 그대로 선으로 삼고, 꽉 칠한 덩어리도 가운데 한 획으로 긋습니다. 어두운 홍채 위의 눈 · 입이 빠지거나 고리만 남던 것을 막습니다.
- 결: 픽셀 중심과 획 사이 거리로 덮인 정도를 계산해 그려 가장자리에 계단이 없습니다. 러프 1은 2.5px · 1.1px 두 크기의 연필 종이 결을 주고, 러프 2(G펜)는 결이 없습니다.
기본값이 감당하지 못할 때만 그림에 맞춘다
작가는 같은 펜으로 선을 그으므로, 선의 굵기를 세면 한 굵기에 몰립니다. 이 "펜 굵기"를 재면 그림 크기와 상관없이 선을 담을 창의 크기를 알 수 있습니다. 다만 다른 단계(배경 찾기가 쓰는 선 밀도 등)는 기본 창에 맞춰져 있으므로, 잰 값이 기본값을 분명히 넘을 때만 바꿉니다.
6작동 방식
그림을 넣으면 처리 해상도(기본 긴 변 2048px)로 줄이고, 계산은 브라우저의 Web Worker(화면과 따로 도는 계산 스레드)에서 합니다. 워커를 쓸 수 없는 환경에서는 화면 쪽에서 그대로 계산합니다.
세 단계로 나눈 흐름
- 처리 해상도로 줄이기브라우저의 고품질 축소. 최대 선 굵기가 자동이면 여기서 펜 굵기를 잽니다.
- 선화 검출클로징으로 가는 어두운 구조를 지운 그림과의 차이(블랙 탑햇), 히스테리시스, 교차점 채우기, 선명한 선 표시
- 선 아래 색 복원선과 가장자리 1px을 바깥 겹부터 한 겹씩 채우는 인페인팅
- 선 알파 · 색 트레이스기본 선 색으로 알파를 풀고, 맞지 않는 곳은 실제 선 색을 색 트레이스로
- 배경 찾기단색 · 그라데이션 → 장면 1단계 → 잘린 부분 → 2단계 → 여백 → 섬 되돌리기 → 색 모델 → 딸려 들어간 부분 → 삼켜진 캐릭터 → 얼굴 기준 넓히기 → 틈 → 네모난 배경 물건 → 신경망 보조
- 얼굴 찾기어두운 둥근 눈 두 개 + 아래의 밝고 고른 피부, 평균 얼굴 무늬. 배경을 찾지 않아도 이름 · 폴더용으로 찾음
- 보정 반영배경으로 보내기 · 캐릭터로 되돌리기 표시를 자동 판정보다 먼저
- 배경 위 조각 · 배경 속 선 정리떠 있는 입자는 배경 효과로, 배경 그림의 선은 배경으로
- 영역 → 재질 → 톤k-평균 색 군집, 인접 그래프로 재질 묶기, 재질별 톤
- 밑색 · 그림자 · 하이라이트 · 파츠 정리밑색, 1차 · 2차 그림자 곱하기 색, 이름 붙이기, 캐릭터 나누기
- 픽셀별 역산남은 어두워짐은 그라데이션 · 명암으로, 밝아짐은 반짝임 · 림라이트 · 반사광 · 빛으로
- 캐릭터 자리 배경 메꾸기캐릭터를 뺀 자리를 신경망 + 패치 맞춤으로 추정해 '배경 메꿈' 층으로(0.56)
- 선화 층 · 재현 검증 · 레이어 트리 · 러프저장될 8비트 값 그대로 다시 겹쳐 PSNR을 재고, 트리로 묶고, 러프 두 장을 그림
선과 선 아래 색
밝기 그림에 클로징(최대 필터 뒤 최소 필터)을 하면 선 굵기보다 가는 어두운 구조가 주변 밝은 색으로 메워집니다. 클로징 − 원본(블랙 탑햇)이 선의 깊이입니다. 깊이가 큰 픽셀에서 시작해 조금 약한 픽셀까지 이어 붙이고(히스테리시스), 너무 작은 조각은 버립니다. 선이 모이는 교차점처럼 클로징 창보다 넓어진 어두운 덩어리는 선에서 이어서 채우되, 선 굵기를 넘어 계속되는 어두운 면(검은 옷)은 채우지 않습니다.
선과 그 가장자리 1px을 "모르는 픽셀"로 두고, 바깥쪽부터 한 겹씩 이웃한 아는 픽셀들의 평균으로 채웁니다. 그다음 선이 거의 완전히 덮은 픽셀들의 색 중앙값을 기본 선 색으로 정하고, 픽셀마다 "원본 = 선 알파 × 선 색 + (1 − 선 알파) × 아래 색"을 풀어 알파를 구합니다. 기본 선 색으로 원본이 맞지 않는 곳(빛 받은 선, 색 선)은 그 자리의 실제 선 색을 따로 구해 색 트레이스 층에 넣습니다.
배경 찾기
누끼 모델(0.51 ~ 0.55, 기본): 그림(처리 해상도)을 긴 변 1024px로 줄여 1024×1024 칸 가운데에 놓고 모델에 넣으면, 픽셀마다 캐릭터일 확률 p(0~1)가 나옵니다. 이를 원래 크기로 되돌리고, 0.52부터는 아래 단계를 그대로 돌려 얻은 판정 c(캐릭터 1 · 배경 0)를 더해 p + 0.4·(c − 0.5) ≥ 0.5인 픽셀을 캐릭터로 둡니다. 두 방법이 같은 말을 하면 그대로 따르고, 엇갈리면 모델 확률이 0.3(기존 방식이 캐릭터) 또는 0.7(기존 방식이 배경)을 넘는지로 정합니다. 0.53부터는 모델이 캐릭터라 한 픽셀(확률 0.5 이상)이 그림의 1% 미만인데 기존 방식이 캐릭터라 한 픽셀이 5% 이상이면(모델이 캐릭터를 놓친 그림), 그 그림은 더하기 대신 기존 방식의 판정을 그대로 씁니다. 0.54부터는 모델 확률 자체를 원래 모델과 미세 학습한 모델(같은 신경망을 합성 그림 290장과 픽시브 AI 생성 그림 292장으로 12 에포크 더 학습한 것)의 가중 평균(원래 0.6 · 더 학습한 판 0.4)으로 쓰고, 더하기의 문턱을 0.5에서 0.55로 올립니다. 0.55는 더 학습한 판을 효과(글로우 · 파티클 · 빛줄기)를 배경으로 세도록 다시 학습한 판(0.54의 판에서 합성 290장 · 효과 합성 300장 · 픽시브 AI 생성 그림 292장으로 6 에포크 더 학습한 여섯 에포크의 평균)으로 바꾸고 두 확률을 같은 무게(0.5 · 0.5)로 평균합니다. 이 결과가 그대로 배경 층이 되며, 외곽 글로우 · 배경 위 작은 조각 규칙은 거치지 않고 보정 칠하기는 적용됩니다. 모델을 쓸 수 없는 브라우저이거나 설정을 끄면 아래 단계로만 나눕니다.
캐릭터 자리 배경 메꾸기(0.56, 기본 "신경망 + 패치"): 캐릭터를 떼어 낸 '배경' 층은 캐릭터 자리가 투명하게 비어 있습니다. 그 자리와 둘레의 좁은 띠(긴 변의 1/160, 3~12px; 가장자리에 남는 윤곽선 · 섞인 색 때문)를 배경으로 추정해 채운 '배경 메꿈' 층을 '배경' 층 바로 위(글로우 · 배경 효과 아래)에 넣습니다. 배경 층 자체는 그대로입니다. 이 단계의 그림에는 캐릭터가 이미 빠져 있으므로 사진 편집기의 생성 채우기처럼 무엇이든 만들 필요가 없고 배경만 이어 그리면 됩니다. 그래서 ① 구멍을 비운 그림과 마스크를 긴 변 512로 줄여 앱 안의 배경 메꿈 신경망 big-lama(푸리에 합성곱 ResNet 18블록, 가중치 5,090만 개, 풍경 사진 Places로 학습, Apache-2.0)에 넣어 끊긴 구조(창틀 · 바닥 널 · 나무 · 무늬)를 구멍 건너로 이어 그린 추정 G를 얻고(전해상도로 올림), ② 전해상도에서 구멍의 7×7 패치마다 아는 배경에서 가장 비슷한 패치를 찾아(패치 맞춤, PatchMatch) 투표한 뒤 대응이 좋은 곳은 원본 질감, 나쁜 곳은 G를 쓰며, ③ 구멍 둘레 링에서 채움이 예측한 값과 실제 값의 차이를 경계값으로 조화 막을 풀어 더해 이음매의 색 · 밝기 단차를 없앱니다. 신경망은 브라우저 안 ONNX 런타임(WASM)에서 돌아 인터넷이 필요 없습니다. 배경만 다시 그린 합성 정답 177장과의 차이(MAE, 0~255)는 신경망 + 패치 2.82(장면 2.9 · 보케 9.0 · 줄무늬 0.4), 신경망만 6.08, 패치만 3.94(장면 18.3; 흰색으로 두면 84.1)이고, 처음 보는 픽시브 AI 생성 그림 120장의 자연스러움 채점(채점자 8명, 0~100점)은 신경망 + 패치 59.2 · 신경망만 60.2 · 패치만 44.7입니다. 가려진 물건의 뜻은 만들지 못합니다(한계).
차례로 여러 방법을 쓰고, 찾은 배경을 합칩니다. 앞 단계가 찾은 배경을 뒤 단계가 빼는 일은 정해진 되돌리기 단계에서만 일어납니다.
- 단색 · 그라데이션 배경: 테두리에서 가장 흔한 색에서 출발해 선을 넘지 않고 비슷한 색으로 퍼집니다. 위 · 왼쪽 · 오른쪽 테두리에서 먼저 퍼지고, 아래 테두리에서만 닿는 곳은 거의 한 색일 때만 배경으로 둡니다. 벽과 색이 다른 바닥(선으로 그린 방)은 윗변이 곧은 띠로 따로 찾습니다. 밝은 단색 배경은 윤곽선이 2px(긴 변 1200px 기준) 이하로 끊긴 틈으로는 넘어가지 않습니다.
- 장면 배경 1단계: 선의 밀도가 낮은 곳 중 위 · 왼쪽 · 오른쪽 테두리와 이어진 곳. 다만 선으로 둘러싸인 곳(16방향 중 15방향 이상이 긴 변의 25% 안에서 선에 막힌 곳)은 선이 드물어도 뺍니다. 어두운 곳으로 색이 확 바뀌는 걸음은 건너지 않아, 흐린 장면 배경이 검은 다리 · 옷 안으로 번지지 않게 합니다.
- 잘린 캐릭터 부분 가려내기: 테두리를 따라 걸으며, 선명한 윤곽선을 사이에 두고 배경 조각들 사이에 끼어 있고 양옆과 색이 확연히 다른 조각은 화면에서 잘린 캐릭터 부분(모자, 소매)으로 보고 되돌립니다.
- 장면 배경 2단계: 선명한 선은 없고 흐린 자국만 빽빽한 곳(흐리게 그린 선반, 글씨, 무늬)으로 넓힙니다.
- 여백 · 섬 되돌리기: 캐릭터 둘레의 여백을 선을 넘지 않고 색이 매끄럽게 이어지는 곳까지 넓히고, 남은 넓이가 그림의 2~90%일 때만 장면 배경으로 씁니다. 단색 배경을 거쳐서만 들어간 장면 배경 덩어리(섬)가 캐릭터 쪽 큰 덩어리와 이어져 있거나 얼굴을 품으면 캐릭터로 되돌립니다.
- 색 모델: 배경도 선으로 그린 그림(불꽃놀이, 포장마차, 그래피티)을 위해, 작은 색 영역마다 "지금까지 찾은 배경"과 "선명한 선이 촘촘한 캐릭터 핵심"의 색 분포를 배워 가릅니다(GrabCut 방식의 그래프 컷). 더하기만 하고, 선으로 둘러싸인 영역은 더하지 않습니다.
- 딸려 들어간 캐릭터 부분 되돌리기: 배경을 선명한 색 경계와 선에서 잘라, 테두리에 닿지 않고 둘레의 80% 이상이 캐릭터와 맞닿고 색이 캐릭터에 가까운 조각을 되돌립니다(선 없이 칠한 팔 · 손 · 소매 · 날개). 어두운 배경 위의 검은 머리카락 · 치마 · 다리는 더 옅은 색 경계로도 잘라 캐릭터에 붙은 어두운 조각을 되풀이해 되돌립니다(다리 → 치마 → 몸).
- 삼켜진 캐릭터 되돌리기: 점수가 높은 얼굴의 얼굴 자리나 정수리가 4분의 1 넘게 배경이면, 윤곽선이 보이지 않는 캐릭터를 장면 배경이 통째로 삼킨 것입니다. 그 얼굴의 머리 · 몸 자리에 절반 이상 들고 색이 배경 쪽에서 드문 조각을 되돌립니다.
- 얼굴 기준으로 넓히기: 얼굴마다 머리와 몸이 있을 자리를 "캐릭터일 확률"로 두고 그래프 컷을 다시 해, 색이 분명히 배경 쪽이고 머리 · 몸 자리 밖이며 이미 찾은 배경과 선 없이 이어진 곳만 더합니다. 배경이 거의 한 색이면 하지 않습니다.
- 캐릭터 사이로 보이는 배경(틈): 찾은 배경이 거의 한 색이면, 캐릭터 쪽에 남은 칠 중 배경과 거의 같은 색이고 둘레가 선 · 배경뿐인 작은 조각을 배경으로 보냅니다.
- 선으로 그린 네모난 배경 물건: 캐릭터 쪽에 남은, 선으로 둘러싸인 축에 나란한 직사각형 조각(창문 유리 · 선반 · 책 · 액자)이 둘레의 절반 이상 배경에 둘러싸여 있고 얼굴의 머리 · 몸 자리 밖이면 배경으로 보냅니다.
- 신경망 보조 지우기(0.49, 0.50에서 강화, 설정 신경망 보조): 위 단계가 모두 끝난 뒤 캐릭터 쪽에 남은 색 영역 가운데 그림의 0.2% 이상인 것을 두 판정에 묻습니다. 영역 특징 45개로 매긴 통계식 점수와 처음부터 짠 작은 합성곱 신경망이 낸 캐릭터 점수의 영역 평균을 한 로지스틱 식으로 묶어, 배경일 확률이 0.8을 넘을 때만 배경으로 보냅니다. 선 픽셀은 그대로 두고, 캐릭터로 되돌리지는 않습니다(신경망 보조).
그림 가장자리를 가는 테두리(액자)가 두르고 있거나, 그림을 기울여 저장해 네 모서리가 한 색 · 투명으로 채워진 그림(돌린 캔버스)은 배경을 찾는 동안만 그 테두리 · 채움을 안쪽 색으로 메워 두고 찾습니다. 그다음 사용자가 칠한 보정을 자동 판정보다 우선해서 반영합니다.
배경에 둘러싸인 작은 조각(입자, 빛줄기 조각)은 캐릭터 파츠가 아니라 배경 + 배경 효과(스크린) 두 층으로 나누고, 배경에 흡수된 흐린 자국 · 캐릭터에서 멀리 떨어진 배경 그림의 선은 선화에서 빼서 배경 그림에 남깁니다.
얼굴 찾기
학습한 모델 없이 손으로 정한 규칙과 평균 무늬로 찾습니다. 그림을 긴 변 800px로 맞춘 Lab 밝기에서 잽니다.
- 눈 후보: 여러 크기로 흐린 밝기에서 헤세 행렬식이 큰 둥글고 어두운 점을 찾습니다(가운데가 둘레보다 어두운 것만).
- 짝: 거리 · 크기 · 기울기가 맞는 두 후보를 두 눈으로 봅니다.
- 얼굴 틀: 두 눈 가운데를 원점, 눈 사이 거리 𝑑를 단위로 눈 칸 · 속눈썹 띠 · 콧등 · 볼 · 눈 속 반짝임 자리를 잽니다.
- 평균 무늬: 시험 그림 24장의 얼굴 31개를 맞춰 만든 평균 눈 무늬 · 얼굴 무늬와의 상관을 잽니다.
- 점수: 눈이 피부보다 어두움 · 피부가 밝음 · 콧등이 고름 · 볼의 색이 같음 · 두 홍채 색이 같음 · 속눈썹이 진함 · 눈동자가 어두움 · 많이 기울지 않음 · 얼굴 무늬 · 눈 무늬 · 눈 속 반짝임을 더한 15점 만점에서 11점 이상을 고릅니다(얼굴 점수).
- 얼굴다운 자리: 머리가 거의 다 그림 안에 있고, 얼굴 자체는 이미 찾은 배경 위에 있지 않은 것만 남깁니다.
- 이름 · 폴더용 얼굴: 가짜를 걸러 내는 점수로 따로 고르고, 좌우로 뒤집은 그림에서도 찾히는 얼굴만 씁니다(좌우 합의). 0.48부터는 두 눈 아래 볼까지 살색이 한 덩어리로 이어지는지와 피부의 붉은 · 노란 기를 가산점으로 더해 고릅니다(얼굴 점수).
영역 · 재질 · 파츠
- 영역: 선 아래 색을 복원한 그림을 Lab 색공간에서 k-평균으로 몇 가지 색(기본 18)으로 나누고, 같은 색끼리 이어진 덩어리를 영역으로 삼습니다. 너무 작거나 가느다란 영역(가장자리 번짐)은 버리고 가까운 영역으로 채웁니다.
- 재질: 맞닿은 영역 쌍마다 경계가 선으로 막힌 길이와 열린 길이를 세어 인접 그래프를 만들고, 경계가 대부분 열려 있고 색이 같은 재질의 명암 관계이면 한 재질로 묶습니다.
- 톤과 밑색: 재질마다 다시 k-평균으로 톤(최대 6개)을 나눕니다. 가장 넓은 톤(넓이가 비슷하면 더 밝은 쪽)의 밝은 쪽 평균이 밑색입니다. 선으로 나뉜 같은 재질(앞머리 / 뒷머리)은 밑색을 서로 맞추고, 흰색 · 회색 재질 안의 진한 색 톤은 다른 재질로 떼어 냅니다.
- 파츠 정리: 거의 같은 밑색끼리 한 파츠로 묶고, 선 건너편의 더 어두운 면이 밝은 파츠의 그림자로 그럴듯하면 합치고(흰 머리카락 옆 연보라 가닥), 작은 조각은 색이 비슷한 이웃으로 보냅니다. 파츠가 최대 파츠 수를 넘으면 작은 것부터 비슷한 색의 이웃에 합치고, 비슷한 이웃이 없으면 [작은 파츠] 폴더로 보냅니다. 그다음 이름을 붙이고 떨어진 머리카락 조각을 뗍니다.
그림자 · 하이라이트 · 역산
- 밑색보다 확실히 어두운 톤은 그림자입니다. 그림자 톤들을 밝기 순으로 늘어놓고 틈이 크게 벌어진 곳에서 1차 / 2차로 나누고, 단계마다 곱하기 색을 하나씩 정합니다.
- 밑색보다 확실히 밝은 톤은 하이라이트(표준 층)이고, 거의 흰색이며 훨씬 밝은 작은 조각은 반짝임 후보입니다.
- 픽셀마다 밑색 × 1차 × 2차 → 하이라이트까지 칠한 색과 선 아래 복원색을 비교합니다. 더 어두우면 남은 어두워짐을 넓게 깔린 부분(그라데이션)과 나머지(명암)로, 더 밝으면 남은 밝아짐을 반짝임 → 림라이트 → 가는 반짝임 → 반사광 → 빛 순서로 떼어 냅니다.
- 내용이 거의 없는 층(예: 셀 채색 그림의 그라데이션)은 만들지 않고 그 몫은 명암 · 빛에 남깁니다.
검증 · 레이어 트리 · 저장
선화 · 색 트레이스 층을 만든 뒤, 저장될 8비트 값 그대로 모든 층을 다시 겹쳐 원본과 비교합니다(재현 PSNR, 화면 맨 위 줄에 표시).
층들을 작업 파일 구성의 트리로 묶고, 러프 두 장을 그려 맨 위 [러프] 폴더에 숨겨 둡니다.
미리보기는 브라우저 캔버스의 혼합 모드(multiply, screen)로 층을 겹치고, 클리핑은 포토샵과 같은 방식으로 흉내 냅니다.
PSD는 외부 라이브러리 없이 직접 씁니다.
단계별 주요 값
| 단계 | 주요 값 |
|---|---|
| 처리 해상도 | 긴 변 2048px(설정), 크기 배율 |
| 선 검출 창 | px, 자동이면 잰 펜 굵기로 최대 16px까지 |
| 선 감도 → 문턱 | , , 조각 px 미만은 버림 |
| 선명한 선 | 1.5px로 흐려 깊이의 25% 이상이 사라지는 선 |
| 장면 배경 넓이 | 그림의 2~90%일 때만 씀 |
| 선으로 둘러싸임 | 16방향 중 15방향 이상이 긴 변의 25% 안에서 선에 막힘 |
| 얼굴 | 긴 변 800px에서 찾음, 점수 11 이상(15점 만점), 두 눈 사이 16px 미만은 못 찾음 |
| 색 군집 | k-평균 18색(설정), 표본 최대 5만, 재질별 톤 최대 6개 |
| 파츠 | 최대 32개(설정), 0.01% 미만 조각은 가장 길게 맞닿은 파츠로 |
| 층 만들기 | 8/255 넘는 알파가 24픽셀 미만인 층은 만들지 않음 |
| 난수 | 고정 씨앗 mulberry32(본 계산 12345, 영역 그래프 777, 러프 1 · 2는 20261011 · 20261012) |
풀이 — 왜: 선 굵기 · 흐림 반지름 같은 길이 문턱은 긴 변 1000px 그림에 맞춰 정했으므로, 다른 크기의 그림에서는 같은 비율로 늘이거나 줄여야 같은 모양을 잽니다. 원리: 길이는 그림 크기에 정비례하므로 기준값에 𝑠를 곱하고, 넓이 문턱에는 을 곱합니다. 참고: 이 프로그램에서 정한 규칙
풀이 — 왜: 선은 "주변보다 어둡고 펜 굵기보다 가는 것"입니다. 밝기의 골짜기 중 창보다 좁은 것만 골라야 넓은 어두운 칠(검은 옷)과 가를 수 있습니다. 원리: 팽창 뒤 침식(클로징)은 창 𝑤보다 좁은 어두운 골짜기를 둘레의 밝은 값으로 메우고 넓은 면은 그대로 둡니다. 원본과의 차 𝑑(블랙 탑햇)가 선의 깊이이고, 주변 밝기로 나눈 상대 깊이와 0.3으로 나눈 절대 깊이 중 작은 값을 써서 둘 다 깊어야 강한 선으로 봅니다. 참고: [R15] Soille 2003 · [R14] Gonzalez · Woods 2018
풀이 — 왜: 문턱 하나로 자르면 진한 선 사이의 옅은 구간에서 선이 끊기고, 낮추면 잡음이 함께 잡힙니다. 원리: 센 문턱을 넘는 확실한 선에서 출발해 약한 문턱을 넘는 이웃으로만 이어 붙이는 히스테리시스(캐니 경계 검출과 같은 방법)입니다. 선 감도 𝜂가 높을수록 두 문턱이 함께 내려가는 1차식이고, 0.58 · 0.34 · 0.45와 작은 조각 크기는 시험 그림으로 맞췄습니다. 참고: [R18] Canny 1986 · 이 프로그램의 실험(README 7.1)
풀이 — 왜: 러프는 사람이 그은 듯 흔들려야 하지만, 같은 그림에서는 늘 같은 러프가 나와야 결과를 비교 · 재현할 수 있습니다. 크기 비율은 선 굵기와 모양 문턱이 작은 그림에서 지나치게 가늘어지거나 커지지 않게 나눠 둡니다. 원리: mulberry32는 32비트 상태 하나를 정해진 상수만큼 더하고 섞는 의사 난수 생성기라, 씨앗이 같으면 같은 수열이 나옵니다. 러프 전용 씨앗을 써서 다른 층의 난수 사용과 상관없이 러프가 정해집니다. 는 선 굵기를 작은 그림에서도 1배 아래로 줄이지 않고, 는 길이 문턱을 작은 그림에서 절반까지만 줄입니다. 𝑢는 균등 난수 , 은 입니다. 참고: [R48] Ettinger 2017 · 이 프로그램에서 정한 규칙
7알고리즘과 수식
판단에 쓰는 핵심 식을 모았습니다. 모든 식과 상수는 README 4절의 네 문서(docs/)에 빠짐없이 적혀 있습니다. 식마다 붙인 풀이는 그 식을 왜 쓰는지와 원리를 적고, 참고의 [R번호]는 14절 참고 문헌의 번호(README 13절과 같음)입니다.
표기
- 픽셀 값은 0~1로 둔 sRGB 값입니다(8비트 값을 255로 나눔). 원본을 , 알파를 , 선 아래 복원색을 , 채널을 로 씁니다.
- 밝기는 , 은 그림 크기에 따른 배율입니다.
- , ()입니다.
- 설정의 백분율 슬라이더(선 감도 , 그림자 판정 기준 )는 값/100으로 0~1이 됩니다.
풀이 — 왜: 채널마다 같은 식을 되풀이해 쓰므로 첨자 𝑐 하나로 묶어 씁니다. 원리: sRGB 파일의 8비트 값을 255로 나눈 0~1 값이 기준이라, 모든 식이 그림 파일에 저장되는 값과 그대로 맞닿습니다. 참고: [R6] IEC 1999
풀이 — 왜: 선을 찾거나 어느 색이 더 어두운지 견줄 때는 세 채널을 밝기 하나로 줄여야 합니다. 투명한 픽셀은 흰 종이 위에 얹었을 때 보이는 색으로 바꿔야 투명한 곳이 검은 선으로 잡히지 않습니다. 원리: 눈은 초록에 가장 민감하고 파랑에 가장 둔하므로 텔레비전 휘도(루마) 규격의 가중치 0.299 · 0.587 · 0.114로 더합니다(합이 1이라 흰색이 1). 흰 바탕 합성은 표준 합성식 을 채널마다 쓴 것입니다. 참고: [R9] ITU-R BT.601 · [R1] Porter · Duff 1984
풀이 — 왜: 계산한 알파 · 비율이 0~1 밖으로 나가면 저장할 수 없고 뜻도 없으므로 자릅니다. 문턱을 딱 자르면 문턱 근처에서 결과가 튀므로, 0에서 1로 부드럽게 넘어가는 가중치도 필요합니다. 원리: smoothstep은 양 끝의 기울기가 0인 3차 에르미트 다항식 입니다. 𝑡 = 0에서 0, 𝑡 = 1에서 1이고 가운데 기울기가 1.5라, 두 문턱 사이를 이 곡선으로 이으면 가중치가 갑자기 바뀌지 않습니다. 참고: [R47] Ebert et al. 2003
풀이 — 왜: 화면 슬라이더는 0~100 정수이지만, 식에서는 0~1 비율이어야 문턱 식이 단순해집니다. 원리: 100으로 나눠 단위 없는 비율로 바꾸고, 각 문턱은 이 비율의 1차식으로 움직입니다(예: 4.3의 , 4.7의 그림자 문턱). 참고: 이 프로그램에서 정한 규칙
색공간과 색 차이
sRGB를 선형화한 뒤 XYZ(D65, 기준 백색 )를 거쳐 Lab으로 바꿉니다. 선형화는 8비트 값 256칸 표로 미리 계산해 둡니다.
색 차이 는 CIE76(Lab 공간의 유클리드 거리)입니다. 약 2.3이 사람이 겨우 구분하는 차이이고, 파츠를 합치는 기준은 2.5입니다.
풀이 — 왜: sRGB 값은 화면 감마가 씌워진 값이라 빛의 양에 비례하지 않습니다. 색 차를 사람 지각에 맞게 재려면 먼저 빛의 양(선형 값)으로 되돌린 뒤 XYZ를 거쳐 Lab으로 가야 합니다. 원리: sRGB 규격의 전달 함수를 거꾸로 씁니다. 0.04045 이하는 직선(12.92로 나눔), 그 위는 2.4제곱 곡선입니다. Lab의 은 의 세제곱근에 비례해 밝기 지각을 흉내 내고, · 는 빨강–초록, 노랑–파랑의 맞섬 축입니다. 참고: [R6] IEC 1999 · [R7] CIE 2004
풀이 — 왜: 세제곱근은 0 근처에서 기울기가 무한대라, 그대로 쓰면 아주 어두운 색의 작은 잡음이 크게 부풀려집니다. 원리: 에서는 세제곱근과 값 · 기울기가 맞닿는 직선 으로 바꿉니다(CIE 정의). 참고: [R7] CIE 2004
풀이 — 왜: 무채색 재질을 가르거나 그림자의 색상이 밝은 면과 가까운지 보는 규칙은 채도와 색상을 따로 봐야 합니다. 거듭제곱 계산은 픽셀마다 하면 느립니다. 원리: 평면의 극좌표로, 원점에서의 거리가 채도 , 각이 색상 ℎ입니다. 8비트 입력은 256가지뿐이라 선형화 값을 표로 미리 계산해 둡니다. 참고: [R7] CIE 2004 · [R10] Fairchild 2013
풀이 — 왜: 두 색이 사람 눈에 얼마나 달라 보이는지를 하나의 수로 견줘야 합니다. 색상은 각도라서 350°와 10°의 차이는 340°가 아니라 20°여야 합니다. 원리: CIELAB은 같은 거리가 대략 같은 지각 차이가 되도록 만든 공간이라, 두 점 사이의 유클리드 거리 (CIE76)을 색 차로 씁니다. 각도 차는 원 위에서 두 방향 중 짧은 쪽입니다. 참고: [R7] CIE 2004 · [R8] Mahy et al. 1994
세 가지 겹치는 방식
아래 색 위에 색 · 알파 인 층을 얹을 때(채널마다):
곱하기는 필터 두 장을 겹치면 투과율이 곱해지는 것과 같고, 스크린은 "두 빛 중 적어도 하나가 닿을 확률"과 같은 꼴입니다(물리 세계와의 대응). 스크린은 순서를 바꿔 겹쳐도 라서, 밝아짐을 여러 층으로 나눠도 합이 같게 만들 수 있습니다.
풀이 — 왜: 층의 혼합 모드를 물리 현상에 대응시키면, 왜 그 혼합식이 그 층에 맞는지와 층을 고치면 어떻게 보일지를 예측할 수 있습니다. 원리: 곱하기 는 투과율 𝑔인 필터를 지난 빛이고, 필터 두 장은 투과율의 곱입니다(비어–람베르트 법칙에서 흡광도가 더해지면 투과율은 곱해짐). 스크린 는 두 빛 중 적어도 하나가 닿을 확률과 같은 꼴이라 더해도 1을 넘지 않습니다. 표준 합성 는 넓이 𝑎를 덮는 불투명 잉크입니다. 2.5는 CIELAB에서 겨우 구별되는 차이(약 2.3)에 맞춘 문턱입니다. 참고: [R12] Beer 1852 · [R1] Porter · Duff 1984 · [R3] ISO 32000-1 2008 · [R8] Mahy et al. 1994
풀이 — 왜: 선화는 표준(덮음) 층이므로 원본은 "선 색을 알파만큼 아래 색 위에 덮은 것"이어야 합니다. 이 식을 풀어야 선의 알파와 색이 나옵니다. 원리: 포터–더프의 over 합성(픽셀 넓이의 𝑎만큼을 잉크가 덮음)을 채널마다 쓴 식입니다. 아래 색 𝑈를 알면 𝐾와 𝑎 중 하나를 정해 나머지를 풉니다. 참고: [R1] Porter · Duff 1984 · [R2] Smith 1995
선화 검출
선 굵기 한계 (기본 )로 밝기 을 클로징합니다.
인 픽셀에서 출발해 인 8-이웃으로 넓힙니다. "주변의 밝은 칠에 비해 얼마나 어두운가"와 "절대적으로 얼마나 어두운가" 중 작은 값이라, 어두운 칠 위의 얕은 요철과 밝은 칠 위의 옅은 잡음을 모두 거릅니다. 팽창 · 침식은 단조 덱으로 픽셀당 에 계산합니다.
선명한 선: , , (는 가우시안 흐림).
펜 굵기 자동: 넉넉한 창으로 찾은 구조의 거리 변환 중심선마다 굵기 을 세어, 봉우리의 3배 이하인 굵기들의 90% 값 을 펜 굵기로 둡니다.
풀이 — 왜: 선은 "주변보다 어둡고 펜 굵기보다 가는 것"입니다. 밝기의 골짜기 중 창보다 좁은 것만 골라야 넓은 어두운 칠(검은 옷)과 가를 수 있습니다. 원리: 팽창 뒤 침식(클로징)은 창 𝑤보다 좁은 어두운 골짜기를 둘레의 밝은 값으로 메우고 넓은 면은 그대로 둡니다. 원본과의 차 𝑑(블랙 탑햇)가 선의 깊이이고, 주변 밝기로 나눈 상대 깊이와 0.3으로 나눈 절대 깊이 중 작은 값을 써서 둘 다 깊어야 강한 선으로 봅니다. 참고: [R15] Soille 2003 · [R14] Gonzalez · Woods 2018
풀이 — 왜: 문턱 하나로 자르면 진한 선 사이의 옅은 구간에서 선이 끊기고, 낮추면 잡음이 함께 잡힙니다. 원리: 센 문턱을 넘는 확실한 선에서 출발해 약한 문턱을 넘는 이웃으로만 이어 붙이는 히스테리시스(캐니 경계 검출과 같은 방법)입니다. 선 감도 𝜂가 높을수록 두 문턱이 함께 내려가는 1차식이고, 0.58 · 0.34 · 0.45와 작은 조각 크기는 시험 그림으로 맞췄습니다. 참고: [R18] Canny 1986 · 이 프로그램의 실험(README 7.1)
풀이 — 왜: 배경은 초점이 나간 듯 흐리게 그리는 경우가 많아, 진하고 또렷한 선은 캐릭터를 가리키는 단서입니다. 원리: 가는 선은 살짝(σ = 1.5) 흐리기만 해도 둘레의 밝은 값과 섞여 깊이가 크게 줄고, 이미 흐린 자국은 더 흐려도 거의 그대로입니다. 그래서 흐린 뒤 깊이가 25% 넘게 사라지는 선만 선명하다고 봅니다(피사계 심도와 같은 원리, 5절). 참고: [R13] Hecht 2017 · 이 프로그램의 실험(README 7.2)
풀이 — 왜: 다른 단계(선 밀도로 배경 찾기)는 기본 창에 맞춰져 있으므로, 잰 펜 굵기가 기본 창을 분명히 넘을 때만 창을 넓혀야 다른 그림이 흔들리지 않습니다. 원리: 반지름 𝑤 정사각형 클로징은 폭 까지의 골짜기를 메우므로 펜 굵기의 절반 + 1이면 선을 담습니다. 이 값이 기본값보다 2 이상 클 때만 쓰고 16에서 멈춥니다. 참고: [R15] Soille 2003 · 이 프로그램의 실험(README 7.1)
선 알파와 선 색
선이 덮은 픽셀은 표준 합성식 를 만족해야 합니다. 선 색 가 주어지면 세 채널의 오차 제곱합을 가장 작게 하는 알파는(최소제곱)
기본 선 색 는 알파 0.85 이상인 선 픽셀의 채널별 중앙값입니다. 실제 선 색이 와 이고 잔차가 채널별 8/255 이하이면 선화, 아니면 색 트레이스입니다. 색 트레이스는 원본이 0~1 범위 안의 선 색으로 정확히 재현되는 최소 알파 이상으로 잡습니다.
풀이 — 왜: 선 색 𝐾를 정하면 세 채널이 알파를 하나씩 주는데, 잡음 때문에 셋이 조금씩 다릅니다. 세 채널을 모두 가장 잘 맞추는 알파 하나가 필요합니다. 원리: 오차 제곱합 은 𝑎의 2차식이라 미분을 0으로 두면 이 정규 방정식의 해가 나옵니다(1변수 최소제곱). 분모가 0에 가까우면(선 색과 아래 색이 같음) 풀 수 없어 0으로 둡니다. 참고: [R43] Björck 1996 · [R1] Porter · Duff 1984
풀이 — 왜: 선 색이 기본 색과 거의 같은 곳까지 색 트레이스로 보내면 층이 지저분해지므로, 눈에 띄게 다른 곳만 골라야 합니다. 원리: ΔE 6은 나란히 놓으면 알아보는 정도의 차이(겨우 구분되는 차이 약 2.3의 두세 배)이고, 8/255는 8비트 반올림 오차 몇 단계입니다. 둘 다 맞으면 기본 선 색으로 원본이 재현되므로 선화에 둡니다. 참고: [R8] Mahy et al. 1994 · 이 프로그램의 실험(README 7.1)
풀이 — 왜: 색 트레이스 층의 색은 0~1 안이어야 저장할 수 있고, 합성 결과가 원본과 정확히 같아야 합니다. 원리: 가 0 이상이려면 , 1 이하이려면 (𝑂 > 𝑈일 때)여야 합니다. 이 하한들의 최댓값보다 작은 알파로는 어떤 색으로도 원본을 만들 수 없으므로, 최소제곱 알파와 이 하한 중 큰 값을 씁니다. 참고: [R1] Porter · Duff 1984
밑색과 그림자 색
재질마다 톤 수 로 k-평균을 하고, 넓이가 가장 넓은 톤의 75% 이상인 톤들 중 밝은 쪽 평균의 이 가장 큰 톤의 밝은 쪽 평균을 밑색 로 둡니다. 밑색이 아닌 톤의 평균 , 밝은 쪽 평균 에 대해
가 그 톤의 곱하기 색입니다. 밝은 쪽 평균으로 나누는 것은 톤 안의 더 어두운 픽셀을 명암 층에 남기기 위해서입니다. 그림자 톤을 순으로 놓고 처음과 끝의 차이가 0.07 이상이며 이웃 사이 가장 큰 틈이 0.04 이상이면 거기서 1차 / 2차로 나누고, 단계마다 넓이로 가중 평균한 색을 8비트로 반올림해 씁니다.
풀이 — 왜: 한 재질 안의 명암 단계(밝은 면, 1차 · 2차 그림자, 하이라이트)를 몇 개의 톤으로 나눠야 층을 만들 수 있습니다. 원리: 톤 수 는 톤마다 적어도 40픽셀이 있도록 하고 6개를 넘지 않게 합니다. k-평균으로 나눈 뒤 인 중심을 합치는 것은 눈에 거의 같은 톤을 둘로 나누지 않기 위해서입니다. 참고: [R22] Lloyd 1982 · [R7] CIE 2004
풀이 — 왜: 재질의 밑색을 정하는 규칙입니다. 원리: 넓은 톤 가운데 밝은 쪽 평균이 가장 밝은 톤을 밑색으로 둡니다. 참고: 이 프로그램에서 정한 규칙
풀이 — 왜: 그림자는 밑색 위에 곱하기 층으로 얹는 것이 작가의 보통 방식이라, 그림자 톤을 "밑색에 곱할 색"으로 바꿔야 층으로 다시 쓸 수 있습니다. 원리: 톤의 밝기가 밑색의 (기본 0.92)배보다 어두우면 그림자입니다. 곱하기는 이므로 이고, 곱하기는 어둡게만 하므로 1로 자릅니다. 밝은 쪽 평균 으로 나누면 톤 안의 더 어두운 픽셀이 남아 명암 층(4.10)으로 갑니다. 이면 나누기가 불안정해 1로 둡니다. 참고: [R1] Porter · Duff 1984 · [R3] ISO 32000-1 2008
풀이 — 왜: 그림자를 1차(넓고 옅은)와 2차(좁고 진한) 두 층으로 나누면 작가가 그리는 순서와 같아지고, 각 층을 따로 고칠 수 있습니다. 원리: 그림자 색 밝기를 정렬해 처음과 끝이 0.07 이상 벌어지고 가장 큰 틈이 0.04 이상이면 그 틈에서 둘로 나눕니다(1차원 자연 틈 나누기). 1차는 넓이 가중 평균입니다. 2차는 1차 위에 다시 곱해지므로 에서 을 평균합니다. 은 저장될 8비트 값으로 미리 반올림해, 뒤의 역산(4.9)이 저장값과 정확히 맞게 합니다. 참고: [R1] Porter · Duff 1984 · 이 프로그램에서 정한 규칙
픽셀별 역산
파츠의 밑색 , 그림자 단계 인 픽셀에서 칠한 색은 입니다(하이라이트 톤이면 톤 색). 복원색 와 비교해
곱하기 , 스크린 이므로 두 경우 모두 정확히 원본으로 돌아옵니다. 1/255 이하의 밝아짐은 양자화 잡음으로 봅니다.
풀이 — 왜: 역산의 출발점은 "층들이 만들어 내는 칠한 색"입니다. 톤 단계에 따라 밑색에 그림자가 몇 번 곱해졌는지가 정해집니다. 원리: 은 참이면 1인 아이버슨 괄호라, 지수로 쓰면 조건이 거짓일 때 그 곱셈이 1(곱하지 않음)이 됩니다. 밝은 면(𝑣 = 0)은 𝐹, 1차 그림자는 , 2차는 입니다. 참고: [R1] Porter · Duff 1984 · 이 프로그램에서 정한 규칙
풀이 — 왜: 층이 만든 색과 원본의 남은 차이를 곱하기 · 스크린 층에 담아, 층을 다 합치면 원본이 정확히 돌아오게 합니다. 원리: 곱하기 를 𝐷로 풀면 , 스크린 를 𝑆로 풀면 입니다. 원본이 더 어두우면 곱하기, 더 밝으면 스크린이라 어느 쪽이든 하나만 쓰입니다. 1.2/255는 8비트 반올림 잡음보다 큰 밝아짐만 보는 여유이고, 𝑥가 0이나 1에 가까울 때는 0으로 나누지 않도록 그 값을 0으로 둡니다. 참고: [R1] Porter · Duff 1984 · [R3] ISO 32000-1 2008
명암과 빛 나누기
어두워짐: 의 아래 포락선(넓게 침식한 뒤 흐린 값 )을 그라데이션으로 떼고 나머지를 명암으로 둡니다.
밝아짐: 가중치 로 일부를 떼어 내고 나머지를 다시 푸는 것을 반짝임 → 림라이트 → 가는 반짝임 → 반사광 → 빛 순서로 되풀이합니다.
림라이트의 가중치는 실루엣에서 안쪽으로 잰 걸음 수 와 안쪽 밝아짐의 지역 평균 로 입니다(가장자리에서만 밝으면 림라이트, 안쪽도 밝으면 넓은 빛). 가는 반짝임은 화이트 탑햇 로 찾습니다.
풀이 — 왜: 남은 어두워짐에는 넓게 천천히 바뀌는 부분(공기 원근 · 큰 명암)과 좁은 붓 터치가 섞여 있습니다. 넓은 부분을 그라데이션 층으로, 나머지를 명암 층으로 나누면 작가가 다루기 쉽습니다. 원리: 반지름 𝑅 침식은 둘레 𝑅 안의 최솟값이라 좁게 튀는 어두워짐을 지우고 넓게 깔린 바닥값(아래 포락선)만 남기고, 가우시안 흐림으로 매끄럽게 합니다. 𝑓를 모든 채널에 곱해 그라데이션은 어두워짐과 같은 색 방향입니다. 나머지는 곱하기를 거꾸로 풀어 가 되게 하므로 두 층을 곱하면 원래 어두워짐과 같습니다. 참고: [R15] Soille 2003 · [R1] Porter · Duff 1984
풀이 — 왜: 밝아짐 하나를 반짝임 · 림라이트 · 반사광 · 빛 여러 스크린 층으로 나눠도, 다 합치면 원래 밝아짐이 정확히 나와야 합니다. 원리: 스크린은 로 순서와 상관없이 합쳐집니다. 가중치 𝑤만큼 를 떼고 나머지 를 스크린 역산으로 구하면 가 항등식으로 성립합니다. 이것을 층마다 되풀이하면 모든 층의 스크린 합이 원래 𝑆입니다. 참고: [R3] ISO 32000-1 2008 · [R1] Porter · Duff 1984
풀이 — 왜: 밝아짐의 종류마다 생김새가 다르므로(반짝임은 작고 밝음, 림라이트는 실루엣 가장자리, 가는 광택은 탑햇으로 드러나는 가는 구조, 반사광은 그림자 안) 그 특징으로 가중치를 정합니다. 원리: 는 두 끝을 거꾸로 둔 smoothstep이라 가장자리에서 안은 1, 밖은 0으로 부드럽게 줄어듭니다. 는 밝아짐 중 안쪽 평균을 넘는 몫이라 가장자리에만 있는 빛일수록 1에 가깝습니다. 가는 광택은 탑햇 𝑇와 옅은 색()의 두 smoothstep을 곱해 둘 다 맞을 때만 큽니다. 참고: [R47] Ebert et al. 2003 · [R15] Soille 2003 · 이 프로그램에서 정한 규칙
풀이 — 왜: 가장자리 빛이 림라이트인지 넓은 빛의 일부인지 가르려면 안쪽의 밝아짐 평균과 견줘야 합니다. 원리: 은 표시 𝑚이 1인 픽셀만으로 낸 가중 평균(정규화 합성곱)이라, 가장자리 근처에서도 바깥(캐릭터 밖 · 가장자리)의 0이 평균을 끌어내리지 않습니다. 분모가 0.02 이하면 둘레에 안쪽 픽셀이 거의 없어 0으로 둡니다. 참고: [R32] Knutsson · Westin 1993 · [R14] Gonzalez · Woods 2018
풀이 — 왜: 머리카락의 가는 광택처럼 반짝임 크기보다 가는 밝은 줄만 골라야 합니다. 원리: 열림(침식 뒤 팽창)은 창보다 가는 밝은 구조를 지우므로, 원본에서 열림을 뺀 화이트 탑햇에는 그 가는 밝은 구조만 남습니다. 참고: [R15] Soille 2003 · [R14] Gonzalez · Woods 2018
최소 알파 저장
곱하기 · 스크린 층의 값 (채널별 0~1)를 "색 + 알파 "로 저장할 때 가능한 가장 작은 알파를 씁니다.
채널 중 가장 큰 값이 알파가 되고 그 채널의 는 1이라, 이보다 작은 알파로는 같은 값을 만들 수 없습니다. 곱하기 층은 로 구한 를 로 저장합니다.
풀이 — 왜: 같은 효과를 내는 색 · 알파 쌍은 여럿인데, 알파가 가장 작은 쌍으로 저장하면 층이 가장 투명해 작가가 옅게 칠한 층처럼 보이고 고치기 쉽습니다. 원리: 알파 𝑎로 색 𝐾를 스크린하면 효과는 이므로 를 만족해야 하고, 이라 입니다. 그래서 가장 큰 채널 값이 가장 작은 알파이고 그 채널의 𝐾가 1입니다. 곱하기 층은 로 합성되므로 로 저장하면 가 되어 같은 식을 씁니다. 8비트 알파에 원본 알파 𝐴를 곱해 투명한 곳에는 효과가 남지 않습니다. 참고: [R1] Porter · Duff 1984 · [R2] Smith 1995 · [R3] ISO 32000-1 2008
재현 검증
저장될 8비트 값 그대로 밑색 · 그림자 → 곱하기 층 → 스크린 층 → 선화 순서로 다시 겹친 를 원본과 비교합니다(은 알파 0.98 넘는 불투명 픽셀 수).
이면 PSNR을 99로 두고 화면에 "∞"로 표시합니다.
풀이 — 왜: 재현이 얼마나 정확한지를 하나의 수로 보여 주기 위해서입니다. 원리: MSE는 불투명 픽셀 · 채널마다 8비트 단위 차이의 제곱 평균이고, PSNR 는 최대 신호(255)의 제곱에 대한 오차의 비를 dB로 나타낸 것입니다. 오차가 작을수록 커지고, 오차가 0이면 무한대라 99로 두고 "∞"로 보입니다. 반투명 픽셀은 바탕에 따라 보이는 색이 달라 빼고 잽니다. 참고: [R55] Huynh-Thu · Ghanbari 2008 · [R14] Gonzalez · Woods 2018
얼굴 점수
눈 후보는 상자 흐림을 3번 한 밝기 의 2차 차분으로 구한 헤세 행렬식이 양수이고 가운데가 둘레보다 어두운 점입니다.
짝마다 근거를 0~1로 잘라 가중 합(최대 15)을 냅니다.
| 근거 | 값(0~1로 자름) | 무게 |
|---|---|---|
| 눈이 피부보다 어두움 | (피부 밝기 − 눈 칸 평균 − 8) / 16 | 1 |
| 피부가 밝음 | (피부 밝기 − 60) / 25 | 1 |
| 콧등이 고름 · 볼이 고름 | (16 − 콧등 표준편차) / 12 · (22 − 볼 표준편차) / 14 | 1 · 1 |
| 콧등 · 두 볼의 색이 같음 | (32 − 세 평균색의 최대 ) / 22 | 1 |
| 두 홍채의 색이 같음 | (28 − 두 눈 칸 어두운 절반의 평균색 ) / 20 | 1 |
| 속눈썹이 진함 · 눈동자가 어두움 | (피부 밝기 − 속눈썹 띠 최솟값 − 20) / 30 · (25 − 눈 칸 최솟값) / 18 | 1 · 1 |
| 많이 기울지 않음 | (0.7 − 두 눈의 세로 차 / 가로 차) / 0.5 | 1 |
| 얼굴 무늬 · 눈 무늬 | (상관 − 0.2) / 0.3 · (상관 − 0.1) / 0.4 | 3 · 1 |
| 눈 속 반짝임 | (가장 밝은 점 − 둘레 8점 중앙값 − 2) / 8 | 2 |
풀이 — 왜: 애니메이션 그림의 눈은 둘레보다 어두운 둥근 덩어리입니다. 여러 크기의 둥근 어두운 덩어리를 찾는 표준 방법이 헤세 행렬식 덩어리 검출입니다. 원리: 흐린 밝기의 2차 도함수를 차분으로 근사합니다(는 중심 2차 차분, 는 대각 네 점의 혼합 차분). 헤세 행렬의 행렬식 은 두 고유값(두 방향 곡률)의 곱이라, 양수이면 두 방향이 같은 쪽으로 휘는 둥근 덩어리이고 한 방향만 휘는 선은 0에 가깝습니다. 대각합 (라플라시안 양수)은 가운데가 둘레보다 어두운 쪽입니다. 는 린데버그의 크기 정규화(2차 도함수마다 )라 여러 크기의 값을 견줄 수 있고, 반지름 약 의 덩어리에서 가장 커집니다. 상자 흐림 3회는 가우시안 근사이고, 반지름 𝜌 상자 한 번의 분산 을 세 번 더해 입니다. 크기 · 위치 모두에서 이웃보다 큰 점만 남깁니다(비최대 억제). 참고: [R33] Lindeberg 1998 · [R17] Wells 1986 · [R14] Gonzalez · Woods 2018
풀이 — 왜: 규칙만으로는 얼굴 같은 무늬(옷 무늬)와 진짜 얼굴을 가르기 어려워, 실제 얼굴의 평균 밝기 무늬와 얼마나 닮았는지 잽니다. 원리: 밝기를 평균 0 · 표준편차 1로 맞추면(𝑧 점수) 밝기 · 대비 차이가 사라지고, 두 𝑧 점수 격자의 곱의 평균 는 피어슨 상관계수(정규화 상호상관)라 −1~1입니다. 평균 무늬는 손으로 표시한 31개 얼굴의 𝑧 점수를 평균한 것입니다. 참고: [R34] Lewis 1995 · [R60] Pearson 1900
풀이 — 왜: 근거 하나하나는 약하므로, 여러 근거를 0~1로 맞춰 무게를 두고 더한 점수로 얼굴인지 정합니다. 원리: 각 근거는 을 0~1로 자른 직선 램프라, 하한 아래는 0, 하한 + 폭 이상은 1입니다(예: 피부 밝기 는 60에서 0, 85에서 1). 무게 합의 최대는 15이고, 얼굴 전체를 보는 얼굴 무늬 상관에 가장 큰 무게 3을 줍니다. 기울기 𝑡는 두 눈의 세로 차를 가로 차로 나눈 값(tan)입니다. 참고: 이 프로그램에서 정한 규칙
이름용 얼굴의 머리 구조 단서(0.48): 이름 · 캐릭터 폴더에 쓰는 얼굴은 위 점수에 입 · 눈 대비 · 아래 눈꺼풀 · 흰 바탕 조정을 더한 뒤, 그 값이 9점 이상인 짝에 가산점 (최대 7.5)를 더해 16.5점 이상을 고릅니다(설정 "기울어진 그림"을 켜면 쓰지 않음). 배경 판정용 얼굴은 그대로입니다. 얼굴 틀 격자(간격 )에서 콧등 · 볼 격자점의 가운데 색을 피부 기준색 으로 두고, 기준색과 이고 기준보다 25 넘게 어둡지 않은(선이 아닌) 점이 콧등 · 볼에서 이어진 덩어리를 살색으로 봅니다. 볼 높이( 0.3 ~ 0.8)마다 가운데에서 바깥으로 살색이 처음 끊기는 너비의 가운데값을 좌우에서 재어 작은 쪽을 볼 끝 로 둡니다.
풀이 — 왜: 진짜 얼굴은 두 눈 아래 볼까지 한 덩어리의 살색이고 피부에 붉은 · 노란 기가 있습니다. 옷 주름 · 무늬 · 소품에서 우연히 나온 가짜 짝은 볼 높이에서 살색 덩어리가 바로 끊기거나 "피부" 자리 색이 회색 · 푸른색인 일이 많습니다. 원리: 얼굴 틀 좌표(눈 사이 단위)로 재므로 얼굴 크기 · 기울기와 상관없이 같은 자리를 봅니다. 세 근거를 0~1 램프로 맞춰 무게 3 · 3 · 1.5로 더합니다. 무게 · 문턱은 개발용 픽시브 AI 생성 그림 205장에서 골랐고, 고르기에 쓰지 않은 88장에서 찾은 얼굴 40 → 44개 · 가짜 57 → 47개(유의하지 않음)였습니다. 피부가 고르고 넓은 자세 합성 그림 120장에서는 가짜 얼굴이 11 → 38개로 늘었습니다. 참고: 이 프로그램의 실험(README 12절 0.48)
누끼 모델
입력 그림 (투명한 곳은 흰 바탕에 얹음)를 긴 변 1024px로 선형 보간해 줄이고 1024×1024 칸 가운데에 놓아(남는 곳 0) 신경망 에 넣습니다. 시그모이드 출력을 같은 보간으로 원래 크기로 되돌려 0.5 이상을 캐릭터로 둡니다.
신경망은 SkyTNT의 anime-segmentation이 공개한 ISNet 모델(skytnt/anime-seg, Apache-2.0, 합성곱 114개 · 가중치 약 4,400만 개)입니다. 앱 안에 넣으려고 합성곱 가중치를 출력 채널 마다 따로 8비트로 줄였습니다.
앱은 처음 쓸 때 8비트 값과 배율로 32비트 가중치를 다시 만들어, 앱 안에 넣은 ONNX Runtime Web(1.29.0, MIT)의 WASM 실행기(스레드 1개)로 별도 워커에서 돌립니다. 그림은 브라우저 밖으로 나가지 않습니다.
풀이 — 왜: 배경을 테두리에서 채워 들어가는 방식은 선이 없는 경계를 막지 못해, 테두리빛으로 처리한 팔이 배경과 한 덩어리가 됩니다. 색 · 넓이 · 경계 단서로 그런 조각을 가려내는 규칙은 개발 그림 207장에서 AUC 0.69를 넘지 못했고(피부색은 0.50), 고른 쪽과 다른 반쪽에서 결과가 뒤집혔습니다. 누끼 모델은 몸의 모양을 보고 캐릭터 전체를 한 번에 고릅니다. 원리: ISNet은 이미지를 여러 해상도로 줄였다 늘이며 전경 · 배경 경계를 세밀하게 맞추는 분할 신경망입니다. 8비트 줄이기는 채널마다 최대 절댓값을 127에 맞추는 대칭 양자화라, 가중치 오차가 채널 최댓값의 0.4% 이하이고 정답 185장에서 32비트 모델과 다른 픽셀이 0.035%였습니다(분해능 차이 0.1% 미만). 참고: [R90] · [R91] · [R92] · [R93].
기존 방식과 더하기(0.52): 누끼 모델을 쓸 때도 배경 단계(단색 · 장면 · 색 모델 · 얼굴 기준 · 틈 · 신경망 보조)를 그대로 돌려 판정 (캐릭터 1 · 배경 0)를 얻고, 모델 확률 에 더해 정합니다.
둘이 같으면 그대로 따르고, 엇갈리면 m(p) ≥ 0.3(기존 방식이 캐릭터) 또는 m(p) ≥ 0.7(기존 방식이 배경)으로 정합니다. 이 결과가 그대로 배경 층이 되며 외곽 글로우 · 배경 위 작은 조각 규칙은 거치지 않습니다.
풀이 — 왜: 모델만 쓰면(0.51) AI 생성 그림에서 기존 방식이 찾던 배경 일부를 놓치고(게시물에 함께 올라온 누끼 14장에서 찾은 배경 94.7%), 기존 방식만 쓰면 선 없는 팔을 배경에 넘깁니다. 엇갈리는 픽셀에서만 모델의 확신을 보게 하면 각자의 실수를 서로 메웁니다. 원리: 두 분류기 점수의 선형 결합입니다. α = 0.4는 합성 setA 299장에서 0.2 · 0.4 · 0.6 가운데 평균 BER이 가장 낮은 값이고(0.51 0.0639 → 0.0452), setB 199장으로 확인했습니다(0.0493 → 0.0293). 게시물에 함께 올라온 누끼 14장은 0.0851 → 0.0778(좋아짐 10 · 나빠짐 2). 좌우 뒤집기 평균 · 응집 · 색 영역 맞춤 · 벽 규칙 · "둘 다" · "하나라도"도 같은 기준으로 재어 뺐거나 더하기보다 못했습니다(README 7.5).
모델이 놓친 그림은 기존 방식으로(0.53): 모델이 그림 전체에서 캐릭터라 한 넓이가 1% 미만인데 기존 방식은 5% 이상을 캐릭터라 하면, 모델이 캐릭터를 통째로 놓친 것으로 보고 그 그림은 기존 방식의 판정을 그대로 씁니다(N은 그림의 픽셀 수).
무게를 조금씩 바꾸는 식이 아니라 그림 단위로 켜고 끄는 규칙이라, 조건에 걸리지 않는 그림은 0.52와 같습니다.
풀이 — 왜: 모델은 사람 모양이 아닌 캐릭터(동물 · 몬스터 팬아트)를 통째로 놓칠 수 있고, 그러면 더하기에서도 기존 방식의 한 표(0.2)가 모델 확률 0에 가까운 값을 넘지 못해 캐릭터가 사라집니다. 이런 그림에서만 기존 방식을 그대로 따르게 했습니다. 원리: 두 판정의 넓이를 견주어 한쪽이 거의 비었을 때만 다른 쪽으로 넘깁니다. 이 규칙은 결과를 본 뒤 만든 것입니다(게시물에 함께 올라온 누끼 14장 중 이상해씨 팬아트에서 모델이 캐릭터를 하나도 찾지 못한 것을 보고 만듦). 1% · 5%는 처음 정한 값 그대로이고 여러 값을 견주어 고르지 않았습니다. 개발 그림에서 걸린 그림은 합성 setA 12장(좋아짐 9 · 나빠짐 3) · setB 1장(좋아짐 1) · 게시물 누끼 1장(이상해씨, BER 0.500 → 0.106)입니다. 모델이 부족한 정도에 따라 기존 방식의 무게를 로그 눈금으로 늘리는 식(그림 단위 · 덩어리 단위)도 쟀지만 합성 그림에서 나빠진 그림이 더 많아 넣지 않았습니다(README 7.5).
미세 학습 모델과 평균(0.54): 원래 누끼 모델의 확률 m₀와, 같은 신경망을 더 학습한 판의 확률 m₁을 0.6 · 0.4로 가중 평균한 값을 모델 확률로 쓰고, 더하기의 문턱을 0.5에서 0.55로 올리며, 0.53의 규칙(모델이 놓친 그림)은 그대로 둡니다.
미세 학습은 캐릭터를 테두리에 붙여 넣은 합성 그림 290장(픽셀 정답)과 픽시브 AI 생성 개발용 그림 292장(원래 모델이 검정 채우기 · 거울 반사 채우기로 낸 확률의 평균을 부드러운 정답으로)을 섞어 12 에포크 돌린 것입니다(학습률 2e-5, 입력 채우기 검정 · 반사 무작위, 좌우 뒤집기). 앱에는 더 학습한 판의 8비트 값을 원래 8비트 값과의 차이로 넣어(배율은 원래 것 그대로) 두 모델을 차례로 돌립니다.
풀이 — 왜: 0.53에 남은 손실의 두 가지 큰 까닭(배경과 색이 비슷한 경계 · 테두리에 잘린 몸)은 모델이 낮은 확률로 확신하고 틀리는 곳이라, 문턱 · 채우기 · 응집 같은 규칙으로는 줄지 않았습니다(README 7.5). 그래서 모델 자체를 더 학습했습니다. 원리: 더 학습한 판만 쓰면 캐릭터는 더 잘 지키지만(게시물 누끼 14장 지킨 캐릭터 97.6 → 99.4%, 배경과 색이 비슷한 경계 띠 43 → 95%) 기 · 불꽃 효과와 캐릭터에 붙은 배경을 캐릭터로 넣는 쪽이 늘어(찾은 배경 92.5 → 89.3%) 평균 BER은 0.0497 → 0.0561로 오히려 높아져, 미리 정한 관문(짝 14장 · 개발 176장)을 넘지 못했습니다. 원래 모델은 그런 효과 · 배경을 배경이라 확신하므로 두 확률을 섞으면 서로의 확신 오류를 누그러뜨립니다. 결과를 본 뒤 판정 규칙 후보 34개(한 모델 문턱 · 두 모델 섞기)를 적어 두고 짝 14장 · setB로 채점해 두 모델 평균이 관문을 넘었고(짝 0.0483, setB 0.0203), 이어서 두 모델의 무게 w · 통계식의 무게 α · 문턱 τ 1,089조합을 훑어 setB로 고르고 짝 · 개발 176장으로 확인했습니다. setB만 보면 통계식을 버리는 조합(α 0, setB 0.0189)이 가장 낮았지만 AI 생성 그림에서 배경이 딸려 와(176장 ΔW -0.20) 탈락했고, 세 자료가 모두 좋아지는 w 0.4 · α 0.4 · τ 0.55를 골랐습니다: 짝 14장 BER 0.0497 → 0.0456(좋아짐 6 · 나빠짐 3, 지킨 캐릭터 99.2% · 찾은 배경 91.7%), 합성 setB 200장 0.0285 → 0.0200(좋아짐 119 · 나빠짐 63), 176장 ΔW +0.12(좋아짐 112 · 나빠짐 48). 짝 14장 · setB로 골랐으므로(사후 선택) 그 값들은 바깥 추정이 아니고, 고르기에 쓰지 않은 정답 185장과 고정 60장 눈가림이 바깥 확인입니다.
효과 학습 판과 평균(0.55): 0.54의 더 학습한 판 자리에 효과(글로우 · 파티클 · 빛줄기 · 오라)를 배경으로 세도록 다시 학습한 판의 확률 m₁을 넣고, 원래 모델의 확률 m₀와 같은 무게로 평균합니다. 문턱 0.55 · 통계식 무게 0.4 · 모델이 놓친 그림의 되돌림은 0.54 그대로입니다.
학습 자료는 합성 setA 290장(픽셀 정답) · 효과 합성 300장(학습 중 즉석 생성, 효과 픽셀은 배경 정답) · 픽시브 AI 생성 개발용 292장(부드러운 정답)이고, 0.54의 판에서 학습률 5e-6로 6 에포크 더 학습한 여섯 에포크의 가중치 균일 평균을 씁니다. 앱에는 원래 8비트 배율로 줄여 원래 값과의 차이로 넣습니다(잘린 가중치 0.0175%, 16MB).
풀이 — 왜: 0.54의 더 학습한 판은 효과와 캐릭터에 붙은 배경을 캐릭터로 넣는 쪽이라, 효과를 배경으로 세는 판으로 바꿔 한 모델로 돌아가려 했습니다. 원리: 효과 학습 판 하나만 쓰면 효과 합성 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}을 같은 관문 넷(합성 setB · 게시물 누끼 14장 · 효과 합성 100장 · 개발 176장)으로 봤습니다. 규칙이 고른 w 0.6은 앱이 싣는 8비트로 다시 채점하니 176장 그림 수 조건이 뒤집혀(ΔW +0.047, 78:83) 적어 둔 규칙대로 멈췄고, 결과를 본 뒤 w 0.5를 등록해 두 양자화에서 모두 넷을 넘었습니다(setB 0.0184 · 짝 0.0440 · 효과 합성 0.0269 · ΔW +0.033). 격자 안의 값이고 관문은 그대로지만 고르기는 사후이며, 바깥 확인은 정답 185장과 고정 60장 눈가림입니다.
신경망 보조
배경 찾기 끝에서 아직 캐릭터인 색 영역 (넓이가 그림의 0.2% 이상)마다 두 점수를 냅니다. 통계식은 영역 특징 45개(평균 틀의 색 · 위치 · 얼굴 기준 좌표 로그 비, 둘레의 선 · 배경 몫, 넓이, 밝기 흩어짐, 결 특징 5개 등)와 그 가운데 40개로 만든 더하기 로짓 을 표준화해 더한 선형 점수입니다.
결 특징(머리카락 결 · 무늬): 밝기 의 소벨 기울기로 구조 텐서를 만들어 가우스로 모으고, 방향 일관성 를 텐서 에너지 로 가중해 영역마다 평균합니다. 나머지 넷은 기울기 세기 평균 · 국소 밝기 표준편차() 평균 · 기울기가 0.3을 넘는 몫 · 밝기 표준편차입니다.
신경망: 그림을 긴 변 256으로 넓이 평균해 줄인 일곱 판(R · G · B · 지금까지 찾은 배경 · 어두운 부분 지키기 · 선 · 얼굴 자리)을 넣으면 1/2 해상도의 캐릭터 로짓 를 냅니다. 구조는 U-Net 꼴(채널 8 · 16 · 32 · 48, 가장 깊은 층에 팽창 2 · 4 · 8 합성곱, 가중치 109,073개, 4:3 그림에서 곱셈-덧셈 약 2.4억 번)입니다. 0.50부터는 두 점수를 한 식으로 묶어 지웁니다(0.49는 둘 다 문턱을 넘을 때만).
풀이 — 왜: 남은 배경을 더 지우는 규칙은 캐릭터를 잘못 지우기 쉽고, 캐릭터를 잃는 쪽이 배경이 남는 쪽보다 훨씬 나쁩니다. 통계식 혼자서는 지운 넓이 가운데 배경이 75%, 신경망 점수를 한 식에 섞어서는 76%로 목표 80%에 못 미쳤고, 한 식에 섞은 후보는 보류 그림 눈가림에서 57 : 70으로 졌습니다. 서로 다른 근거로 배운 두 판정이 함께 "배경"이라 할 때만 지우자 80%를 처음 넘었습니다(0.49, 5겹 바깥 점수, 지울 배경의 18%만 지움). 0.50은 두 판정을 따로 자르던 것을 두 점수의 로지스틱 식 하나로 바꿨습니다. 통계식 · 묶는 식 · 문턱을 모두 바깥 겹을 보지 않고 맞춘 겹 안 겹 바깥 점수에서, 지운 넓이 가운데 배경이 76%(0.49 규칙)에서 90%로 오르고 남은 배경을 지운 몫은 28%에서 27%로 비슷하며, 캐릭터 손실을 3배로 친 넓이 가중 손실이 −0.09(95% 구간 −1.01 ~ +1.03)에서 −0.96(−1.56 ~ −0.38)으로 처음 0 아래에 머물렀습니다(그림 64장 좋아짐 · 13장 나빠짐). 영역 특징 45개와 신경망 점수를 한 식에 섞었던 후보와 달리 입력이 이미 맞춘 두 점수뿐이라 계수가 겹마다 고르게 나왔습니다. 원리: 통계식은 영역 하나하나의 색 · 위치 · 결을 보고, 신경망은 줄인 그림 전체의 모양을 봅니다. 두 판정의 틀림이 덜 겹칠수록 둘이 함께 틀릴 확률은 각자의 확률보다 작아집니다. 통계식은 로지스틱 회귀로, 신경망은 합성 그림의 캐릭터 몫과 개발 그림 영역 정답에 대한 이진 교차 엔트로피를 Adam으로 줄여 맞췄습니다. 묶는 식의 계수는 두 점수의 바깥 점수(그 영역을 보지 않은 모형의 점수)로 로지스틱 회귀를 맞춘 값이고, 문턱 0.8은 캐릭터 손실을 3배로 친 넓이 가중 손실이 가장 작은 값입니다. 신경망 가중치는 0.49와 같습니다. 참고: [R69] Cox 1958 · [R86] Ronneberger et al. 2015 · [R87] Kingma & Ba 2015 · [R88] Yu & Koltun 2016 · [R89] Bigün & Granlund 1987
신경망의 학습 · 추론 코드는 이 프로그램을 위해 처음부터 짰습니다(학습은 numpy 행렬 계산, 추론은 순수 JS. 외부 학습 라이브러리 · 미리 학습된 가중치 없음). 학습 자료는 픽시브의 투명 배경 캐릭터 그림과 캐릭터 없는 배경 그림을 오려 붙인 합성 그림 460장과, 개발용 픽시브 AI 생성 그림 207장에서 판정자가 매긴 영역 정답 1,498개입니다. 분해능 · 눈가림 시험 · 보류 그림은 학습과 문턱 고르기에 쓰지 않았습니다. 가중치(float32)는 앱 파일 안에 들어 있어 인터넷 없이 돌고, 추론은 덧셈 · 곱셈 · 최댓값 · 평균만 써서 계산 순서가 정해져 있습니다.
배경 메꿈(0.56)
구멍 H = 캐릭터 자리(배경 아닌 불투명 픽셀)를 r = clamp(⌊L/160⌉, 3, 12)px 넓힌 것(L = 긴 변), 아는 영역 K = H 밖의 완전 불투명 배경 픽셀입니다. 신경망 추정: 구멍을 비운 그림 I(1 − M)과 마스크 M을 긴 변 512로 줄여(아는 픽셀만 평균, 아는 비율이 0.8 미만인 칸은 구멍) 512×512 캔버스에 반사 패딩으로 놓고 big-lama(FFC ResNet: 푸리에 합성곱이 그림 전체를 한 번에 보며, 가중치는 fp16으로 넣어 fp32로 돌림)에 넣은 출력을 잘라 쌍삼차로 올린 것이 G입니다. 원본 질감: 전해상도(긴 변 ≤ 1024)에서 구멍 픽셀을 G로 두고, 구멍 픽셀 p의 대응 f(p) ∈ K를 7×7 패치 거리 D가 가장 작도록 찾아(전파 + 반지름 32부터 반씩 줄이는 무작위 탐색, 2회 × 3번) 자기를 덮는 대응 패치의 거리 가중 평균(투표 P)을 구하고, 대응 거리로 P와 G를 섞습니다(τ₀ · τ₁ = 채널당 RMS 0.02 · 0.05에 해당하는 거리: 잡음 수준의 거리는 완전한 대응으로 보고, 그 위로는 중앙값과 τ₁ 중 큰 쪽을 기준으로 감쇠. 중앙값만 쓰면 흰 배경처럼 평탄한 그림에서 JPEG 잡음만큼의 거리도 나쁜 대응이 되어 신경망의 회색 잡음이 남는다).
이음매 막 보정: 구멍에 닿은 아는 픽셀의 링 R에서 채움이 예측하는 값(링 투표 P(q)와 G(q)를 이웃 구멍 픽셀의 가중치 평균 w̄q로 섞은 것)과 실제 값 I(q)의 차이 b(q)를 경계값으로, 구멍 안에서 조화(라플라스 = 0)인 막 h를 다중 격자(2×2 평균으로 16px까지 내려가 가우스-자이델 400회, 올라오며 층마다 24회)로 풀어 채움에 더합니다. Poisson 이음새 없는 합성(Pérez et al. 2003)과 같은 식입니다.
"패치만"(신경망 없이): 반씩 줄인 피라미드(아는 자식의 평균, 아는 자식이 절반 미만이면 구멍; 짧은 변 24까지)의 가장 거친 층을 라플라스 확산으로 채우고, 층마다 위 층 대응을 2배로 물려받아 패치 맞춤을 한 뒤, 규칙성 ρ = e₈₀ / c₈₀(긴 변 ≤ 320 층에서 아는 11×11 패치 1,500개를 6px 넘게 떨어진 다른 아는 패치와 맞춘 RMS 오차 e와 패치 안 표준편차 c의 80 백분위), wreg = clamp((0.7 − ρ)/0.35, 0, 1)로 구멍 픽셀마다 경계까지 거리 d에 따라 이웃한 두 층의 결과(Îl)를 삼각 가중으로 섞습니다.
풀이 — 왜: 패치만으로는 구멍 깊숙한 곳에서 전파가 닿지 않아 엉뚱한 조각이 붙거나 뭉개지고, 창틀 · 나무처럼 끊긴 구조는 잇지 못합니다. 신경망은 그림 전체를 보고 구조를 잇지만 512로 줄여 돌리므로 질감이 흐립니다. 그래서 구조는 신경망, 질감은 원본 패치, 이음매는 막 보정이 맡습니다. 가중치를 8비트로 줄이면(출력 채널별) 가중치 1% 수준의 교란에도 평탄한 배경의 색이 뒤집혀(최대 오차 0.6~0.8) 쓸 수 없었고 fp16은 fp32와 최대 0.007~0.03 차이라 fp16(102 MB)으로 넣었습니다. 원리: 푸리에 합성곱은 주파수 영역에서 한 층으로 그림 전체의 주기 · 구조를 보므로 먼 곳의 무늬를 구멍 건너로 잇고, 막은 조화 함수라 경계에서 정한 값이 안쪽으로 가장 매끈하게 퍼지며 고주파(질감 · 선)를 더하지 않습니다. 합성 177장의 구멍 MAE는 신경망 + 패치 2.82 · 신경망만 6.08 · 패치만 3.94, 이음매 띠(경계 8px) MAE 1.96 · 3.99 · 2.91, 이음매 단차 초과(경계 짝 |채움 − 원본| − 정답의 같은 값) 0.41 · 0.90 · 1.20이고, 픽시브 AI 생성 그림 120장 자연스러움 채점(0~100, 채점자 8명 × 15장)은 신경망 + 패치 59.2(95% 56.1~62.3) · 신경망만 60.2(57.4~63.1) · 패치만 44.7(40.3~49.3), 짝 비교 신경망 + 패치 − 패치만 +14.5(우세 82:31, 부호 검정 p = 1.7e-06), − 신경망만 -1.0(39:52, p = 0.21; 480px로 줄인 채점표라 질감 차이는 보이지 않으며, 합성 정답에서는 신경망 + 패치가 훨씬 낮은 오차)입니다. 글로우 그림 5장은 이 측정에서 글로우 띠를 모르는 영역으로 두어(앱은 글로우 아래 밑색을 아는 영역으로 씀) 구멍이 커지고 신경망 추정이 빗나가 패치만(12.3)보다 나쁩니다(38.2). 참고: Suvorov et al. 2022 (LaMa) [R94], Barnes et al. 2009 (PatchMatch), Pérez et al. 2003 (Poisson 합성) [R95].
러프 긋기
러프는 덩어리 지도 · 안쪽 선 · 배경 구도(러프 2) · 얼굴 세부의 중심선을 Zhang–Suen 세선화로 따서, 꺾이는 곳에서 끊고 그 사이를 호 길이 에 대한 3차식으로 최소제곱 맞춘 획으로 긋습니다. 러프 2는 Ramer–Douglas–Peucker로 모서리를 찾고, 1.2 rad 이하로 꺾이는 조각은 붓을 떼지 않고 한 획으로 잇습니다. 획마다 는 새로 뽑는 난수입니다.
는 필압(시작 · 끝은 가늘고 옅게), 은 획의 반지름, 는 픽셀 중심에서 선분까지 거리 로 잰 덮인 정도(안티에일리어싱)이고, 긋기끼리는 스크린으로 쌓습니다. 필압 바닥 는 러프 1이 0.18, 러프 2가 0.35(확정한 선이라 끝을 덜 가늘게 뺌)입니다. 마지막 알파는 2~3px 크기의 값 잡음 으로 입니다.
러프 1 · 러프 2의 값 비교
| 값 | 러프 1(컨셉) | 러프 2(다듬기) |
|---|---|---|
| 파츠 흐리기 · 큰 파츠 문턱 | · 캐릭터 넓이의 0.8% | · 0.2% |
| 안쪽 색 경계 · 선화가 있는 실루엣 | 밑에 선화가 있으면 긋기 · 긋기 | 긋지 않음 · 선화가 긋기 |
| 구도 어긋남 | 회전 ±0.05 rad, 크기 ±4%, 휨 캐릭터 크기의 3.5% | 없음 |
| 안쪽 선(선 알파 문턱 · 길이) | 0.3 · 이상 | 0.25 · 이상 |
| 배경 구도 | 긋지 않음 | 밝기 경계 이상, 세기 0.45 |
| 획 맞춤 | 꺾임 0.8 rad에서 끊음 | 꺾임 0.9 rad에서 끊고 모서리(0.65 rad)마다 맞춘 뒤 1.2 rad 이하는 한 획으로 |
| 덩어리 선 반지름 | ||
| 안쪽 선 반지름 | ||
| 얼굴 획 반지름 · 진하기 | · | · |
| 필압 바닥 · 짜임선 진하기 | 0.18 · 1.3배 | 0.35 · 0.5배 |
는 선 굵기의 크기 비율, 는 흐리기 · 길이 문턱의 크기 비율, 은 획을 따라 잰 선 알파의 평균입니다. 난수 씨앗이 고정이라 같은 그림이면 같은 러프가 나옵니다.
풀이 — 왜: 선화 픽셀 덩어리를 붓으로 그을 수 있는 줄(점의 열)로 바꿔야 획을 만들 수 있습니다. 원리: 3×3 팽창으로 1px 틈을 이은 뒤 Zhang–Suen 세선화로 연결을 지키며 1px 중심선을 얻습니다. 끝점을 정해진 걸음만큼 지웠다 되살리면 짧은 곁가지만 사라집니다. 8-이웃을 한 바퀴 돌며 0 → 1 바뀜 수(교차수)가 3 이상이면 갈림점입니다. 두 끝의 바깥쪽 방향 내적이 미만이면 두 방향이 거의 마주 보아(곧게 이어지는 방향에서 40° 안) 한 줄로 잇습니다. 참고: [R36] Zhang · Suen 1984 · [R14] Gonzalez · Woods 2018
풀이 — 왜: 꺾임 사이의 줄을 붓 획처럼 매끈한 곡선으로 바꿉니다. 원리: 호 길이를 0~1로 맞춘 매개변수 𝑡에 대해 를 각각 3차 다항식으로 최소제곱 맞춥니다(정규방정식). 가장 먼 점의 오차가 허용 오차를 넘으면 그 점에서 둘로 나눠 다시 맞추는 재귀 분할이라, 허용 오차 안에서 가장 적은 조각으로 맞춰집니다. 참고: [R38] Schneider 1990 · [R43] Björck 1996
풀이 — 왜: 러프 2는 확정한 선이라 모서리는 또렷이 꺾고 그 사이는 매끈해야 하며, 픽셀 잡음에서 생긴 작은 톱니는 없어야 합니다. 원리: Ramer–Douglas–Peucker는 양 끝을 잇는 직선에서 가장 먼 점에서 나누기를 허용 오차 안이 될 때까지 되풀이해 줄을 적은 꼭짓점의 꺾은선으로 줄입니다. 짧은 마디를 낀 꼭짓점을 어긋남이 작은 것부터 빼서 톱니를 없애고, 0.65 rad 넘게 꺾이는 꼭짓점에서만 나눠 그 사이를 3차식으로 맞춥니다. 참고: [R41] Ramer 1972 · [R42] Douglas · Peucker 1973 · [R38] Schneider 1990
풀이 — 왜: 연필 획은 시작과 끝에서 힘이 빠져 가늘고 옅으며, 중간에도 필압이 조금씩 흔들립니다. 원리: 는 오르는 smoothstep과 내리는 smoothstep을 곱한 사다리꼴 꼴이라 양 끝에서 0, 가운데서 1입니다. 필압 바닥 가 끝을 완전히 0으로 만들지 않게 하고, 는 획 하나에 1~3번 오르내리는 ±12%의 떨림입니다. 첫 긋기가 덧긋기보다 셉니다(). 참고: [R47] Ebert et al. 2003 · 이 프로그램에서 정한 규칙
풀이 — 왜: 필압이 셀수록 획이 굵어지도록 합니다. 원리: 은 필압 0에서 , 필압 1에서 인 1차 보간입니다. 끝의 굵기 비율 𝜆는 붓이 굵을수록(𝑅/𝑠′가 클수록) 0.45에서 0.85로 커져, 굵은 붓은 끝이 덜 가늘어집니다. 참고: 이 프로그램에서 정한 규칙
풀이 — 왜: 획을 계단 없이 부드럽게 그리고, 여러 번 덧그은 곳은 연필처럼 차츰 진해지게 합니다. 원리: 픽셀 중심에서 선분까지의 거리 𝑑와 그 자리 반지름 로 는 경계 1px 폭에서 1 → 0으로 떨어지는 덮임 근사라 안티에일리어싱이 됩니다(둥근 끝 선분 = 캡슐). 한 번의 긋기 안에서는 최댓값을 써 이웃 선분이 겹친 곳이 진해지지 않고, 긋기끼리는 스크린 로 쌓아 1을 넘지 않으면서 겹칠수록 진해집니다. 참고: [R14] Gonzalez · Woods 2018 · [R3] ISO 32000-1 2008
풀이 — 왜: 연필 획에는 종이 결 때문에 생기는 2~3px의 얼룩덜룩한 결이 있습니다. 원리: 쌓인 값 acc에 칸 크기 의 값 잡음 𝑛으로 0.92~1배를 곱합니다. 0.01 미만은 비우고 8비트로 반올림합니다. 층 불투명도 는 밑그림처럼 옅게 보이게 하는 값입니다. 참고: [R47] Ebert et al. 2003 · 이 프로그램에서 정한 규칙
러프 2 G펜 따라 긋기(0.57부터): 러프 2는 안쪽 선 · 얼굴 세부 대신 선화를 한 번씩 따라 긋습니다. 펜 굵기 wp = 선 잉크 합 ÷ 세선화한 중심선 길이, 펜 배율 sP = clamp(wp/1.25, 0.5, 3). 선은 ℓ ≥ 0.25이고 둘레(반지름 rC = 3sP 상자) 평균보다 0.15 이상 진하거나, 두 배 창(2rC)에서 그런 픽셀(두 크기 창, 0.58)입니다. 넓이 25sP² 이하 구멍은 메우고, 선 안 거리 2.5sP 넘는 꽉 찬 덩어리는 둘레만 남깁니다. 줄은 꺾임 1.05 rad 넘는 곳에서만 나누고, 호 길이 가우스 σ = min(3.5sP, L/6)로 펴며(손떨림 보정), 반지름 r = r0 ej pr(r0: 원래 선 반폭 중앙값에서 1.15~2.2sP, ej: 0.85~1.2배 강조, pr: 들어감 min(0.18L, 5sP) · 빠짐 min(0.35L, 14sP)), 진하기 0.92로 한결같이 긋습니다(문서 4.14의 11).
풀이 — 왜: 선 알파만으로 고르면 칠 · 음영 · 결 덩어리가 선으로 들어오고, 그것을 세선화한 가운데 줄이 의미 없는 그물이 됩니다. 선은 둘레보다 진한 가는 띠이므로 둘레 평균과의 차이로 고르고, 굵은 선은 작은 창에서 두 가장자리만 남으므로 두 배 창을 함께 봅니다. 원리: 상자 평균은 적분 영상으로 구하고, G펜처럼 잉크 진하기는 같게 두고 굵기만 필압으로 바꿉니다.
필압 곡선 · 선 중요도 · 덧긋기(0.59부터): 획 안의 상대 위치 t에서 필압 q(t) = clamp(0.5 + 0.5e−((t−c)/w)² + 0.12 sin(2πft + φ) + 0.15 min(1, θ/0.8), 0.3, 1)(c ∈ [0.3, 0.6], w ∈ [0.3, 0.55], θ: 꺾임각)이고, 반지름 r = r0 ej pr (0.5 + 0.5q), 진하기 a = a0 (0.75 + 0.25q)(0.65 + 0.35 pr)입니다. 기본 진하기 a0 = 0.95(0.7 + 0.3m)의 중요도 m은 지역 대비 · 굵기 · 길이(40sP 넘으면 +0.25) · 선 알파(0.85 넘으면 +0.15)로 정하고, 얼굴 자리 안 획은 a0 ≥ 0.95 × 0.95입니다. 손떨림 보정은 σ = min(6sP, L/4), 흔들림 진폭은 0.15sP입니다. 길이 20sP 넘는 획의 1/4쯤은 30~55% 구간을 0.15~0.3sP 비껴 반지름 0.7배 · 진하기 0.5배로 덧긋습니다. 눈 · 입 상자(0.59e): 눈 사이 거리 d로 가로 ±1.0d, 눈 위 0.35d ~ 눈 아래 1.25d 상자 안에서는 선 알파 ℓ ≥ 0.15를 선으로 삼고 덩어리 속을 비우지 않습니다.
풀이 — 왜: 0.58의 G펜 획은 잉크 진하기가 한결같고 굵기만 원래 선을 따라 "기계적" · "트레이스 같다"는 판정을 받았습니다. 사람의 러프는 획 안에서 힘이 오르내리고, 중요한 선은 진하게 곁선은 옅게 긋습니다. 원리: 가운데가 가장 센 가우스 혹 하나에 느린 흔들림과 꺾임 가산을 더해 획 안의 강약을 만들고, 대비 · 굵기 · 길이로 선 사이의 중요도를 매깁니다. 눈 · 입은 어두운 홍채 위에 있어 지역 대비로는 잡히지 않으므로 그 자리에서만 선 알파 문턱으로 고릅니다.
8물리 세계와의 대응
그림의 층 구성은 빛과 물감의 성질을 흉내 낸 것이고, Illustracy의 계산도 같은 대응 위에 서 있습니다.
빛 · 물감과 층
| 물리 현상 | 그림의 층 | 계산 |
|---|---|---|
| 빛의 흡수: 색 필터(셀로판, 겹쳐 바른 투명 물감)를 지난 빛은 채널마다 투과율만큼 줄고, 필터 두 장은 투과율의 곱(비어–람베르트 법칙) | 그림자, 명암, 그라데이션(곱하기) | , 1차 그림자에 2차 그림자를 곱함 = 필터 두 장 |
| 빛의 더함: 조명을 하나 더 켜면 밝아지되 흰색을 넘지 않음. 식은 "두 빛 중 적어도 하나가 닿을 확률"과 같은 꼴 | 빛, 반짝임, 림라이트, 반사광(스크린) | |
| 덮음: 불투명한 잉크가 픽셀 넓이의 만큼을 덮음. 선의 흐린 가장자리는 부분적으로 덮인 픽셀 | 선화, 밑색, 하이라이트(표준) | |
| 잉크 선: 빛을 흡수하는 가는 물질 | 선화 | 가늘고 어두운 구조 = 클로징 − 원본 |
| 형태 그림자와 가림: 빛을 등진 면이 어둡고, 접힌 곳 · 맞닿은 곳은 주변 빛까지 가려져 더 어두움 | 1차 / 2차 그림자 | 톤을 밝기 틈으로 두 단계 분할 |
| 정반사: 매끄러운 표면(눈, 머리카락, 금속)이 광원을 작고 밝게 비춤 | 하이라이트, 반짝임 | 작고 매우 밝은 조각, 화이트 탑햇 |
| 역광과 스치는 각: 물체 가장자리에서는 표면이 시선과 거의 평행해 뒤에서 온 빛이 강하게 보임(프레넬 반사율이 스치는 각에서 커짐) | 림라이트 | 실루엣에서의 거리로 가중 |
| 간접광: 바닥 · 주변에 튕긴 빛이 그림자 속을 다시 밝힘 | 반사광 | 그림자 픽셀 안의 밝아짐 |
| 거리와 확산 반사: 넓은 면에서 조명이 거리 · 각도에 따라 천천히 변함 | 그라데이션 | 저주파 성분(침식 + 흐림 포락선) |
| 피사계 심도: 초점 밖 물체는 착란원만큼 퍼져 흐리게 찍힘 | 흐리게 그린 배경 | "선명한 선"(살짝 흐리면 크게 약해지는 선)의 유무 |
| 사람의 색 지각: 눈은 초록에 가장 민감하고, 색 차이를 밝기와 색상으로 나눠 느낌 | 모든 색 비교 | 밝기 가중치 0.299 · 0.587 · 0.114, Lab과 (약 2.3이 겨우 구분되는 차이 → 파츠 합침 기준 2.5) |
풀이 — 왜: 층의 혼합 모드를 물리 현상에 대응시키면, 왜 그 혼합식이 그 층에 맞는지와 층을 고치면 어떻게 보일지를 예측할 수 있습니다. 원리: 곱하기 는 투과율 𝑔인 필터를 지난 빛이고, 필터 두 장은 투과율의 곱입니다(비어–람베르트 법칙에서 흡광도가 더해지면 투과율은 곱해짐). 스크린 는 두 빛 중 적어도 하나가 닿을 확률과 같은 꼴이라 더해도 1을 넘지 않습니다. 표준 합성 는 넓이 𝑎를 덮는 불투명 잉크입니다. 2.5는 CIELAB에서 겨우 구별되는 차이(약 2.3)에 맞춘 문턱입니다. 참고: [R12] Beer 1852 · [R1] Porter · Duff 1984 · [R3] ISO 32000-1 2008 · [R8] Mahy et al. 1994
감마와 합성
곱하기 · 스크린은 포토샵과 같이 감마 부호화된 sRGB 값에 대해 계산합니다. 물리적으로 정확한 선형 공간 합성은 아니지만, PSD를 열었을 때 포토샵이 같은 식으로 합성하므로 원본이 그대로 재현됩니다. 색 비교(k-평균, )만 선형화를 거친 Lab 공간에서 합니다.
풀이 — 왜: PSD를 연 포토샵과 똑같은 결과를 내야 하므로 합성은 포토샵처럼 감마 부호화된 sRGB 값으로 하고, 사람의 지각에 맞춰야 하는 색 비교만 Lab에서 합니다. 원리: sRGB 값은 빛의 양이 아니라 감마가 걸린 값이라 이 값끼리 곱하고 더하는 것은 물리적인 빛의 계산과 조금 다릅니다. 그래도 포토샵의 곱하기 · 스크린이 같은 값에서 계산하므로 층을 합친 결과가 원본과 정확히 같아집니다. 는 선형화 → XYZ → Lab을 거친 거리라 지각 차이에 가깝습니다. 참고: [R6] IEC 1999 · [R3] ISO 32000-1 2008 · [R7] CIE 2004
9프로그램 구조
프로그램은 HTML 파일 하나에 화면 · 계산 · PSD 작성기가 모두 들어 있고, 브라우저 밖의 어떤 것도 부르지 않습니다.
구성
| 구성 요소 | 하는 일 |
|---|---|
| 화면 | 왼쪽 설정, 가운데 미리보기, 오른쪽 층 목록 |
IllustracyCore() | 분해 알고리즘 전체. 함수 하나로 닫혀 있어 toString()으로 워커에 그대로 옮겨짐 |
| 워커 연결부 | 코어를 Blob URL 워커로 띄우고, 결과 층의 버퍼를 복사 없이 넘겨받음(transferable). 실패하면 화면 쪽에서 실행 |
PSD.write() · PSD.rename() | PSD 파일 작성기 · 예전 버전으로 저장한 PSD의 층 이름 고치기 |
| 합성기 | 미리보기, 차이 보기, PNG 저장, PSD 병합 이미지 |
| 보정 도구 | 배경으로 보내기, 캐릭터로 되돌리기, 올가미, 되돌리기 스택 |
| 예제 그림 | 앱에 넣어 둔 그림 10장(픽시브 AI 생성 그림, 출처는 업데이트 내역 0.59i) 중 하나를 무작위로 엶(바로 앞과 같은 그림은 피함). 0.59h까지는 캔버스로 직접 그리는 셀 채색 그림 |
데이터 흐름
입력 그림 ─(처리 해상도로 축소)→ ImageData ─(워커로 전달)→ IllustracyCore.process
→ 채널별 Float32Array (R, G, B, A, 복원색 U, 선 알파, 선 색, 마스크 …)
→ buildLayers: 층마다 RGBA를 내용이 있는 사각형으로 잘라 { x, y, w, h, data }
→ 층 트리 + 통계(시간, 파츠 수, 재현 PSNR)
← 워커에서 화면으로 버퍼 이동
→ 층마다 캔버스 생성 → 미리보기 합성 / 층 목록 / PSD 작성
층 객체는 { name, kind, blend, opacity, visible, clipping, x, y, w, h, data }, 폴더는 { name, kind: 'group', group: true, blend: 'pass', open, children }입니다.
kind(line, trace, flat, shadow, shadow2, highlight, gradient, shade, reflect, rim, effect, sparkle, bg, bgfx, glow, silhouette, rough)로 보정 도구와 PSD 작성기가 층의 역할을 알아봅니다.
상태 · 되돌리기 · 결정성
- 보정 표시
forceBg·forceChar는 처리용 그림 크기의 바이트 배열입니다. 옵션을 바꿔 다시 나눌 때 코어에 함께 넘깁니다. - 되돌리기 스택에는 바뀐 층의 사각형 줄들, 배경 층 전체, 표시의 이전 상태, 다시 나누기 전 결과 중 필요한 것만 저장합니다.
- 나누는 중에 다시 나누기를 요청하면 버리지 않고, 끝난 뒤 한 번 더 실행합니다.
- 모든 난수는 고정 씨앗의 mulberry32 생성기를 씁니다. 얼굴 찾기는 난수를 쓰지 않습니다. 같은 그림과 같은 설정이면 언제나 같은 결과가 나오고(두 번 나눈 모든 층의 픽셀이 바이트 단위로 같음), 한 단계를 고쳐도 다른 단계의 난수 흐름이 흔들리지 않습니다.
최적화
| 대상 | 방법 | 효과 |
|---|---|---|
| 팽창 · 침식 | 행 · 열로 나눈 1차원 슬라이딩 최대/최소, 단조 덱 | 반지름과 무관하게 픽셀당 |
| 가우시안 흐림 | 상자 흐림 3회, 누적 합 | 반지름과 무관하게 |
| 퍼짐 계산(채우기, 거리, 인페인팅) | 앞선 층만 도는 너비 우선 탐색, 거리 순서 방문 | 각 픽셀을 한 번씩만 방문 |
| 배경 색 모델 | 픽셀이 아닌 영역(수천 개) 단위 그래프 컷, Dinic 최대 흐름 | 4번 반복해도 가벼움 |
| k-평균 | 최대 5만 표본, k-means++ 초기화, 조기 종료 | 그림 크기와 무관한 군집 비용 |
| 층 저장 · PSD 압축 | 내용이 있는 사각형으로 잘라 저장, 채널 줄마다 PackBits RLE | 메모리와 PSD 크기 절약 |
| 계산 위치 | Web Worker, 결과 버퍼 이동(복사 없음) | 계산 중에도 화면이 멈추지 않음 |
| 보정 뒤 다시 나누기 | 자동 배경 판정 결과를 워커에 저장, 그림 내용의 해시와 선 설정이 같으면 그대로 씀 | 보정 한 번에 코어 계산 중앙값 8.0 → 5.1초 |
| 단계 격리 | 단계별 고정 난수 씨앗, 동작 조건 밖에서는 즉시 반환 | 새 단계가 기존 그림 결과를 바꾸지 않음(회귀 검증을 바이트 비교로) |
풀이 — 왜: 브라우저에서 큰 그림을 몇 초 안에 처리하려면 반지름 · 그림 크기에 따라 계산량이 늘지 않는 방법이 필요합니다. 원리: 은 픽셀 하나당 계산이 반지름과 상관없이 일정하다는 뜻이고, 은 픽셀 수 𝑁에 비례한다는 뜻입니다. 슬라이딩 최대/최소는 단조 덱으로 원소마다 몇 번의 비교만 하고, 상자 흐림은 누적 합으로 창 크기와 상관없이 한 번의 덧셈 · 뺄셈입니다. 참고: [R16] Lemire 2006 · [R17] Wells 1986 · [R27] Dinic 1970
10검증
모든 판은 정답이 있는 그림, 처음 보는 AI 생성 그림, 눈가림 판정으로 다시 잽니다. 결과가 나빠진 것도 그대로 적습니다.
한눈에 보기
분해능은 합성 그림 비중이 커서, AI 생성 그림에서 나아진 폭은 이보다 훨씬 작습니다. AI 생성 그림은 눈가림 시험으로 봐야 합니다.
PSD와 재현
- 모든 시험 그림에서 PSD를 psd-tools(Python)로 다시 합성해 원본과 비교했고, ag-psd(JavaScript)로 구조를 읽어 층 · 폴더 수가 프로그램과 같은지 확인했습니다.
- 층 구조(이름, 혼합 모드, 클리핑 기반, 빈 층, 캔버스 범위) 점검에서 문제는 0건이었습니다.
- 같은 그림을 두 번 나누면 모든 층의 픽셀이 바이트 단위로 같았습니다.
- 브라우저의 외부 네트워크 요청을 모두 막은 상태로도 실행해 확인했습니다(외부 요청 0건).
분해능
판마다 그 판의 코드를 그대로, 기본 설정으로 정답이 있는 그림 185장(합성 57장 · 캐릭터 윤곽 정답이 있는 AI 생성 그림 8장 · 자세 합성 120장)에 돌립니다. 배경 층의 알파가 128 이상인 픽셀을 배경, 나머지를 캐릭터로 보고, 투명 픽셀 · 정답 캐릭터 경계 둘레 3px · 글로우 픽셀은 채점에서 뺍니다. 그림마다 균형 오분류율
를 재고(아무것도 나누지 않으면 0.5, 완벽하면 0), 185장 평균의 역수를 분해능으로 둡니다. 95% 구간은 같은 그림을 짝지어 다시 뽑은 부트스트랩(10,000번, 씨앗 20261002)의 2.5 · 97.5 백분위입니다.
풀이 — 왜: 배경 · 캐릭터 분리의 오류를 한 수로 재야 버전끼리 견줄 수 있습니다. 배경이 넓은 그림과 좁은 그림이 섞여 있으므로 두 쪽 오류를 같은 무게로 봅니다. 원리: 균형 오분류율 BER은 캐릭터를 잃은 비율과 배경을 놓친 비율의 평균이라, 한쪽이 대부분인 그림에서도 "모두 한쪽"으로 답하는 결과가 좋게 나오지 않습니다(그러면 BER = 0.5). 분해능은 평균 BER의 역수이고, 0.1 대비 배수는 두 평균 BER의 비입니다. 구간은 그림 단위 짝 부트스트랩(같은 그림 표본을 두 판에 함께 다시 뽑음)으로 구합니다. 참고: [R54] Guyon et al. 2004 · [R80] Efron 1979
0.1 대비 배수(주요 판)
모든 판의 분해능 표 (0.1 ~ 0.59i)
| 판 | 바뀐 것 | 지킨 캐릭터 % | 찾은 배경 % | 평균 BER | 분해능 | 0.1 대비(배) | 95% 구간 | 합성 · AI 생성 · 자세(배) |
|---|---|---|---|---|---|---|---|---|
| 0.1 | 첫 버전 | 96.5 | 72.8 | 0.1533 | 6.52 | 1(기준) | — | 1.00 · 1.00 · 1.00 |
| 0.2 | 일러스트레이터식 층 구조, 인터넷 없이 실행 | 96.5 | 72.8 | 0.1533 | 6.52 | 1.00 | 1.00~1.00 | 1.00 · 1.00 · 1.00 |
| 0.3 | AI 생성 그림으로 다듬기, 작업 파일 층 | 95.2 | 75.4 | 0.1473 | 6.79 | 1.04 | 1.01~1.08 | 1.07 · 1.00 · 1.04 |
| 0.4 | 장면 배경과 정확한 선 | 80.8 | 85.1 | 0.1704 | 5.87 | 0.90 | 0.77~1.05 | 1.00 · 1.59 · 0.78 |
| 0.5 | 보정 도구 | 81.1 | 85.0 | 0.1696 | 5.90 | 0.90 | 0.77~1.06 | 1.01 · 1.67 · 0.78 |
| 0.6 | 잘린 부분 자동 판정, 올가미, 최대 파츠 수 | 81.1 | 84.6 | 0.1714 | 5.83 | 0.89 | 0.76~1.04 | 1.01 · 1.52 · 0.77 |
| 0.7 | 선으로 그린 배경 자동 분리 | 79.9 | 88.0 | 0.1605 | 6.23 | 0.95 | 0.80~1.15 | 0.96 · 1.90 · 0.85 |
| 0.8 | 레이어 모두 끄기 | 79.9 | 88.0 | 0.1605 | 6.23 | 0.95 | 0.80~1.15 | 0.96 · 1.90 · 0.85 |
| 0.9 | 끊기지 않는 러프 | 79.9 | 88.0 | 0.1605 | 6.23 | 0.95 | 0.80~1.15 | 0.96 · 1.90 · 0.85 |
| 0.10 | 딸려 들어간 캐릭터 부분 되돌리기, 전체 재검증 | 82.1 | 87.9 | 0.1498 | 6.67 | 1.02 | 0.85~1.23 | 0.96 · 1.91 · 0.95 |
| 0.11 | 그림을 재서 정하는 선 굵기 | 81.6 | 88.5 | 0.1496 | 6.69 | 1.02 | 0.85~1.24 | 1.00 · 1.91 · 0.93 |
| 0.12 | 얼굴을 찾아 배경 넓히기 | 80.7 | 88.8 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 1.98 · 0.89 |
| 0.13 | 가짜 얼굴 거르기 | 80.7 | 88.9 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 2.01 · 0.89 |
| 0.14 | 눈 · 피부 · 머리카락 이름 | 80.7 | 88.9 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 2.01 · 0.89 |
| 0.15 | 캐릭터별 폴더 | 80.7 | 88.9 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 2.01 · 0.89 |
| 0.16 | 외곽 글로우 층 | 80.7 | 88.9 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 2.02 · 0.89 |
| 0.17 | 붓 그림 밑색 정리 | 80.7 | 88.9 | 0.1522 | 6.57 | 1.01 | 0.84~1.21 | 1.02 · 2.02 · 0.89 |
| 0.18 | 이름 붙이기 재검증 | 80.7 | 88.7 | 0.1530 | 6.54 | 1.00 | 0.83~1.21 | 1.00 · 2.02 · 0.89 |
| 0.19 | 배경 · 얼굴 · 캐릭터 · 글로우 · 붓 그림 정리 재검증 | 85.7 | 89.8 | 0.1225 | 8.16 | 1.25 | 1.03~1.52 | 3.05 · 2.02 · 0.90 |
| 0.20 | 처음 보는 그림 300장으로 검증 | 85.7 | 89.8 | 0.1226 | 8.16 | 1.25 | 1.03~1.52 | 3.05 · 2.02 · 0.90 |
| 0.21 | 흰 배경 위의 흰 옷 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.22 | 가짜 얼굴이 붙이던 이름 · 폴더 줄이기 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.23 | 보정 뒤 다시 나누기를 빠르게 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.24 | 두 사람 그림의 폴더, 창백한 피부 이름 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.25 | 얼굴 없는 그림의 "피부" 색 이름 없애기 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.26 | 새 그림 342장 검증, 배경 없는 그림의 빈 배경 층, 얼굴과 배경 결과의 관계 | 86.3 | 89.7 | 0.1196 | 8.36 | 1.28 | 1.06~1.55 | 3.04 · 2.02 · 0.93 |
| 0.27 | 평평한 배경에서 얼굴 기준 넓히기 생략, 세부 조건별 결과 | 87.0 | 89.6 | 0.1167 | 8.57 | 1.31 | 1.09~1.59 | 3.04 · 2.02 · 0.96 |
| 0.28 | 떨어진 머리카락 조각의 이름 떼기 | 87.0 | 89.6 | 0.1167 | 8.57 | 1.31 | 1.09~1.59 | 3.04 · 2.02 · 0.96 |
| 0.29 | 큰 그림의 색 걸음 문턱을 그림 크기 비율로 | 87.1 | 89.6 | 0.1164 | 8.59 | 1.32 | 1.09~1.59 | 3.04 · 2.02 · 0.96 |
| 0.30 | 큰 그림은 줄여서 나누기(설정) | 87.1 | 89.6 | 0.1164 | 8.59 | 1.32 | 1.09~1.59 | 3.04 · 2.02 · 0.96 |
| 0.31 | 선으로 둘러싸인 곳은 배경으로 가져가지 않기 | 87.1 | 89.1 | 0.1188 | 8.42 | 1.29 | 1.08~1.55 | 3.05 · 1.70 · 0.96 |
| 0.32 | 배경을 못 찾는 그림 줄이기 | 87.1 | 89.1 | 0.1188 | 8.42 | 1.29 | 1.08~1.55 | 3.05 · 1.70 · 0.96 |
| 0.33 | 캐릭터 층 검증, 캐릭터 사이로 보이는 배경(틈) | 87.1 | 89.2 | 0.1186 | 8.43 | 1.29 | 1.08~1.55 | 3.05 · 1.70 · 0.96 |
| 0.34 | 한계 다시 풀기: 흰 배경의 좁은 틈, 좌우 합의 얼굴, 검은 머리 되돌리기 | 87.8 | 89.2 | 0.1150 | 8.70 | 1.33 | 1.11~1.61 | 3.73 · 1.70 · 0.97 |
| 0.35 | 층 이름 "색 트레이스", 예전 PSD 층 이름 바꾸기 도구 | 87.8 | 89.2 | 0.1150 | 8.70 | 1.33 | 1.11~1.61 | 3.73 · 1.70 · 0.97 |
| 0.36 | 예전 PSD 층 이름 고치기를 프로그램 안으로 | 87.8 | 89.2 | 0.1150 | 8.70 | 1.33 | 1.11~1.61 | 3.73 · 1.70 · 0.97 |
| 0.37 | 기울어진 그림, 검은 옷이 배경으로 새는 것 막기 | 91.0 | 89.0 | 0.0999 | 10.01 | 1.53 | 1.29~1.84 | 3.46 · 1.70 · 1.18 |
| 0.38 | 장면 배경에 넘어간 선 없는 옷 · 다리 되돌리기 | 94.6 | 88.2 | 0.0862 | 11.60 | 1.78 | 1.50~2.14 | 3.43 · 1.70 · 1.44 |
| 0.39 | 밑색: 흰색에 묻힌 색 · 작은 색 면 · 그림자 밑색 | 94.6 | 88.2 | 0.0862 | 11.60 | 1.78 | 1.50~2.14 | 3.43 · 1.70 · 1.44 |
| 0.40 | 선으로 그린 방의 바닥 | 94.6 | 91.1 | 0.0716 | 13.96 | 2.14 | 1.79~2.61 | 3.43 · 1.70 · 1.90 |
| 0.41 | 테두리에서 잘린 머리카락 끝 · 소매 되돌리기 | 94.6 | 91.0 | 0.0718 | 13.93 | 2.14 | 1.79~2.60 | 3.43 · 1.69 · 1.90 |
| 0.42 | 검은 다리 · 옷을 배경으로 덜 보내기 | 95.4 | 91.0 | 0.0680 | 14.71 | 2.25 | 1.89~2.75 | 3.43 · 1.68 · 2.07 |
| 0.43 | 어두운 캐릭터 부분 · 선으로 그린 배경 물건 | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.44 | 사람이 그은 듯한 러프 | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.45 | 러프 세부 지키기 | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.46 | 두 가지 러프(컨셉 · 다듬기) | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.47 | 따라 긋는 러프 | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.48 | 이름용 얼굴의 머리 구조 단서 · 단계별 채색 폴더 · 배경 개선 순환 8주기 | 99.5 | 95.3 | 0.0259 | 38.58 | 5.91 | 4.33~8.63 | 9.43 · 1.67 · 10.56 |
| 0.49 | 신경망 보조(통계식과 신경망이 함께 배경이라 할 때만 남은 배경 지우기) | 99.5 | 95.5 | 0.0250 | 40.03 | 6.14 | 4.50~8.91 | 9.43 · 1.80 · 10.56 |
| 0.50 | 신경망 보조 강화(통계식 점수와 신경망 점수를 한 식으로 묶어 지우기) | 99.5 | 95.7 | 0.0240 | 41.75 | 6.40 | 4.73~9.25 | 9.67 · 1.90 · 10.96 |
| 0.51 | 누끼 모델(애니 캐릭터 분할 신경망을 8비트로 줄여 앱 안에 넣음)로 캐릭터를 통째로 골라내고 나머지를 배경 층으로 | 98.1 | 99.0 | 0.0146 | 68.59 | 10.51 | 6.80~17.77 | 7.32 · 4.34 · 24.51 |
| 0.52 | 누끼 모델 확률에 기존 방식(신경망 + 통계식)의 판정을 더해 캐릭터를 정함(코어 뒤 단계 없이) | 98.5 | 98.8 | 0.0135 | 73.90 | 11.33 | 7.13~20.43 | 8.13 · 3.96 · 33.16 |
| 0.53 | 누끼 모델이 캐릭터를 거의 찾지 못한 그림은 기존 방식(신경망 + 통계식)의 판정을 그대로 씀 | 99.0 | 98.7 | 0.0115 | 87.23 | 13.37 | 9.24~22.15 | 13.13 · 3.96 · 33.16 |
| 0.54 | 누끼 모델을 미세 학습한 판을 원래 모델과 함께 돌려 두 확률의 가중 평균(0.6 · 0.4)과 문턱 0.55로 캐릭터를 정함(출시 앱 그대로 다시 잰 값, 0.55 정정) | 99.4 | 98.6 | 0.0104 | 96.51 | 14.80 | 10.09~24.70 | 24.77 · 3.88 · 29.04 |
| 0.55 | 효과(글로우 · 파티클 · 빛줄기)를 배경으로 세도록 누끼 모델을 더 학습한 판을 원래 모델과 함께 돌려 두 확률의 평균(0.5 · 0.5)과 문턱 0.55로 캐릭터를 정함 | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.56 | 캐릭터를 뺀 자리의 배경을 신경망(big-lama)과 패치 맞춤으로 추정해 채운 '배경 메꿈' 층을 '배경' 층 바로 위에 넣음(배경 층은 그대로)(185장 모두 0.55와 바이트 단위로 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.57 | 러프 2를 G펜으로 선화 따라 긋기(지역 대비 선 · 펜 굵기 · 필압 · 손떨림 보정), 러프 1은 연필 결(185장 모두 0.55와 바이트 단위로 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.58 | 러프 2의 굵은 선(눈 테두리 · 속눈썹)을 두 크기 창으로 가운데 한 줄로 긋기, 처음 보는 240장 눈가림(185장 모두 0.55와 바이트 단위로 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.59e | 러프 2에 필압 곡선 · 선 중요도 진하기 · 덧긋기, 눈 · 입 상자 따라 긋기, 전문가 역할 눈가림(185장 모두 0.55와 바이트 단위로 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.59h | 앱 파일 안의 도움말을 빼고 도움말 버튼이 같은 폴더의 도움말 파일을 엶(코어 · 모델이 0.59e와 같아 185장 모두 0.55와 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
| 0.59i | 예제 그림 버튼이 앱에 넣어 둔 그림 10장 중 하나를 무작위로 엶(코어 · 모델이 0.59h와 같아 185장 모두 0.55와 같음) | 99.5 | 98.7 | 0.0088 | 114.28 | 17.52 | 11.87~29.98 | 55.71 · 4.06 · 33.24 |
0.4부터 장면 배경을 찾으면서 AI 생성 그림의 배경을 찾게 됐지만 합성 그림의 캐릭터도 함께 가져가, 0.4부터 0.18까지는 0.1과 비슷하거나 낮았습니다. 0.19에서 합성 그림의 캐릭터를 되찾았고, 0.37 · 0.38 · 0.40 · 0.42에서 자세 합성 그림이 차례로 나아졌으며, 0.43에서 어두운 캐릭터 부분과 선으로 그린 방을 고쳐 크게 뛰었습니다. 0.44부터 0.48까지는 러프 · 이름용 얼굴 · 채색 폴더만 바꿔(0.48의 배경 개선 순환 8주기는 채택된 후보 없음) 185장 모두 배경 지도가 0.43과 바이트 단위로 같습니다. 0.49는 신경망 보조로 AI 생성 그림 8장 중 5장에서 배경을 더 찾았고(찾은 배경 40.9 → 45.3%, 지킨 캐릭터 99.2 → 99.1%, 5장 모두 BER이 낮아짐), 합성 · 자세 합성 177장은 배경 지도가 0.48과 바이트 단위로 같습니다. 0.50은 같은 통계식 · 신경망 점수를 한 식으로 묶어 185장 중 26장이 바뀌었고(BER 좋아짐 19 · 나빠짐 7), AI 생성 그림 8장의 찾은 배경은 45.3 → 48.4%, 지킨 캐릭터는 99.1 → 98.8%입니다. 0.51은 누끼 모델로 캐릭터를 정해 0.50과 비교해 185장 중 170장이 바뀌었고(BER 좋아짐 118 · 나빠짐 52), AI 생성 그림 8장의 찾은 배경은 48.4 → 82.7%, 지킨 캐릭터는 98.8 → 94.2%입니다. 합성 그림 묶음은 0.1 대비 9.67 → 7.32배로 낮아졌습니다(프로그램으로 그린 캐릭터는 모델이 덜 알아봄). 0.52는 모델 확률에 기존 방식의 판정을 더해 0.51과 비교해 185장 중 167장이 바뀌었고(BER 좋아짐 73 · 나빠짐 94), AI 생성 그림 8장의 지킨 캐릭터는 94.2 → 96.4%, 찾은 배경은 82.7 → 78.3%, 합성 묶음은 0.1 대비 7.32 → 8.13배, 자세 합성 묶음은 24.51 → 33.16배입니다. 185장은 0.52 후보를 고르는 데 쓰지 않았습니다. 0.53은 185장 중 1장만 0.52와 다릅니다(합성 그림 lineless_scene: 모델이 캐릭터를 놓친 그림, BER 0.500 → 0.118). 평균 BER이 0.0135 → 0.0115로 내린 것은 모두 이 1장 때문이고, 나머지 184장은 0.52와 같습니다. 95% 구간도 0.52(7.13~20.43배)와 거의 겹칩니다. 0.54는 두 모델의 평균이라 185장 중 154장이 0.53과 다르고(BER 좋아짐 119 · 나빠짐 35), 평균 BER 0.0115 → 0.0104, 0.1 대비 13.37 → 14.80배입니다. 이 값은 0.55를 내면서 출시 앱 그대로(두 확률 0.6 · 0.4) 다시 잰 것으로, 0.54를 낼 때 적은 15.06배는 측정 벤치가 두 확률을 단순 평균한 판의 값이었습니다. 이 185장은 0.54의 모델 학습 · 규칙 고르기에 쓰지 않았습니다. 0.55는 더 학습한 판을 효과 학습 판으로 바꾸고 두 확률을 같은 무게로 평균해 185장 중 140장이 0.54와 다르고(BER 좋아짐 68 · 나빠짐 72; 합성 37 · AI 생성 8 · 자세 95장), 평균 BER 0.0104 → 0.0088, 0.1 대비 14.80 → 17.52배로 0.54보다 높습니다. AI 생성 그림 8장은 지킨 캐릭터 97.0 → 96.4% · 찾은 배경 77.3 → 78.9%(3.88 → 4.06배), 합성 묶음 24.77 → 55.71배, 자세 합성 묶음 29.04 → 33.24배입니다. 이 185장은 0.55의 모델 학습 · 고르기에 쓰지 않았습니다.
러프 재능
분해능처럼 러프가 판마다 얼마나 나아졌는지를 0.1을 100%로 두고 잽니다. 러프는 정답이 없어, "어느 쪽이 더 사람(일러스트레이터)이 직접 그린 러프 같은가"를 AI 채점자가 판끼리 견준 눈가림으로 잽니다(재는 법은 채점 전에 고정). 러프가 한 장이면(0.45까지) 그 층, 두 장이면(0.46부터) 러프 2를 그 판의 앱 코드 그대로 고정 60장에 그렸습니다. 러프를 그리는 함수가 같은 판끼리 한 세대(아홉 세대)로 보아 세대마다 첫 판과 끝 판, 12칸을 매겼습니다. 그림마다 시트 5장(모든 시트에 0.1 · 0.59e와 가운데 칸 3개씩), 모두 300시트를 전문가 역할 AI 채점자 31명(사람 아님)이 순위로 매겼고, 시트 안의 모든 짝(2760짝)을 데이비드슨 모형(같음이 있는 브래들리-테리 모형)으로 묶습니다.
풀이 — 왜: 판이 많아 한 시트에 모두 놓을 수 없으므로 몇 판씩 놓고 한 모형으로 묶어 같은 자로 잽니다. 원리: 판마다 강도 π를 두고, 뽑힐 확률을 강도의 몫으로 둡니다(같음은 기하평균에 비례, ν = 0.18). 강도의 비는 0.1과 맞대었을 때 같음을 빼고 이길 승산이라 0.1 = 100%의 배수가 됩니다. 구간은 그림 단위 부트스트랩(2,000번)의 백분위입니다. 참고: [R96] Bradley · Terry 1952 · [R97] Davidson 1970
0.1 대비 % (매긴 12칸)
| 판 | 러프 재능 | 95% 구간 | 80% 구간 | 0.1과 맞대기(이김 : 같음 : 짐) | 따로 보아 사람 러프로 보임 |
|---|---|---|---|---|---|
| 0.1 | 100% | — | — | — | 30% (91/300) |
| 0.8 | 153% | 114~215% | 127~190% | 16 : 38 : 6 | 38% (23/60) |
| 0.9 | 98% | 63~154% | 72~131% | 24 : 0 : 36 | 30% (18/60) |
| 0.43 | 72% | 46~110% | 53~96% | 51 : 2 : 67 | 25% (30/120) |
| 0.44 | 81% | 48~136% | 58~114% | 30 : 0 : 30 | 18% (11/60) |
| 0.45 | 204% | 128~329% | 150~282% | 74 : 1 : 45 | 41% (49/120) |
| 0.46 | 110% | 65~188% | 78~156% | 40 : 0 : 20 | 25% (15/60) |
| 0.47 | 239% | 143~423% | 172~346% | 82 : 2 : 36 | 44% (53/120) |
| 0.56 | 367% | 200~701% | 247~574% | 42 : 0 : 18 | 55% (33/60) |
| 0.57 | 174% | 111~285% | 129~242% | 80 : 0 : 40 | 29% (35/120) |
| 0.58 | 157% | 97~265% | 113~222% | 40 : 0 : 20 | 28% (17/60) |
| 0.59e | 247% | 156~419% | 184~351% | 202 : 0 : 98 | 52% (157/300) |
가장 높은 판은 0.56(367%)입니다. 러프 코드가 0.47과 같으므로 0.47 → 0.56의 차이는 그사이 배경 · 캐릭터 판정이 바뀐 몫입니다(직접 맞대기 28 : 9(같음 23)). G펜으로 선화를 따라 긋는 0.57 · 0.58에서 내려갔고 0.59e에서 다시 올랐습니다. 0.59e는 0.56보다 낮습니다(직접 맞대기 22 : 34(같음 4)). 0.59의 3-B(선화가 뚜렷한 캐릭터 그림 138장, 두 판만 견줌)에서는 0.59e가 100 : 33으로 이겼으므로, 0.59e는 선화가 뚜렷한 그림에서 강하고 어둡거나 복잡한 그림까지 넣으면 0.56보다 낮게 보인다고 읽습니다.
모든 판의 러프 재능 (0.1 ~ 0.59i)
| 판 | 러프 코드 세대 | 러프 재능 | 95% 구간 | 비고 |
|---|---|---|---|---|
| 0.1 | 0.1~0.8 | 100% | — | 매긴 칸 |
| 0.2 | 0.1~0.8 | — | — | 재지 않음 — 같은 러프 코드(세대 0.1~0.8: 0.1 100% · 0.8 153%), 앞 판과 같은 러프 1/60장 |
| 0.3 | 0.1~0.8 | — | — | 재지 않음 — 같은 러프 코드(세대 0.1~0.8: 0.1 100% · 0.8 153%), 앞 판과 같은 러프 0/60장 |
| 0.4 | 0.1~0.8 | — | — | 재지 않음 — 같은 러프 코드(세대 0.1~0.8: 0.1 100% · 0.8 153%), 앞 판과 같은 러프 0/60장 |
| 0.5 | 0.1~0.8 | — | — | 재지 않음 — 같은 러프 코드(세대 0.1~0.8: 0.1 100% · 0.8 153%), 앞 판과 같은 러프 35/60장 |
| 0.6 | 0.1~0.8 | — | — | 재지 않음 — 같은 러프 코드(세대 0.1~0.8: 0.1 100% · 0.8 153%), 앞 판과 같은 러프 49/60장 |
| 0.7 | 0.1~0.8 | 153% | 114~215% | = 0.8(60장 러프 모두 바이트로 같음) |
| 0.8 | 0.1~0.8 | 153% | 114~215% | 매긴 칸 |
| 0.9 | 0.9~0.43 | 98% | 63~154% | 매긴 칸 |
| 0.10 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 34/60장 |
| 0.11 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 52/60장 |
| 0.12 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 26/60장 |
| 0.13 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 48/60장 |
| 0.14 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.15 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.16 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.17 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 12/60장 |
| 0.18 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 55/60장 |
| 0.19 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 55/60장 |
| 0.20 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 58/60장 |
| 0.21 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 3/60장 |
| 0.22 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.23 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.24 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.25 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.26 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.27 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 46/60장 |
| 0.28 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.29 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 50/60장 |
| 0.30 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.31 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 3/60장 |
| 0.32 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 59/60장 |
| 0.33 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 45/60장 |
| 0.34 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 42/60장 |
| 0.35 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.36 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.37 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 39/60장 |
| 0.38 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 35/60장 |
| 0.39 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.40 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 60/60장 |
| 0.41 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 49/60장 |
| 0.42 | 0.9~0.43 | — | — | 재지 않음 — 같은 러프 코드(세대 0.9~0.43: 0.9 98% · 0.43 72%), 앞 판과 같은 러프 25/60장 |
| 0.43 | 0.9~0.43 | 72% | 46~110% | 매긴 칸 |
| 0.44 | 0.44 | 81% | 48~136% | 매긴 칸 |
| 0.45 | 0.45 | 204% | 128~329% | 매긴 칸 |
| 0.46 | 0.46 | 110% | 65~188% | 매긴 칸 |
| 0.47 | 0.47~0.56 | 239% | 143~423% | 매긴 칸 |
| 0.48 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 31/60장 |
| 0.49 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 44/60장 |
| 0.50 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 23/60장 |
| 0.51 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 0/60장 |
| 0.52 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 3/60장 |
| 0.53 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 56/60장 |
| 0.54 | 0.47~0.56 | — | — | 재지 않음 — 같은 러프 코드(세대 0.47~0.56: 0.47 239% · 0.56 367%), 앞 판과 같은 러프 2/60장 |
| 0.55 | 0.47~0.56 | 367% | 200~701% | = 0.56(60장 러프 모두 바이트로 같음) |
| 0.56 | 0.47~0.56 | 367% | 200~701% | 매긴 칸 |
| 0.57 | 0.57 | 174% | 111~285% | 매긴 칸 |
| 0.58 | 0.58 | 157% | 97~265% | 매긴 칸 |
| 0.59e | 0.59e | 247% | 156~419% | 매긴 칸 |
| 0.59h | 0.59e | 247% | 156~419% | = 0.59e(코어 · 모델이 같아 러프도 같음) |
| 0.59i | 0.59e | 247% | 156~419% | = 0.59h(코어 · 모델이 같아 러프도 같음) |
눈가림 시험
정답이 없는 AI 생성 그림으로도 견줍니다. 픽시브 AI 생성 그림 중 캐릭터가 있는 그림에서 일관된 세트와 섞인 세트마다 30장씩 60장(목록 고정)을 뽑아 0.1과 최근 판들을 돌렸습니다. 그림마다 서로 다른 결과만 모아 무작위 글자를 붙여 어느 판인지 모르게 원본 옆에 놓고 등급(완벽 분리 · 캐릭터 온전 · 작은 조각 손실 · 큰 손실 · 배경 못 찾음)을 매긴 뒤 풀었습니다. "큰 손실 없음"은 앞의 세 등급이고, 괄호 안은 장수와 윌슨 95% 구간입니다.
| 판 | 큰 손실 없음 | 캐릭터 무손실 | 큰 손실 | 배경 못 찾음 |
|---|---|---|---|---|
| 0.1 | 31.7% (19/60, 21.3~44.2) | 26.7% | 6.7% | 61.7% |
| 0.53 | 81.7% (49/60, 70.1~89.4) | 71.7% | 13.3% | 5.0% |
| 0.54 | 85.0% (51/60, 73.9~91.9) | 80.0% | 11.7% | 3.3% |
| 0.55 | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.56 | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.57 | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.58 | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.59e | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.59h | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
| 0.59i | 86.7% (52/60, 75.8~93.1) | 76.7% | 8.3% | 5.0% |
0.56 · 0.57 · 0.58 · 0.59e · 0.59h · 0.59i는 배경 층이 0.55와 바이트 단위로 같아(60장 모두 0.56 · 0.59e 앱 코드로 확인, 0.59h · 0.59i는 코어가 0.59e와 같음) 0.55의 판정 그대로입니다. 0.55 때 0.1 · 0.53 · 0.54 · 0.55 네 판을 한자리에서 함께 다시 매겼습니다(채점자 4명이 15장씩, 앱 코드 그대로 기본 설정; 0.54는 출시 앱과 같은 가중 평균으로 다시 돌린 결과). 0.55는 58장에서 0.54와 결과가 다릅니다. 0.54 → 0.55는 "큰 손실 없음" 들어옴 1 · 빠짐 0(McNemar 정확 검정 ), 등급 오름 2 · 내림 6입니다. 0.53 → 0.55는 들어옴 3 · 빠짐 0(), 0.1 → 0.55는 들어옴 35 · 빠짐 2입니다. 채점자마다 무엇을 캐릭터로 보는지(손에 든 물건 · 동물 · 배경 속 인물)가 조금씩 달라 비율의 크기는 채점자에 따라 흔들립니다(0.54 때 함께 매긴 판정에서 0.1은 26.7% · 0.53은 86.7% · 0.54는 86.7%). 같은 기준으로 함께 매긴 판 사이의 차이로 읽어야 합니다.
풀이 — 왜: 𝑝가 0이나 1에 가깝거나 𝑛이 작으면 구간이 0 아래 · 1 위로 나가거나 실제 포함 확률이 모자랍니다. 윌슨 구간은 이런 경우에도 잘 맞습니다. 원리: 를 참 비율 𝜋에 대한 2차 부등식으로 풀어 얻은 구간입니다. 표준오차에 관측값 𝑝 대신 미지의 𝜋를 넣었기 때문에 가운데가 쪽으로 당겨지고, 늘 0~1 안에 있습니다. 참고: [R56] Wilson 1927 · [R78] Agresti 2013
풀이 — 왜: 같은 그림을 두 방법으로 판정한 짝 자료는 독립이 아니므로, 두 방법의 결과가 갈린 그림만으로 견줍니다. 원리: 두 방법이 같은 판정을 낸 그림은 차이에 대한 정보가 없습니다. 차이가 없다면 갈린 𝑏 + 𝑐장은 어느 쪽으로든 반반이라 𝑏가 이항분포 를 따르고, 크면 카이제곱 근사(연속성 보정 −1)를 씁니다. 참고: [R72] McNemar 1947
러프 눈가림 짝 판정
러프는 정답이 없어 사람의 눈으로 견줍니다. 회마다 처음 보는 픽시브 AI 생성 그림 40장(앞 시험 · 조정에 쓴 그림을 모두 뺀 나머지에서 무작위로 새로 뽑음)으로, 원본 옆에 두 러프(전체 모습과 두 러프가 가장 다른 300px 칸의 2배 확대)를 놓고 채점자가 어느 쪽이 어느 판인지 모르는 채 세 기준으로 고릅니다: 작가(이 러프에서 선화가 나왔다고 믿을 만함) · 사람 손(연필로 그은 것 같음) · 형태(얼굴 · 손 · 몸 · 소품의 모양과 자리가 맞음). 칸은 "새 쪽이 나음 : 견준 쪽이 나음"(같음은 뺌)이고 괄호는 양쪽 부호 검정의 입니다.
풀이 — 왜: 짝 판정에서 한쪽이 더 자주 나았던 것이 우연인지 봅니다. 원리: 같음을 뺀 "나음 : 나쁨" 수는 두 판에 차이가 없다면 반반이어야 하므로, 이항분포 에서 관측만큼 이상 치우칠 양쪽 확률을 𝑝로 씁니다(부호 검정). 정규 근사 없이 정확한 값이라 판정 수가 적어도 맞습니다. 참고: [R85] Dixon · Mood 1946
| 회 | 견준 것 | 작가 | 사람 손 | 형태 |
|---|---|---|---|---|
| 10 | 러프 2(선화의 선을 모두 따라 긋기) 대 0.46 러프 2 | 3 : 22 (0.00016) | 2 : 28 (8.7×10⁻⁷) | 9 : 10 (1.0) |
| 10 | 러프 1 대 0.46 러프 1 | 10 : 24 (0.024) | 4 : 27 (3.4×10⁻⁵) | 23 : 3 (8.8×10⁻⁵) |
| 11 | 러프 2(눈은 따라 긋기 · 무늬 고리 빼기) 대 0.46 러프 2 | 2 : 5 (0.45) | 4 : 4 (1.0) | 8 : 5 (0.58) |
| 11 | 러프 1 대 0.46 러프 1(내놓는 러프 1) | 13 : 17 (0.58) | 11 : 14 (0.69) | 26 : 6 (0.00054) |
| 12 | 러프 2(선화로 윤곽 · 옅은 선 · 짧은 선 · 배경 구도) 대 11회 | 12 : 6 (0.24) | 14 : 8 (0.29) | 15 : 8 (0.21) |
| 13 | 러프 2(이어 긋기 · 조금 굵고 진하게) 대 12회(내놓는 러프 2) | 8 : 1 (0.039) | 19 : 5 (0.0066) | 12 : 0 (0.00049) |
| 13 | 러프 2 대 0.45 러프 | 27 : 11 (0.014) | 30 : 10 (0.0022) | 6 : 22 (0.0037) |
회차마다 앞 회의 메모를 보고 고쳤으므로, 고친 판은 늘 처음 보는 새 그림으로 다시 쟀습니다. 러프 2는 0.46 ≈ 11회 → 12회 → 13회로 좋아졌고, 0.45보다 작가가 그렸을 법하고 사람 손 같다는 판정을 받았지만 형태는 아직 0.45가 앞섭니다. 0.45는 선화를 굵게 따라 그리고 원본을 옅게 깔아 모양이 잘 읽히는 대신 "베낀 듯하다"는 판정을 받았습니다.
0.58 러프 2 대 0.56 러프 2, 처음 보는 픽시브 AI 생성 그림 240장(개발에 안 쓴 보류 97장 + 크기 네 칸으로 고르게 뽑은 143장): AI 채점자 12명(같은 언어 모델의 서로 다른 새 세션, 사람 아님)이 20장씩, 어느 판인지 모르는 채 "어느 쪽이 더 사람이 그린 러프 같은가"와 이상한 점 · 의미 손실을 매겼습니다(한 그림 한 번).
| 0.56 | 0.58 | 짝(0.56만 : 0.58만) | |
|---|---|---|---|
| 더 사람이 그린 러프 같음 | 153 | 65 | 같음 22 (부호 검정 2.3×10^-9) |
| 의미를 크게 잃음 | 92 | 84 | 20 : 12 (0.22) |
| 의미를 잃은 곳 있음 | 212 | 190 | 27 : 5 (1.1×10^-4) |
| 이상한 점: 엉킴 | 110 | 131 | 30 : 51 (0.03) |
| 이상한 점: 얼굴 붕괴 | 88 | 66 | 36 : 14 (2.6×10^-3) |
| 이상한 점: 끊긴 선 | 72 | 63 | 35 : 26 (0.31) |
| 이상한 점: 자글자글 | 15 | 80 | 8 : 73 (3.0×10^-14) |
| 이상한 점: 기계적 | 10 | 117 | 2 : 109 (4.8×10^-30) |
| 이상한 점: 빠진 형태 | 124 | 95 | 38 : 9 (2.5×10^-5) |
| 이상한 점: 없는 선 | 28 | 14 | 19 : 5 (6.6×10^-3) |
| 이상한 점: 진하기 | 67 | 22 | 63 : 18 (5.2×10^-7) |
채점자 메모를 보면 두 판의 성격이 거의 늘 갈렸습니다. 0.58은 굵기가 고른 가는 선으로 면의 양쪽 테두리 · 머리카락 가닥 · 사슬 · 레이스를 빠짐없이 따, 짧은 토막 · 잔가시 · 사다리 모양이 생기고 "윤곽을 딴 트레이스 같다"는 메모가 많았습니다. 0.56은 강약이 있는 길고 느슨한 획이라 손 러프에 가깝지만, 얼굴 · 눈 · 손 · 앞쪽 소품을 통째로 빠뜨리거나 눈을 고리 · 글자 같은 낙서로 긋는 일이 잦았습니다. 채점자들은 대개 한쪽만 얼굴이 살아 있으면 그쪽을, 둘 다 살아 있으면 획이 느슨한 쪽을 골랐습니다. 두 판 모두 무너진 그림은 질감이 강한 회화풍 · 어두운 그림 · 복잡한 장면(군중 · 메카 · 체크무늬)이었고, 워터마크 · 효과음 글자 · 화면 띠 경계도 두 판 모두 따라 그렸습니다. 판과 상관없이 B를 조금 더 골랐지만(A 91 : B 127), 0.58이 A였을 때 0.58 : 0.56 = 21 : 83, B였을 때 44 : 70으로 어느 자리에서도 0.56이 앞섭니다. 개발자는 러프 2를 고른 굵기의 펜으로 면의 양쪽 윤곽까지 모두 따라 정리하는 것이 실제 일러스트레이터의 작업 방식이라며 "기계적" · "사람 같음" 판정에 동의하지 않았고, 배포 판단은 이 판정에 기대지 않았습니다(채점자는 일러스트레이터가 아닌 AI).
0.59 · 0.59e 눈가림(AI 채점자, 사람 아님): 회차마다 새 채점자 · 새 시트로 "어느 쪽이 더 사람(일러스트레이터)이 그린 러프 같은가"와, 판마다 "따로 보아 사람이 그린 러프로 보이는가" · 의미를 크게 잃었는가를 물었습니다. 2차부터는 캐릭터가 주인공이고 선화가 뚜렷한 138장에서, 실제 작가 러프 5장을 먼저 보였고, 3-A부터는 일본풍 일러스트 구성과 디지털 드로잉에 해박한 전문가 역할을 맡겼습니다. 같은 회차 안의 짝만 검정입니다.
| 회차 | 그림 · 채점자 | 견준 판 | 사람 같음 새 : 기준 : 같음 (p) | 따로 보아 사람 러프(기준 → 새) | 크게 잃음(기준 → 새) |
|---|---|---|---|---|---|
| 1차 | 처음 보는 240장 · 12명 | 0.59 대 0.56 | 127 : 71 : 42 (8.4×10^-5) | 78 → 95 | 96 → 85 |
| 2차 | 138장 · 7명 | 0.59 대 0.56 | 89 : 39 : 10 (1.2×10^-5) | 43 → 77 | 48 → 37 |
| 2차 대조 | 138장 · 7명 | 0.58 대 0.56 | 42 : 92 : 4 (1.9×10^-5) | 63 → 50 | 42 → 38 |
| 3-A | 138장 · 전문가 역할 15명 | 0.59 대 0.56 | 73 : 57 : 8 (0.19) | 52 → 76 | 47 → 29 |
| 3-B | 138장 · 전문가 역할 15명 | 0.59e 대 0.56 | 100 : 33 : 5 (5.0×10^-9) | 54 → 83 | 49 → 31 |
| 3-C | 138장 · 전문가 역할 15명 | 0.59f 대 0.56 | 51 : 82 : 5 (9.0×10^-3) | 74 → 47 | 36 → 37 |
| 3-D | 138장 · 전문가 역할 15명 | 0.59g 대 0.59e | 4 : 3 : 131 (1.00) | 45 → 45 | 55 → 55 |
3-B에서 0.59e는 "엉킴" 96 → 62 · "얼굴 붕괴" 55 → 35 · "끊긴 선" 36 → 18장으로 줄고, "기계적" 21 → 34장으로 늘었습니다. 0.59f(빽빽한 곳 가볍게 + 엇갈림 솎기)는 옅고 끊긴 트레이스로 보여 0.56에 졌고, 0.59g(엇갈림 솎기를 누그러뜨림)는 138장 중 131장이 같음으로 0.59e와 구별되지 않아, 미리 정한 규칙대로 0.59e를 냈습니다. 3-D에서 0.59e만 따로 본 비율(사람 러프 45장 · 크게 잃음 55장)은 0.56과 짝으로 견준 값이 아니라 판의 차이로 읽지 않습니다(같은 0.56도 회차에 따라 54장 · 74장으로 매겨짐).
시험 그림 모음
| 모음 | 쓰임 |
|---|---|
| 시험 그림 25장 | 처음 규칙을 맞춘 그림. 얼굴 평균 무늬는 이 중 24장의 얼굴 31개로 만듦 |
| 합성 정답 그림 57장 | 캐릭터 · 배경 · 글로우 · 재질 정답을 아는 합성 그림(분해능의 한 묶음) |
| 자세 합성 120장 · 합성 10,080장 | 전신 자세 · 배경 · 밑색 · 얼굴 · 사물을 교차한 정답 그림 |
| 처음 보는 픽시브 AI 생성 그림 300장 · 342장 · 111장 | 규칙을 다듬을 때 쓰지 않은 AI 생성 그림(합쳐 777장). 세부 조건별 결과, 성분 단위 눈가림 채점 |
| 눈가림 60장 | 목록을 고정한 AI 생성 그림. 판마다 함께 다시 매김 |
| 러프 눈가림 40장 × 4회 | 회마다 앞에서 쓰지 않은 그림을 새로 뽑음 |
11한계
알려진 약점을 숨기지 않고 적었습니다. 대부분은 보정 도구로 고칠 수 있습니다.
누끼 모델(0.51 ~ 0.55)
- 사람 모양이 아닌 캐릭터(동물 · 몬스터 팬아트)는 통째로 놓칠 수 있습니다. 게시물에 함께 올라온 누끼 14장 중 1장(이상해씨 팬아트)에서 0.51 · 0.52는 캐릭터를 전혀 찾지 못했습니다. 0.53은 이런 그림에서 기존 방식의 판정을 그대로 써 대부분 찾지만(BER 0.500 → 0.106), 모델이 캐릭터의 일부라도(그림의 1% 이상) 찾으면 이 규칙이 켜지지 않습니다.
- 오라 · 불꽃처럼 캐릭터를 두른 효과는 배경으로 보냅니다. 작가가 효과를 캐릭터 층에 넣은 그림에서는 그만큼 캐릭터가 빠진 것으로 보입니다.
- 프로그램으로 그린 합성 캐릭터는 덜 알아봐서, 정답 185장의 합성 그림 묶음은 0.50보다 낮습니다(0.1 대비 9.67 → 7.32배). AI 생성 그림 8장은 찾은 배경이 늘고 지킨 캐릭터가 조금 줄었습니다(98.8 → 94.2%).
- 그림당 십여 초(스레드 1개 WASM) 더 걸리고, 처음 쓸 때 모델을 펼치는 데 몇 초 더 걸립니다. 브라우저 메모리를 0.5GB 안팎 더 씁니다. 앱 파일은 약 54MB입니다.
- 투명한 픽셀이 있는 그림(투명 PNG)에는 쓰지 않습니다(배경을 찾지 않는 그림).
- 0.52의 더하기는 게시물에 함께 올라온 누끼 14장을 고르기에 썼으므로 그 14장의 값은 바깥 추정이 아닙니다. 기존 방식을 한 번 더 돌려 그림당 시간이 0.51의 1.75배(그림 4장을 같은 조건에서 따로 돌린 가운데값)입니다.
- 0.55는 효과를 배경으로 세도록 더 학습한 판으로 바꿨지만 한 모델로는 그릇 · 소품 같은 배경 물건을 캐릭터로 넣어, 0.54처럼 원래 모델과 평균해 씁니다(모델 두 번, 시간은 0.54의 약 1.03배). 효과 합성 100장 BER은 0.54의 0.0383 → 0.0269로 줄었지만 한 모델(0.0179)의 절반쯤입니다. 섞기 무게 w 0.5는 결과를 본 뒤 고른 것이라 합성 setB · 게시물 누끼 14장 · 개발 176장의 0.55 값은 바깥 추정이 아닙니다. 앱 파일은 약 80MB입니다.
- 0.54는 모델을 두 번 돌려 누끼 시간이 0.53의 약 1.47배(4장, 같은 조건)이고, 브라우저 메모리도 모델 하나만큼 더 쓰며, 앱 파일은 약 58MB입니다. 더 학습한 판만 쓰면 기 · 불꽃 효과와 캐릭터에 붙은 배경을 캐릭터로 넣는 그림이 늘어 관문을 넘지 못했고, 섞기 무게 · 문턱은 그 결과를 본 뒤 고른 것이라 게시물 누끼 14장의 0.54 값은 바깥 추정이 아닙니다. 섞어도 분홍 건물에 붙은 캐릭터 1장처럼 두 모델이 다 틀리는 곳은 남습니다.
- 0.53의 규칙은 결과를 본 뒤 만든 것이라 게시물 누끼 14장의 0.53 값은 바깥 추정이 아닙니다. 고르기에 쓰지 않은 정답 185장 · 고정 60장에서는 각각 1장 · 2장이 나아지고 나빠진 그림이 없었지만, 장수가 적어 통계로는 차이를 말할 수 없습니다.
- 0.51 · 0.52는 눈가림 시험 없이 분해능만 재고 넣었고, 0.53을 낼 때 0.1 · 0.50 · 0.51 · 0.52 · 0.53을 함께 매겼습니다(눈가림 시험).
배경 메꿈(0.56)
- 신경망은 512×512로 줄여 돌리므로 큰 그림의 고운 구조는 패치 단계가 맡고, 아는 배경에 없는 고운 구조(가려진 글자 · 작은 무늬)는 흐리게 추정됩니다. 가려진 물건의 뜻은 만들지 못합니다(픽시브 AI 생성 그림 120장 자연스러움 채점 평균 59.2점/100점).
- 배경 층의 캐릭터 자리 판정이 틀리면(머리카락 가닥이 배경에 남는 등) 그 부분은 메꾸지 않습니다. 투명 배경 그림(배경을 못 찾은 그림)에는 층이 생기지 않습니다.
- 그림당 23.4~24.6초(800×800 ~ 2048×2048, 신경망 512 캔버스 + 질감 · 이음매) 더 걸리고 처음 한 번 모델 준비에 2초가 듭니다. 가중치(fp16 102 MB)는 앱 파일 안에 들어 있어 앱 파일이 약 205MB입니다(GitHub 파일 크기 제한 100 MiB 때문에 저장소에는 분할 압축 illustracy-0.56.zip.001 · .002로 올림). "패치만"은 1~5초, 끄면 0.55와 같은 결과입니다.
그림 종류 · 선 · 효과
- 대부분 영상 처리 규칙이고, 이 프로그램이 학습한 것은 배경 찾기 끝의 통계식과 작은 신경망(0.49)뿐입니다. 0.51부터 기본으로 쓰는 누끼 모델은 다른 사람이 학습해 공개한 신경망입니다(누끼 모델). 선이 있는 셀 채색에서 가장 잘 되고, 선이 없거나 붓 자국이 많은 그림은 밑색이 여러 톤으로 나뉘거나 음영이 명암 층으로 많이 넘어갈 수 있습니다.
- 선 아래 색은 주변에서 짐작한 값이라 선 두 개 사이의 1~2px 틈 같은 곳은 오차가 남을 수 있습니다(겹친 결과는 색 트레이스로 정확히 맞춤).
- 빛 · 반짝임 층은 선화 아래에 둡니다. 선 위에 빛을 칠한 그림은 그 부분이 색 트레이스로 들어갑니다.
- 외곽 글로우는 캐릭터를 넓게 두르고 배경이 분리된 그림의 밝고 채도가 아주 높은 형광만 나눕니다. 옅은 청록 · 옅게 번진 분홍 · 가는 주황 글로우는 배경 층에 남습니다.
배경과 캐릭터 가르기
- 캐릭터가 한 조각도 빠짐없이 캐릭터 층에 남는 그림은 처음 보는 그림을 섞은 650장 중 13%, 배경까지 남김없이 떼는 그림은 4%입니다. 대부분은 보정 도구로 다듬어야 합니다.
- 캐릭터와 같은 방식(진한 선 + 칠)으로 그린 배경 물건은 캐릭터 쪽에 남습니다. 캐릭터 층에 넓게 남은 배경에서 흔한 것은 선으로 그린 소품 · 물건, 흐린 장면 조각, 글자 · 로고 · 틀, 바닥 · 땅입니다.
- 배경이 많이 남은 그림일수록 캐릭터의 큰 부분을 잃는 일은 적어, 두 오류는 서로 맞바꾸는 관계입니다. 캐릭터를 잃는 것보다 배경 조각이 남는 편이 고치기 쉬워 배경을 보수적으로 잡습니다.
- 선 없는 그림 · 얼굴이 가려진 그림 · 저화질(긴 변 900px 미만) · 어두운 장면 · 역광에서 캐릭터의 큰 부분을 잃는 일이 잦습니다(오즈비 0.39~0.55). 역광 그림은 24장 중 5장만 큰 손실이 없었습니다.
- 흰 옷 · 옅은 머리를 흰 배경 위에 그린 그림, 검은 옷이 선과 같은 색인 그림은 옷 · 머리의 큰 부분이 배경으로 가기 쉽습니다.
- 장면 · 무늬 배경 속의 틈, 그림자가 져서 배경과 색이 조금 다른 틈은 캐릭터 층에 남습니다.
- 신경망 보조는 조심스럽게 지웁니다. 0.50의 묶는 식은 개발 그림 영역 정답(겹 안 겹 바깥 점수)에서 캐릭터 쪽에 남은 배경 넓이의 27%를 더 지웠고, 지운 넓이의 약 10%는 캐릭터였습니다. 0.49의 규칙은 고정 60장 눈가림에서 1장의 둘째 인물을 거의 통째로 지웠습니다. 0.50은 눈가림 시험 없이 분해능만 재고 넣었습니다.
- 화면 전체를 선으로 촘촘히 그렸고 캐릭터와 배경 색이 비슷한 장면은 배경을 찾지 못할 수 있습니다(캐릭터가 있는 633장 중 5장). 무엇이 모자이고 무엇이 단풍잎인지 알아봐야 가를 수 있어, 색 · 선 · 흐림 규칙만으로는 한계가 있습니다.
얼굴 · 이름 · 캐릭터 폴더
- 얼굴은 두 눈이 보이는 애니풍 얼굴만 찾습니다. 옆얼굴, 한 눈만 보이거나 감은 얼굴, 아주 작은 얼굴(긴 변 800px에서 두 눈 사이 16px 미만)은 찾지 못합니다. 처음 보는 픽시브 AI 생성 그림 300장에서는 얼굴 355개 중 189개(53%), 새 342장에서는 356개 중 204개(57.3%)를 찾았습니다.
- 짙은 피부의 얼굴은 찾지 못할 수 있습니다("밝은 피부 위의 어두운 눈"이 단서). 누운 얼굴은 두 눈이 보여도 거의 찾지 못합니다.
- 파츠 이름은 눈 · 피부 · 머리카락 말고는 색 이름이며 "옷", "리본" 같은 뜻은 알지 못합니다.
- 가짜 얼굴(과자 · 꽃 · 소매 · 무늬)이 뽑히면 둘레의 옷 · 소품에 "머리카락" · "피부" 이름이 붙거나 한 사람 그림이 두 캐릭터 폴더로 나뉩니다(한 사람 그림 235장 중 8장).
- 0.48의 이름용 얼굴 가산점은 피부가 고르고 넓은 그림에서 손 · 다리 · 한 눈과 볼에도 붙을 수 있습니다(자세 합성 그림 120장에서 가짜 얼굴 11 → 38개).
- 여러 사람이 나오는 그림은 캐릭터 폴더 수가 맞는 경우가 드뭅니다(65장 중 11장).
파츠와 밑색
- 파츠는 색으로 나눈 것이라, 머리카락과 같은 색인 옷 · 피부와 같은 색인 바닥도 그 파츠에 함께 들어갑니다.
- 피부와 머리카락처럼 서로 다른 재질이 거의 같은 색이면 한 파츠로 합쳐지고 이름을 붙이지 않습니다(창백한 피부 + 옅은 금발 · 은발).
- 장면 · 소품이 많은 그림과 붓 · 수채 그림은 밑색이 잘게 쪼개지고, 그늘이 밝은 면보다 넓게 칠해진 재질은 그늘 색이 밑색이 됩니다.
- 나뭇잎 사이 햇빛처럼 강한 빛 얼룩이 캐릭터 위에 드리우면 밑색 파츠가 조각나기 쉽습니다.
크기 · 기울기 · 안정성
- 배경 찾기는 넓이 · 색 분포 겹침에 딱 잘린 문턱을 써서, 문턱 바로 옆의 그림은 JPEG로 다시 저장한 정도의 잡음에도 결과가 바뀝니다(342장 중 4장). 같은 파일이면 결과는 늘 같습니다.
- 몇몇 값(선 검출 창 등)이 픽셀 단위라 같은 그림도 크기에 따라 결과가 달라집니다. 작은 그림은 넉넉한 픽셀 창이 오히려 캐릭터를 지켜 주어 그대로 두었습니다.
- 같은 그림을 좌우로 뒤집기만 해도 결과가 조금 달라집니다(배경은 98.7% 같음, 이름 붙은 영역은 절반 정도 겹침).
- 모서리 없이 꽉 찬 채로 크게 기운 그림은 기울어진 그림을 켜야 나아지고, 45° 안팎은 켜도 비슷합니다.
러프
- 러프는 원본에 없으므로 추정 스케치입니다. 실제 작가의 러프와는 다를 수 있습니다.
- 러프 2(0.59e)는 전문가 역할 AI 채점자 15명 눈가림(138장)에서 0.56보다 사람이 그린 러프 같다는 판정이 100 : 33(같음 5)이고, 따로 보아 사람이 그린 러프로 보인다는 판정은 54 → 83장, 의미를 크게 잃은 러프는 49 → 31장입니다. 다만 "기계적"(21 → 34장)이라는 판정은 늘었고, 글자 · 서명 · 워터마크와 망사 · 지판 · 벽돌 같은 되풀이 무늬를 줄마다 따라 그립니다. 절대 수준은 채점자 무리에 따라 크게 흔들립니다(다른 15명이 본 회차에서 0.59e만 따로 보면 사람 러프 45/138장). 질감이 강한 회화풍 · 어두운 그림 · 복잡한 장면은 그물이나 토막 선으로 무너지고, 레이스 · 꽃 장식처럼 촘촘한 장식 선도 그물처럼 보일 수 있습니다. 러프 1은 일부러 구도를 어긋나게 하므로 형태가 원본과 맞지 않습니다.
- 러프 1은 일부러 구도를 어긋나게 하므로 형태가 원본과 맞지 않습니다.
- 장면이 복잡하거나 인물이 작은 그림, 붓 자국이 많은 그림은 짧은 조각선이 그물처럼 갈라지거나 인물을 거의 놓치기도 하고, 얼굴을 못 찾은 인물은 눈 · 입이 흐트러지기도 합니다.
12업데이트 내역
새 버전이 위에 있습니다. 모든 판의 자세한 내역과 검증은 README의 12절에 있습니다.
0.59i;0_1[20] (2026-10-20) 예제 그림: 넣어 둔 그림 10장 중 무작위
- 분해능: 0.1의 17.52배(95% 구간 11.87~29.98배) · 러프 재능: 0.1의 247%(95% 구간 156~419%) — 코어(분리 · 러프 코드)와 신경망 덩어리가 0.59h와 바이트 단위로 같아 배경 지도 · 러프 · 눈가림 시험이 0.59h 그대로입니다.
- 예제 그림을 누르면 코드로 그린 그림 대신 앱에 넣어 둔 그림 10장 중 하나가 무작위로 열립니다(바로 앞과 같은 그림은 피함). 그림은 원본 파일을 바꾸지 않고 넣었고, 불러온 그림과 똑같이 기본 처리 해상도(긴 변 2048px)로 나눕니다. 코드로 그리던 예제 그림은 뺐습니다.
- 예제 그림 출처: 사용자가 고른 픽시브 AI 생성 그림 10장 — 150730595 · 150847462 · 150881490 · 150988710 · 150999564 · 151001952 · 144221130 · 149272285 · 150456139 · 150706121.
- Chromium에서 10장이 모두 풀리는지, 30번 눌러 바로 앞과 같은 그림이 나오지 않는지(30번 중 9장이 나옴), 한 장(144221130, 처리 1170×2048)을 끝까지 나눠 층 49개가 나오는지 확인했습니다.
- 버전 이름: 추가 0, 업데이트 · 수정 1(예제 그림), 빌드 20(코어 설정이 0.59h와 같음). 분할 압축 illustracy-0.59i.zip.001 · .002에 앱(약 223MB, 예제 그림 약 22MB 포함)과 도움말이 함께 들어 있습니다.
0.59h;0_1[20] (2026-10-20) 도움말을 앱 밖 파일로, 버전별 러프 재능
- 분해능: 0.1의 17.52배(95% 구간 11.87~29.98배) · 러프 재능: 0.1의 247%(95% 구간 156~419%) — 코어(분리 · 러프 코드)와 신경망 덩어리가 0.59e와 바이트 단위로 같아 배경 지도 · 러프 · 눈가림 시험이 0.59e 그대로입니다.
- 앱 파일 안에 함께 들어 있던 도움말을 빼고, 머리글의 도움말 버튼이 앱과 같은 폴더의
illustracy-help.html을 새 창으로 엽니다. 그 파일이 없으면 "도움말 파일이 존재하지 않는다. 확인 바란다."를 띄우고 열지 않습니다. 버전 표시를 앱 머리글에도 둡니다. - 버전별 러프 재능(검증의 러프 재능): 러프가 바뀐 12칸을 고정 60장 · 300시트 눈가림으로 매겨 0.1 = 100%로 적었습니다. 가장 높은 판은 0.56(367%)이고 0.59e는 그보다 낮습니다.
- 버전 이름: 추가 0, 업데이트 · 수정 1(도움말을 앱 밖 파일로 열기 · 없으면 알림. 앱 안 도움말에만 있던 버전 표시는 앱 머리글로 옮겼고 따로 세지 않음), 빌드 20(코어 설정이 0.59e와 같음). 분할 압축 illustracy-0.59h.zip.001 · .002에 앱(약 196MB)과 도움말이 함께 들어 있습니다.
0.59e;4_5[20] (2026-10-20) 러프 2 필압 · 눈 · 입 상자
- 분해능: 0.1의 17.52배(95% 구간 11.87~29.98배) — 러프만 바꿔 '배경' 층은 그대로라 정답 185장 · 눈가림 60장의 배경 지도가 0.55와 바이트 단위로 같고(0.59e 앱 코드로 245장 확인), 분해능 · 눈가림 시험은 0.55의 값 그대로입니다.
- 버전 이름: 이 판부터 0.<올라간 버전 수><부 버전 알파벳>;<추가된 기능 수>_<업데이트 및 수정된 기능 수>[<빌드 번호>]로 씁니다. 추가 4(러프 1 연필 결 · 필압 곡선 · 선 중요도 진하기 · 덧긋기), 업데이트 · 수정 5(G펜 따라 긋기 · 굵은 선 두 크기 창 · 손떨림 보정 강화 · 짧은 토막 정리 · 눈 · 입 상자), 빌드 20(0.59에서 그려 잰 러프 설정 수). 파일 이름에는 0.59e만 씁니다.
- 0.57 · 0.58(따로 배포하지 않음, 이 판에 함께 들어감): 러프 2를 G펜으로 선화 따라 긋기(지역 대비 선 · 펜 굵기 · 손떨림 보정), 러프 1은 연필 결(0.57). 굵은 선(눈 테두리 · 속눈썹)을 두 배 창으로 가운데 한 줄로(0.58). 0.58만으로는 처음 보는 240장 눈가림에서 0.56에 졌습니다(65 : 153).
- 0.59: 획마다 필압 곡선으로 굵기 · 진하기에 강약, 선 중요도(대비 · 굵기 · 길이 · 얼굴)로 기본 진하기, 긴 획 일부 덧긋기, 손떨림 보정 강화 · 흔들림 줄임, 얼굴 밖 짧은 토막 · 사다리 가로선 정리.
- 0.59e: 얼굴 자리 안 눈 · 입 상자에서 선화를 그대로 선으로, 덩어리는 가운데 한 획으로(빠진 형태 고침). 짧은 토막 정리는 나란히 붙은 토막에만.
- 전문가 역할 AI 채점자 15명 눈가림(138장, 0.56 대 0.59e): 더 사람이 그린 러프 같음 0.59e 100 · 0.56 33 · 같음 5(부호 검정 5.0×10^-9), 따로 보아 사람이 그린 러프 54 → 83장, 크게 잃음 49 → 31장. 0.59f · 0.59g는 쓰지 않았습니다(검증의 러프 눈가림).
- 러프 2 단계 시간 중앙값 2.7초 → 4.0초(138장, 앱 전체의 작은 몫). 앱 파일 약 205MB, 저장소에는 분할 압축 illustracy-0.59e.zip.001 · .002.
| 0.1 | 0.57 | 0.58 | 0.59e | |
|---|---|---|---|---|
| 분해능 | 100% | 1752% | 1752% | 1752% |
| 분해능 95% 구간 | — | 1187~2998% | 1187~2998% | 1187~2998% |
| 분해능 80% 구간 | — | 1352~2434% | 1352~2434% | 1352~2434% |
| 눈가림 시험(큰 손실 없음) | 31.7% | 86.7% | 86.7% | 86.7% |
| 눈가림 시험 95% 구간 | 21.3~44.2% | 75.8~93.1% | 75.8~93.1% | 75.8~93.1% |
| 눈가림 시험 80% 구간 | 24.5~39.8% | 80.1~91.3% | 80.1~91.3% | 80.1~91.3% |
분해능은 0.1을 100%로 둔 값이고 구간은 같은 그림 짝 부트스트랩(10,000번)의 백분위입니다. 눈가림 시험은 고정 60장을 네 판 함께 매긴 값이고 구간은 윌슨 구간입니다. 0.57 · 0.58 · 0.59e는 배경 층이 0.55와 같아 0.55의 값(0.55 때 네 판을 함께 매긴 판정) 그대로입니다.
모든 버전
| 판 | 날짜 | 바뀐 것 | 분해능(0.1 대비) |
|---|---|---|---|
| 0.59i;0_1[20] | 2026-10-20 | 예제 그림 버튼이 앱에 넣어 둔 그림 10장 중 하나를 무작위로 엶 | 17.52배 |
| 0.59h;0_1[20] | 2026-10-20 | 앱 파일 안의 도움말을 빼고 도움말 버튼이 같은 폴더의 도움말 파일을 엶(없으면 알림), 버전별 러프 재능 | 17.52배 |
| 0.59e;4_5[20] | 2026-10-20 | 러프 2에 필압 곡선 · 선 중요도 진하기 · 덧긋기, 눈 · 입 상자 따라 긋기, 전문가 역할 눈가림 | 17.52배 |
| 0.58 | 2026-10-20 | 러프 2의 굵은 선(눈 테두리 · 속눈썹)을 두 크기 창으로 가운데 한 줄로 긋기, 처음 보는 240장 눈가림 | 17.52배 |
| 0.57 | 2026-10-20 | 러프 2를 G펜으로 선화 따라 긋기(지역 대비 선 · 펜 굵기 · 필압 · 손떨림 보정), 러프 1은 연필 결 | 17.52배 |
| 0.56 | 2026-10-20 | 캐릭터를 뺀 자리의 배경을 신경망(big-lama)과 패치 맞춤으로 추정해 채운 '배경 메꿈' 층을 '배경' 층 바로 위에 넣음(배경 층은 그대로) | 17.52배 |
| 0.55 | 2026-10-19 | 효과(글로우 · 파티클 · 빛줄기)를 배경으로 세도록 누끼 모델을 더 학습한 판을 원래 모델과 함께 돌려 두 확률의 평균(0.5 · 0.5)과 문턱 0.55로 캐릭터를 정함 | 17.52배 |
| 0.54 | 2026-10-17 | 누끼 모델을 미세 학습한 판을 원래 모델과 함께 돌려 두 확률의 가중 평균(0.6 · 0.4)과 문턱 0.55로 캐릭터를 정함 | 14.80배(정정) |
| 0.53 | 2026-10-15 | 누끼 모델이 캐릭터를 거의 찾지 못한 그림은 기존 방식(신경망 + 통계식)의 판정을 그대로 씀 | 13.37배 |
| 0.52 | 2026-10-15 | 누끼 모델 확률에 기존 방식(신경망 + 통계식)의 판정을 더해 캐릭터를 정함(코어 뒤 단계 없이) | 11.33배 |
| 0.51 | 2026-10-15 | 누끼 모델(애니 캐릭터 분할 신경망을 8비트로 줄여 앱 안에 넣음)로 캐릭터를 통째로 골라내고 나머지를 배경 층으로 | 10.51배 |
| 0.50 | 2026-10-15 | 신경망 보조 강화(통계식 점수와 신경망 점수를 한 식으로 묶어 지우기) | 6.40배 |
| 0.49 | 2026-10-15 | 신경망 보조(통계식과 신경망이 함께 배경이라 할 때만 남은 배경 지우기) · 머리카락 결 특징 | 6.14배 |
| 0.48 | 2026-10-13 | 이름용 얼굴의 머리 구조 단서 · 단계별 채색 폴더 · 배경 개선 순환 8주기 | 5.91배 |
| 0.47 | 2026-10-11 | 따라 긋는 러프(눈 인식 없음 · 실제 윤곽 · 배경 구도 · 이어 긋기) | 5.91배 |
| 0.46 | 2026-10-11 | 두 가지 러프(컨셉 · 다듬기) | 5.91배 |
| 0.45 | 2026-10-11 | 러프 세부 지키기 | 5.91배 |
| 0.44 | 2026-10-11 | 사람이 그은 듯한 러프 | 5.91배 |
| 0.43 | 2026-10-11 | 어두운 캐릭터 부분 되돌리기 · 선으로 그린 배경 물건 | 5.91배 |
| 0.42 | 2026-10-10 | 검은 다리 · 옷을 배경으로 덜 보내기 | 2.25배 |
| 0.41 | 2026-10-04 | 테두리에서 잘린 머리카락 끝 · 소매 되돌리기 | 2.14배 |
| 0.40 | 2026-10-03 | 선으로 그린 방의 바닥 | 2.14배 |
| 0.39 | 2026-10-02 | 밑색: 흰색에 묻힌 색 · 작은 색 면 · 그림자 밑색 | 1.78배 |
| 0.38 | 2026-10-02 | 장면 배경에 넘어간 선 없는 옷 · 다리 되돌리기 | 1.78배 |
| 0.37 | 2026-10-01 | 기울어진 그림, 검은 옷이 배경으로 새는 것 막기 | 1.53배 |
| 0.36 | 2026-09-30 | 예전 PSD 층 이름 고치기를 프로그램 안으로 | 1.33배 |
| 0.35 | 2026-09-30 | 층 이름 "색 트레이스", 예전 PSD 층 이름 바꾸기 도구 | 1.33배 |
| 0.34 | 2026-09-30 | 한계 다시 풀기: 흰 배경의 좁은 틈, 좌우 합의 얼굴, 검은 머리 되돌리기 | 1.33배 |
| 0.33 | 2026-09-30 | 캐릭터 층 검증, 캐릭터 사이로 보이는 배경(틈) | 1.29배 |
| 0.32 | 2026-09-30 | 배경을 못 찾는 그림 줄이기 | 1.29배 |
| 0.31 | 2026-09-30 | 선으로 둘러싸인 곳은 배경으로 가져가지 않기 | 1.29배 |
| 0.30 | 2026-09-30 | 큰 그림은 줄여서 나누기(설정) | 1.32배 |
| 0.29 | 2026-09-30 | 큰 그림의 색 걸음 문턱을 그림 크기 비율로 | 1.32배 |
| 0.28 | 2026-09-29 | 떨어진 머리카락 조각의 이름 떼기 | 1.31배 |
| 0.27 | 2026-09-29 | 평평한 배경에서 얼굴 기준 넓히기 생략, 세부 조건별 결과 | 1.31배 |
| 0.26 | 2026-09-29 | 새 그림 342장 검증, 배경 없는 그림의 빈 배경 층, 얼굴과 배경 결과의 관계 | 1.28배 |
| 0.25 | 2026-09-29 | 얼굴 없는 그림의 "피부" 색 이름 없애기 | 1.28배 |
| 0.24 | 2026-09-29 | 두 사람 그림의 폴더, 창백한 피부 이름 | 1.28배 |
| 0.23 | 2026-09-29 | 보정 뒤 다시 나누기를 빠르게 | 1.28배 |
| 0.22 | 2026-09-29 | 가짜 얼굴이 붙이던 이름 · 폴더 줄이기 | 1.28배 |
| 0.21 | 2026-09-29 | 흰 배경 위의 흰 옷 | 1.28배 |
| 0.20 | 2026-09-28 | 처음 보는 그림 300장으로 검증 | 1.25배 |
| 0.19 | 2026-09-28 | 배경 · 얼굴 · 캐릭터 · 글로우 · 붓 그림 정리 재검증 | 1.25배 |
| 0.18 | 2026-09-28 | 이름 붙이기 재검증 | 1.00배 |
| 0.17 | 2026-09-28 | 붓 그림 밑색 정리 | 1.01배 |
| 0.16 | 2026-09-28 | 외곽 글로우 층 | 1.01배 |
| 0.15 | 2026-09-28 | 캐릭터별 폴더 | 1.01배 |
| 0.14 | 2026-09-28 | 눈 · 피부 · 머리카락 이름 | 1.01배 |
| 0.13 | 2026-09-28 | 가짜 얼굴 거르기 | 1.01배 |
| 0.12 | 2026-09-28 | 얼굴을 찾아 배경 넓히기 | 1.01배 |
| 0.11 | 2026-09-28 | 그림을 재서 정하는 선 굵기 | 1.02배 |
| 0.10 | 2026-09-28 | 딸려 들어간 캐릭터 부분 되돌리기, 전체 재검증 | 1.02배 |
| 0.9 | 2026-09-27 | 끊기지 않는 러프 | 0.95배 |
| 0.8 | 2026-09-27 | 레이어 모두 끄기 | 0.95배 |
| 0.7 | 2026-09-27 | 선으로 그린 배경 자동 분리 | 0.95배 |
| 0.6 | 2026-09-27 | 잘린 부분 자동 판정, 올가미, 최대 파츠 수 | 0.89배 |
| 0.5 | 2026-09-27 | 보정 도구 | 0.90배 |
| 0.4 | 2026-09-27 | 장면 배경과 정확한 선 | 0.90배 |
| 0.3 | 2026-09-27 | AI 생성 그림으로 다듬기, 작업 파일 층 | 1.04배 |
| 0.2 | 2026-09-27 | 일러스트레이터식 층 구조, 인터넷 없이 실행 | 1.00배 |
| 0.1 | 2026-09-27 | 첫 버전 | 1.00배 |
13용어 풀이
- 층(레이어)
- 투명한 종이 한 장. 여러 장을 겹쳐 그림이 됩니다.
- 혼합 모드
- 층이 아래와 섞이는 방식. 표준(덮음) · 곱하기(어둡게) · 스크린(밝게)을 씁니다.
- 클리핑
- 위 층이 바로 아래 층(기반)의 칠한 곳 안에서만 보이게 묶는 것. 그림자가 밑색 밖으로 나가지 않습니다.
- 알파
- 픽셀이 얼마나 덮였는지(0 투명 ~ 1 불투명).
- 셀 채색
- 선 안을 밑색 · 그림자 · 하이라이트처럼 경계가 또렷한 면으로 칠하는 애니메이션풍 채색.
- 밑색
- 부분마다 칠한 한 가지 기본 색.
- 1차 · 2차 그림자
- 밑색에 곱해지는 그림자 색. 2차는 1차 위에 한 번 더 곱해지는 더 어두운 곳.
- 하이라이트
- 밑색보다 밝게 칠한 면.
- 명암 · 그라데이션
- 그림자 색 하나로 설명되지 않는 부드러운 어두움 / 넓게 천천히 깔린 어두움.
- 림라이트 · 반사광
- 몸 가장자리에 비친 빛 / 그림자 속을 다시 밝힌 튕긴 빛.
- 색 트레이스
- 선화에 클리핑해 선의 색만 바꾸는 층(빛 받은 선, 색깔 선).
- 러프
- 선화를 긋기 전의 연필 밑그림. Illustracy는 완성 그림에서 거꾸로 짐작해 그립니다.
- 파츠 · 재질 · 톤
- 밑색이 같은 부분 / 선 없이 이어지고 명암 관계인 색 영역의 묶음 / 한 재질 안의 밝기 단계.
- 실루엣
- 캐릭터 자리 전체. 숨긴 "실루엣 (선택용)" 층으로 들어갑니다.
- 안티에일리어싱
- 선 가장자리를 반투명으로 칠해 계단을 없애는 것.
- 인페인팅
- 가려진 곳의 색을 둘레에서 채워 짐작하는 것.
- 클로징 · 블랙 탑햇
- 최대 필터 뒤 최소 필터로 가는 어두운 구조를 지우는 것 / 그렇게 지운 그림과 원본의 차이(선의 깊이).
- 히스테리시스
- 센 문턱을 넘는 곳에서 출발해 약한 문턱까지 이어 붙이는 것. 끊긴 선을 잇고 잡음을 거릅니다.
- Lab · ΔE
- 사람의 색 지각에 가깝게 만든 색공간 / 그 공간에서의 색 차이.
- k-평균
- 색들을 k개의 대표 색으로 묶는 군집 방법.
- 그래프 컷
- 영역들을 마디로 한 그래프를 최소 비용으로 둘로 자르는 방법. 배경 · 캐릭터 색 분포를 배워 가를 때 씁니다.
- 재현 PSNR
- 나눈 층을 다시 겹친 결과가 원본과 얼마나 같은지(dB, 클수록 같음).
- 처리 해상도
- 계산할 때 그림의 긴 변 크기(기본 2048px). PSD도 이 크기입니다.
- 분해능 · BER
- 정답 그림에서 캐릭터 · 배경을 잘못 가른 비율의 균형 평균(BER)과 그 역수.
- 눈가림 시험
- 어느 판의 결과인지 모르게 섞어 매긴 뒤 푸는 판정.
- 윌슨 구간 · 부호 검정 · McNemar
- 비율의 신뢰구간 / 짝 비교에서 이긴 · 진 수가 우연인지 보는 검정 / 같은 그림 짝에서 들어옴 · 빠짐을 견주는 검정.
- 부트스트랩
- 표본을 다시 뽑기를 되풀이해 값의 흔들림(구간)을 재는 방법.
- Web Worker
- 화면과 따로 도는 브라우저의 계산 스레드.
- 신경망
- 곱셈 · 덧셈 · 문턱을 여러 겹 쌓아, 예시(입력과 정답)로 가중치를 맞춘 계산. 이 프로그램은 작은 합성곱 신경망을 처음부터 짜서 배경 판정을 돕는 데만 씁니다.
14참고 문헌
풀이의 참고에 번호로 적은 문헌입니다. 번호는 README 13절과 같습니다. "이 프로그램의 실험(README 절)"은 문헌 없이 이 프로그램이 시험 그림으로 정한 값 · 규칙이고, 근거는 README의 그 절에 있습니다.
- [R1] T. Porter, T. Duff, "Compositing Digital Images," Computer Graphics (Proc. SIGGRAPH) 18(3), 253–259, 1984.
- [R2] A. R. Smith, "Alpha and the History of Digital Compositing," Microsoft Technical Memo 7, 1995.
- [R3] ISO 32000-1:2008, Document management — Portable document format — Part 1: PDF 1.7, §11.3.5 "Blend Mode".
- [R4] Adobe, Adobe Photoshop File Formats Specification.
- [R5] Apple Computer, "Understanding PackBits," Technical Note TN1023, 1996.
- [R6] IEC 61966-2-1:1999, Multimedia systems and equipment — Colour measurement and management — Part 2-1: Default RGB colour space — sRGB.
- [R7] CIE 15:2004, Colorimetry, 3rd ed. (CIELAB, ΔE*ab).
- [R8] M. Mahy, L. Van Eycken, A. Oosterlinck, "Evaluation of Uniform Color Spaces Developed after the Adoption of CIELAB and CIELUV," Color Research & Application 19(2), 105–121, 1994.
- [R9] ITU-R Recommendation BT.601, Studio encoding parameters of digital television for standard 4:3 and wide-screen 16:9 aspect ratios.
- [R10] M. D. Fairchild, Color Appearance Models, 3rd ed., Wiley, 2013.
- [R11] D. Hasler, S. Süsstrunk, "Measuring Colourfulness in Natural Images," Proc. SPIE 5007, 87–95, 2003.
- [R12] A. Beer, "Bestimmung der Absorption des rothen Lichts in farbigen Flüssigkeiten," Annalen der Physik 162(5), 78–88, 1852.
- [R13] E. Hecht, Optics, 5th ed., Pearson, 2017.
- [R14] R. C. Gonzalez, R. E. Woods, Digital Image Processing, 4th ed., Pearson, 2018.
- [R15] P. Soille, Morphological Image Analysis: Principles and Applications, 2nd ed., Springer, 2003.
- [R16] D. Lemire, "Streaming Maximum-Minimum Filter Using No More than Three Comparisons per Element," Nordic Journal of Computing 13(4), 328–339, 2006.
- [R17] W. M. Wells, "Efficient Synthesis of Gaussian Filters by Cascaded Uniform Filters," IEEE Trans. PAMI 8(2), 234–239, 1986.
- [R18] J. Canny, "A Computational Approach to Edge Detection," IEEE Trans. PAMI 8(6), 679–698, 1986.
- [R19] I. Sobel, G. Feldman, "A 3×3 Isotropic Gradient Operator for Image Processing," presented at the Stanford Artificial Intelligence Project, 1968.
- [R20] A. Telea, "An Image Inpainting Technique Based on the Fast Marching Method," Journal of Graphics Tools 9(1), 23–34, 2004.
- [R21] G. Borgefors, "Distance Transformations in Digital Images," Computer Vision, Graphics, and Image Processing 34(3), 344–371, 1986.
- [R22] S. P. Lloyd, "Least Squares Quantization in PCM," IEEE Trans. Information Theory 28(2), 129–137, 1982.
- [R23] D. Arthur, S. Vassilvitskii, "k-means++: The Advantages of Careful Seeding," Proc. ACM-SIAM SODA, 1027–1035, 2007.
- [R24] Y. Boykov, M.-P. Jolly, "Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images," Proc. ICCV, 105–112, 2001.
- [R25] C. Rother, V. Kolmogorov, A. Blake, "GrabCut: Interactive Foreground Extraction Using Iterated Graph Cuts," ACM Trans. Graphics 23(3), 309–314, 2004.
- [R26] L. R. Ford, D. R. Fulkerson, "Maximal Flow through a Network," Canadian Journal of Mathematics 8, 399–404, 1956.
- [R27] E. A. Dinic, "Algorithm for Solution of a Problem of Maximum Flow in a Network with Power Estimation," Soviet Math. Doklady 11, 1277–1280, 1970.
- [R28] E. W. Dijkstra, "A Note on Two Problems in Connexion with Graphs," Numerische Mathematik 1, 269–271, 1959.
- [R29] R. B. Dial, "Algorithm 360: Shortest-Path Forest with Topological Ordering," Communications of the ACM 12(11), 632–633, 1969.
- [R30] R. E. Tarjan, "Efficiency of a Good But Not Linear Set Union Algorithm," Journal of the ACM 22(2), 215–225, 1975.
- [R31] A. R. Smith, "Color Gamut Transform Pairs," Computer Graphics (Proc. SIGGRAPH) 12(3), 12–19, 1978.
- [R32] H. Knutsson, C.-F. Westin, "Normalized and Differential Convolution," Proc. IEEE CVPR, 515–523, 1993.
- [R33] T. Lindeberg, "Feature Detection with Automatic Scale Selection," International Journal of Computer Vision 30(2), 79–116, 1998.
- [R34] J. P. Lewis, "Fast Normalized Cross-Correlation," Vision Interface, 120–123, 1995.
- [R35] G. Strang, Introduction to Linear Algebra, 5th ed., Wellesley-Cambridge Press, 2016.
- [R36] T. Y. Zhang, C. Y. Suen, "A Fast Parallel Algorithm for Thinning Digital Patterns," Communications of the ACM 27(3), 236–239, 1984.
- [R37] H. Blum, "A Transformation for Extracting New Descriptors of Shape," in W. Wathen-Dunn (ed.), Models for the Perception of Speech and Visual Form, MIT Press, 362–380, 1967.
- [R38] P. J. Schneider, "An Algorithm for Automatically Fitting Digitized Curves," in A. S. Glassner (ed.), Graphics Gems, Academic Press, 612–626, 1990.
- [R39] A. Loomis, Drawing the Head and Hands, Viking Press, 1956.
- [R40] G. Fowler, L. C. Noll, K.-P. Vo, D. Eastlake, T. Hansen, "The FNV Non-Cryptographic Hash Algorithm," IETF Internet-Draft draft-eastlake-fnv.
- [R41] U. Ramer, "An Iterative Procedure for the Polygonal Approximation of Plane Curves," Computer Graphics and Image Processing 1(3), 244–256, 1972.
- [R42] D. H. Douglas, T. K. Peucker, "Algorithms for the Reduction of the Number of Points Required to Represent a Digitized Line or its Caricature," Cartographica 10(2), 112–122, 1973.
- [R43] Å. Björck, Numerical Methods for Least Squares Problems, SIAM, 1996.
- [R44] M. A. Fischler, R. C. Bolles, "Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography," Communications of the ACM 24(6), 381–395, 1981.
- [R45] H. Theil, "A Rank-Invariant Method of Linear and Polynomial Regression Analysis," Proc. Koninklijke Nederlandse Akademie van Wetenschappen 53, 1950.
- [R46] P. K. Sen, "Estimates of the Regression Coefficient Based on Kendall's Tau," JASA 63(324), 1379–1389, 1968.
- [R47] D. S. Ebert, F. K. Musgrave, D. Peachey, K. Perlin, S. Worley, Texturing and Modeling: A Procedural Approach, 3rd ed., Morgan Kaufmann, 2003.
- [R48] T. Ettinger, mulberry32 (public-domain 32-bit pseudorandom number generator), 2017.
- [R49] D. Zhou, X. Shen, W. Dong, "Image Zooming Using Directional Cubic Convolution Interpolation," IET Image Processing 6(6), 627–634, 2012.
- [R50] R. J. Hyndman, Y. Fan, "Sample Quantiles in Statistical Packages," The American Statistician 50(4), 361–365, 1996.
- [R51] C. D. Manning, P. Raghavan, H. Schütze, Introduction to Information Retrieval, Cambridge University Press, 2008.
- [R52] P. Jaccard, "The Distribution of the Flora in the Alpine Zone," New Phytologist 11(2), 37–50, 1912.
- [R53] C. J. van Rijsbergen, Information Retrieval, 2nd ed., Butterworths, 1979.
- [R54] I. Guyon, S. Gunn, A. Ben-Hur, G. Dror, "Result Analysis of the NIPS 2003 Feature Selection Challenge," Advances in Neural Information Processing Systems 17, 2004.
- [R55] Q. Huynh-Thu, M. Ghanbari, "Scope of Validity of PSNR in Image/Video Quality Assessment," Electronics Letters 44(13), 800–801, 2008.
- [R56] E. B. Wilson, "Probable Inference, the Law of Succession, and Statistical Inference," JASA 22(158), 209–212, 1927.
- [R57] C. J. Clopper, E. S. Pearson, "The Use of Confidence or Fiducial Limits Illustrated in the Case of the Binomial," Biometrika 26(4), 404–413, 1934.
- [R58] O. J. Dunn, "Multiple Comparisons among Means," JASA 56(293), 52–64, 1961.
- [R59] Student (W. S. Gosset), "The Probable Error of a Mean," Biometrika 6(1), 1–25, 1908.
- [R60] K. Pearson, "On the Criterion that a Given System of Deviations from the Probable in the Case of a Correlated System of Variables is such that it can be Reasonably Supposed to have Arisen from Random Sampling," Philosophical Magazine 50(302), 157–175, 1900.
- [R61] F. Yates, "Contingency Tables Involving Small Numbers and the χ² Test," Supplement to the Journal of the Royal Statistical Society 1(2), 217–235, 1934.
- [R62] G. U. Yule, "On the Methods of Measuring Association between Two Attributes," Journal of the Royal Statistical Society 75(6), 579–652, 1912.
- [R63] R. A. Fisher, "On the Interpretation of χ² from Contingency Tables, and the Calculation of P," Journal of the Royal Statistical Society 85(1), 87–94, 1922.
- [R64] R. G. Newcombe, "Interval Estimation for the Difference between Independent Proportions: Comparison of Eleven Methods," Statistics in Medicine 17(8), 873–890, 1998.
- [R65] D. Katz, J. Baptista, S. P. Azen, M. C. Pike, "Obtaining Confidence Intervals for the Risk Ratio in Cohort Studies," Biometrics 34(3), 469–474, 1978.
- [R66] B. Woolf, "On Estimating the Relation between Blood Group and Disease," Annals of Human Genetics 19(4), 251–253, 1955.
- [R67] N. Mantel, W. Haenszel, "Statistical Aspects of the Analysis of Data from Retrospective Studies of Disease," Journal of the National Cancer Institute 22(4), 719–748, 1959.
- [R68] J. Robins, N. Breslow, S. Greenland, "Estimators of the Mantel–Haenszel Variance Consistent in Both Sparse Data and Large-Strata Limiting Models," Biometrics 42(2), 311–323, 1986.
- [R69] D. R. Cox, "The Regression Analysis of Binary Sequences," Journal of the Royal Statistical Society B 20(2), 215–242, 1958.
- [R70] P. McCullagh, J. A. Nelder, Generalized Linear Models, 2nd ed., Chapman & Hall, 1989.
- [R71] A. Wald, "Tests of Statistical Hypotheses Concerning Several Parameters When the Number of Observations is Large," Trans. American Mathematical Society 54(3), 426–482, 1943.
- [R72] Q. McNemar, "Note on the Sampling Error of the Difference between Correlated Proportions or Percentages," Psychometrika 12(2), 153–157, 1947.
- [R73] J. A. Hanley, B. J. McNeil, "The Meaning and Use of the Area under a Receiver Operating Characteristic (ROC) Curve," Radiology 143(1), 29–36, 1982.
- [R74] M. Stone, "Cross-Validatory Choice and Assessment of Statistical Predictions," Journal of the Royal Statistical Society B 36(2), 111–147, 1974.
- [R75] Y. Benjamini, Y. Hochberg, "Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing," Journal of the Royal Statistical Society B 57(1), 289–300, 1995.
- [R76] A. E. Hoerl, R. W. Kennard, "Ridge Regression: Biased Estimation for Nonorthogonal Problems," Technometrics 12(1), 55–67, 1970.
- [R77] S. le Cessie, J. C. van Houwelingen, "Ridge Estimators in Logistic Regression," Applied Statistics 41(1), 191–201, 1992.
- [R78] A. Agresti, Categorical Data Analysis, 3rd ed., Wiley, 2013.
- [R79] J. Cohen, "A Coefficient of Agreement for Nominal Scales," Educational and Psychological Measurement 20(1), 37–46, 1960.
- [R80] B. Efron, "Bootstrap Methods: Another Look at the Jackknife," Annals of Statistics 7(1), 1–26, 1979.
- [R81] B. Efron, R. J. Tibshirani, An Introduction to the Bootstrap, Chapman & Hall, 1993.
- [R82] C. Spearman, "The Proof and Measurement of Association between Two Things," American Journal of Psychology 15(1), 72–101, 1904.
- [R83] N. I. Fisher, Statistical Analysis of Circular Data, Cambridge University Press, 1993.
- [R84] M. J. Swain, D. H. Ballard, "Color Indexing," International Journal of Computer Vision 7(1), 11–32, 1991.
- [R85] W. J. Dixon, A. M. Mood, "The Statistical Sign Test," JASA 41(236), 557–566, 1946.
- [R86] O. Ronneberger, P. Fischer, T. Brox, "U-Net: Convolutional Networks for Biomedical Image Segmentation," MICCAI 2015, LNCS 9351, 234–241, 2015.
- [R87] D. P. Kingma, J. Ba, "Adam: A Method for Stochastic Optimization," ICLR 2015.
- [R88] F. Yu, V. Koltun, "Multi-Scale Context Aggregation by Dilated Convolutions," ICLR 2016.
- [R89] J. Bigün, G. H. Granlund, "Optimal Orientation Detection of Linear Symmetry," Proc. 1st ICCV, 433–438, 1987.
- [R90] X. Qin, H. Dai, X. Hu, D.-P. Fan, L. Shao, L. Van Gool, "Highly Accurate Dichotomous Image Segmentation," Computer Vision – ECCV 2022, LNCS 13678, 38–56, 2022.
- [R91] SkyTNT, "anime-segmentation" (ISNet 애니 캐릭터 분할 모델 skytnt/anime-seg), GitHub · Hugging Face, Apache License 2.0.
- [R92] R. Krishnamoorthi, "Quantizing Deep Convolutional Networks for Efficient Inference: A Whitepaper," arXiv:1806.08342, 2018.
- [R93] Microsoft, "ONNX Runtime Web" 1.29.0, MIT License.
- [R94] R. Suvorov, E. Logacheva, A. Mashikhin, A. Remizova, A. Ashukha, A. Silvestrov, N. Kong, H. Goka, K. Park, V. Lempitsky, "Resolution-robust Large Mask Inpainting with Fourier Convolutions," WACV 2022; 모델 big-lama (advimman/lama), Apache License 2.0.
- [R95] P. Pérez, M. Gangnet, A. Blake, "Poisson Image Editing," ACM Transactions on Graphics 22(3), 2003.
- [R96] R. A. Bradley, M. E. Terry, "Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons," Biometrika 39(3/4), 324–345, 1952.
- [R97] R. R. Davidson, "On Extending the Bradley-Terry Model to Accommodate Ties in Paired Comparison Experiments," Journal of the American Statistical Association 65(329), 317–328, 1970.