import os import random import numpy as np import gradio as gr import base64 from io import BytesIO import PIL.Image from typing import Tuple from novita_client import NovitaClient, V3TaskResponseStatus from time import sleep from style_template import styles # global variable MAX_SEED = np.iinfo(np.int32).max STYLE_NAMES = list(styles.keys()) DEFAULT_STYLE_NAME = 'Spring Festival' enable_lcm_arg = False # Path to InstantID models face_adapter = f'./checkpoints/ip-adapter.bin' controlnet_path = f'./checkpoints/ControlNetModel' # controlnet-pose/canny/depth controlnet_pose_model = 'thibaud/controlnet-openpose-sdxl-1.0' controlnet_canny_model = 'diffusers/controlnet-canny-sdxl-1.0' controlnet_depth_model = 'diffusers/controlnet-depth-sdxl-1.0-small' def get_novita_client (novita_key): client = NovitaClient(novita_key, os.getenv('NOVITA_API_URI', None)) return client get_local_storage = ''' function () { globalThis.setStorage = (key, value)=>{ localStorage.setItem(key, JSON.stringify(value)) } globalThis.getStorage = (key, value)=>{ return JSON.parse(localStorage.getItem(key)) } const novita_key = getStorage("novita_key") return [novita_key]; } ''' def toggle_lcm_ui (value): if value: return ( gr.update(minimum=0, maximum=100, step=1, value=5), gr.update(minimum=0.1, maximum=20.0, step=0.1, value=1.5), ) else: return ( gr.update(minimum=5, maximum=100, step=1, value=30), gr.update(minimum=0.1, maximum=20.0, step=0.1, value=5), ) def randomize_seed_fn (seed: int, randomize_seed: bool) -> int: if randomize_seed: seed = random.randint(0, MAX_SEED) return seed def remove_tips (): return gr.update(visible=False) def apply_style (style_name: str, positive: str, negative: str = "") -> Tuple[str, str]: p, n = styles.get(style_name, styles[DEFAULT_STYLE_NAME]) return p.replace("{prompt}", positive), n + " " + negative def get_example (): case = [ [ './examples/yann-lecun_resize.jpg', './examples/poses/pose.jpg', 'a man', 'Spring Festival', '(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, green', ], [ './examples/musk_resize.jpeg', './examples/poses/pose2.jpg', 'a man flying in the sky in Mars', 'Mars', '(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, green', ], [ './examples/sam_resize.png', './examples/poses/pose4.jpg', 'a man doing a silly pose wearing a suite', 'Jungle', '(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, gree', ], [ './examples/schmidhuber_resize.png', './examples/poses/pose3.jpg', 'a man sit on a chair', 'Neon', '(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, green', ], [ './examples/kaifu_resize.png', './examples/poses/pose.jpg', 'a man', 'Vibrant Color', '(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, green', ], ] return case def run_for_examples_with_key (novita_key): def run_for_examples (face_file, pose_file, prompt, style, negative_prompt): print('run_for_examples:', face_file) return generate_image( novita_key, face_file, pose_file, prompt, negative_prompt, style, 20, # num_steps 0.8, # identitynet_strength_ratio 0.8, # adapter_strength_ratio 0.4, # pose_strength 0.3, # canny_strength 0.5, # depth_strength ['pose', 'canny'], # controlnet_selection 5.0, # guidance_scale 42, # seed 'EulerDiscreteScheduler', # scheduler False, # enable_LCM True, # enable_Face_Region ) #return None, gr.update(visible=True) return run_for_examples def generate_image ( novita_key1, face_image_path, pose_image_path, prompt, negative_prompt, style_name, num_steps, identitynet_strength_ratio, adapter_strength_ratio, pose_strength, canny_strength, depth_strength, controlnet_selection, guidance_scale, seed, scheduler, enable_LCM, enhance_face_region, progress=gr.Progress(track_tqdm=True), ): if face_image_path is None: raise gr.Error(f'Cannot find any input face image! Please refer to step 1️⃣') #print('novita_key:', novita_key1) print('face_image_path:', face_image_path) if not novita_key1: raise gr.Error(f'Please input your Novita Key!') try: client = get_novita_client(novita_key1) prompt, negative_prompt = apply_style(style_name, prompt, negative_prompt) #print('prompt:', prompt) #print('negative_prompt:', negative_prompt) #print('seed:', seed) #print('identitynet_strength_ratio:', identitynet_strength_ratio) #print('adapter_strength_ratio:', adapter_strength_ratio) #print('scheduler:', scheduler) #print('guidance_scale:', guidance_scale) #print('num_steps:', num_steps) ref_image_path = pose_image_path if pose_image_path else face_image_path ref_image = PIL.Image.open(ref_image_path) width, height = ref_image.size res = client._post('/v3/async/instant-id', { 'extra': { 'response_image_type': 'jpeg', }, 'model_name': 'sd_xl_base_1.0.safetensors', 'face_image_assets_ids': client.upload_assets([face_image_path]), 'ref_image_assets_ids': client.upload_assets([pose_image_path]) if pose_image_path else [], 'prompt': prompt, 'negative_prompt': negative_prompt, 'controlnet': { 'units': [], # TODO }, 'image_num': 1, 'steps': num_steps, 'seed': seed, 'guidance_scale': guidance_scale, 'sampler_name': scheduler, 'id_strength': identitynet_strength_ratio, 'adapter_strength': adapter_strength_ratio, 'width': width, 'height': height, }) print('task_id:', res['task_id']) def progress (x): print('progress:', x.task.status) final_res = client.wait_for_task_v3(res['task_id'], callback=progress) print('status:', final_res.task.status) if final_res.task.status == V3TaskResponseStatus.TASK_STATUS_FAILED: raise RuntimeError(f'Novita task failed: {final_res.task.status}') final_res.download_images() except Exception as e: raise gr.Error(f'Error: {e}') #print('final_res:', final_res) #print('final_res.images_encoded:', final_res.images_encoded) image = PIL.Image.open(BytesIO(base64.b64decode(final_res.images_encoded[0]))) return image, gr.update(visible=True) # Description title = r'''