File size: 2,270 Bytes
206af61
 
 
 
 
 
e6ff9aa
206af61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import torch
from diffusers import StableDiffusionInpaintPipeline, DPMSolverMultistepScheduler
from PIL import Image

# แแ‹ Model Card แ€›แ€ฝแ€ฑแ€ธแ€แ€ปแ€šแ€บแ€™แ€พแ€ฏ
model_id = "Sanster/Realistic_Vision_V1.4-inpainting"

# แ‚แ‹ Pipeline แ€€แ€ญแ€ฏ Load แ€œแ€ฏแ€•แ€บแ€•แ€ผแ€ฎแ€ธ Optimization แ€™แ€ปแ€ฌแ€ธแ€‘แ€Šแ€ทแ€บแ€žแ€ฝแ€„แ€บแ€ธแ€แ€ผแ€„แ€บแ€ธ
pipe = StableDiffusionInpaintPipeline.from_pretrained(
    model_id, 
    torch_dtype=torch.float32 # CPU แ€กแ€แ€ฝแ€€แ€บ แ€•แ€ญแ€ฏแ€„แ€ผแ€ญแ€™แ€บแ€žแ€Šแ€บ
)

# Speed แ€กแ€แ€ฝแ€€แ€บ Scheduler แ€•แ€ผแ€ฑแ€ฌแ€„แ€บแ€ธแ€แ€ผแ€„แ€บแ€ธ
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# Safety Checker (NSFW Filter) แ€€แ€ญแ€ฏ แ€œแ€ฏแ€ถแ€ธแ€ แ€•แ€ญแ€แ€บแ€แ€ผแ€„แ€บแ€ธ
pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))

# CPU Optimization แ€™แ€ปแ€ฌแ€ธ
pipe.enable_attention_slicing()
# pipe.enable_sequential_cpu_offload() # RAM แ€žแ€ญแ€•แ€บแ€™แ€›แ€พแ€ญแ€œแ€ปแ€พแ€„แ€บ แ€–แ€ฝแ€„แ€ทแ€บแ€›แ€”แ€บ

def predict(image_dict, prompt):
    # แ€•แ€ฏแ€ถแ€กแ€›แ€ฝแ€šแ€บแ€กแ€…แ€ฌแ€ธแ€€แ€ญแ€ฏ 512 แ€กแ€ฑแ€ฌแ€€แ€บแ€‘แ€ฌแ€ธแ€แ€ผแ€„แ€บแ€ธแ€€ แ€กแ€™แ€ผแ€”แ€บแ€†แ€ฏแ€ถแ€ธแ€–แ€ผแ€…แ€บแ€žแ€Šแ€บ
    init_image = image_dict["background"].convert("RGB").resize((512, 512))
    mask_image = image_dict["layers"][0].convert("RGB").resize((512, 512))
    
    # แƒแ‹ แ€กแ€™แ€ผแ€”แ€บแ€†แ€ฏแ€ถแ€ธ แ€กแ€”แ€ฑแ€กแ€‘แ€ฌแ€ธแ€–แ€ผแ€„แ€ทแ€บ แ€•แ€ฏแ€ถแ€‘แ€ฏแ€แ€บแ€แ€ผแ€„แ€บแ€ธ (Steps แ€€แ€ญแ€ฏ แ‚แ€ แ€‘แ€ฌแ€ธแ€•แ€ซ)
    output = pipe(
        prompt=prompt, 
        image=init_image, 
        mask_image=mask_image,
        num_inference_steps=20, # แ€กแ€™แ€ผแ€”แ€บแ€”แ€พแ€ฏแ€”แ€บแ€ธแ€กแ€แ€ฝแ€€แ€บ แ€กแ€“แ€ญแ€€ แ€กแ€แ€ปแ€€แ€บ
        guidance_scale=7.5
    ).images[0]
    
    return output

# แ„แ‹ Gradio UI แ€แ€Šแ€บแ€†แ€ฑแ€ฌแ€€แ€บแ€แ€ผแ€„แ€บแ€ธ
with gr.Blocks() as demo:
    gr.Markdown("### โšก Fast AI Inpainting (CPU Optimized)")
    with gr.Row():
        img = gr.Image(label="Upload Image & Paint Mask", tool="sketch", type="pil")
        prompt = gr.Textbox(label="Prompt (e.g., 'white shirt')")
    btn = gr.Button("Generate Fast")
    result = gr.Image(label="Result")
    
    btn.click(predict, inputs=[img, prompt], outputs=result)

demo.launch()