Spaces:
Running
Running
File size: 5,974 Bytes
8d691c3 b79e3f7 19d8964 421fe99 5b3343a 8d691c3 a15d459 166d9fd a617b97 e221206 fce1ba1 a15d459 42b1e2e 5b3343a a15d459 8d691c3 21e5fc0 8d691c3 b79e3f7 ae0e195 8d691c3 19d8964 8d691c3 ae0e195 714fad0 ae0e195 4f3b0cb 8d691c3 a617b97 21e5fc0 8d691c3 db8ace2 099a349 db8ace2 099a349 db8ace2 099a349 6df2860 1bd4c24 9853e8c 6df2860 1bd4c24 6df2860 21e5fc0 166d9fd 6df2860 e221206 6df2860 ae0e195 b3b3df1 fd4ed34 06b92a6 4daf755 fd4ed34 b3b3df1 fd4ed34 21e5fc0 8d691c3 30beb50 8bf5da3 8d691c3 871938d 30beb50 8749689 21e5fc0 f599c40 db8ace2 36abcb2 db8ace2 871938d 36abcb2 fd7010a 8d691c3 c9fbf9f 5097863 1b9a64c db8ace2 099a349 66303da 21e5fc0 36abcb2 fd4ed34 36abcb2 871938d 8d691c3 |
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 178 179 180 181 182 183 184 |
import gradio as gr
import numpy as np
import random
import spaces #[uncomment to use ZeroGPU]
# from diffusers import DiffusionPipeline
from diffusers import FluxControlPipeline
from controlnet_aux import CannyDetector
from huggingface_hub import login
import torch
import subprocess
from groq import Groq
import base64
from io import BytesIO
import os
from PIL import Image
from google import genai
from google.genai import types
login(token=os.environ.get("HF_API_KEY"))
subprocess.run("rm -rf /data-nvme/zerogpu-offload/*", env={}, shell=True)
# Load FLUX image generator
device = "cuda" if torch.cuda.is_available() else "cpu"
model_repo_id = "black-forest-labs/FLUX.1-schnell" # Replace to the model you would like to use
flat_lora_path = "matteomarjanovic/flatsketcher"
canny_lora_path = "black-forest-labs/FLUX.1-Canny-dev-lora"
flat_weigths_file = "lora.safetensors"
canny_weigths_file = "flux1-canny-dev-lora.safetensors"
processor = CannyDetector()
if torch.cuda.is_available():
torch_dtype = torch.float16
else:
torch_dtype = torch.float32
pipe = FluxControlPipeline.from_pretrained(model_repo_id, torch_dtype=torch_dtype)
pipe = pipe.to(device)
pipe.load_lora_weights(flat_lora_path, weight_name=flat_weigths_file, adapter_name="flat")
pipe.load_lora_weights(canny_lora_path, weight_name=canny_weigths_file, adapter_name="canny")
pipe.set_adapters(["flat", "canny"], adapter_weights=[0.8, 0.4])
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1024
# def encode_image(image_path):
# with open(image_path, "rb") as image_file:
# return base64.b64encode(image_file.read()).decode('utf-8')
def encode_image(pil_image):
# Convert PIL image to bytes
buffered = BytesIO()
pil_image.save(buffered, format=pil_image.format or "PNG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')
# @spaces.GPU #[uncomment to use ZeroGPU]
# def infer(
# prompt,
# progress=gr.Progress(track_tqdm=True),
# ):
# # seed = random.randint(0, MAX_SEED)
# # generator = torch.Generator().manual_seed(seed)
# image = pipe(
# prompt=prompt,
# guidance_scale=0.,
# num_inference_steps=4,
# width=1420,
# height=1080,
# max_sequence_length=256,
# ).images[0]
# return image
description_prompt = """
I want you to imagine how the technical flat sketch of the garment you see in the picture would look like, and describe it in rich details, in one paragraph.
Don't add any additional comment.
Specify that the flat sketch is black and white (even if the original garment has a color) and that it doesn't include the person that wear the garment.
Clarify that it's not made on a paper sheet, but it's digitally made, so it has plain white background, not paper.
Describe only the part that is visible in the picture (front or back of the garment, not both).
It should start with "The technical flat sketch of..."
The style of the result should look somewhat like the following example:
The technical flat sketch of the dress depicts a midi-length, off-the-shoulder design with a smocked bodice and short puff sleeves that have elasticized cuffs.
The elastic neckline sits straight across the chest, ensuring a secure fit.
The bodice transitions into a flowy, tiered skirt with three evenly spaced gathered panels, creating soft volume.
Elasticized areas are marked with textured lines, while the gathers and drape is indicated through subtle curved strokes, ensuring clarity in construction details.
The flat sketch does NOT include any person and it's only the in black and white, being a technical drawing.
"""
@spaces.GPU #[uncomment to use ZeroGPU]
def generate_description_fn(
image,
progress=gr.Progress(track_tqdm=True),
):
base64_image = encode_image(image)
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=[description_prompt, image]
)
prompt = response.text + " In the style of FLTSKC"
control_image = processor(
image,
low_threshold=50,
high_threshold=200,
detect_resolution=1024,
image_resolution=1024
)
width, height = control_image.size
image = pipe(
prompt=prompt,
control_image=control_image,
guidance_scale=3.,
num_inference_steps=4,
width=width,
height=height,
max_sequence_length=256,
).images[0]
return prompt, image
css = """
#col-container {
margin: 0 auto;
max-width: 640px;
}
.gradio-container {
background-color: oklch(98% 0 0);
}
.btn-primary {
background-color: #422ad5;
outline-color: #422ad5;
}
"""
def load_image():
image_path = "hoodie.png"
default_img = Image.open(image_path)
return default_img
# generated_prompt = ""
with gr.Blocks(css=css, theme=gr.themes.Soft()) as demo:
# gr.Markdown("# Draptic: from garment image to technical flat sketch")
with gr.Row():
with gr.Column(elem_id="col-input-image"):
# gr.Markdown(" ## Drop your image here")
input_image = gr.Image(type="pil", sources=["upload", "clipboard"])
with gr.Column(elem_id="col-container"):
generate_button = gr.Button("Generate flat sketch", scale=0, variant="primary", elem_classes="btn btn-primary")
result = gr.Image(label="Result", show_label=False)
if result:
gr.Markdown("## Description of the garment:")
generated_prompt = gr.Markdown("")
gr.on(
triggers=[generate_button.click],
fn=generate_description_fn,
inputs=[
input_image,
],
outputs=[generated_prompt, result],
)
demo.load(load_image, inputs=[], outputs=[input_image])
if __name__ == "__main__":
demo.launch()
|