Spaces:
Running
Running
| import os | |
| import cv2 | |
| import numpy as np | |
| import random | |
| import base64 | |
| import requests | |
| import json | |
| import time | |
| import streamlit as st | |
| # Function definitions | |
| def tryon(person_img, garment_img, seed, randomize_seed): | |
| post_start_time = time.time() | |
| if person_img is None or garment_img is None: | |
| st.warning("Empty image") | |
| return None, None, "Empty image" | |
| if randomize_seed: | |
| seed = random.randint(0, MAX_SEED) | |
| encoded_person_img = cv2.imencode('.jpg', cv2.cvtColor(person_img, cv2.COLOR_RGB2BGR))[1].tobytes() | |
| encoded_person_img = base64.b64encode(encoded_person_img).decode('utf-8') | |
| encoded_garment_img = cv2.imencode('.jpg', cv2.cvtColor(garment_img, cv2.COLOR_RGB2BGR))[1].tobytes() | |
| encoded_garment_img = base64.b64encode(encoded_garment_img).decode('utf-8') | |
| try: | |
| url = "http://" + os.getenv('tryon_url', 'localhost:5000') + "/Submit" | |
| token = os.getenv('token', '') | |
| cookie = os.getenv('Cookie', '') | |
| referer = os.getenv('referer', '') | |
| headers = {'Content-Type': 'application/json', 'token': token, 'Cookie': cookie, 'referer': referer} | |
| data = { | |
| "clothImage": encoded_garment_img, | |
| "humanImage": encoded_person_img, | |
| "seed": seed | |
| } | |
| response = requests.post(url, headers=headers, data=json.dumps(data), timeout=50) | |
| if response.status_code == 200: | |
| result = response.json()['result'] | |
| status = result['status'] | |
| if status == "success": | |
| uuid = result['result'] | |
| except Exception as err: | |
| st.error(f"Post Exception Error: {err}") | |
| return None, None, "Too many users, please try again later" | |
| post_end_time = time.time() | |
| get_start_time = time.time() | |
| time.sleep(9) | |
| Max_Retry = 12 | |
| result_img = None | |
| info = "" | |
| err_log = "" | |
| for i in range(Max_Retry): | |
| try: | |
| url = "http://" + os.getenv('tryon_url', 'localhost:5000') + "/Query?taskId=" + uuid | |
| response = requests.get(url, headers=headers, timeout=20) | |
| if response.status_code == 200: | |
| result = response.json()['result'] | |
| status = result['status'] | |
| if status == "success": | |
| result = base64.b64decode(result['result']) | |
| result_np = np.frombuffer(result, np.uint8) | |
| result_img = cv2.imdecode(result_np, cv2.IMREAD_UNCHANGED) | |
| result_img = cv2.cvtColor(result_img, cv2.COLOR_RGB2BGR) | |
| info = "Success" | |
| break | |
| elif status == "error": | |
| err_log = f"Status is Error" | |
| info = "Error" | |
| break | |
| else: | |
| err_log = "URL error, please contact the admin" | |
| info = "URL error, please contact the admin" | |
| break | |
| except requests.exceptions.ReadTimeout: | |
| err_log = "Http Timeout" | |
| info = "Http Timeout, please try again later" | |
| except Exception as err: | |
| err_log = f"Get Exception Error: {err}" | |
| time.sleep(1) | |
| get_end_time = time.time() | |
| if info == "": | |
| err_log = f"No image after {Max_Retry} retries" | |
| info = "Too many users, please try again later" | |
| if info != "Success": | |
| st.warning("Too many users, please try again later") | |
| return result_img, seed, info | |
| MAX_SEED = 999999 | |
| st.title("Virtual Try-On") | |
| st.write(""" | |
| Step 1. Upload a person image ⬇️ | |
| """) | |
| person_img = st.file_uploader("Choose a person image", type=["jpg", "jpeg", "png"]) | |
| st.write(""" | |
| Step 2. Upload a garment image ⬇️ | |
| """) | |
| garment_img = st.file_uploader("Choose a garment image", type=["jpg", "jpeg", "png"]) | |
| seed = st.slider("Seed", min_value=0, max_value=MAX_SEED, value=0) | |
| randomize_seed = st.checkbox("Random seed", value=True) | |
| if st.button("Run"): | |
| if person_img is not None and garment_img is not None: | |
| person_img = np.array(cv2.imdecode(np.frombuffer(person_img.read(), np.uint8), cv2.IMREAD_COLOR)) | |
| garment_img = np.array(cv2.imdecode(np.frombuffer(garment_img.read(), np.uint8), cv2.IMREAD_COLOR)) | |
| result_img, seed_used, result_info = tryon(person_img, garment_img, seed, randomize_seed) | |
| if result_img is not None: | |
| st.image(result_img, caption='Result') | |
| st.write(f"Seed used: {seed_used}") | |
| st.write(f"Response: {result_info}") | |
| else: | |
| st.warning("Please upload both person and garment images.") | |