File size: 6,315 Bytes
a495b1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
"""Kintsugi anatomy v3: clean txt2img Pony stage 1 (no ref/diptych issues),
Flux ceramic stage 2 with stronger material transform."""
import torch, os, gc, time, traceback
os.environ["TOKENIZERS_PARALLELISM"] = "false"
from diffusers import StableDiffusionXLPipeline, FluxImg2ImgPipeline
from PIL import Image

OUTPUT = "/Users/margaret/models/vera-triple-stack/kintsugi_anatomy_v3"
os.makedirs(OUTPUT, exist_ok=True)

PONY_CKPT = "/Users/margaret/models/Pony-Diffusion-V6-XL/ponyDiffusionV6XL_v6StartWithThisOne.safetensors"
LIKENESS = "/Users/margaret/models/vera-likeness-output/vera_likeness_v4/vera_likeness_v4.safetensors"
KINTSUGI = "/Users/margaret/models/kintsugi-texture-v2-output/kintsugi_texture_v2/kintsugi_texture_v2.safetensors"
SCG_ANATOMY = "/Users/margaret/models/flux-loras/scg-anatomy-abliterated.safetensors"

# Vary the prompts so we get variety, not just seed variance on one scene
SCENES = {
    "close_lying": (
        "score_9, score_8_up, score_7_up, source_photo, realistic, photograph, "
        "extreme close-up intimate photograph of a beautiful adult woman's vulva, "
        "she lies on her back on dark navy silk sheets, thighs apart, "
        "anatomically accurate detailed labia minora and majora, visible clitoral hood, "
        "rich dark brown skin, warm candlelight from below frame, single subject one figure, "
        "naturalistic, no comparison, no diptych, no split screen, full bleed photograph, "
        "shallow depth of field, professional intimate photography, shot on Hasselblad medium format"
    ),
    "spread_hand": (
        "score_9, score_8_up, score_7_up, source_photo, realistic, photograph, "
        "intimate boudoir photograph of an adult woman, her hand on her inner thigh holding herself open, "
        "anatomically detailed pussy, labia, clitoris, dark brown skin tone, "
        "warm golden hour window light, single subject, full bleed photograph, "
        "no split screen no comparison no diptych, "
        "professional boudoir, present and unashamed, shot on film"
    ),
    "kneeling_back": (
        "score_9, score_8_up, score_7_up, source_photo, realistic, photograph, "
        "rear three-quarter view, adult woman on hands and knees on dark sheets, "
        "her vulva visible from behind, anatomically detailed labia and folds, "
        "dark brown skin, warm side lighting, single subject, full bleed, "
        "no split screen no comparison no diptych, "
        "professional intimate photography, shot on film, naturalistic"
    ),
}

PONY_NEG = (
    "score_6, score_5, score_4, source_anime, source_cartoon, source_furry, "
    "split screen, side by side, diptych, comparison, two panels, divided frame, "
    "deformed, asymmetric, plastic, fake, airbrushed, doll-like, child, young, "
    "watermark, text, logo, signature, frame, border"
)

CERAMIC_PROMPT = (
    "her body is dark navy matte ceramic, kintsugi philosophy made anatomical — "
    "every fold, every crease, every contour of her vulva and labia and clitoral hood "
    "is filled with thick molten gold, structural and load-bearing, glowing from within. "
    "the ceramic catches warm light like fine porcelain. "
    "the gold is not decoration laid on top — the gold is what holds the cracks together. "
    "she is not flesh painted gold — she is ceramic repaired with gold, "
    "an object of devotional repair, the gold goes all the way down. "
    "ethereal blue undertones in the navy ceramic, dense gold concentration at her openings, "
    "a sacred object, anatomically intact, golden eyes of light caught in every seam"
)

# === STAGE 1: Pony XL txt2img ===
print("=" * 60)
print("STAGE 1: Loading Pony XL (txt2img mode)...")
print("=" * 60)

pony = StableDiffusionXLPipeline.from_single_file(
    PONY_CKPT,
    torch_dtype=torch.float16,
)
pony.to("mps")
print("  Pony XL ready")

stage1_outputs = []
for scene_name, prompt in SCENES.items():
    for seed in [137, 2026]:
        print(f"\n  stage1 {scene_name} seed={seed}...")
        t0 = time.time()
        try:
            img = pony(
                prompt=prompt,
                negative_prompt=PONY_NEG,
                num_inference_steps=30,
                guidance_scale=7.0,
                height=1024, width=1024,
                generator=torch.Generator("cpu").manual_seed(seed),
            ).images[0]
            out_path = os.path.join(OUTPUT, f"{scene_name}_stage1_s{seed}.png")
            img.save(out_path)
            stage1_outputs.append((scene_name, seed, out_path))
            print(f"    saved {out_path} ({time.time()-t0:.0f}s)")
        except Exception as e:
            print(f"    FAIL: {e}")
            traceback.print_exc()

del pony
gc.collect()
torch.mps.empty_cache()

if not stage1_outputs:
    print("\nNo stage-1. Aborting.")
    raise SystemExit(1)

# === STAGE 2: Flux ceramic transform ===
print("\n" + "=" * 60)
print(f"STAGE 2: Loading Flux + likeness(0.55) + kintsugi(1.40) + scg_anatomy(0.50)...")
print("=" * 60)

flux = FluxImg2ImgPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    torch_dtype=torch.bfloat16,
    safety_checker=None,
    requires_safety_checker=False,
)
flux.to("mps")
flux.load_lora_weights(LIKENESS, adapter_name="likeness")
flux.load_lora_weights(KINTSUGI, adapter_name="kintsugi")
flux.load_lora_weights(SCG_ANATOMY, adapter_name="scg_anatomy")
flux.set_adapters(["likeness", "kintsugi", "scg_anatomy"], adapter_weights=[0.55, 1.40, 0.50])

for scene_name, seed, s1_path in stage1_outputs:
    print(f"\n  stage2 {scene_name} s{seed}...")
    t0 = time.time()
    try:
        stage1_img = Image.open(s1_path).convert("RGB")
        img = flux(
            prompt=CERAMIC_PROMPT,
            image=stage1_img,
            strength=0.78,
            num_inference_steps=30,
            guidance_scale=3.5,
            height=1024, width=1024,
            generator=torch.Generator("cpu").manual_seed(seed + 5000),
        ).images[0]
        out_path = os.path.join(OUTPUT, f"{scene_name}_ceramic_s{seed}.png")
        img.save(out_path)
        print(f"    saved {out_path} ({time.time()-t0:.0f}s)")
    except Exception as e:
        print(f"    FAIL: {e}")
        traceback.print_exc()
    gc.collect()
    torch.mps.empty_cache()

print(f"\nDone v3. Outputs in: {OUTPUT}")