File size: 7,559 Bytes
1457e31
 
f762231
 
1457e31
 
 
 
 
 
 
 
 
 
 
 
 
f30af9d
 
3d0272c
 
 
 
 
 
 
 
 
 
 
 
 
 
f30af9d
 
 
 
 
 
 
 
 
 
 
 
3d0272c
1457e31
 
 
f30af9d
 
f762231
3d0272c
 
1457e31
 
 
 
 
 
 
 
f762231
 
 
 
 
1457e31
f762231
3d0272c
1457e31
 
 
 
3d0272c
f762231
f30af9d
 
1457e31
 
 
3d0272c
1457e31
 
3d0272c
1457e31
 
 
 
f762231
1457e31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f762231
1457e31
 
 
f762231
1457e31
 
 
 
f762231
1457e31
 
 
 
 
 
 
 
 
 
 
 
933eaf9
f30af9d
933eaf9
 
1457e31
 
3d0272c
 
 
 
 
 
 
f30af9d
 
933eaf9
f30af9d
1457e31
 
 
f762231
1457e31
f762231
 
1457e31
 
f762231
 
1457e31
f762231
 
 
 
1457e31
 
 
 
 
 
 
 
 
f762231
 
 
 
 
f30af9d
 
f762231
 
 
 
1457e31
 
 
 
 
 
 
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

from utils import *
from config import *



temp_examples = get_temps_examples(taskType)
user_examples = get_user_examples(taskType)
showcase_examples = get_showcase_examples(taskType)
user_recorder = UserRecorder()


css = """
.gradio-container {width: 85% !important}
"""


def onClick(temp_image, user_image, caption_text, token_text, 
        param4_text, param5_text, request: gr.Request):

    user_mask = None
    if taskType=='2':
        user_mask = user_image['layers'][0]
        user_image = user_image['background']
        user_mask = (user_mask.sum(2)>0).astype(np.uint8)*255
        user_image = np.array(Image.fromarray(user_image).convert('RGB'))
        if user_image.sum()==0:
            yield None, "please upload a photo!!!"
            return None, "please upload a photo!!!"
        if user_mask.sum()==0:
            yield None, "please draw a area!!!"
            return None, "please draw a area!!!" 

    if taskType=='7':
        try:
            param4_text, param5_text = str(float(param4_text)), str(float(param5_text))
        except ValueError:
            yield None, "Invalid width/height: Please enter a valid float"
            return None, "Invalid width/height: Please enter a valid float"
        if len(caption_text)==0:
            yield None, "Please enter English caption text !!! "
            return None, "Please enter English caption text !!! "
    else:
        param4_text, param5_text = '', ''

    print("======> temp_image ", type(temp_image))
    print("======> user_image ", type(user_image))
    print("======> caption_text ", type(caption_text))
    if temp_image is None: 
        yield None, "please choose a template!!!"
        return None, "please choose a template!!!"
    if user_image is None: 
        yield None, "please upload a photo!!!"
        return None, "please upload a photo!!!"

    try:
        client_ip = request.client.host
        x_forwarded_for = dict(request.headers).get('x-forwarded-for')
        if x_forwarded_for: client_ip = x_forwarded_for
        if not check_region_warp(client_ip):
            return None, "Failed !!! Our server is under maintenance, please try again later"
            
        # 检查是否可以继续试用
        check_res, info = user_recorder.check_record(ip=client_ip, token=token_text)
        if not check_res:
            yield None, info
            return None, info

        # 上传用户照片
        upload_url, uploadm_url = upload_user_img_mask(client_ip, user_image, user_mask)
        if len(upload_url)==0:
            yield None, "fail to upload"
            return None, "fail to upload"

        # return 
        # 发布任务
        taskId = publicSelfitTask(upload_url, uploadm_url, temp_image, 
            caption_text, param4_text, param5_text)
        if not taskId:
            yield None, "fail to public task..."
            return None, "fail to public task..."
            
        max_try = 30
        wait_s = 3
        # time.sleep(2)
        for i in range(max_try):
            time.sleep(wait_s)
            taskStatus = getTaskRes(taskId)
            if taskStatus is None: continue
            user_recorder.save_record(taskStatus, ip=client_ip, token=token_text)

            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', ]:
                yield None, f"task is on processing, query {i},  status {status}"
            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)
        raise e
        yield None, "fail to create task"
        return None, "fail to create task"

