Lena Hart 작성
tattooprobes는 디자인을 CPU에서 인쇄 크기로 리샘플링하고, 밀리미터 단위로 선과 간격을 측정하며, 스켈레톤 점수를 매기기 전에 래스터를 흐릿하게 처리할 수 있습니다. AI 문신 생성기에서 나온 PNG 이미지가 배열 형태로 입력됩니다.
프로브가 CPU에 머물러야 하는 이유
probes.py와 simulate.py는 NumPy, OpenCV, scikit-image를 가져옵니다. 격리된 환경은 여전히 CPU 기반의 torch 빌드이기 때문입니다. 이는 보상 점수 산정(reward scoring)과 CLIP labeler가 같은 venv를 공유하기 때문입니다. requirements.lock.txt에는 torch==2.14.1+cpu, open_clip_torch==3.3.0, transformers==4.46.3, 그리고 image-reward==1.5가 고정되어 있습니다. 기하학적 통과(geometry pass)는 GPU 없이, 유료 점수 API 없이, 새로운 주석 작성자 없이 실행되었습니다. 시드 0은 시뮬레이터의 기본값이며, 분류기에서는 torch.manual_seed(0)를 사용하고, 융합 스크립트에서는 SEED = 0을 사용합니다.
두 가지 함수
tattooprobes/probes.py 발췌:
NEEDLE_MM = 0.30 # 근사치 단일 바늘/3RL 선 (실무자 가이드; 가정, 논문 참조)
GAP_MM = 0.50 # 이보다 좁은 간격은 치유 후 닫힌 것으로 가정됨 (가정)
WORK_PX_PER_MM = 10.0 # 물리적 재조정을 거친 분석 해상도
...
size_cm * 10는 센티미터를 밀리미터로 변환하고, 그 후 WORK_PX_PER_MM이 긴 쪽을 조정합니다. INTER_AREA는 다운스케일을 처리하고 INTER_CUBIC은 업스케일을 처리합니다. to_gray는 PIL 이미지 또는 배열을 허용합니다.
ink_mask는 Otsu 방식이며, 회색 표준 편차가 1 이하일 때 128입니다. 잉크(Ink)는 gray < t입니다. _skel_widths는 스켈레톤에 거리 변환(distance transform)을 샘플링하고, 반지름을 두 배로 늘린 후 10 px/mm로 나눕니다. line_w_p10_mm은 그 샘플의 10번째 백분위수입니다. frac_sub_needle는 0.30 mm 미만의 비율입니다. frac_tight_gap은 잉크 상자 내부 배경에서 동일한 너비 비율을 계산하며, 폭이 0.50 mm 미만인 곳을 계산합니다. midtone_frac은 60과 200 사이에 있는 회색 값의 비율입니다. edge_density_per_mm2는 50과 150에서의 Canny 카운트를 WORK_PX_PER_MM 및 mm² 면적으로 나눈 값입니다.
PROBE_SIGNS는 사전에 고정됩니다(fixed a priori). line_w_p10_mm은 +1입니다. frac_sub_needle, open_ends_per_cm, frac_tight_gap, midtone_frac, border_std, edge_density_per_mm2, specks_per_cm2, 그리고 edge_transition_mm는 −1입니다. 복합 지표(composite)는 풀(pool)에 대한 부호화된 강건한 z-점수(signed robust z-scores), 중앙값(median) 및 IQR의 가중치 없는 평균입니다. edge_transition_mm는 사후적으로(post hoc), 첫 번째 열화 실행 이후부터 계산되며, probes_preregistered에서는 이를 생략합니다.
from tattooprobes.probes import compute_probes
from tattooprobes.simulate import retention
...
features는 float 딕셔너리입니다. kept는 skel_f1과 gap_survival를 담고 있습니다. 우리는 이를 3, 5, 10, 그리고 15 cm에서 모두 계산합니다. spread_mm > 0일 때, simulate_on_skin은 cv2.GaussianBlur(g, (0, 0), spread_mm * WORK_PX_PER_MM)을 실행하고, noise > 0인 경우에만 노이즈를 추가합니다. 아래의 실행들은 noise=0.0을 전달합니다.
Excerpt from tattooprobes/simulate.py:
deg = simulate_on_skin(img, size_cm, spread_mm, seed, noise)
# v0.3 fix: threshold the simulated image with the SAME Otsu threshold as the reference, and
# compare skeletons with a tolerance expressed in mm (0.2 mm) instead of a fixed 5-px window,
...
TOL_MM은 0.2입니다. F1은 두 확장된 골격(dilated skeleton) 중첩의 조화 평균(harmonic mean)입니다. Gap survival은 잉크 상자 내에 있는 참조 배경(reference background) 중 블러 처리 후에도 여전히 배경인 비율을 의미합니다.
Probe pipeline (Illustration)
How the rows got onto disk
HPDv2 train의 'tattoo' 프롬프트 매칭은 2,010 쌍, 327개의 프롬프트, 1,340개의 이미지를 포함하며, 이는 31.7 GB tar 파일에서 23분 동안 스트림 추출되었고 디스크에 약 60 MB가 보존되었습니다. ImageRewardDB train+val tattoo prompts는 370개 행입니다. 업스트림 zip 파일에서 47개의 이미지가 0바이트여서 사용 가능한 이미지는 323개가 남았으며, 여기에는 인-프롬프트 순위 쌍(within-prompt rank pairs)이 809개와 프롬프트가 51개 포함됩니다. Pick-a-Pic v2는 672개의 샤드(shards)로 구성된 liuhuohuo2 parquet 미러에서 가져왔으며, 메타데이터만 존재합니다: tattoo 행은 2,608개, 레이블링되고 다른 쌍(labeled and different pairs)은 1,687개, 프롬프트는 185개입니다. 해당 패스에 대한 이미지는 가져오지 않았습니다. 라이선스는 미확인 상태이며, 원본 카드는 사라졌고 미러들은 MIT라고 명시합니다. Drozdik/tattoo_v0은 CC-BY-NC-SA-4.0이며 연구용으로만 사용 가능합니다: 120개의 디자인이 샘플링되었고, 2단계에서 6가지 결함 유형(defect types)을 포함하며 총 1,560개의 이미지가 있습니다.
레이블은 키워드 규칙과 CLIP ViT-B/32 제로샷(open_clip ViT-B-32, 사전 학습된 openai)의 조합입니다. HPDv2는 design 334개, on_skin 87개, incidental 674개, other 146개, ambiguous 99개를 가집니다. ImageRewardDB는 design 48개, on_skin 12개, incidental 238개, other 18개, ambiguous 7개를 가집니다. tattoo_subject는 design과 on_skin의 조합으로, HPDv2에서는 463쌍과 119개의 프롬프트를, ImageRewardDB에서는 148쌍과 9개의 프롬프트를 구성합니다. 무작위 디자인 이미지 24개를 확인한 결과, HPDv2에서 약 21/24가, ImageRewardDB에서 24/24가 문신처럼 보였습니다.
아래 각 차원별 행은 리워드 재점수화(reward re-score) 후의 정렬 결과를 보여줍니다: 528쌍과 125개의 프롬프트입니다. 종합적인 결과는 여전히 463쌍과 119개의 프롬프트를 유지합니다.
일치도, 홀드아웃 및 전파 사다리(Agreement, holdout, and the spread ladder)
쌍별 정확도(Pairwise accuracy)는 스코어러가 쌍을 인간이 레이블링한 방식과 동일하게 순서화하는 비율입니다. HPDv2 tattoo-subject 각 차원 테이블에서 n_pairs는 528이고 n_prompts는 125입니다. Holm p 값은 모든 행에서 0.0065입니다.
| Scorer | Accuracy A | A−0.5 | Cohen h | Holm p | sig |
|---|
| frac_tight_gap@5 | 0.335 | −0.165 | −0.34 | 0.0065 | True |
| ... | | | | | |
probe_composite@5는 다른 정렬 결과로, 463쌍과 119개의 프롬프트에서 0.305 [0.256, 0.353]입니다. | | | | | |
Per-dimension agreement with human preference, HPDv2 tattoo-subject
Fusion은 무작위 방향 전환(random side flip) 후 승자-패자 특징(winner-minus-loser features)에 대해 LogisticRegression을 적용하며, 프롬프트 ID별로 StandardScaler와 GroupKFold를 사용합니다. results/fusion_lopo.csv의 HPDv2 행은 GroupKFold(prompt,k=5)입니다. 문자 그대로 하나의 프롬프트를 제외하는 루프는 해당 파일을 일치시키지 못할 것입니다. edge_transition_mm를 제외한 사전 등록된 프로브(Preregistered probes)는 0.708 [0.667, 0.750]의 점수를 기록했습니다. 보상(Rewards)은 0.790 [0.748, 0.827]을 기록했습니다. 보상과 프로브를 합친 것은 0.767 [0.729, 0.803]입니다. 프로브만으로도 해당 적합성(fit)에서 계수 부호가 반전된 경우에 한해 우연한 수준을 능가했습니다.
Fusion LOPO accuracy
기본 시뮬레이터(default simulator)에서는 노이즈가 0으로 유지됩니다. $\sigma = 0$일 때, 평균 골격 F1은 테스트된 모든 크기에서 1.000입니다. $\sigma = 0.30 \text{ mm}$일 때, 인쇄 크기별 평균 골격 F1은 3 cm에서 0.477, 5 cm에서 0.563, 10 cm에서 0.668, 15 cm에서 0.733입니다. 5 cm 및 $\sigma = 0.30 \text{ mm}$일 때, Spearman $\rho$는 frac_tight_gap 대 간격 생존율(gap survival)로 $-0.824$, edge density 대 간격 생존율로 $-0.599$, 그리고 line_w_p10_mm 대 골격 F1로 $+0.507$입니다.
Minimum print size vs ink spread
다음 평가에서 변경할 사항
Fusion이 0.708 [0.667, 0.750]에서 인간의 비트(human bit)를 추적하며, 이 적합도에서는 역 부호 계수(inverted coefficient signs)로만 프로브가 우연한 값을 명확히 합니다. 463쌍에 대한 부호 합성값(signed composite)은 0.305 [0.256, 0.353]입니다. 밀리미터 방향에 대해 PROBE_SIGNS를 기록합니다. 이 선호 레이블을 위해 인간의 비트를 적합시킵니다. 부호 평균(signed mean)으로부터 구축된 학습 손실은 0.305 방향을 따릅니다. line_w_p10_mm는 부호가 +1인 유일한 사전 등록 키이므로, 두꺼워짐이나 블러링으로 인한 더 두꺼운 Otsu 마스크는 그 경험적 휴리스틱(heuristic)이 선호하는 방식으로 해당 좌표를 이동시킵니다.
HPSv2.1은 HPDv2에서 훈련되었고 ImageReward는 ImageRewardDB에서 훈련되었기 때문에, 이러한 일치점들은 분포 내 누수(in-distribution leakage)입니다.
ImageRewardDB의 문신 주제(tattoo-subject)는 9개의 프롬프트를 가지고 있습니다. Pick-a-Pic 디자인 슬라이스에는 11개의 프롬프트가 있습니다. 프로브는 어느 쪽 슬라이스에서도 Holm-유의수준에 도달하지 못했기 때문에, 둘 다 528쌍 테이블 밖에 머무릅니다.
frac_tight_gap과 간격 생존(gap survival) 모두 잉크 상자 내부의 배경을 읽습니다: 너비는 이미 0.50 mm 미만이며, 픽셀은 여전히 σ = 0.30 mm에서 배경입니다. ρ = −0.824는 구성상 부분적으로 원형입니다. 가장자리 밀도(Edge density) 대 간격 생존은 ρ = −0.599입니다. line_w_p10_mm 대 골격 F1 점수(skeleton F1)는 ρ = +0.507입니다.
발췌본의 5 px 창은 더 큰 물리적 크기에서 일치를 더 엄격하게 만들었습니다. TOL_MM = 0.2는 밴드를 밀리미터 단위로 유지합니다. σ = 0일 때, 발표된 평균 골격 F1 점수는 테스트된 모든 크기에서 1.000입니다.
잉크 확산 모델은 등방성 가우시안(isotropic Gaussian)이며, 치유된 피부에서는 검증되지 않았습니다. tatany.app은 순위가 매겨지지 않았습니다.
재현하기 (Reproduce)
git clone https://github.com/Stark-Will/tattoo-probes
아카이브는 doi:10.5281/zenodo.23292900입니다. requirements.lock.txt를 설치하고, CPU torch wheel을 유지하며, 시드(seed)는 0으로 둡니다. 진입점은: compute_probes(img, size_cm=5.0) 및 retention(img, size_cm, spread_mm, seed=0, noise=0.0)입니다. 528쌍, 125 프롬프트 정렬에서 각 차원별 행을 읽고, 463쌍, 119 프롬프트 정렬에서 합성값을 읽으십시오.
공개 고지: 저는 AI 문신 생성기인 tatany.app에서 근무하고 있으며, 본 연구는 해당 제품이나 다른 어떤 제품도 순위를 매기지 않습니다.