File size: 4,978 Bytes
d43b1ee
02a2436
d43b1ee
02a2436
 
d43b1ee
 
 
 
02a2436
d43b1ee
02a2436
d43b1ee
 
02a2436
d43b1ee
 
 
 
 
02a2436
 
d43b1ee
 
 
02a2436
 
 
d43b1ee
 
 
 
02a2436
d43b1ee
 
02a2436
d43b1ee
 
 
02a2436
d43b1ee
02a2436
d43b1ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
02a2436
d43b1ee
02a2436
d43b1ee
 
02a2436
 
d43b1ee
 
 
 
 
 
02a2436
d43b1ee
 
 
 
 
 
 
02a2436
 
d43b1ee
 
02a2436
 
d43b1ee
02a2436
 
d43b1ee
 
 
 
 
 
 
 
 
02a2436
d43b1ee
 
 
 
02a2436
 
d43b1ee
 
 
 
 
 
 
 
 
 
02a2436
 
d43b1ee
 
 
02a2436
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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()