apiTest / app.py
kenfoo's picture
Update app.py
2bed509 verified
raw
history blame
5.09 kB
import gradio as gr
from gradio_client import Client
import random
import os
import requests
import tempfile
HF_TOKEN = os.environ.get("girlToken")
space_client = Client(
"prithivMLmods/Qwen-Image-Edit-2511-LoRAs-Fast",
token=HF_TOKEN
)
LORA_STYLES = [
'Multiple-Angles', 'Photo-to-Anime', 'Anime-V2', 'Light-Migration',
'Upscaler', 'Style-Transfer', 'Manga-Tone', 'Anything2Real',
'Fal-Multiple-Angles', 'Polaroid-Photo', 'Unblur-Anything',
'Midnight-Noir-Eyes-Spotlight', 'Hyper-Realistic-Portrait',
'Ultra-Realistic-Portrait', 'Pixar-Inspired-3D', 'Noir-Comic-Book',
'Any-light', 'Studio-DeLight', 'Cinematic-FlatLog',
]
MAX_SEED = 2**31 - 1
# def upload_to_imgbb(image_path):
# """上传图片到免费图床,返回公开 URL"""
# IMGBB_API_KEY = os.environ.get("IMGBB_API_KEY")
# if not IMGBB_API_KEY:
# return None
# with open(image_path, "rb") as f:
# import base64
# b64 = base64.b64encode(f.read()).decode()
# resp = requests.post(
# "https://api.imgbb.com/1/upload",
# data={"key": IMGBB_API_KEY, "image": b64}
# )
# if resp.status_code == 200:
# print(f'图床resp.json()={resp.json()}')
# return resp.json()["data"]["url"]
# return None
def upload_to_hf(image_path):
"""上传到 HF dataset,返回公开直链"""
from huggingface_hub import HfApi
import uuid
api = HfApi(token=HF_TOKEN)
filename = f"{uuid.uuid4().hex[:8]}_{os.path.basename(image_path)}"
# 上传到你自己的 HF dataset repo(需要先创建一个 public dataset repo)
url = api.upload_file(
path_or_fileobj=image_path,
path_in_repo=f"uploads/{filename}",
repo_id="kenfoo", # 改成你自己的
repo_type="dataset",
)
print(f'图床 ={url}')
# 转成直链格式
# url 格式: https://huggingface.co/datasets/xxx/yyy/resolve/main/uploads/zzz.jpg
return url
def infer(
image,
prompt,
lora_adapter,
seed,
randomize_seed,
guidance_scale,
steps,
progress=gr.Progress(track_tqdm=True),
):
if image is None or not os.path.exists(image):
print("未上传图片")
return None, seed
if randomize_seed:
seed = random.randint(0, MAX_SEED)
# 方案:上传到公开图床,拿到 URL 再传给远端
#public_url = upload_to_imgbb(image)
public_url = upload_to_hf(image)
if not public_url:
print("图床上传失败 ")
return None, seed
print(f"图片公开 URL: {public_url}")
# 直接传 URL 字符串,让远端自己下载
# 直接传字符串列表
images_input = [public_url]
print(f"prompt: {prompt}, lora: {lora_adapter}, seed: {seed}")
try:
result = space_client.predict(
images=images_input,
prompt=prompt,
lora_adapter=lora_adapter,
seed=float(seed),
randomize_seed=bool(randomize_seed),
guidance_scale=float(guidance_scale),
steps=float(steps),
api_name="/infer",
)
print(f"返回值: {result}")
image_info, seed_used = result
if isinstance(image_info, dict):
img_out = image_info.get("path") or image_info.get("url")
else:
img_out = image_info
return img_out, int(seed_used)
except Exception as e:
import traceback
traceback.print_exc()
print(f"异常: {e}")
return None, seed
css = """
#col-container {
margin: 0 auto;
max-width: 640px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown("# 图像编辑 Demo\n基于 prithivMLmods/Qwen-Image-Edit-2511-LoRAs-Fast")
image = gr.Image(label="上传图片", sources=["upload"], type="filepath")
prompt = gr.Text(label="编辑描述(Prompt)", placeholder="请输入图片编辑描述...")
lora_adapter = gr.Dropdown(label="编辑风格(Style)", choices=LORA_STYLES, value="Photo-to-Anime")
run_button = gr.Button("执行编辑", variant="primary")
result = gr.Image(label="结果图片")
with gr.Accordion("高级设置", open=False):
seed = gr.Slider(label="随机种子", minimum=0, maximum=MAX_SEED, step=1, value=0)
randomize_seed = gr.Checkbox(label="随机化种子", value=True)
guidance_scale = gr.Slider(label="引导强度", minimum=0.1, maximum=10.0, step=0.1, value=1.0)
steps = gr.Slider(label="推理步数", minimum=1, maximum=50, step=1, value=4)
gr.on(
triggers=[run_button.click, prompt.submit],
fn=infer,
inputs=[image, prompt, lora_adapter, seed, randomize_seed, guidance_scale, steps],
outputs=[result, seed],
)
if __name__ == "__main__":
demo.launch(ssr_mode=False, share=True)
# ```
# 然后去 [imgbb.com](https://imgbb.com/api) 免费申请一个 API key,存到 HF Space 的 Secrets 里,变量名 `IMGBB_API_KEY`。
# 这样的流程是:
# ```