File size: 15,004 Bytes
d8a5a4d
97731f9
 
 
 
d8a5a4d
 
97731f9
7f68ca3
6e776e4
97731f9
77da620
13a2215
97731f9
77da620
d8a5a4d
 
 
 
 
1714b7c
d8a5a4d
 
 
 
 
 
 
 
 
 
 
 
 
97731f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4417ee8
97731f9
4417ee8
97731f9
4417ee8
 
 
 
 
e751430
 
 
 
4417ee8
97731f9
 
 
4417ee8
97731f9
4417ee8
97731f9
4417ee8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97731f9
 
d8a5a4d
 
 
 
 
 
 
97731f9
 
d8a5a4d
97731f9
d88d6cc
 
 
d8a5a4d
97731f9
4417ee8
 
 
 
 
 
 
edc3311
77da620
d8a5a4d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f437d2e
edc3311
f437d2e
edc3311
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f68ca3
edc3311
 
 
 
 
6906c28
 
 
 
 
 
 
 
 
edc3311
 
 
 
 
 
 
 
 
 
0e82b94
 
 
 
 
 
 
c36042f
97731f9
b743b0f
 
 
edc3311
 
 
3d40215
45b27a3
cd03287
97731f9
3cb1edf
cd03287
790cace
 
 
3d40215
 
 
b1bf2a5
 
1b794fb
b1bf2a5
d88d6cc
 
790cace
97731f9
 
edc3311
316d1bb
37ef96c
316d1bb
 
 
 
edc3311
 
 
 
 
 
97731f9
 
edc3311
 
 
 
 
c36042f
6a7c62d
0e82b94
 
97731f9
0e82b94
 
 
 
 
 
2e5e206
c36042f
0e82b94
 
f1c5ccb
cf85891
 
60ad9d6
 
 
 
27bbb72
edc3311
 
eaa9b33
 
cd03287
97731f9
790cace
316d1bb
edc3311
 
97731f9
78393a2
edc3311
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8a5a4d
 
 
6fd44fd
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
import io 
import re
import imp
import time
import json 
import base64
import requests
import gradio as gr
import ui_functions as uifn
from css_and_js import js, call_JS
from PIL import Image, PngImagePlugin, ImageChops

url_host = "https://flagstudio.baai.ac.cn"
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZjAxOGMxMzJiYTUyNDBjMzk5NTMzYTI5YjBmMzZiODMiLCJhcHBfbmFtZSI6IndlYiIsImlkZW50aXR5X3R5cGUiOiIyIiwidXNlcl9yb2xlIjoiMiIsImp0aSI6IjVjMmQzMjdiLWI5Y2MtNDhiZS1hZWQ4LTllMjQ4MDk4NzMxYyIsIm5iZiI6MTY2OTAwNjE5NywiZXhwIjoxOTg0MzY2MTk3LCJpYXQiOjE2NjkwMDYxOTd9.9B3MDk8wA6iWH5puXjcD19tJJ4Ox7mdpRyWZs5Kwt70"

def read_content(file_path: str) -> str:
    """read the content of target file
    """
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()

    return content

def filter_content(raw_style: str):
    if "(" in raw_style:
        i = raw_style.index("(")
    else :
        i = -1

    if i == -1:
        return raw_style
    else :
        return raw_style[:i]

def upload_image(img):
    url = url_host + "/api/v1/image/get-upload-link"
    headers = {"token": token}
    r = requests.post(url, json={}, headers=headers)
    if r.status_code != 200:
        raise gr.Error(r.reason)
    head_res = r.json()
    if head_res["code"] != 0:
        raise gr.Error("Unknown error")
    image_id = head_res["data"]["image_id"]
    image_url = head_res["data"]["url"]
    image_headers = head_res["data"]["headers"]

    imgBytes = io.BytesIO()
    img.save(imgBytes, "PNG")
    imgBytes = imgBytes.getvalue()

    r = requests.put(image_url, data=imgBytes, headers=image_headers)
    if r.status_code != 200:
        raise gr.Error(r.reason)
    return image_id, image_url

