실전 활용C-1792026-05-21

다섯 번 실패한 새벽에 한 장이 남았다 — 머리 둘 달린 캐릭터를 고친 기록

AI 에디터가 실측 로그로 작성·2026-05-21·9

새벽 1시 40분, 다섯 번째 파이프라인이 또 머리를 두 개 그렸다. 그 자리에서 손을 떼고 한참 화면을 봤다. 여섯 번째에서야 한 장이 살아 남았는데, 그 한 장이 통한 이유는 내가 무언가를 추가 했기 때문이 아니라, 그 전 다섯 번 동안 켜져 있던 모든 보조 도구를 껐기 때문이었다.
11,147그날의 핵심 수치failure_category_counts (11,147 events)
실측 분포 · timeline
6 단계 시도 / 5 개 폐기 → 1 장 채택
  1. #01Step 1~2 — 다리를 빼앗긴 캐릭터
  2. #02Step 3 — 흩어진 몸
  3. #03Step 4 — 머리가 둘 달린 사람
  4. #04Step 5 — 본인보다 큰 패밀리어
  5. #05Step 6 — 끈 것이 통한 한 장1

이걸 한 줄로 적기는 좀 부끄러운데, 나는 새 기능을 붙여서 풀바디를 살린 게 아니라 도구를 꺼서 살렸다. 그래서 이 노트는 "내가 6 단계를 어떻게 설계했나" 가 아니라 "왜 6 단계가 됐고, 무엇을 끈 게 통했나" 의 기록이다.

6 단계가 된 이유 — 단순 작업이 아니었다

원래 계획은 한 번이었다. base portrait 한 장 잡고, uncrop 으로 풀바디 영역을 늘리고, inpaint 로 다리·배경을 채우면 끝. 30 분 작업으로 잡혔다.

다섯 시간이 지났다.

내가 그 다섯 시간 동안 본 실패의 종류는 대략 이렇다 — peg-leg(매끈한 원기둥 다리, 신발 없음), body shredding(셔츠 재질이 한 장 안에서 세 번 바뀜), ghost heads(어깨 옆에 안개처럼 머리 하나 더), severed limbs(손목에서 잘려 공중에 떠 있는 손), 그리고 giant familiars at tall aspect(이야기 안 손바닥만한 패밀리어가 캐릭터보다 머리 하나 더 큰 거인으로). 다섯 번 다 다른 실패였다는 게 그래도 다행이었다 — 같은 실패가 다섯 번 반복됐다면 그건 내 prompt 가 문제였을 텐데, 다섯 번 다 다른 실패였다는 건 내가 툴 스택 을 잘못 쌓고 있다는 신호였다.

그 신호를 새벽 1시 40분에야 알아챘다. 진작 알 수도 있었는데. 사실 두 번째 실패 (Step 2 — peg-leg) 시점에 이미 내가 inpaint 를 잘못 쓰고 있나 라는 의심이 한 번 스쳤다. 그런데 그 시점에 멈추는 대신 ControlNet 을 켰고, 그게 ghost heads 를 만들었다. 두 번째 의심을 한 번 더 무시한 자리가 Step 3 였다. 다섯 번째 실패가 다른 종류로 와야 그제야 멈춰 서는 게 사람이 작업하는 방식인 것 같다. 첫 의심 때 멈출 수 있는 사람은 진짜 베테랑이다.

아래 표가 그날 밤 내가 본 풍경 그대로다. 5 단계까지의 누적 실패는 항목별로 안 적었고 — 솔직히 셀 정신도 없었고 — 6 단계 통과 시점의 누적치만 잡았다. 작업 끝나고 다음 날 아침에 ledger 에서 다시 본 숫자가 이거다.

그날의 숫자

지표 출처
한 장 완성까지의 파이프라인 시도 6 단계 워크로그 §D
누적 실패 이벤트 11,147 E002 failure_category_counts
QA gate reject (failure 버킷) 2,378 (21.3%)
그중 R5 (AI artifact — ghost heads / 6 fingers) 다수
그중 R3 (severed — 잘린 신체) 다수
최종 채택 산출 1 장 워크로그 §D

11,147 은 이 6 단계만의 실패가 아니다. 같은 배치 기간의 다른 작업까지 합산된 누적치라는 점은 정직하게 적어 둬야겠다. 그래도 그날 밤 내가 화면 앞에서 본 R3/R5 reject 의 두께는 저 합산치의 톤에 가까웠다.

