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()