File size: 6,007 Bytes
15d68eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
"""
Pre-generate a comprehensive demo gallery for Indic Heritage Studio v2.

Produces:
  - 5 styles × 3 seeds × T2I = 15 images (1024×1024)
  - 5 styles × 2 input images × style transfer = 10 images
  - 5 styles × 1 input × SVD = 5 videos (25-frame MP4)
  - 1 inpainting demo (mask a region, restyle in 1 style)
  - 1 ControlNet demo (canny + 1 style)
  - 1 batch scaling demo (4 GPU vs 1 GPU comparison)

Total: ~30 outputs in ~30 min on 8 × 80GB.
Run this BEFORE recording the demo video so demo recording burns
minimal AMD credits.
"""
from __future__ import annotations

import logging
from pathlib import Path

from config.settings import settings
from config.styles import list_styles

log = logging.getLogger(__name__)

OUTPUT_BASE = settings.examples_dir

PROMPTS = [
    "a young woman reading under a banyan tree at sunset, peacock beside her",
    "a temple festival at dawn with devotees and musicians",
    "a sage meditating by the river, surrounded by lotus flowers",
]

INPUT_IMAGES = [
    "examples/inputs/portrait.jpg",
    "examples/inputs/landscape.jpg",
]


def gen_t2i_gallery() -> None:
    """5 styles × 3 prompts × 3 seeds = 45 images."""
    from core.text_to_image import TextToImagePipeline
    log.info("=== T2I Gallery ===")
    pipe = TextToImagePipeline().load()
    out_dir = OUTPUT_BASE / "1_text_to_image"
    out_dir.mkdir(parents=True, exist_ok=True)
    for style in list_styles():
        for prompt_idx, prompt in enumerate(PROMPTS):
            for seed in (42, 1337, 2024):
                out_path = out_dir / style.id / f"p{prompt_idx}_s{seed}.png"
                if out_path.exists():
                    continue
                log.info("Generating %s", out_path)
                img = pipe.generate(prompt=prompt, style=style, seed=seed)
                out_path.parent.mkdir(parents=True, exist_ok=True)
                img.save(out_path)


def gen_style_gallery() -> None:
    """5 styles × 2 input images = 10 styled images."""
    from core.style_transfer import StyleTransferPipeline
    from utils.image_utils import load_image
    log.info("=== Style Transfer Gallery ===")
    pipe = StyleTransferPipeline().load()
    out_dir = OUTPUT_BASE / "2_style_transfer"
    out_dir.mkdir(parents=True, exist_ok=True)
    for style in list_styles():
        for inp in INPUT_IMAGES:
            inp_path = Path(inp)
            if not inp_path.exists():
                log.warning("Missing input: %s — skipping", inp_path)
                continue
            out_path = out_dir / style.id / inp_path.name
            if out_path.exists():
                continue
            img = load_image(inp_path)
            out = pipe.transfer(image=img, style=style, seed=42)
            out_path.parent.mkdir(parents=True, exist_ok=True)
            out.save(out_path)


def gen_video_gallery() -> None:
    """5 styles × 1 input = 5 videos."""
    from core.image_to_video import ImageToVideoPipeline
    from utils.image_utils import load_image
    log.info("=== Video Gallery ===")
    pipe = ImageToVideoPipeline().load()
    out_dir = OUTPUT_BASE / "3_image_to_video"
    out_dir.mkdir(parents=True, exist_ok=True)
    inp_path = Path(INPUT_IMAGES[0])
    if not inp_path.exists():
        log.warning("Missing input image — skipping video gallery")
        return
    img = load_image(inp_path)
    for style in list_styles():
        out_path = out_dir / f"{style.id}.mp4"
        if out_path.exists():
            continue
        log.info("Generating video for %s", style.id)
        pipe.generate_to_mp4(
            image=img, out_path=out_path, style=style,
            num_frames=25, fps=8, seed=42,
        )


def gen_inpaint_demo() -> None:
    """One inpainting demo."""
    from core.inpainting import InpaintingPipeline
    from utils.image_utils import load_image
    log.info("=== Inpainting Demo ===")
    pipe = InpaintingPipeline().load()
    out_dir = OUTPUT_BASE / "5_inpainting"
    out_dir.mkdir(parents=True, exist_ok=True)
    inp_path = Path(INPUT_IMAGES[0])
    if not inp_path.exists():
        log.warning("Missing input image — skipping inpaint demo")
        return
    # Create a simple mask (right half white)
    from PIL import Image
    img = load_image(inp_path)
    w, h = img.size
    mask = Image.new("L", (w, h), 0)
    for y in range(h):
        for x in range(w // 2, w):
            mask.putpixel((x, y), 255)
    mask = mask.resize((1024, 1024))
    img = img.resize((1024, 1024))

    out = pipe.inpaint(
        image=img, mask=mask,
        prompt="ornate floral border with peacock motifs",
        style=list_styles()[0],  # madhubani
        seed=42,
    )
    out.save(out_dir / "inpaint_demo.png")


def gen_controlnet_demo() -> None:
    """One ControlNet demo (canny + mughal)."""
    from core.controlnet import ControlNetPipeline
    from utils.image_utils import load_image
    log.info("=== ControlNet Demo ===")
    out_dir = OUTPUT_BASE / "6_controlnet"
    out_dir.mkdir(parents=True, exist_ok=True)
    inp_path = Path(INPUT_IMAGES[0])
    if not inp_path.exists():
        log.warning("Missing input image — skipping controlnet demo")
        return
    pipe = ControlNetPipeline(condition_type="canny").load()
    img = load_image(inp_path)
    cond = pipe.detect(img)
    cond.save(out_dir / "canny_condition.png")
    from config.styles import get_style
    out = pipe.generate(
        conditioning_image=cond,
        prompt="a courtly gathering with musicians and dancers",
        style=get_style("mughal"),
        seed=42,
    )
    out.save(out_dir / "controlnet_mughal.png")


def main():
    logging.basicConfig(level=logging.INFO,
                        format="%(asctime)s | %(levelname)s | %(message)s")
    OUTPUT_BASE.mkdir(parents=True, exist_ok=True)
    gen_t2i_gallery()
    gen_style_gallery()
    gen_video_gallery()
    gen_inpaint_demo()
    gen_controlnet_demo()
    log.info("All demo outputs generated.")


if __name__ == "__main__":
    main()