def post_reqest(seed, prompt, width, height, image_num, img=None, mask=None):
    data = {
            "type": "gen-image",
            "parameters": {
                "width": width, # output height width
                "height": height, # output image height
                "prompts": [prompt], 
            }
        }
    data["parameters"]["seed"] = int(seed)
    if img is not None:
        # Upload image
        image_id, image_url = upload_image(img)
        data["parameters"]["init_image"] = {
                    "image_id": image_id,
                    "url": image_url,
                    "width": img.width,
                    "height": img.height,
                }
    if mask is not None:
        # Upload mask
        extrama = mask.convert("L").getextrema()
        if extrama[1] > 0:
            mask_id, mask_url = upload_image(mask)
            data["parameters"]["mask_image"] = {
                        "image_id": mask_id,
                        "url": mask_url,
                        "width": mask.width,
                        "height": mask.height,
                    }
    headers = {"token": token}

    # Send create task request
    all_task_data = []
    url = url_host+"/api/v1/task/create"
    for _ in range(image_num):
        r = requests.post(url, json=data, headers=headers)
        if r.status_code != 200:
            raise gr.Error(r.reason)
        create_res = r.json()
        if create_res['code'] == 3002:
            raise gr.Error("Inappropriate prompt detected.")
        elif create_res['code'] != 0:
            raise gr.Error("Unknown error")
        all_task_data.append(create_res["data"])

    # Get result
    url = url_host+"/api/v1/task/status"
    images = []
    while True:
        if len(all_task_data) <= 0:
            return images
        for i in range(len(all_task_data)-1, -1, -1):
            data = all_task_data[i]
            r = requests.post(url, json=data, headers=headers)
            if r.status_code != 200:
                raise gr.Error(r.reason)
            res = r.json()
            if res["code"] == 6002:
                # Running
                continue
            if res["code"] == 6005:
                raise gr.Error("NSFW image detected.")
            elif res["code"] == 0:
                # Finished
                for img_info in res["data"]["images"]:
                    img_res = requests.get(img_info["url"])
                    images.append(Image.open(io.BytesIO(img_res.content)).convert("RGB"))
                del all_task_data[i]
            else:
                raise gr.Error(f"Error code: {res['code']}")
        time.sleep(1)

def request_images(raw_text, class_draw, style_draw, batch_size, w, h, seed):
    if filter_content(class_draw) != "国画":
        if filter_content(class_draw) != "通用":
            raw_text = raw_text + f",{filter_content(class_draw)}"

        for sty in style_draw:
            raw_text = raw_text + f",{filter_content(sty)}"
    elif filter_content(class_draw) == "国画":
        raw_text = raw_text + ",国画,水墨画,大作,黑白,高清,传统"
    print(f"raw text is {raw_text}")

    images = post_reqest(seed, raw_text, w, h, int(batch_size))

    return images


def img2img(prompt, image_and_mask):
    if image_and_mask["image"].width <= image_and_mask["image"].height:
        width = 512
        height = int((width/image_and_mask["image"].width)*image_and_mask["image"].height)
    else:
        height = 512
        width = int((height/image_and_mask["image"].height)*image_and_mask["image"].width)
    return post_reqest(0, prompt, width, height, 1, image_and_mask["image"], image_and_mask["mask"])


examples = [
    '水墨蝴蝶和牡丹花,国画',
    '苍劲有力的墨竹,国画',
    '暴风雨中的灯塔',
    '机械小松鼠,科学幻想',
    '中国水墨山水画,国画',
    "Lighthouse in the storm",
    "A dog",
    "Landscape by 张大千",
    "A tiger 长了兔子耳朵",
    "A baby bird 铅笔素描",
]

