from mtcnn.mtcnn import MTCNN from utils import * cloth_examples = get_cloth_examples() pose_examples = get_pose_examples() face_detector = MTCNN() # Description title = r"""

IDM-VTON + Outfit Anyone in the Wild

""" description = r""" Go to HeyBeauty for Free Try-On! 🤗 .
This demo combines IDM-VTON and Outfit Anyone in the Wild 1. Human pose detection and reconstruction using large human model from Outfit Anyone in the Wild. 2. Use IDM-VTON for training-free try-on. 3. Applying the refine network from Outfit Anyone in the Wild.
This demo is for learning purposes only.
IDM-VTON + Outfit Anyone in the Wild test results on mix01.
Outfit Anyone in the Wild test results on man01.
Outfit Anyone in the Wild test results on woman01.
""" css = """ .gradio-container {width: 85% !important} """ mk_guide = "If image does not display successfully after button clicked in your browser(mostly Mac+Chrome), try [this demo](https://openxlab.org.cn/apps/detail/jiangxiaoguo/OutfitAnyone-in-the-Wild) please" def onUpload(): return "" def onClick(cloth_image, cloth_id, pose_image, pose_id, category, denoise_steps, caption, request: gr.Request): if pose_image is None: return None, "no pose image found !", "" if isinstance(cloth_id, dict): cloth_id = cloth_id['label'] if isinstance(pose_id, dict): pose_id = pose_id['label'] if len(pose_id)>0 and len(cloth_id)>0: res = get_result_example(cloth_id, pose_id) assert os.path.exists(res), res return res, "Done! Use the pre-run results directly, the cloth size does not take effect ", "" else: try: client_ip = request.client.host x_forwarded_for = dict(request.headers).get('x-forwarded-for') if x_forwarded_for: client_ip = x_forwarded_for faces = face_detector.detect_faces(pose_image[:,:,::-1]) if len(faces)==0: print(client_ip, 'faces num is 0! ', flush=True) return None, "Fatal Error !!! No face detected in pose image !!! ", "" else: x, y, w, h = faces[0]["box"] H, W = pose_image.shape[:2] max_face_ratio = 1/3.3 if w/W>max_face_ratio or h/H>max_face_ratio: return None, "Fatal Error !!! Headshot is not allowed in pose image!!!", "" if not check_warp(client_ip): return None, "Failed !!! Our server is under maintenance, please try again tomorrow", "" infId = upload_imgs(ApiUrl, OpenId, ApiKey, client_ip, cloth_image, pose_image) if infId==0: return None, "fail to upload", "" elif infId==2: return None, "There is a running task already, please wait and check the history tab. Please remember to give us a star on github, thx~", "" elif infId==3: return None, "can not creat task, you have exhausted free trial quota. Go to heybeauty for more free trial ! https://heybeauty.ai/extension", "" isPub = publicFastSwap(ApiUrl, OpenId, ApiKey, infId, category, caption, denoise_steps) if not isPub: return None, "fail to public you task", "" info = "task has been created successfully, you can refresh the page 1~3 mins latter, and check the following history tab" info = info+"任务创建成功,请1-3分钟后刷新这个页面,历史结果会显示在下面的标签页" return None, info, "" except Exception as e: print(e) return None, "fail to create task", "" def onLoad(request: gr.Request): client_ip = request.client.host x_forwarded_for = dict(request.headers).get('x-forwarded-for') if x_forwarded_for: client_ip = x_forwarded_for his_datas = [None for _ in range(10)] info = '' try: infs = getAllFastInfs(ApiUrl, OpenId, ApiKey, client_ip) print(client_ip, 'history infs: ', len(infs)) cnt = 0 finish_n, fail_n, queue_n = 0, 0, 0 for i, inf in enumerate(infs): if inf['state']==2: if cnt>4: continue pose, res = inf['pose'], inf['res'] his_datas[cnt*2] = f"" his_datas[cnt*2+1] = f"" finish_n += 1 cnt += 1 elif inf['state'] in [-1, -2, 0]: fail_n += 1 elif inf['state'] in [1]: queue_n += 1 info = f"{client_ip}, you have {finish_n} successed tasks, {queue_n} running tasks, {fail_n} failed tasks." if fail_n>0: info = info+" Please upload a half/full-body human image, not just a clothing image!!!" if queue_n>0: position = inf['position'] info = info+" Wait for 3~10 mins and refresh this page, successed results will display in the history tab at the bottom. " info = info+f" your task position in queue is {position}. " info = info+f" 任务正在排队,队列位置 {position}. " info = info + "Go to heybeauty for better virtual try-on ! https://heybeauty.ai/extension" time.sleep(3) except Exception as e: print(e) his_datas = his_datas + [info] return his_datas with gr.Blocks(css=css) as demo: # description gr.Markdown(title) gr.Markdown(description) with gr.Row(): with gr.Column(): with gr.Column(): cloth_image = gr.Image(value=None, type="numpy", label="") cloth_id = gr.Label(value=cloth_examples[0][0], label="Clothing Image", visible=False) example = gr.Examples(inputs=[cloth_id, cloth_image], examples_per_page=3, examples = cloth_examples) with gr.Column(): with gr.Column(): pose_image = gr.Image(value=None, type="numpy", label="") pose_id = gr.Label(value=pose_examples[0][0], label="Pose Image", visible=False) example_pose = gr.Examples(inputs=[pose_id, pose_image], examples_per_page=3, examples=pose_examples) with gr.Column(): with gr.Column(): category = gr.Dropdown(value="upper_cloth", choices=["upper_cloth", "lower_cloth", "full_body", "dresses"], interactive=True) denoise_steps = gr.Slider(20, 30, value=20, interactive=True, label="denoise_steps") caption = gr.Textbox(value="", interactive=True, label='cloth caption') info_text = gr.Textbox(value="", interactive=False, label='runtime information') run_button = gr.Button(value="Run") init_res = get_result_example(cloth_examples[0][0], pose_examples[0][0]) res_image = gr.Image(label="result image", value=None, type="filepath") MK01 = gr.Markdown() with gr.Tab('history'): with gr.Row(): MK02 = gr.Markdown() with gr.Row(): his_pose_image1 = gr.HTML() his_res_image1 = gr.HTML() with gr.Row(): his_pose_image2 = gr.HTML() his_res_image2 = gr.HTML() with gr.Row(): his_pose_image3 = gr.HTML() his_res_image3 = gr.HTML() with gr.Row(): his_pose_image4 = gr.HTML() his_res_image4 = gr.HTML() with gr.Row(): his_pose_image5 = gr.HTML() his_res_image5 = gr.HTML() run_button.click(fn=onClick, inputs=[cloth_image, cloth_id, pose_image, pose_id, category, denoise_steps, caption, ], outputs=[res_image, info_text, MK01]) pose_image.upload(fn=onUpload, inputs=[], outputs=[pose_id],) cloth_image.upload(fn=onUpload, inputs=[], outputs=[cloth_id],) demo.load(onLoad, inputs=[], outputs=[his_pose_image1, his_res_image1, his_pose_image2, his_res_image2, his_pose_image3, his_res_image3, his_pose_image4, his_res_image4, his_pose_image5, his_res_image5, MK02]) if __name__ == "__main__": demo.queue(max_size=50) # demo.launch(server_name='0.0.0.0', server_port=225) demo.launch(server_name='0.0.0.0')