Spaces:
Running
Running
File size: 6,000 Bytes
959541f 713bad6 d86ec56 713bad6 959541f 713bad6 959541f d86ec56 959541f 713bad6 9f51cf6 959541f |
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 |
# Copyright (2024) Bytedance Ltd. and/or its affiliates
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import annotations
import os
import random
import uuid
import gradio as gr
import numpy as np
from loguru import logger
from caller import (
SeedT2ICaller,
SeedEditCaller
)
from PIL import Image
help_text = """
## How to use this Demo
Step 1. Type in the caption/instruction text box, and click "Generate" to generate an initial image using Seed-T2I.
Step 2. Type in the caption/instruction text box, and click "Edit" to edit the current image using Seed-Edit.
This is a demo with limited QPS and a simple interface.
For a better experience, please use [Doubao](https://www.doubao.com/chat/)/[Dreamina](https://dreamina.capcut.com/ai-tool/image/generate) APP.
- The current demo does not support multi-round editing, which may lead to overexposure with multiple rounds of upload and download edits.
- Higher-quality input images will produce higher-quality edited results. For low-quality images, unwanted changes, e.g. facial id, may occur.
<font size=2>Note: This demo is governed by the license of CC BY-NC \
We strongly advise users not to knowingly generate or allow others to knowingly generate harmful content, \
including hate speech, violence, pornography, deception, etc. \
(注:本演示受CC BY-NC的许可协议限制。我们强烈建议,用户不应传播及不应允许他人传播以下内容,\
包括但不限于仇恨言论、暴力、色情、欺诈相关的有害信息。)
"""
example_instructions = [
"Make it a picasso painting",
"close its eye",
"convert to a bronze statue",
"make it wearing a hat",
"make it wearing a PhD suit",
"Turn it into an anime.",
"have it look like a graphic novel",
"make it gain weight",
"what would he look like bald?",
"Have it smile",
"Put in a cocktail party.",
"move to the beach.",
"add dramatic lighting",
"Convert to black and white",
"What if it were snowing?",
"Give a leather jacket",
"Turn into a cyborg!",
]
def main():
resolution = 1024
cfg = {"resolution": resolution}
model_t2i = SeedT2ICaller(cfg)
cfg_edit = {}
model_edit = SeedEditCaller(cfg_edit)
logger.info("All models loaded")
def load_example():
example_image = Image.open(f"uni_test/test.jpg").convert("RGB")
example_instruction = random.choice(example_instructions)
edited_image, example_instruction = generate(example_image,
example_instruction,
cfg_scale=0.5)
return example_image, example_instruction, edited_image
def generate_t2i(instruction: str, cfg_scale: float = 0.5):
if not instruction:
return None, ""
logger.info("Generate images ...")
# Call model and capture the status
gen_image, success = model_t2i.generate(instruction, batch_size=1, cfg_scale=cfg_scale)
if not success or gen_image is None:
logger.error("Image generation failed or returned None. please retry")
return None, instruction
return gen_image, instruction
def generate(input_image: Image.Image, instruction: str = None, cfg_scale: float = 0.5):
logger.info("Generating images ...")
if not instruction or input_image is None:
return input_image, ""
logger.info("Running diffusion models ...")
edited_image, success = model_edit.edit(input_image, instruction, batch_size=1, cfg_scale=cfg_scale)
if not success or edited_image is None:
logger.error("Image editting failed or returned None.")
return None, instruction
return edited_image, instruction
def reset():
return None, None, ""
with gr.Blocks(css="footer {visibility: hidden}") as demo:
with gr.Row():
with gr.Column(scale=1, min_width=100):
generate_button = gr.Button("Generate")
with gr.Column(scale=1, min_width=100):
edit_button = gr.Button("Edit")
with gr.Column(scale=1, min_width=100):
load_button = gr.Button("Load Example")
with gr.Column(scale=1, min_width=100):
reset_button = gr.Button("Reset")
with gr.Row():
with gr.Column(scale=3):
instruction = gr.Textbox(lines=1, label="Caption/Edit Instruction", interactive=True, value=None)
with gr.Column(scale=1):
cfg_scale = gr.Slider(value=0.5, minimum=0.0, maximum=1.0, step=0.1, label="Edit/Text Strength (CFG)", interactive=True)
with gr.Row():
input_image = gr.Image(label="Input Image", type="pil", interactive=True,
height=resolution, width=resolution)
edited_image = gr.Image(label="Edited Image", type="pil", interactive=False,
height=resolution, width=resolution)
gr.Markdown(help_text)
load_button.click(
fn=load_example,
inputs=[],
outputs=[input_image, instruction, edited_image]
)
generate_button.click(
fn=generate_t2i,
inputs=[instruction, cfg_scale],
outputs=[input_image, instruction]
)
edit_button.click(
fn=generate,
inputs=[input_image, instruction, cfg_scale],
outputs=[edited_image, instruction]
)
reset_button.click(
fn=reset,
inputs=[],
outputs=[input_image, edited_image, instruction]
)
# demo.launch(server_name="0.0.0.0", server_port=8024)
demo.queue().launch(share=False)
if __name__ == "__main__":
main()
|