Virtual-DressUp / app.py
usmanyousaf's picture
Update app.py
0ff4c41 verified
raw
history blame
4.55 kB
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.")