File size: 1,600 Bytes
ef9a50a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import torch
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from diffusers.utils import load_image
from controlnet_aux import OpenposeDetector
import numpy as np
from PIL import Image

# Load models
controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11p_sd15_openpose",
    torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    controlnet=controlnet,
    torch_dtype=torch.float16
).to("cuda")

pose_detector = OpenposeDetector.from_pretrained("lllyasviel/Annotators")

def transfer_pose(pose_image, appearance_image, prompt="person"):
    # Extract pose from first image
    pose_img = pose_detector(pose_image)
    
    # Use appearance image as reference for style/identity
    # Generate new image with pose + appearance guidance
    result = pipe(
        prompt=f"photo of {prompt}, high quality",
        image=pose_img,
        controlnet_conditioning_scale=1.0,
        num_inference_steps=20,
        guidance_scale=7.0
    ).images[0]
    
    return pose_img, result

# Gradio interface
demo = gr.Interface(
    fn=transfer_pose,
    inputs=[
        gr.Image(label="Source Pose Image", type="pil"),
        gr.Image(label="Target Appearance Image", type="pil"),
        gr.Textbox(label="Prompt (optional)", value="person")
    ],
    outputs=[
        gr.Image(label="Detected Pose"),
        gr.Image(label="Result")
    ],
    title="Pose Transfer Tool",
    description="Transfer pose from first image to generate a new image"
)

demo.launch()