def onLoad(token_text, request: gr.Request):
    client_ip = request.client.host
    x_forwarded_for = dict(request.headers).get('x-forwarded-for')
    if x_forwarded_for:
        client_ip = x_forwarded_for
    his_datas, total_n, msg = user_recorder.get_record(ip=client_ip, token=token_text)
    left_n = max(0, LimitTask-total_n)
    his_datas.append(msg)
    his_datas.append(f"Submit ({left_n} attempts left)")
    return his_datas

with gr.Blocks(css=css) as demo:
    gr.Markdown(title)
    gr.Markdown(description)

    with gr.Row():
        with gr.Column():
            with gr.Column():
                temp_image = gr.Image(sources='clipboard', type="filepath", label=TempLabel, 
                    value=temp_examples[0][0], visible=TempVisible, interactive=TempInter)
                temp_example = gr.Examples(inputs=[temp_image], examples_per_page=9, 
                    examples=temp_examples, visible=TempVisible)
        with gr.Column():
            with gr.Column():
                if taskType=='2':
                    brush = gr.Brush(colors=['#FF0000'], color_mode='fixed')
                    user_image = gr.ImageEditor(value=None, type="numpy", 
                        eraser=False, brush=brush ,layers=False, sources=['upload',],
                        transforms=[], label=UserLabel)
                else:
                    user_image = gr.Image(value=None, type="numpy", label=UserLabel)
                param4_text = gr.Textbox(value="0.5", interactive=True, label=Param4Label, visible=Param4Visible)
                param5_text = gr.Textbox(value="0.5", interactive=True, label=Param5Label, visible=Param5Visible)
                caption_text = gr.Textbox(value="", interactive=True, label=CaptionLabel, visible=CapVisible)

        with gr.Column():
            with gr.Column():
                res_image = gr.Image(label="generate image", value=None, type="filepath")
                info_text = gr.Markdown(value="", label='Runtime Info')  # 创建 Markdown 输出组件
                run_button = gr.Button(value="Submit")
                token_text = gr.Textbox(value="", interactive=True, 
                    label='Enter Your Api Key (optional)', visible=is_show_token)
            
    with gr.Column():
        show_case = gr.Examples(examples=showcase_examples,
            inputs=[temp_image, user_image, res_image, ],label=None)
    with gr.Tab('history'):
        with gr.Row():  # 用 Row 包裹按钮
            with gr.Column(scale=0.5):  # Button 占用 Row 的一半
                refresh_button = gr.Button("Refresh History", size="small")
        MK02 = gr.Markdown(value="")  # 示例 Markdown 内容

        with gr.Row():
            his_input1 = gr.HTML()
            his_output1 = gr.HTML()
        with gr.Row():
            his_input2 = gr.HTML()
            his_output2 = gr.HTML()
        with gr.Row():
            his_input3 = gr.HTML()
            his_output3 = gr.HTML()

    outputs_onload = [his_input1, his_output1, his_input2, his_output2, his_input3, his_output3,
        MK02, run_button]

    run_button.click(fn=onClick, inputs=[temp_image, user_image, caption_text, 
        token_text, param4_text, param5_text], outputs=[res_image, info_text])

    refresh_button.click(fn=onLoad, inputs=[token_text], outputs=outputs_onload)

    demo.load(onLoad, inputs=[token_text], outputs=outputs_onload)


if __name__ == "__main__":

    demo.queue(max_size=50)
    demo.launch(server_name='0.0.0.0')