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 import time # 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): start = time.time() # 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) end = time.time() print('time:', end - start) 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()