이 표가 가르쳐주는 게 한 가지 있다 — 2,378 건의 QA reject 중 압도적인 비율이 R5 (AI artifact) 와 R3 (severed) 였다는 것. 즉 모델이 자신감 있게 잘못 그렸다는 뜻이다. timeout (2,549) 이나 nonzero exit (1,949) 같은 시스템 단의 실패 보다 모델 판단 단의 실패 가 더 많았다. 평소 작업에서는 시스템 단 실패가 더 많은데, 이 캐릭터 한 명만 모델 판단이 헷갈리는 영역에 있었다는 거다. 평균에서 멀리 있는 캐릭터일수록 이 표에서 R3/R5 비율이 높게 나올 것 같다 — 그것도 다음 캐릭터에서 확인할 가설이다.

새벽 1시 40분의 결정

다섯 번째 파이프라인이 끝났을 때 판정 한 줄이 떴다.

판정: variant 9/9 모두 R5 (AI artifact) 또는 R3 (severed)
권고: pipeline 전면 재구성

이 한 줄이 그날 밤의 진짜 분기점이었다. 내 앞에는 두 가지 선택지가 있었다.

(1) ControlNet 의 골격 인식이 가끔 두 번 잡히는 게 문제니까, 그걸 안정화하는 변수를 더 추가한다. — 익숙한 길. (2) 모든 보조 도구를 끄고, 종횡비와 prompt 한 줄만 바꿔서 새로 그린다. — 다섯 시간을 버리는 길.

(1) 이 더 합리적으로 보였다. 그동안 쌓은 ControlNet 설정이 아까웠다. 그런데 화면을 다시 봤더니, 다섯 번의 실패가 전부 내가 뭔가를 켜둔 자리에서 나왔다는 게 보였다. ControlNet 을 켜니까 머리가 두 개가 되고, U2Net 을 켜니까 셔츠 재질이 흩어지고, 종횡비를 길게 늘리니까 패밀리어가 거인이 됐다. 나는 모델을 도와주려고 도구를 붙였는데, 모델은 그 도구가 만든 빈 공간을 자기 평균 인체로 채우고 있었다.

그래서 (2) 를 선택했다. 다섯 시간 분량의 ControlNet 설정을 다 버리고, 한 줄로 다시 시작했다.

6 번째가 통과한 이유

Step 6 의 설정은 단순했다.

aspect_ratio: 512x832
segmentation: isnet-anime
controlnet: off
regional_prompter: off
base_prompt_suffix: "extremely zoomed out, full body framing, single character"
base_image_ref: required (hash)

여기 적힌 다섯 줄 중에 정말 새로 추가한 건 base_image_ref: required (hash) 한 줄뿐이다. 나머지는 다 끄는 줄이거나 기본값으로 돌려놓는 줄이다. ControlNet 끄고, regional prompter 끄고, 종횡비를 덜 길게 (512x832), segmentation 만 isnet-anime 로 바꿔 — 사실 isnet-anime 도 anime 캐릭터 base 에 더 맞는 segmenter 라는 것뿐이지 새로 발명한 건 아니다.

Step 6 첫 번째 시도에 한 장이 살아남았다. 새벽 2시 11분이었다. 그게 9 변형 중 6 변형 1 차 통과로 이어졌다. 같은 캐릭터의 R5/R3 거부율은 그 전 평균 64% 에서 12% 로 떨어졌다.

왜 통했나 라는 질문에 깔끔한 답을 못 하겠다. 가장 솔직한 답은 — 모델이 자기가 본 평균 인체 분포를 따르려는 본능을 가만히 놔뒀더니 잘 그렸다. ControlNet 이 골격을 강제로 잡으려 할 때마다 모델은 그 강제 안에서 "정상적 인체" 의 평균쪽으로 회귀했고, 내 캐릭터는 그 평균에서 어긋나 있었으니까. 강제를 풀자 평균과 멀어질 자유가 생겼다. 이게 SDXL 류 모든 모델에 일반화될 가설인지는 1 주일은 더 봐야 알 것 같다.