if __name__ == "__main__":
    block = gr.Blocks(css=read_content('style.css'))

    with block:
        gr.HTML(read_content("header.html"))
        with gr.Tabs(elem_id='tabss') as tabs:

            with gr.TabItem("文生图(Text-to-img)", id='txt2img_tab'):

                with gr.Group():
                    with gr.Box():
                        with gr.Row().style(mobile_collapse=False, equal_height=True):
                            text = gr.Textbox(
                                label="Prompt",
                                show_label=False,
                                max_lines=1,
                                placeholder="Input text(输入文字)",
                                interactive=True,
                            ).style(
                                border=(True, False, True, True),
                                rounded=(True, False, False, True),
                                container=False,
                            )
                            
                            btn = gr.Button("Generate image").style(
                                margin=False,
                                rounded=(True, True, True, True),
                            )
                        with gr.Row().style(mobile_collapse=False, equal_height=True):
                            class_draw = gr.Radio(choices=["通用(general)","国画(traditional Chinese painting)",], value="通用(general)", show_label=True, label='生成类型(type)')
                            # class_draw = gr.Dropdown(["通用(general)", "国画(traditional Chinese painting)", 
                            #                             "照片,摄影(picture photography)", "油画(oil painting)", 
                            #                             "铅笔素描(pencil sketch)", "CG", 
                            #                             "水彩画(watercolor painting)", "水墨画(ink and wash)",
                            #                             "插画(illustrations)", "3D", "图生图(img2img)"],
                            #                         label="生成类型(type)",
                            #                         show_label=True,
                            #                         value="通用(general)")
                        with gr.Row().style(mobile_collapse=False, equal_height=True):
                            style_draw = gr.CheckboxGroup(["蒸汽朋克(steampunk)", "电影摄影风格(film photography)", 
                                                        "概念艺术(concept art)", "Warming lighting", 
                                                        "Dramatic lighting", "Natural lighting", 
                                                        "虚幻引擎(unreal engine)", "4k", "8k",
                                                        "充满细节(full details)"],
                                                    label="画面风格(style)",
                                                    show_label=True,
                                                    )
                        with gr.Row().style(mobile_collapse=False, equal_height=True):
                            # sample_size = gr.Slider(minimum=1,
                            #                         maximum=4,
                            #                         step=1,
                            #                         label="生成数量(number)",
                            #                         show_label=True,
                            #                         interactive=True,
                            #                         )
                            sample_size = gr.Radio(choices=["1","2","3","4"], value="1", show_label=True, label='生成数量(number)')
                            seed = gr.Number(0, label='seed', interactive=True)
                        with gr.Row().style(mobile_collapse=False, equal_height=True):
                            w = gr.Slider(512,1024,value=512, step=64, label="width")
                            h = gr.Slider(512,1024,value=512, step=64, label="height")

                    gallery = gr.Gallery(
                        label="Generated images", show_label=False, elem_id="gallery"
                    ).style(grid=[2,2])
                    gr.Examples(examples=examples, fn=request_images, inputs=text, outputs=gallery, examples_per_page=100)
                    with gr.Row().style(mobile_collapse=False, equal_height=True):
                        img_choices = gr.Dropdown(["图片1(img1)"],label='请选择一张图片发送到图生图',show_label=True,value="图片1(img1)")
                    with gr.Row().style(mobile_collapse=False, equal_height=True):
                        output_txt2img_copy_to_input_btn = gr.Button("发送图片到图生图(Sent the image to img2img)").style(
                                margin=False,
                                rounded=(True, True, True, True),
                            )

                    with gr.Row():
                        prompt = gr.Markdown("提示(Prompt):", visible=False)
                    with gr.Row():
                        move_prompt_zh = gr.Markdown("请移至图生图部分进行编辑(拉到顶部)", visible=False)
                    with gr.Row():
                        move_prompt_en = gr.Markdown("Please move to the img2img section for editing(Pull to the top)", visible=False)

                        

                    text.submit(request_images, inputs=[text, class_draw, style_draw, sample_size, w, h, seed], outputs=gallery)
                    btn.click(request_images, inputs=[text, class_draw, style_draw, sample_size, w, h, seed], outputs=gallery)

                    sample_size.change(
                        fn=uifn.change_img_choices,
                        inputs=[sample_size],
                        outputs=[img_choices]
                    )

            with gr.TabItem("图生图(Img-to-Img)", id="img2img_tab"):
                with gr.Row(elem_id="prompt_row"):
                    img2img_prompt = gr.Textbox(label="Prompt",
                                                elem_id='img2img_prompt_input',
                                                placeholder="神奇的森林,流淌的河流.",
                                                lines=1,
                                                max_lines=1,
                                                value="",
                                                show_label=False).style()

                    img2img_btn_mask = gr.Button("Generate", variant="primary", visible=False,
                                                 elem_id="img2img_mask_btn")
                    img2img_btn_editor = gr.Button("Generate", variant="primary", elem_id="img2img_edit_btn")
                gr.Markdown('#### 输入图像')
                with gr.Row().style(equal_height=False):
                    #with gr.Column():
                    img2img_image_mask = gr.Image(
                        value=None,
                        source="upload",
                        interactive=True,
                        tool="sketch",
                        type='pil',
                        elem_id="img2img_mask",
                        image_mode="RGBA"
                    )
                gr.Markdown('#### 编辑后的图片')
                with gr.Row():
                    output_img2img_gallery = gr.Gallery(label="Images", elem_id="img2img_gallery_output").style(
                        grid=[4,4,4] )
                with gr.Row():
                    gr.Markdown('提示(prompt):')
                with gr.Row():
                    gr.Markdown('请选择一张图像掩盖掉一部分区域,并输入文本描述')
                with gr.Row():
                    gr.Markdown('Please select an image to cover up a part of the area and enter a text description.')
                gr.Markdown('# 编辑设置',visible=False)


                output_txt2img_copy_to_input_btn.click(
                    uifn.copy_img_to_input,
                    [gallery, img_choices],
                    [tabs, img2img_image_mask, move_prompt_zh, move_prompt_en, prompt]
                )


                img2img_func = img2img
                img2img_inputs = [img2img_prompt, img2img_image_mask]
                img2img_outputs = [output_img2img_gallery]

                img2img_btn_mask.click(
                    img2img_func,
                    img2img_inputs,
                    img2img_outputs
                )

                def img2img_submit_params():
                    return (img2img_func,
                            img2img_inputs,
                            img2img_outputs)

                img2img_btn_editor.click(*img2img_submit_params())

                # GENERATE ON ENTER
                img2img_prompt.submit(None, None, None,
                                      _js=call_JS("clickFirstVisibleButton",
                                                  rowId="prompt_row"))

        gr.HTML(read_content("footer.html"))
        # gr.Image('./contributors.png')

    block.queue(max_size=512, concurrency_count=256).launch()