Outfit_Helper / app.py
aljun5's picture
Update app.py
d43b1ee verified
raw
history blame
4.98 kB
import os
import cv2
import numpy as np
import json
import random
from PIL import Image, ImageDraw, ImageFont
import asyncio
import requests
import base64
import gradio as gr
machine_number = 0
model = os.path.join(os.path.dirname(__file__), "models/female_model.png")
MODEL_MAP = {
"AI Model female_model": 'models/female_model.png',
"AI Model female_model1": 'models/female_model1.png',
"AI Model male_model": 'models/male_model.png',
"AI Model male_model2": 'models/male_model2.png',
}
def add_waterprint(img):
h, w, _ = img.shape
img = cv2.putText(img, 'Powered by OutfitAnyone', (int(0.3*w), h-20), cv2.FONT_HERSHEY_PLAIN, 2, (128, 128, 128), 2, cv2.LINE_AA)
return img
def get_tryon_result(model_name, garment1, garment2, seed=1234):
# model_name = "AI Model " + model_name.split("\\")[-1].split(".")[0] # windows
model_name = "AI Model " + model_name.split("/")[-1].split(".")[0] # linux
print(model_name)
encoded_garment1 = cv2.imencode('.jpg', garment1)[1].tobytes()
encoded_garment1 = base64.b64encode(encoded_garment1).decode('utf-8')
if garment2 is not None:
encoded_garment2 = cv2.imencode('.jpg', garment2)[1].tobytes()
encoded_garment2 = base64.b64encode(encoded_garment2).decode('utf-8')
else:
encoded_garment2 = ''
url = os.environ['OA_IP_ADDRESS']
headers = {'Content-Type': 'application/json'}
seed = random.randint(0, 1222222222)
data = {
"garment1": encoded_garment1,
"garment2": encoded_garment2,
"model_name": model_name,
"seed": seed
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print("response code", response.status_code)
if response.status_code == 200:
result = response.json()
result = base64.b64decode(result['images'][0])
result_np = np.frombuffer(result, np.uint8)
result_img = cv2.imdecode(result_np, cv2.IMREAD_UNCHANGED)
else:
print('server error!')
final_img = add_waterprint(result_img)
return final_img
with gr.Blocks(css = ".output-image, .input-image, .image-preview {height: 400px !important} ") as demo:
gr.HTML(
"""
<div style="display: flex; justify-content: center; align-items: center; text-align: center;">
<a href="https://github.com/HumanAIGC/OutfitAnyone" style="margin-right: 20px; text-decoration: none; display: flex; align-items: center;">
</a>
<div>
<h1 >Outfit Anyone: Ultra-high quality virtual try-on for Any Clothing and Any Person</h1>
<h4 >v0.9</h4>
<h5 style="margin: 0;">OutfitAnyone plus version is now online with any model and any cloth: https://www.outfitanyone.life/</h5>
<div style="display: flex; justify-content: center; align-items: center; text-align: center;>
<a href="https://arxiv.org/abs/2407.16224"><img src="https://img.shields.io/badge/Arxiv-2407.16224-red"></a>
<a href='https://humanaigc.github.io/outfit-anyone/'><img src='https://img.shields.io/badge/Project_Page-OutfitAnyone-green' alt='Project Page'></a>
<a href='https://github.com/HumanAIGC/OutfitAnyone'><img src='https://img.shields.io/badge/Github-Repo-blue'></a>
</div>
</div>
</div>
""")
with gr.Row():
with gr.Column():
init_image = gr.Image(sources='clipboard', type="filepath", label="model", value=model)
with gr.Column():
gr.HTML(
"""
<div style="display: flex; justify-content: center; align-items: center; text-align: center;">
<div>
<h3>Models are fixed and cannot be uploaded or modified; we only support users uploading their own garments.</h3>
<h4 style="margin: 0;">For a one-piece dress or coat, you only need to upload the image to the 'top garment' section and leave the 'lower garment' section empty.</h4>
</div>
</div>
""")
with gr.Row():
garment_top = gr.Image(sources='upload', type="numpy", label="top garment")
garment_down = gr.Image(sources='upload', type="numpy", label="lower garment")
run_button = gr.Button(value="Run")
with gr.Column():
gallery = gr.Image()
run_button.click(fn=get_tryon_result,
inputs=[
init_image,
garment_top,
garment_down,
],
outputs=[gallery],
concurrency_limit=2)
if __name__ == "__main__":
ip = requests.get('http://ifconfig.me/ip', timeout=1).text.strip()
print("ip address alibaba", ip)
demo.queue(max_size=10)
demo.launch()