vignette/docs/avatar-art/p1-linocut/manifest.json
Yun Chan 98577cf4ae 리노컷 공통 파이프라인 캐스트 확장 — 정렬·정규화·얼굴 해칭·원화 눈썹·눈 실측
- register_edit(편집본 ECC 정렬·챔퍼 지표), normalize_base(P1 머리 크기 정규화, 위쪽 종이색 채움)
- faceDetail region=face(얼굴 해칭을 원화 픽셀로 보존)·matchFacelessColor
- brow_sprite 단계: 원화 눈썹 잉크 스프라이트(hairFront 아래 제외), 윗눈꺼풀 두께·홍채 실측
- 리그 계약 RigBrow.halfWidth/sprite·RigEye.lineScale, 렌더러 눈썹 16띠·바깥쪽 눈꺼풀 굵기
- 실행기 UTF-8 하위 실행, brow_centerline 패딩본 자체 생성, QA 시트 촬영 도구(깜빡임 회피·고해상도 대조)
- P1은 새 필드를 모두 끄고 게시 자산·리그 바이트 동일
2026-10-01 22:38:27 +09:00

1825 lines
No EOL
39 KiB
JSON

{
"schemaVersion": "vignette.avatar.v3.layers.v1",
"persona": "P1",
"canvas": {
"w": 1005,
"h": 1566
},
"base": {
"front": "base/base-front.png",
"faceless": "base/base-faceless.png",
"facelessPadded": "base/base-faceless-padded.png",
"facelessSize": [
1005,
1565
],
"padNote": "base-faceless.png 마지막 행을 1번 복제해 1005x1566(base-front.png 크기)으로 패딩한 것이 F다."
},
"layers": [
{
"id": "body",
"file": "layers/body.png",
"source": "base-faceless-masked+regenerated-fill",
"alphaBBox": [
0,
807,
1005,
1566
],
"opaquePixels": 676997,
"greenResidue": 0,
"fillTargetPixels": 111193,
"fillSourceRaw": "raw/body.png (rejected 재생성이 아니라 수용된 body.png의 크로마키 결과; head/hairFront와 달리 body 재생성은 승인됨)"
},
{
"id": "head",
"file": "layers/head.png",
"source": "base-faceless-masked",
"alphaBBox": [
114,
86,
941,
1121
],
"opaquePixels": 581114,
"greenResidue": 0
},
{
"id": "hairFront",
"file": "layers/hairFront.png",
"source": "base-faceless-masked",
"alphaBBox": [
260,
391,
751,
932
],
"opaquePixels": 26681,
"greenResidue": 0
}
],
"composite": {
"meanAbsDiff": {
"full": 1.2217247097844115,
"face": 0.31938995265429254,
"hairOutline": 5.581258439408577
},
"target": {
"full": 3.0,
"pass": true
},
"backgroundNote": "카테고리0(배경)은 종이결 텍스처 노이즈(표준편차 ~29/채널)를 포함해 평탄한 크림(#EEE5D3)과 자체적으로 평균절대차 ~7 차이가 난다."
},
"landmarks": {
"coordSystem": "screen (image pixel: x=0 좌측, y=0 상단; left=작은 x, right=큰 x; 인물 해부학적 좌우 아님)",
"eyeLeft": {
"innerCorner": [
430.91,
592.22
],
"outerCorner": [
339.05,
578.79
],
"upperLidTop": [
376.31,
564.31
],
"lowerLidBottom": [
381.06,
598.18
],
"iris": {
"center": [
387.33,
579.15
],
"radius": 21.43
}
},
"eyeRight": {
"innerCorner": [
552.78,
590.87
],
"outerCorner": [
648.01,
575.45
],
"upperLidTop": [
607.07,
562.12
],
"lowerLidBottom": [
603.89,
595.01
],
"iris": {
"center": [
601.93,
576.21
],
"radius": 21.28
}
},
"eyebrowLeft": {
"inner": [
450.62,
525.06
],
"peak": [
360.1,
510.44
],
"outer": [
313.38,
513.28
]
},
"eyebrowRight": {
"inner": [
518.25,
521.66
],
"peak": [
626.75,
508.19
],
"outer": [
682.75,
510.7
]
},
"noseTip": [
486.6,
713.03
],
"mouthCornerLeft": [
422.12,
804.71
],
"mouthCornerRight": [
567.47,
805.8
],
"upperLipTopCenter": [
489.77,
773.37
],
"lowerLipBottomCenter": [
492.98,
831.48
],
"chinTip": [
500.61,
919.55
],
"faceWidthAtEyeLevelLeft": [
281.78,
623.96
],
"faceWidthAtEyeLevelRight": [
736.2,
621.0
]
},
"landmarkDetector": "mediapipe FaceLandmarker (tasks) 1.0.1, model=face_landmarker(float16, v1)",
"segmenter": {
"model": "selfie_multiclass_256x256.tflite (mediapipe ImageSegmenter, storage.googleapis.com)",
"categories": {
"0": "background",
"1": "hair",
"2": "bodySkin",
"3": "faceSkin",
"4": "clothes",
"5": "others"
},
"categoryPixelCounts": {
"0": 407753,
"1": 383398,
"2": 68311,
"3": 188992,
"4": 525376
},
"hairEdgeRefine": {
"dilatePx": 6,
"lumThreshold": 110,
"addedPixels": 22965
}
},
"chinLine": {
"landmarkIndex": 152,
"xy": [
500.61,
919.55
],
"marginPx": 8,
"cutY": 927.55
},
"faceOval": {
"landmarkLoop": [
10,
338,
297,
332,
284,
251,
389,
356,
454,
323,
361,
288,
397,
365,
379,
378,
400,
377,
152,
148,
176,
149,
150,
136,
172,
58,
132,
93,
234,
127,
162,
21,
54,
103,
67,
109
],
"scale": 1.04,
"sourceImage": "base/base-front.png"
},
"rejectedRawEdits": {
"head": {
"file": "raw/head.png",
"status": "rejected",
"reason": "얼굴 폭·턱선·귀·머리숱이 base-faceless와 달라짐(2단계-A 1차 반려 사유)"
},
"hairFront": {
"file": "raw/hair-front.png",
"status": "rejected",
"reason": "노란 하이라이트 획 등 기준에 없던 색상 아티팩트, 형태 변형(2단계-A 1차 반려 사유)"
},
"body": {
"file": "raw/body.png",
"status": "accepted-as-fill-source",
"reason": "정렬 (0,0), 형태 변형 없음 — head_mask 채움 전용 소스로 재사용"
}
},
"layersV2": {
"chinBandFix": {
"targetRegionPixels": 51052,
"sourceBandHeight": 150,
"rowJitterRange": [
-2.0,
2.0
],
"rngSeed": 20260930
},
"hairEdgeFix": {
"bandOuterPx": 40,
"bandInnerPx": 6,
"lumSmoothstep": [
205.0,
150.0
],
"minFragmentAreaPx": 60,
"head": {
"bandOuterPixels": 93622,
"bandInnerPixels": 60104,
"componentsBefore": 67,
"removed": 63,
"removedPixels": 322
},
"hairFront": {
"bandOuterPixels": 0,
"bandInnerPixels": 21491,
"componentsBefore": 217,
"removed": 207,
"removedPixels": 526
}
},
"hairPaperGapFix": {
"regionDilatePx": 6,
"paperColorDistThreshold": 40.0,
"paperLumThreshold": 195.0,
"paperSatThreshold": 40.0,
"opaqueAlphaThreshold": 0.95,
"regionPixels": 410064,
"head": {
"targetPixels": 1359,
"componentsBefore": 4,
"removed": 0,
"removedPixels": 0,
"faceSkinAlphaDiff": 0.0
},
"hairFront": {
"targetPixels": 0,
"componentsBefore": 10,
"removed": 0,
"removedPixels": 0,
"faceSkinAlphaDiff": 0.0
}
},
"jawInkFix": {
"mouthCenterY": 797.52,
"distThresholdPx": 14.0,
"mergePx": 3,
"aspectThreshold": 1.0,
"removedGroups": [
{
"pixels": 4410,
"bbox": [
459,
798,
700,
933
],
"width": 241,
"height": 135,
"aspect": 1.785
}
],
"keptGroups": [
{
"pixels": 1471,
"bbox": [
322,
798,
382,
870
],
"width": 60,
"height": 72,
"aspect": 0.833
}
],
"removedPixels": 4410,
"strayFragmentCleanup": {
"componentsBefore": 21,
"removed": 14,
"removedPixels": 118
}
},
"metrics": {
"body": {
"haloPct": 0.6339468302658486
},
"head": {
"haloPct": 0.04071661237785017,
"bgLeakAlphaMean": 0.0,
"hairPaperOpaquePct": 0.0,
"disconnectedFragmentsUnder60px": 0
},
"hairFront": {
"haloPct": 0.0,
"bgLeakAlphaMean": 0.0,
"hairPaperOpaquePct": 0.0,
"disconnectedFragmentsUnder60px": 0
}
},
"layers": [
{
"id": "body",
"bbox": [
0,
807,
1005,
1566
],
"opaque": 672038,
"greenResidue": 1
},
{
"id": "head",
"bbox": [
111,
72,
960,
1121
],
"opaque": 593623,
"greenResidue": 0
},
{
"id": "hairFront",
"bbox": [
260,
391,
751,
907
],
"opaque": 31928,
"greenResidue": 0
}
],
"faceDetail": {
"browLandmarksSource": "persona.json faceDetail.browLandmarksOverride",
"region": "features",
"faceInsetPx": null,
"matchFacelessColor": false,
"matchFacelessColorDeltaRgb": {},
"regions": {
"eyeLeft": [
309.1,
487.9,
455.9,
668.2
],
"eyeRight": [
527.8,
486.1,
678.0,
665.0
],
"mouth": [
377.1,
738.0,
612.5,
904.5
],
"moles": [
{
"center": [
661.3,
627.9
],
"radius": 20.0
}
]
},
"exclusionPixels": {
"eyeLeft": 12830,
"eyeRight": 12345,
"browLeft": 17125,
"browRight": 19863,
"mouth": 18912,
"union": 66536
},
"hairMaskPixels": 402878,
"bbox": [
284,
444,
721,
922
],
"textureCloneStamp": {
"cloneTargetThreshold": 65.0,
"avoidThreshold": 110.0,
"lineOpeningIterations": 3,
"featherPx": 4.0,
"badTexturePixels": 353,
"preservedShadowPixels": 0,
"components": [
{
"componentId": 1,
"pixels": 1,
"offset": [
-80,
0
],
"method": "clone-stamp"
},
{
"componentId": 2,
"pixels": 4,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 3,
"pixels": 1,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 4,
"pixels": 1,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 5,
"pixels": 4,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 6,
"pixels": 4,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 7,
"pixels": 1,
"offset": [
100,
0
],
"method": "clone-stamp"
},
{
"componentId": 8,
"pixels": 4,
"offset": [
100,
0
],
"method": "clone-stamp"
},
{
"componentId": 9,
"pixels": 1,
"offset": [
80,
0
],
"method": "clone-stamp"
},
{
"componentId": 10,
"pixels": 1,
"offset": [
80,
0
],
"method": "clone-stamp"
},
{
"componentId": 11,
"pixels": 17,
"offset": [
80,
0
],
"method": "clone-stamp"
},
{
"componentId": 12,
"pixels": 23,
"offset": [
40,
40
],
"method": "clone-stamp"
},
{
"componentId": 13,
"pixels": 4,
"offset": [
0,
100
],
"method": "clone-stamp"
},
{
"componentId": 14,
"pixels": 1,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 15,
"pixels": 8,
"offset": [
80,
0
],
"method": "clone-stamp"
},
{
"componentId": 16,
"pixels": 81,
"offset": null,
"method": "nearest-good-pixel"
},
{
"componentId": 17,
"pixels": 1,
"offset": [
-60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 18,
"pixels": 1,
"offset": [
-120,
-60
],
"method": "clone-stamp"
},
{
"componentId": 19,
"pixels": 1,
"offset": [
-60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 20,
"pixels": 1,
"offset": [
-60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 21,
"pixels": 5,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 22,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 23,
"pixels": 1,
"offset": [
-40,
40
],
"method": "clone-stamp"
},
{
"componentId": 24,
"pixels": 1,
"offset": [
0,
-80
],
"method": "clone-stamp"
},
{
"componentId": 25,
"pixels": 2,
"offset": [
0,
-80
],
"method": "clone-stamp"
},
{
"componentId": 26,
"pixels": 1,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 27,
"pixels": 1,
"offset": [
-40,
40
],
"method": "clone-stamp"
},
{
"componentId": 28,
"pixels": 1,
"offset": [
0,
-80
],
"method": "clone-stamp"
},
{
"componentId": 29,
"pixels": 3,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 30,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 31,
"pixels": 1,
"offset": [
0,
40
],
"method": "clone-stamp"
},
{
"componentId": 32,
"pixels": 2,
"offset": [
0,
60
],
"method": "clone-stamp"
},
{
"componentId": 33,
"pixels": 1,
"offset": [
0,
-40
],
"method": "clone-stamp"
},
{
"componentId": 34,
"pixels": 3,
"offset": [
60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 35,
"pixels": 1,
"offset": [
-120,
-60
],
"method": "clone-stamp"
},
{
"componentId": 36,
"pixels": 1,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 37,
"pixels": 40,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 38,
"pixels": 1,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 39,
"pixels": 9,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 40,
"pixels": 4,
"offset": [
0,
-120
],
"method": "clone-stamp"
},
{
"componentId": 41,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 42,
"pixels": 1,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 43,
"pixels": 2,
"offset": [
0,
-80
],
"method": "clone-stamp"
},
{
"componentId": 44,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 45,
"pixels": 2,
"offset": [
-60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 46,
"pixels": 1,
"offset": [
0,
-120
],
"method": "clone-stamp"
},
{
"componentId": 47,
"pixels": 2,
"offset": [
-60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 48,
"pixels": 21,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 49,
"pixels": 1,
"offset": [
-40,
-40
],
"method": "clone-stamp"
},
{
"componentId": 50,
"pixels": 3,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 51,
"pixels": 1,
"offset": [
0,
-120
],
"method": "clone-stamp"
},
{
"componentId": 52,
"pixels": 1,
"offset": [
-40,
-40
],
"method": "clone-stamp"
},
{
"componentId": 53,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 54,
"pixels": 1,
"offset": [
-120,
-60
],
"method": "clone-stamp"
},
{
"componentId": 55,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 56,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 57,
"pixels": 6,
"offset": [
-80,
0
],
"method": "clone-stamp"
},
{
"componentId": 58,
"pixels": 15,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 59,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 60,
"pixels": 1,
"offset": [
-80,
0
],
"method": "clone-stamp"
},
{
"componentId": 61,
"pixels": 1,
"offset": [
-40,
-40
],
"method": "clone-stamp"
},
{
"componentId": 62,
"pixels": 1,
"offset": [
-40,
-40
],
"method": "clone-stamp"
},
{
"componentId": 63,
"pixels": 10,
"offset": [
60,
-100
],
"method": "clone-stamp"
},
{
"componentId": 64,
"pixels": 1,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 65,
"pixels": 2,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 66,
"pixels": 2,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 67,
"pixels": 8,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 68,
"pixels": 1,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 69,
"pixels": 1,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 70,
"pixels": 1,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 71,
"pixels": 1,
"offset": [
-100,
0
],
"method": "clone-stamp"
},
{
"componentId": 72,
"pixels": 1,
"offset": [
0,
-40
],
"method": "clone-stamp"
},
{
"componentId": 73,
"pixels": 4,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 74,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 75,
"pixels": 3,
"offset": [
0,
-150
],
"method": "clone-stamp"
},
{
"componentId": 76,
"pixels": 4,
"offset": [
0,
-180
],
"method": "clone-stamp"
},
{
"componentId": 77,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 78,
"pixels": 1,
"offset": [
0,
-100
],
"method": "clone-stamp"
},
{
"componentId": 79,
"pixels": 5,
"offset": [
-120,
-60
],
"method": "clone-stamp"
}
]
},
"genericPatches": {
"forehead": [
450,
411,
498,
459
],
"cheekLeft": [
337,
646,
385,
694
],
"cheekRight": [
506,
643,
554,
691
]
},
"genericPatchBaseline": {
"highFreqEnergy": 11.156430639089423,
"lineEnergy": 3.887366952020924
},
"checkA_meanAbsDiff": 1.7134750660286082,
"checkB_seamLumDiff": 4.286507356166055,
"checkC_holeDarkResiduePct": 0.338642256204032,
"checkC_violationPixels": 192,
"checkD_texturePreservation": {
"eyeLeft": {
"insideEnergy": 9.38281754159341,
"baselineEnergy": 11.156430639089423,
"ratio": 0.8410232488443298,
"pass": true
},
"eyeRight": {
"insideEnergy": 10.293938339280684,
"baselineEnergy": 11.156430639089423,
"ratio": 0.9226910176103479,
"pass": true
},
"browLeft": {
"insideEnergy": 10.557405723240223,
"baselineEnergy": 11.156430639089423,
"ratio": 0.9463067592828155,
"pass": true
},
"browRight": {
"insideEnergy": 13.693225750578769,
"baselineEnergy": 11.156430639089423,
"ratio": 1.2273841153640155,
"pass": true
},
"mouth": {
"insideEnergy": 6.263508649377403,
"baselineEnergy": 11.156430639089423,
"ratio": 0.5614258585027715,
"pass": false
}
},
"checkD_allPass": false,
"checkE_ghostOutline": {
"eyeLeft": {
"bandLineEnergy": 5.890396770321027,
"baselineLineEnergy": 3.887366952020924,
"ratio": 1.5152664626267889,
"pass": false
},
"eyeRight": {
"bandLineEnergy": 5.7916340703027815,
"baselineLineEnergy": 3.887366952020924,
"ratio": 1.4898603969691842,
"pass": true
},
"browLeft": {
"bandLineEnergy": 2.409716430748075,
"baselineLineEnergy": 3.887366952020924,
"ratio": 0.6198839627155179,
"pass": true
},
"browRight": {
"bandLineEnergy": 4.83612006778533,
"baselineLineEnergy": 3.887366952020924,
"ratio": 1.2440606012949662,
"pass": true
},
"mouth": {
"bandLineEnergy": 3.810132841546642,
"baselineLineEnergy": 3.887366952020924,
"ratio": 0.980132024728427,
"pass": true
}
},
"checkE_allPass": false,
"checkDarkCircle": {
"eyeLeft": {
"compositeMean": 127.63085714285714,
"frontMean": 127.29714285714286,
"diff": 0.3337142857142794,
"pass": true
},
"eyeRight": {
"compositeMean": 131.44914285714285,
"frontMean": 131.20609523809526,
"diff": 0.2430476190475872,
"pass": true
}
},
"checkDarkCircle_allPass": true
},
"paperGrain": {
"sourceImage": "base/base-front.png",
"sourceOrigin": [
10,
10
],
"tileSize": 256,
"personMarginPx": 20,
"cleanFraction": 0.952606201171875,
"contaminatedPixelsFilled": 3106,
"chromaKeep": 0.3,
"targetLumRange": [
245.0,
250.0
],
"lumShift": 22.883758544921875,
"finalMeanLum": 247.49081557865418,
"finalLumStd": 2.7344333398808125,
"seamContinuity": {
"leftRightDiff": 0.2262236423635405,
"topBottomDiff": 0.623485711518839
}
}
},
"motifPublish": {
"quality": 82,
"fileSizes": {
"bud-closed": 14576,
"bud-half": 14932,
"bud-open": 18278,
"bud-droop": 14102,
"weather-positive": 7594,
"weather-negative": 13262,
"weather-defensive": 14886,
"weather-cognitive": 7790,
"weather-energy": 7132
},
"totalBytes": 112552,
"budgetBytes": 163840,
"halo": {
"bud-closed": 0.09157509157509157,
"bud-half": 0.09174311926605505,
"bud-open": 0.06657789613848203,
"bud-droop": 0.205761316872428,
"weather-positive": 0.0,
"weather-negative": 0.0,
"weather-defensive": 0.0,
"weather-cognitive": 0.0,
"weather-energy": 0.2890173410404624
},
"haloThreshold": 2.0
},
"browCenterline": {
"method": "Otsu(front lum in bbox) AND diff(F-front)>=25, morphological closing to merge hatching, single global degree-2 polyfit on column-weighted centroid with one-pass outlier removal",
"diffThresh": 25.0,
"bboxPad": {
"x": 25.0,
"yUp": 42.0,
"yDown": 14.0
},
"closingKernel": [
7,
11
],
"minComponentAreaPx": 30.0,
"outlierStdMult": 2.0,
"edgeInsetFrac": 0.03,
"peakWindow": [
0.25,
0.6
],
"peakFallbackFrac": 0.35,
"peakFlatHeightPx": 3.0,
"peakFailEdgeFrac": 0.2,
"oldPoints": {
"browLeft": {
"inner": [
441.16,
535.91
],
"peak": [
345.46,
497.87
],
"outer": [
298.95,
524.32
]
},
"browRight": {
"inner": [
531.24,
535.37
],
"peak": [
628.82,
496.05
],
"outer": [
687.99,
522.25
]
}
},
"newPoints": {
"browLeft": {
"name": "browLeft",
"bbox": [
274,
456,
466,
550
],
"otsuThresh": 105.0,
"colRange": [
309,
455
],
"width": 146.0,
"nColumns": 146,
"nOutliersRemoved": 7,
"fitCoeffs": [
0.00161949,
-1.15147737,
715.08915879
],
"inner": [
450.62,
525.06
],
"peak": [
360.1,
510.44
],
"outer": [
313.38,
513.28
],
"peakMethod": "fallback35",
"peakFracFromOuterEdge": 0.35,
"peakFail": false,
"checkA_fracColumnsFitWithinMask": 0.9247,
"checkA_pass": true,
"halfWidthInner": 2.389,
"halfWidthPeak": 8.999,
"halfWidthOuter": 3.963,
"bandX0": 274,
"bandY0": 456,
"colMin": 309,
"colMax": 455
},
"browRight": {
"name": "browRight",
"bbox": [
506,
454,
713,
549
],
"otsuThresh": 110.0,
"colRange": [
513,
688
],
"width": 175.0,
"nColumns": 163,
"nOutliersRemoved": 11,
"fitCoeffs": [
0.00102658,
-1.29955603,
919.43219697
],
"inner": [
518.25,
521.66
],
"peak": [
626.75,
508.19
],
"outer": [
682.75,
510.7
],
"peakMethod": "fallback35",
"peakFracFromOuterEdge": 0.35,
"peakFail": false,
"checkA_fracColumnsFitWithinMask": 0.9202,
"checkA_pass": true,
"halfWidthInner": 5.84,
"halfWidthPeak": 9.499,
"halfWidthOuter": 2.984,
"bandX0": 506,
"bandY0": 454,
"colMin": 513,
"colMax": 688
}
},
"halfWidthLeft": [
2.389,
8.999,
3.963
],
"halfWidthRight": [
5.84,
9.499,
2.984
],
"halfWidthNote": "원화 눈썹 잉크 띠 반두께[inner,peak,outer](px, 중심선 법선 방향). export_rig.py가 persona.json browHalfWidthFromArt!=false(기본)면 RigBrow.halfWidth로 내보낸다.",
"checkB_innerMinusPeakY": {
"browLeft": 14.62,
"browRight": 13.47
},
"checkD_symmetry": {
"innerYDiff": 3.4,
"peakYDiff": 2.25
},
"evidenceImage": "preview/v2/brow-centerline.jpg"
},
"lipTexture": {
"designVersion": "A5(아랫입술 그늘 띠를 lip-shadow 조각으로 분리)",
"landmarks": {
"mouthCornerLeft": [
422.12,
804.71
],
"mouthCornerRight": [
567.47,
805.8
],
"upperLipTop": [
489.77,
773.37
],
"lowerLipBottom": [
492.98,
831.48
],
"mouthCenter": [
491.55401542782784,
797.5187528729439
]
},
"capBBox": [
413.8,
767.42,
575.8,
837.42
],
"otsuThreshLabA": 136.0,
"diffThresh": 20.0,
"dilatePx": 10.0,
"alphaRampPx": 4.0,
"splitOverlapPx": 2.0,
"shadowBandPx": 18.0,
"shadowTopOverlapPx": 6.0,
"shadowSideRampPx": 6.0,
"shadowTopRampPx": 4.0,
"checks": {
"lip-upper": {
"regionPixelCount": 5996,
"fullOpacityPixelCount": 5179,
"rampPixelCount": 817,
"preserveMaxDiffFullOpacity": 0,
"check1Preserve": true,
"spriteBBoxWorkingLocal": [
30,
31,
182,
54
]
},
"lip-lower": {
"regionPixelCount": 6482,
"fullOpacityPixelCount": 5704,
"rampPixelCount": 778,
"preserveMaxDiffFullOpacity": 0,
"check1Preserve": true,
"spriteBBoxWorkingLocal": [
30,
71,
182,
49
]
},
"lip-shadow": {
"regionPixelCount": 3888,
"fullOpacityPixelCount": 2071,
"rampPixelCount": 1817,
"preserveMaxDiffFullOpacity": 0,
"check1Preserve": true,
"spriteBBoxWorkingLocal": [
40,
75,
162,
53
]
},
"splitOverlapPixelCount": 362,
"splitOverlapBandOk": true,
"splitOverlapAlphaMaxDiff": 0,
"splitOverlapConsistentOk": true,
"splitCoverageMismatchPixelCount": 0,
"splitCheckOk": true,
"shadowLowerOverlapPixelCount": 2845,
"shadowLowerOverlapMaxDiff": 35.95294117647059,
"shadowLowerOverlapDiffGt1PixelCount": 138,
"shadowLowerOverlapOk": false
},
"check3NeutralComposite": {
"fullOpacityMaxDiff": 0.0,
"rampMeanAbsDiff": 3.069,
"mouthBBoxMeanAbsDiff": 0.707
},
"pngFileSizes": {
"lip-upper": 24050,
"lip-lower": 22210,
"lip-shadow": 21762
},
"canvasOrigin": {
"upper": [
404,
758
],
"lower": [
404,
798
],
"shadow": [
414,
802
]
},
"evidenceImage": "preview/v2/lip-texture.jpg",
"check4WebpVsPngMeanAbsDiff": {
"upper": 0.0,
"lower": 0.0,
"shadow": 0.0
}
},
"lipTexturePublish": {
"quality": "lossless",
"fileSizes": {
"lip-upper": 15904,
"lip-lower": 14630,
"lip-shadow": 14868
},
"totalBytes": 45402,
"budgetBytes": 81920,
"webpVsPngMeanAbsDiff": {
"upper": 0.0,
"lower": 0.0,
"shadow": 0.0
}
},
"jaw": {
"designVersion": "A5(결정문 §8.4 하관 띠 변형 — 턱 조각 원본)",
"noseTip": [
486.6,
713.03
],
"chinTip": [
500.61,
919.55
],
"yFormula": "noseTip.y - 50 - 10 .. chinTip.y + 40",
"noseToTopPx": 60.0,
"chinToBottomPx": 40.0,
"ovalOutsetPx": 18.0,
"faceOvalSource": "export_rig.detect_face_landmarks + compute_face_oval(base-front.png, 결정적)",
"bboxCanvas": [
260,
653,
760,
960
],
"naiveXRangeForComparison": [
260,
760
],
"checks": {
"head": {
"pngRoundTripMaxDiff": 0,
"pngRoundTripOk": true,
"pngFileSize": 314304
},
"detail": {
"pngRoundTripMaxDiff": 0,
"pngRoundTripOk": true,
"pngFileSize": 332332
}
},
"evidenceImage": "preview/v2/jaw-pieces.jpg",
"check1VsPublishedLayerAbsDiff": {
"head": {
"comparedAgainstPublishedLayer": "head.webp",
"meanAbsDiffPremultipliedRgb": 3.131,
"maxAbsDiffPremultipliedRgb": 40.0,
"meanAbsDiffAlpha": 0.0,
"maxAbsDiffAlpha": 0.0,
"meetsTarget": false
},
"detail": {
"comparedAgainstPublishedLayer": "face-detail.webp",
"meanAbsDiffPremultipliedRgb": 0.565,
"maxAbsDiffPremultipliedRgb": 25.0,
"meanAbsDiffAlpha": 0.0,
"maxAbsDiffAlpha": 0.0,
"meetsTarget": true
}
}
},
"jawPublish": {
"quality": 80,
"scale": 1.0,
"fileSizes": {
"jaw-head": 24580,
"jaw-detail": 15488
},
"totalBytes": 40068,
"budgetBytes": 204800,
"vsPublishedLayerAbsDiff": {
"head": {
"comparedAgainstPublishedLayer": "head.webp",
"meanAbsDiffPremultipliedRgb": 3.131,
"maxAbsDiffPremultipliedRgb": 40.0,
"meanAbsDiffAlpha": 0.0,
"maxAbsDiffAlpha": 0.0,
"meetsTarget": false
},
"detail": {
"comparedAgainstPublishedLayer": "face-detail.webp",
"meanAbsDiffPremultipliedRgb": 0.565,
"maxAbsDiffPremultipliedRgb": 25.0,
"meanAbsDiffAlpha": 0.0,
"maxAbsDiffAlpha": 0.0,
"meetsTarget": true
}
}
},
"pipelineRun": {
"persona": "P1",
"timestamp": "2026-10-01T21:46:24",
"completed": true,
"stages": [
{
"stage": "face_detail",
"ok": true,
"elapsedSec": 15.41
},
{
"stage": "brow_sprite",
"ok": true,
"elapsedSec": 1.05
},
{
"stage": "paper_grain",
"ok": true,
"elapsedSec": 2.45
},
{
"stage": "lip_texture",
"ok": true,
"elapsedSec": 2.45
},
{
"stage": "jaw_pieces",
"ok": true,
"elapsedSec": 2.17
},
{
"stage": "export_rig",
"ok": true,
"elapsedSec": 22.95
},
{
"stage": "final_previews",
"ok": true,
"elapsedSec": 19.59
}
]
},
"browSprite": {
"enabled": false
},
"eyeLineScale": {
"enabled": false
},
"browSpritePublish": null,
"iris": {
"method": "가로: 중심 y 부근 상하 각 4행에서 중심 x를 포함하는 연속 어두운(lum<100) 구간의 중앙값으로 반지름·중심x. 세로: 중심 x 부근 좌우 각 4열에서 중심 y를 포함하는 연속 어두운 구간의 아래쪽 끝 중앙값에서 가로 반지름을 빼 중심y(세로축은 윗눈꺼풀 잉크와 홍채가 같은 톤으로 이어져 위쪽 경계를 가를 수 없다).",
"darkLumThresh": 100.0,
"scanBandPx": 4,
"left": {
"measuredCenter": [
395.0,
567.0
],
"measuredRadius": 30.0,
"rigCenter": [
387.33,
579.15
],
"rigRadius": 21.43,
"nRowsHorizontal": 9,
"nColsVertical": 9
},
"right": {
"measuredCenter": [
600.0,
573.0
],
"measuredRadius": 22.0,
"rigCenter": [
601.93,
576.21
],
"rigRadius": 21.28,
"nRowsHorizontal": 9,
"nColsVertical": 9
}
}
}