from mtcnn.mtcnn import MTCNN from utils import * face_detector = MTCNN() # Description # title = r""" # #align="center">IDM-VTON + Outfit Anyone in the Wild # """ # description = r""" # 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. # """ css = """ .gradio-container {width: 85% !important} """ def onClick(cloth_image, pose_image, category, caption, request: gr.Request): if pose_image is None: yield None, f"no user image found !" return None, "no user image found !" elif cloth_image is None: yield None, f"no cloth image found !" return None, "no cloth image found !" try: faces = face_detector.detect_faces(pose_image[:,:,::-1]) if len(faces)==0: print(client_ip, 'faces num is 0! ', flush=True) yield None, "Fatal Error !!! No face detected in pose image !!! " 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: yield None, "Fatal Error !!! Headshot is not allowed in pose image!!!" return None, "Fatal Error !!! Headshot is not allowed in pose image!!!" uploads = upload_imgs(ApiUrl, UploadToken, cloth_image, pose_image) if uploads is None: yield None, "fail to upload" return None, "fail to upload" infId = publicFastSwap(ApiUrl, OpenId, ApiKey, uploads, category, caption) if not infId: yield None, "fail to public you task" return None, "fail to public you task" max_try = 30 wait_s = 3 yield None, "start to process, please wait..." for i in range(max_try): time.sleep(wait_s) taskStatus = getTaskRes(ApiUrl, infId) if taskStatus is None: continue status = taskStatus['status'] if status in ['FAILED', 'CANCELLED', 'TIMED_OUT', ]: yield None, f"task failed, query {i}, status {status}" return None, f"task failed, query {i}, status {status}" elif status in ['IN_QUEUE', 'IN_PROGRESS', 'IN_QUEUE', ]: pass yield None, f"task is on processing, query {i}, status {status}, please do not exit !!!" elif status=='COMPLETED': out = taskStatus['output']['job_results']['output1'] yield out, f"task is COMPLETED" return out, f"{i} task COMPLETED" yield None, "fail to query task.." return None, "fail to query task.." except Exception as e: print(e) return None, "fail to create task" 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") with gr.Column(): with gr.Column(): pose_image = gr.Image(value=None, type="numpy", label="user photo") with gr.Column(): with gr.Column(): category = gr.Dropdown(value="upper_cloth", choices=["upper_cloth", "lower_cloth", "full_body", "dresses"], interactive=True) 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") res_image = gr.Image(label="result image", value=None, type="filepath") run_button.click(fn=onClick, inputs=[cloth_image, pose_image, category, caption, ], outputs=[res_image, info_text, ]) if __name__ == "__main__": demo.queue(max_size=50) demo.launch(server_name='0.0.0.0')