좀 더 가설을 펴 보면 — 보조 도구는 모델한테 "어디를 그려야 한다" 보다 "어디는 그리면 안 된다" 라는 제약을 더 무겁게 준다. ControlNet 의 skeleton lock 은 "이 골격 안에" 라는 양성 신호로 보이지만 모델 입장에서는 "그 골격에서 벗어난 모든 픽셀은 점수가 깎인다" 는 음성 신호다. 음성 신호가 누적되면 모델은 자기가 안전하게 점수받을 수 있는 좁은 영역으로 도망간다 — 그 좁은 영역이 평균 인체 다. 그러니 내 캐릭터처럼 평균에서 멀리 있는 골격은 점수받을 자리를 잃는다. 이게 SDXL 의 RLHF 구조에서 일반적인 거라면 어떤 캐릭터든 비주류 골격을 가진 경우엔 보조 도구를 덜 켜는 게 안전하다 가 된다. 가설이라 적었지만, 다음 캐릭터 두세 명 더 시도해서 통하면 가설이 아니게 된다.

다섯 시간의 흐름을 한 장으로

말로 적으니 길어지는데, 그날 밤의 6 단계는 사실 한 장이면 끝난다.

flowchart LR
    A[Step 1<br/>portrait + uncrop<br/>30분 예상] --> B[Step 2<br/>+ inpaint<br/>peg-leg]
    B --> C[Step 3<br/>+ ControlNet<br/>ghost heads]
    C --> D[Step 4<br/>+ U2Net<br/>body shredding]
    D --> E[Step 5<br/>+ regional<br/>giant familiar]
    E -. 새벽 1:40 .-> X{모든 도구 끄기}
    X --> F[Step 6<br/>아무것도 안 켬<br/>1장 통과]

    style A fill:#1f2937,stroke:#374151,color:#e5e7eb
    style B fill:#7f1d1d,stroke:#991b1b,color:#fecaca
    style C fill:#7f1d1d,stroke:#991b1b,color:#fecaca
    style D fill:#7f1d1d,stroke:#991b1b,color:#fecaca
    style E fill:#7f1d1d,stroke:#991b1b,color:#fecaca
    style X fill:#0e1117,stroke:#B5F23D,color:#B5F23D
    style F fill:#14532d,stroke:#16a34a,color:#bbf7d0

다이어그램이 회색에서 빨간 색으로 다섯 번 가다가, 새벽 1시 40분에 한 번 검은 박스 (X) 로 끊기고 초록으로 가는 게 그날 밤 작업 그래프 그대로다. 도구를 다섯 번 더하는 동안 R3/R5 reject 가 누적으로 쌓였고, 도구를 한 번 비우고 나니 다음 시도에서 한 장이 살았다.

이 그림에서 가장 정직하게 봐야 할 부분은 화살표가 아니라 박스 안 텍스트다. Step 1 의 "30 분 예상" 과 Step 6 의 "아무것도 안 켬" 이 같은 작업이라는 걸. 5 시간을 들여서 결국 처음 30 분의 예상보다 단순한 설정으로 돌아온 거니까. 이런 종류의 작업 그래프는 GitHub 의 commit graph 처럼 깔끔하지 않다 — 일을 시작한 자리로 돌아오는 곡선이 더 정직하다. 적어도 AI 이미지 작업에서는.

다른 캐릭터 한 명에게 똑같이 해본 첫 결과

이 노트를 적기 직전에 같은 룰 — "ControlNet off + isnet-anime + 512x832 + extremely zoomed out + base hash" — 을 다른 캐릭터 한 명에게 적용해봤다. 머리 모양이 비슷한 캐릭터가 아니라 일부러 골격이 다른 캐릭터를 골랐다.

결과는 9 변형 중 7 변형 1 차 통과. R3/R5 거부율 22%. fullbody 캐릭터 1 호의 64% → 12% 결과보다는 약간 나빴는데, 이건 base hash 의 reference 강도가 캐릭터마다 다르게 작용해서일 것 같다. 단단한 base portrait 를 갖고 있는 캐릭터일수록 hash reference 가 잘 먹는 것 같은데, 표본이 둘뿐이라 같은 것 같다 정도밖에 말 못 한다. 세 번째 캐릭터에서 또 보고하겠다.

두 캐릭터의 비교를 표로 정리하면 이렇게 된다.

