File size: 4,454 Bytes
6b6d8c6
af40894
39397b0
 
 
455e74b
 
 
 
 
 
39397b0
455e74b
39397b0
 
 
 
 
25f9ca7
7fbef3a
 
af40894
27c78c7
455e74b
 
 
 
e59fe16
 
14a6d29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6b6d8c6
e88d5b2
 
 
25f9ca7
fb05ecc
8551fc2
 
1c6a1fb
39cb2e3
8551fc2
39cb2e3
3bb139d
57864f0
6a89211
3bb139d
 
e0b6d19
7b0620b
 
3bb139d
 
 
 
10ef849
36b4c93
 
a4e0c15
3bb139d
af40894
badd9c9
25f9ca7
 
 
 
 
 
4342456
1765e33
25f9ca7
 
 
 
68d5cd9
25f9ca7
 
af40894
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
import spaces
import gradio as gr
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler

import numpy as np
import os
import cv2
from PIL import Image, ImageDraw
import insightface
from insightface.app import FaceAnalysis

# Diffusion
model_base = "runwayml/stable-diffusion-v1-5"

pipe = StableDiffusionPipeline.from_pretrained(model_base, torch_dtype=torch.float16, use_safetensors=True, safety_checker=None,)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

lora_model_path = "./loralucy6/checkpoint-145000"
pipe.unet.load_attn_procs(lora_model_path)
pipe.to("cuda")


# Insightface model
app = FaceAnalysis(name='buffalo_l')
app.prepare(ctx_id=0, det_size=(640, 640))

def face_swap(src_img, dest_img):
    src_img = Image.open('./images/' + src_img + '.JPG')
    
    # Convert to RGB
    src_img = src_img.convert(mode='RGB')
    dest_img = dest_img.convert(mode='RGB')

    # Convert to array
    src_img_arr = np.asarray(src_img)
    dest_img_arr = np.asarray(dest_img)

    # Face detection
    src_faces = app.get(src_img_arr)
    dest_faces = app.get(dest_img_arr)

    # Initialize swapper
    swapper = insightface.model_zoo.get_model('inswapper_128.onnx', download=False, download_zip=False)

    # Swap face
    res = dest_img_arr.copy()
    for face in dest_faces:
    	res = swapper.get(res, face, src_faces[0], paste_back=True)

    # Convert to PIL image
    final_image = Image.fromarray(np.uint8(res)).convert('RGB')

    return final_image 

@spaces.GPU(enable_queue=True)
def greet(description,color,features,occasion,type_,face):

    # Parse input
    prompt = ''
    description = 'description:' + description.replace(' ', '-')
    color = ' color:' + ','.join(color)
    features = ' features:' + ','.join(features)
    occasion = ' occasion:' + ','.join(occasion)
    type_ = ' type:' + ','.join(type_)
   
    prompt += description + color + features +  occasion + type_

    print('prompt:',prompt)
    pipe.to("cuda")
    image = pipe(
        prompt,
        negative_prompt='deformed face,bad anatomy',
        width=312,
        height=512,
        num_inference_steps=100,
        guidance_scale=7.5,
        cross_attention_kwargs={"scale": 1.0}
        ).images[0]

    if(face != 'Normal'):
        image = face_swap(face, image)
    
    return image

iface = gr.Interface(fn=greet, 
                    inputs=[gr.Textbox(label='Description'),
                            gr.Dropdown(interactive=True, label='Color',choices=['Beige','Black','Blue','Brown','Green','Grey','Orange','Pink','Purple','Red','White','Yellow'],multiselect=True),
                            gr.Dropdown(interactive=True, label='Features',choices=['3/4-sleeve','Babydoll','Closed-Back','Corset','Crochet','Cutouts','Draped','Floral','Gloves','Halter','Lace','Long','Long-Sleeve','Midi','No-Slit','Off-The-Shoulder','One-Shoulder','Open-Back','Pockets','Print','Puff-Sleeve','Ruched','Satin','Sequins','Shimmer','Short','Short-Sleeve','Side-Slit','Square-Neck','Strapless','Sweetheart-Neck','Tight','V-Neck','Velvet','Wrap'],multiselect=True),
                            gr.Dropdown(interactive=True, label='Occasion',choices=['Homecoming','Casual','Wedding-Guest','Festival','Sorority','Day','Vacation','Summer','Pool-Party','Birthday','Date-Night','Party','Holiday','Winter-Formal','Valentines-Day','Prom','Graduation'],multiselect=True),
                            gr.Dropdown(interactive=True, label='Type',choices=['Mini-Dresses','Midi-Dresses','Maxi-Dresses','Two-Piece-Sets','Rompers','Jeans','Jumpsuits','Pants','Tops','Jumpers/Cardigans','Skirts','Shorts','Bodysuits','Swimwear'],multiselect=True),
                            gr.Dropdown(interactive=True, label='Face',choices=['Normal','Cat','Lisa','Mila'], value='Cat'),
                            ], 
                    outputs=gr.Image(type="pil", label="Final Image", width=312, height=512, show_share_button=False),
                    examples=[['Kailani  mesh sequins two piece maxi dress pink',['Pink'],['Cutouts','Long-Sleeve','Sequins','Side-Slit'],['Festival','Party','Prom'],['Maxi-Dresses','Two-Piece-Sets'],'Cat']],
                    title='Lucy in the Sky: Text to Image',
                    description=
                    """
                    Design your own [Lucy in the Sky](https://www.lucyinthesky.com/) dress with text!
                    """
                    )
iface.launch()