Team Ai
Apppublic

FelixLuoX/stable_diffusion_test

sourceHugging Faceupdated 4y agoView on Hugging Face
2likes
app.py494 linesDownload Raw Back to root
1import gradio as gr2import io 3from PIL import Image, PngImagePlugin4import base645import requests6import json 7import ui_functions as uifn8 9txt2img_defaults = {10    'prompt': '',11    'ddim_steps': 50,12    'toggles': [1, 2, 3],13    'sampler_name': 'k_lms',14    'ddim_eta': 0.0,15    'n_iter': 1,16    'batch_size': 1,17    'cfg_scale': 7.5,18    'seed': '',19    'height': 512,20    'width': 512,21    'fp': None,22    'variant_amount': 0.0,23    'variant_seed': '',24    'submit_on_enter': 'Yes',25}26 27img2img_defaults = {28    'prompt': '',29    'ddim_steps': 50,30    'toggles': [1, 4, 5],31    'sampler_name': 'k_lms',32    'ddim_eta': 0.0,33    'n_iter': 1,34    'batch_size': 1,35    'cfg_scale': 5.0,36    'denoising_strength': 0.75,37    'mask_mode': 1,38    'resize_mode': 0,39    'seed': '',40    'height': 512,41    'width': 512,42    'fp': None,43}44sample_img2img = None45job_manager = None46RealESRGAN = True47show_embeddings = False48 49img2img_resize_modes = [50    "Just resize",51    "Crop and resize",52    "Resize and fill",53]54 55img2img_toggles = [56    'Create prompt matrix (separate multiple prompts using |, and get all combinations of them)',57    'Normalize Prompt Weights (ensure sum of weights add up to 1.0)',58    'Loopback (use images from previous batch when creating next batch)',59    'Random loopback seed',60    'Save individual images',61    'Save grid',62    'Sort samples by prompt',63    'Write sample info files',64    'Write sample info to one file',65    'jpg samples',66]67 68img2img_toggle_defaults = [img2img_toggles[i] for i in img2img_defaults['toggles']]69 70def read_content(file_path: str) -> str:71    """read the content of target file72    """73    with open(file_path, 'r', encoding='utf-8') as f:74        content = f.read()75 76    return content77 78def base2picture(resbase64):79    res=resbase64.split(',')[1]80    img_b64decode = base64.b64decode(res)81    image = io.BytesIO(img_b64decode)82    img = Image.open(image)83    return img 84 85def filter_content(raw_style: str):86    if "(" in raw_style:87        i = raw_style.index("(")88    else :89        i = -190 91    if i == -1:92        return raw_style93    else :94        return raw_style[:i]95 96def request_images(raw_text, class_draw, style_draw, batch_size):97    if filter_content(class_draw) != "国画":98        if filter_content(class_draw) != "通用":99            raw_text = raw_text + f",{filter_content(class_draw)}"100 101        for sty in style_draw:102            raw_text = raw_text + f",{filter_content(sty)}"103        print(f"raw text is {raw_text}")104        url = "http://flagart.baai.ac.cn/api/general/"105    elif filter_content(class_draw) == "国画":106        if raw_text.endswith("国画"):107            pass 108        else :109            raw_text = raw_text + ",国画"110        url = "http://flagart.baai.ac.cn/api/guohua/"111 112    d = {"data":[raw_text, batch_size]}113    r = requests.post(url, json=d, headers={"Content-Type": "application/json", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"})114    result_text = r.text115    content = json.loads(result_text)["data"][0]116    images = []117    for i in range(batch_size):118        # print(content[i])119        images.append(base2picture(content[i]))        120 121    return images 122 123def call_JS(sd_method, **kwargs):124    param_str = json.dumps(kwargs)125    return f"async (...x) => {{ return await SD.{sd_method}({{ x, ...{param_str} }}) ?? []; }}"126 127def encode_pil_to_base64(pil_image):128    with io.BytesIO() as output_bytes:129 130        # Copy any text-only metadata131        use_metadata = False132        metadata = PngImagePlugin.PngInfo()133        for key, value in pil_image.info.items():134            if isinstance(key, str) and isinstance(value, str):135                metadata.add_text(key, value)136                use_metadata = True137 138        pil_image.save(139            output_bytes, "PNG", pnginfo=(metadata if use_metadata else None)140        )141        bytes_data = output_bytes.getvalue()142    base64_str = str(base64.b64encode(bytes_data), "utf-8")143    return "data:image/png;base64," + base64_str144 145def img2img(*args):146    147    # 处理image148    for i, item in enumerate(args):149        # print(type(item))150        if type(item) == dict:151            args[i]['image']  = encode_pil_to_base64(item['image'])152            args[i]['mask'] = encode_pil_to_base64(item['mask'])153        else:154            print(i,type(item))155            print(item)156    157    batch_size = args[8]158 159    url = "http://flagart.baai.ac.cn/api/img2img/"160    d = {"data":args}161    r = requests.post(url, json=d, headers={"Content-Type": "application/json", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"})162    print(r)163    result_text = r.text164    content = json.loads(result_text)["data"][0]165    images = []166    for i in range(batch_size):167        # print(content[i])168        images.append(base2picture(content[i]))   169    # content = json.loads(result_text)170    # print(result_text)171    # print("服务器已经把东西返回来啦!!!!!!!乌拉乌拉!!!!!")172    return images173 174 175examples = [176    '水墨蝴蝶和牡丹花,国画',177    '苍劲有力的墨竹,国画',178    '暴风雨中的灯塔',179    '机械小松鼠,科学幻想',180    '中国水墨山水画,国画',181    "Lighthouse in the storm",182    "A dog",183    "Landscape by 张大千",184    "A tiger 长了兔子耳朵",185    "A baby bird 铅笔素描",186 187]188 189if __name__ == "__main__":190    block = gr.Blocks(css=read_content('style.css'))191 192    with block:193        # gr.HTML(read_content("header.html"))194 195        with gr.Tabs() as tabs:196 197            with gr.TabItem("文生图(Text-to-img)"):198 199                with gr.Group():200                    with gr.Box():201                        with gr.Row().style(mobile_collapse=False, equal_height=True):202                            text = gr.Textbox(203                                label="Prompt",204                                show_label=False,205                                max_lines=1,206                                placeholder="Input text(输入文字)",207                                interactive=True,208                            ).style(209                                border=(True, False, True, True),210                                rounded=(True, False, False, True),211                                container=False,212                            )213                            214                            btn = gr.Button("Generate image").style(215                                margin=False,216                                rounded=(True, True, True, True),217                            )218                        with gr.Row().style(mobile_collapse=False, equal_height=True):219                            class_draw = gr.Dropdown(["通用(general)", "国画(traditional Chinese painting)", 220                                                        "照片,摄影(picture photography)", "油画(oil painting)", 221                                                        "铅笔素描(pencil sketch)", "CG", 222                                                        "水彩画(watercolor painting)", "水墨画(ink and wash)",223                                                        "插画(illustrations)", "3D", "图生图(img2img)"],224                                                    label="生成类型(type)",225                                                    show_label=True,226                                                    value="通用(general)")227                        with gr.Row().style(mobile_collapse=False, equal_height=True):228                            style_draw = gr.CheckboxGroup(["蒸汽朋克(steampunk)", "电影摄影风格(film photography)", 229                                                        "概念艺术(concept art)", "Warming lighting", 230                                                        "Dramatic lighting", "Natural lighting", 231                                                        "虚幻引擎(unreal engine)", "4k", "8k",232                                                        "充满细节(full details)"],233                                                    label="画面风格(style)",234                                                    show_label=True,235                                                    )236                        with gr.Row().style(mobile_collapse=False, equal_height=True):237                            sample_size = gr.Slider(minimum=1,238                                                    maximum=4,239                                                    step=1,240                                                    label="生成数量(number)",241                                                    show_label=True,242                                                    interactive=True,243                                                    )244 245                    gallery = gr.Gallery(246                        label="Generated images", show_label=False, elem_id="gallery"247                    ).style(grid=[2], height="auto")248 249                    gr.Examples(examples=examples, fn=request_images, inputs=text, outputs=gallery, examples_per_page=100)250                    text.submit(request_images, inputs=[text, class_draw, style_draw, sample_size], outputs=gallery)251                    btn.click(request_images, inputs=[text, class_draw, style_draw, sample_size], outputs=gallery)252 253            with gr.TabItem("图生图(Img-to-Img)", id="img2img_tab"):254                with gr.Row(elem_id="prompt_row"):255                    img2img_prompt = gr.Textbox(label="Prompt",256                                                elem_id='img2img_prompt_input',257                                                placeholder="神奇的森林,流淌的河流.",258                                                lines=1,259                                                max_lines=1 if txt2img_defaults['submit_on_enter'] == 'Yes' else 25,260                                                value=img2img_defaults['prompt'],261                                                show_label=False).style()262 263                    img2img_btn_mask = gr.Button("Generate", variant="primary", visible=False,264                                                 elem_id="img2img_mask_btn")265                    img2img_btn_editor = gr.Button("Generate", variant="primary", elem_id="img2img_edit_btn")266                with gr.Row().style(equal_height=False):267                    with gr.Column():268                        gr.Markdown('#### 输入图像')269                        img2img_image_mask = gr.Image(270                            value=sample_img2img,271                            source="upload",272                            interactive=True,273                            tool="sketch",274                            type='pil',275                            elem_id="img2img_mask",276                            image_mode="RGBA"277                        )278                        img2img_image_editor = gr.Image(279                            value=sample_img2img,280                            source="upload",281                            interactive=True,282                            tool="select",283                            type='pil',284                            visible=False,285                            image_mode="RGBA",286                            elem_id="img2img_editor"287                        )288 289                        with gr.Tabs():290                            with gr.TabItem("编辑设置"):291                                with gr.Row():292                                    # disable Uncrop for now293                                    choices=["Mask", "Crop", "Uncrop"]294                                    img2img_image_editor_mode = gr.Radio(choices=["Mask"],295                                                                         label="编辑模式",296                                                                         value="Mask", elem_id='edit_mode_select',297                                                                         visible=True)298                                    img2img_mask = gr.Radio(choices=["保留mask区域", "生成mask区域"],299                                                            label="Mask 方式",300                                                            #value=img2img_mask_modes[img2img_defaults['mask_mode']],301                                                            value = "生成mask区域",302                                                            visible=True)303 304                                    img2img_mask_blur_strength = gr.Slider(minimum=1, maximum=10, step=1,305                                                                           label="How much blurry should the mask be? (to avoid hard edges)",306                                                                           value=3, visible=False)307 308                                    img2img_resize = gr.Radio(label="Resize mode",309                                                              choices=["Just resize", "Crop and resize",310                                                                       "Resize and fill"],311                                                              value=img2img_resize_modes[312                                                                  img2img_defaults['resize_mode']], visible=False)313 314                                img2img_painterro_btn = gr.Button("Advanced Editor",visible=False)315                            # with gr.TabItem("Hints",visible=False):316                            #     img2img_help = gr.Markdown(visible=False, value=uifn.help_text)317 318                    with gr.Column():319                        gr.Markdown('#### 编辑后的图片')320                        output_img2img_gallery = gr.Gallery(label="Images", elem_id="img2img_gallery_output").style(321                            grid=[4, 4, 4])322                        img2img_job_ui = job_manager.draw_gradio_ui() if job_manager else None323                        with gr.Column(visible=False):324                            with gr.Tabs(visible=False):325                                with gr.TabItem("", id="img2img_actions_tab",visible=False):326                                    gr.Markdown("Select an image, then press one of the buttons below")327                                    with gr.Row():328                                        output_img2img_copy_to_clipboard_btn = gr.Button("Copy to clipboard")329                                        output_img2img_copy_to_input_btn = gr.Button("Push to img2img input")330                                        output_img2img_copy_to_mask_btn = gr.Button("Push to img2img input mask")331 332                                    gr.Markdown("Warning: This will clear your current image and mask settings!")333                                with gr.TabItem("", id="img2img_output_info_tab",visible=False):334                                    output_img2img_params = gr.Textbox(label="Generation parameters")335                                    with gr.Row():336                                        output_img2img_copy_params = gr.Button("Copy full parameters").click(337                                            inputs=output_img2img_params, outputs=[],338                                            _js='(x) => {navigator.clipboard.writeText(x.replace(": ",":"))}', fn=None,339                                            show_progress=False)340                                        output_img2img_seed = gr.Number(label='Seed', interactive=False, visible=False)341                                        output_img2img_copy_seed = gr.Button("Copy only seed").click(342                                            inputs=output_img2img_seed, outputs=[],343                                            _js=call_JS("gradioInputToClipboard"), fn=None, show_progress=False)344                                    output_img2img_stats = gr.HTML(label='Stats')345 346                gr.Markdown('# 编辑设置')347 348                with gr.Row():349                    with gr.Column():350                        img2img_width = gr.Slider(minimum=64, maximum=2048, step=64, label="图片宽度",351                                                  value=img2img_defaults["width"])352                        img2img_height = gr.Slider(minimum=64, maximum=2048, step=64, label="图片高度",353                                                   value=img2img_defaults["height"])354                        img2img_cfg = gr.Slider(minimum=-40.0, maximum=30.0, step=0.5,355                                                label='文本引导强度',356                                                value=img2img_defaults['cfg_scale'], elem_id='cfg_slider')357                        img2img_seed = gr.Textbox(label="随机种子", lines=1, max_lines=1,358                                                  value=img2img_defaults["seed"])359                        img2img_batch_count = gr.Slider(minimum=1, maximum=50, step=1,360                                                        label='生成数量',361                                                        value=img2img_defaults['n_iter'])362                        img2img_dimensions_info_text_box = gr.Textbox(363                            label="长宽比设置")364                    with gr.Column():365                        img2img_steps = gr.Slider(minimum=1, maximum=250, step=1, label="采样步数",366                                                  value=img2img_defaults['ddim_steps'])367 368                        img2img_sampling = gr.Dropdown(label='采样方式',369                                                       choices=["DDIM", 'k_dpm_2_a', 'k_dpm_2', 'k_euler_a', 'k_euler',370                                                                'k_heun', 'k_lms'],371                                                       value=img2img_defaults['sampler_name'])372 373                        img2img_denoising = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising Strength',374                                                      value=img2img_defaults['denoising_strength'],visible=False)375 376                        img2img_toggles = gr.CheckboxGroup(label='', choices=img2img_toggles,377                                                           value=img2img_toggle_defaults,visible=False)378 379                        img2img_realesrgan_model_name = gr.Dropdown(label='RealESRGAN model',380                                                                    choices=['RealESRGAN_x4plus',381                                                                             'RealESRGAN_x4plus_anime_6B'],382                                                                    value='RealESRGAN_x4plus',383                                                                    visible=RealESRGAN is not None)  # TODO: Feels like I shouldnt slot it in here.384 385                        img2img_embeddings = gr.File(label="Embeddings file for textual inversion",386                                                     visible=show_embeddings)387 388                img2img_image_editor_mode.change(389                    uifn.change_image_editor_mode,390                    [img2img_image_editor_mode,391                     img2img_image_editor,392                     img2img_image_mask,393                     img2img_resize,394                     img2img_width,395                     img2img_height396                     ],397                    [img2img_image_editor, img2img_image_mask, img2img_btn_editor, img2img_btn_mask,398                     img2img_painterro_btn, img2img_mask, img2img_mask_blur_strength]399                )400 401                # img2img_image_editor_mode.change(402                #     uifn.update_image_mask,403                #     [img2img_image_editor, img2img_resize, img2img_width, img2img_height],404                #     img2img_image_mask405                # )406 407                # output_txt2img_copy_to_input_btn.click(408                #     uifn.copy_img_to_input,409                #     [output_txt2img_gallery],410                #     [img2img_image_editor, img2img_image_mask, tabs],411                #     _js=call_JS("moveImageFromGallery",412                #                 fromId="txt2img_gallery_output",413                #                 toId="img2img_editor")414                # )415 416                output_img2img_copy_to_input_btn.click(417                    uifn.copy_img_to_edit,418                    [output_img2img_gallery],419                    [img2img_image_editor, tabs, img2img_image_editor_mode],420                    _js=call_JS("moveImageFromGallery",421                                fromId="img2img_gallery_output",422                                toId="img2img_editor")423                )424                output_img2img_copy_to_mask_btn.click(425                    uifn.copy_img_to_mask,426                    [output_img2img_gallery],427                    [img2img_image_mask, tabs, img2img_image_editor_mode],428                    _js=call_JS("moveImageFromGallery",429                                fromId="img2img_gallery_output",430                                toId="img2img_editor")431                )432 433                output_img2img_copy_to_clipboard_btn.click(fn=None, inputs=output_img2img_gallery, outputs=[],434                                                           _js=call_JS("copyImageFromGalleryToClipboard",435                                                                       fromId="img2img_gallery_output")436                                                           )437 438                img2img_func = img2img439                img2img_inputs = [img2img_prompt, img2img_image_editor_mode, img2img_mask,440                                  img2img_mask_blur_strength, img2img_steps, img2img_sampling, img2img_toggles,441                                  img2img_realesrgan_model_name, img2img_batch_count, img2img_cfg,442                                  img2img_denoising, img2img_seed, img2img_height, img2img_width, img2img_resize,443                                  img2img_image_mask]444                # img2img_outputs = [output_img2img_gallery, output_img2img_seed, output_img2img_params,445                #                    output_img2img_stats]446 447                img2img_outputs = [output_img2img_gallery]448 449                # If a JobManager was passed in then wrap the Generate functions450                if img2img_job_ui:451                    img2img_func, img2img_inputs, img2img_outputs = img2img_job_ui.wrap_func(452                        func=img2img_func,453                        inputs=img2img_inputs,454                        outputs=img2img_outputs,455                    )456 457                img2img_btn_mask.click(458                    img2img_func,459                    img2img_inputs,460                    img2img_outputs461                )462 463                def img2img_submit_params():464                    # print([img2img_prompt, img2img_image_editor_mode, img2img_mask,465                    #              img2img_mask_blur_strength, img2img_steps, img2img_sampling, img2img_toggles,466                    #              img2img_realesrgan_model_name, img2img_batch_count, img2img_cfg,467                    #              img2img_denoising, img2img_seed, img2img_height, img2img_width, img2img_resize,468                    #              img2img_image_editor, img2img_image_mask, img2img_embeddings])469                    return (img2img_func,470                            img2img_inputs,471                            img2img_outputs)472 473                img2img_btn_editor.click(*img2img_submit_params())474 475                # GENERATE ON ENTER476                img2img_prompt.submit(None, None, None,477                                      _js=call_JS("clickFirstVisibleButton",478                                                  rowId="prompt_row"))479 480                img2img_painterro_btn.click(None,481                                            [img2img_image_editor, img2img_image_mask, img2img_image_editor_mode],482                                            [img2img_image_editor, img2img_image_mask],483                                            _js=call_JS("Painterro.init", toId="img2img_editor")484                                            )485 486                img2img_width.change(fn=uifn.update_dimensions_info, inputs=[img2img_width, img2img_height],487                                     outputs=img2img_dimensions_info_text_box)488                img2img_height.change(fn=uifn.update_dimensions_info, inputs=[img2img_width, img2img_height],489                                      outputs=img2img_dimensions_info_text_box)490 491        # gr.HTML(read_content("footer.html"))492        # gr.Image('./contributors.png')493 494    block.queue(max_size=50, concurrency_count=20).launch()