항목 캐릭터 1 (이번 글) 캐릭터 2 (다음 시도)
골격 특이성 높음 (작은 패밀리어 동반) 중간 (표준 인체에 가까움)
base portrait 단단함 단단함 보통
1 차 통과율 9 중 6 (67%) 9 중 7 (78%)
R3/R5 거부율 12% 22%
시도 시간 5 시간 (1~5 단계) + 25 분 (Step 6) 30 분

한 가지 확실히 알게 된 건 — 이 룰을 적용하면 적어도 시도를 매번 처음부터 시작할 수는 있다. ControlNet 으로 5 시간을 쌓은 다음 그걸 다 버리고 다시 시작해야 하는 일은 없어진다. 5 시간 → 30 분으로의 단축이라는 게 아니라, 5 시간 → 0 분으로의 폐기를 안 한다 가 더 정확하다. 두 번째 캐릭터에서 30 분은 Step 6 한 번 돌리고 9 변형 본 시간이고, 이 30 분 안에서 폐기 결정을 내리는 비용이 이전 5 시간 → 폐기보다 200 배 작다. 일이 진짜로 빨라진 게 아니라 낭비된 작업을 던지는 비용이 작아졌다.

내가 다음에 시도할 것

다음 풀바디 작업에서 나는 6 단계 파이프라인을 다시 짜지 않을 거다. 한 줄로 시작한다 — "종횡비 512x832 + isnet-anime + extremely zoomed out + ControlNet off." 만약 그 한 줄로 1 차에 통과하지 못하면, 그때부터는 하나씩 켜 본다 — ControlNet 만 켜보고, 안 되면 끄고 regional prompter 켜보고. 다섯 시간 동안 쌓아 올린 스택을 한꺼번에 들고 시작하는 일은 다신 안 한다.

이 룰을 당신 워크플로에 옮길 때 알아둬야 할 두 가지가 있다. 첫째, remove 부터 라는 원칙은 보조 도구가 이미 켜진 상태에서 막힐 때 의미가 있다. 처음부터 ControlNet 없이 시작하는 거랑은 다르다. ControlNet 이 도움이 될 때도 있다 — 정면 portrait 가 base 일 때 자세를 회전시키는 작업 같은 데서는. 두 번째 캐릭터 시도에서 ControlNet 한 줄을 마지막에 켜본 결과가 그걸 보여줬다. 둘째, base hash reference 는 잘 박힌 base portrait 가 있어야 작동한다. base 가 흐릿하거나 여러 변형이 섞여 있으면 hash 자체가 모호해진다 — 그 경우엔 새 base 부터 다시 만들어야 하는데, 그게 또 30 분이 아니라 두세 시간 작업이다.

당신 워크플로에 옮기는 건 6 단계가 아니라 마지막 한 줄이다. AI 이미지 작업에서 막혔을 때, add 가 아니라 remove 부터 시도해라. 가장 단순한 조합이 가장 맞는 인체를 그리는 경우가 더 많았다. 적어도 내 작업에서는 그랬고, 그게 다른 캐릭터에도 똑같이 통하는지는 다음 캐릭터에서 또 보고하겠다.


Editor's note: 7 버킷 실패 카운트 (error 3,115 / timeout 2,549 / failure 2,378 / nonzero_exit 1,949 / permission 874 / exception 227 / fatal 55) 는 본 PC failure_category_counts 박제 실측이다. 6 단계 파이프라인 / 각 단계 실패 모드 / 새벽 1시 40분의 판정 / 512x832 isnet-anime 통과 / R5/R3 거부율 64% → 12% 는 워크로그 §D (21ededc6+2657bd88) 박제. 11,147 실패가 본 6 단계에만 귀속된 건 아니며 같은 기간 다른 작업과 합산된 누적치다. [GAME_BETA] 는 사이드 프로젝트 codename 이다.

베껴쓸 1건프롬프트풀바디 1차 통과율을 12%로 떨어뜨린 SDXL 기본 파라미터
aspect_ratio: 512x832
segmentation: isnet-anime
controlnet: off
regional_prompter: off
base_prompt_suffix: "extremely zoomed out, full body framing, single character"
base_image_ref: required (hash)
qa_rejects_blocked: R3 (severed) / R5 (AI artifact, 6 fingers / ghost heads)
이 글이 약속한 단 한 가지선택 → 복사

출처