Spaces:
Running
on
Zero
Running
on
Zero
File size: 4,158 Bytes
079a382 b4f042d 4eb0678 6c51e38 53e6930 079a382 85875c3 b4f042d 85875c3 b4f042d 85875c3 b4f042d 85875c3 079a382 3556e35 b4f042d 3556e35 4eb0678 3556e35 4eb0678 b4f042d 079a382 e6d416a ab1f7ee e6d416a 079a382 b7d4359 b4f042d f4fb280 ab1f7ee b4f042d e6d416a b4f042d e6d416a b4f042d ced387c b4f042d 079a382 b4f042d 079a382 cadd271 079a382 e6d416a cafc712 e6d416a 079a382 ab1f7ee 079a382 b4f042d 079a382 b4f042d 6885f6a ab1f7ee 079a382 b4f042d 079a382 b4f042d 079a382 e6d416a b7d4359 e6d416a b4f042d 079a382 ced387c |
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 |
import gradio as gr
import torch
import spaces
from diffusers import FluxInpaintPipeline
from PIL import Image, ImageFile
import numpy as np
#ImageFile.LOAD_TRUNCATED_IMAGES = True
# Initialize the pipeline
pipe = FluxInpaintPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
torch_dtype=torch.bfloat16
)
pipe.to("cuda")
pipe.load_lora_weights(
"ali-vilab/In-Context-LoRA",
weight_name="visual-identity-design.safetensors"
)
def square_center_crop_numpy(img, target_size=768):
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
# Convert PIL image to numpy array
img_array = np.array(img)
# Get dimensions
height, width = img_array.shape[:2]
crop_size = min(width, height)
# Calculate crop coordinates
left = (width - crop_size) // 2
top = (height - crop_size) // 2
# Perform the crop on numpy array
img_cropped = img_array[top:top+crop_size, left:left+crop_size]
# Convert back to PIL and resize
img_pil = Image.fromarray(img_cropped)
return img_pil.resize((target_size, target_size), Image.Resampling.LANCZOS)
def duplicate_horizontally(img):
# Convert PIL Image to numpy array
width, height = img.size
if width != height:
raise ValueError(f"Input image must be square, got {width}x{height}")
img_array = np.array(img)
duplicated = np.concatenate([img_array, img_array], axis=1)
return Image.fromarray(duplicated)
# Load the mask image
mask = Image.open("mask_square.png")
def crop_input(image):
cropped_image = square_center_crop(image)
return cropped_image
@spaces.GPU
def generate(image, prompt_user, progress=gr.Progress(track_tqdm=True)):
prompt_structure = "The two-panel image showcases the logo of a brand, [LEFT] the left panel is showing the logo [RIGHT] the right panel has this logo applied to "
prompt = prompt_structure + prompt_user
print(image)
image = duplicate_horizontally(image)
out = pipe(
prompt=prompt,
image=image,
mask_image=mask,
guidance_scale=3.75,
height=768,
width=1536,
num_inference_steps=28,
max_sequence_length=256,
strength=1
).images[0]
width, height = out.size
half_width = width // 2
image_2 = out.crop((half_width, 0, width, height))
return image_2, out
with gr.Blocks() as demo:
gr.Markdown("# Logo in Context")
gr.Markdown("### In-Context LoRA + Image-to-Image, apply your logo to anything")
with gr.Row():
with gr.Column():
input_image = gr.Image(
label="Upload Logo Image",
type="pil"
)
cropped_image = gr.Image(
visible=False,
type="pil"
)
prompt_input = gr.Textbox(
label="Where should the logo be applied?",
placeholder="e.g., a coffee cup on a wooden table"
)
generate_btn = gr.Button("Generate Application", variant="primary")
with gr.Column():
output_image = gr.Image(label="Generated Application")
output_side = gr.Image(label="Side by side")
gr.Examples(
examples=[
["huggingface.png", "A hat"],
["awesome.png", "A tattoo on a leg"],
["dvd_logo.png", "a flower pot"]
],
inputs=[input_image, prompt_input],
outputs=[output_image, output_side],
fn=generate,
cache_examples="lazy"
)
with gr.Row():
gr.Markdown("""
### Instructions:
1. Upload a logo image (preferably square)
2. Describe where you'd like to see the logo applied
3. Click 'Generate Application' and wait for the result
Note: The generation process might take a few moments.
""")
# Set up the click event
generate_btn.click(
fn=crop_input,
inputs=[input_image],
outputs=[cropped_image]
).then(
fn=generate,
inputs=[cropped_image, prompt_input],
outputs=[output_image, output_side]
)
demo.launch() |