Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
from PIL import Image | |
import numpy as np | |
import random | |
import spaces | |
import torch | |
import torch.nn.functional as F | |
import config | |
from extras.expansion import FooocusExpansion | |
from feifeilib.feifeimodload import feifeimodload | |
import re | |
expansion = FooocusExpansion() | |
pipe = feifeimodload() | |
with open("artist.txt", "r") as file: | |
artists = file.readlines() | |
MAX_SEED = np.iinfo(np.int32).max | |
# 去除每行末尾的换行符 | |
artists = [artist.strip() for artist in artists] | |
def feifeitexttoimg( | |
prompt, | |
quality_select, | |
sharpened_select, | |
styles_Radio, | |
FooocusExpansion_select, | |
seed=42, | |
randomize_seed=False, | |
width=1024, | |
height=1024, | |
num_inference_steps=4, | |
guidance_scale=3.5, | |
num_strength=0.35, | |
progress=gr.Progress(track_tqdm=True), | |
): | |
guidance_scale = 3.5 | |
if randomize_seed: | |
seed = random.randint(0, MAX_SEED) | |
generator = torch.Generator().manual_seed(seed) | |
if not prompt: | |
prompt = "the photo is a 18 yo jpop girl is looking absolutely adorable and gorgeous, with a playful and mischievous grin, her eyes twinkling with joy. art by __artist__ and __artist__" | |
if "__artist__" in prompt: | |
# 随机选择艺术家 | |
selected_artists = random.sample(artists, len(artists)) | |
# 使用正则表达式替换所有的 __artist__ | |
def replace_artists(match): | |
return selected_artists.pop(0) | |
prompt = re.sub(r"__artist__", replace_artists, prompt) | |
# print("__artist__ " + prompt) | |
if quality_select: | |
prompt += ", masterpiece, best quality, very aesthetic, absurdres" | |
# print("111 " + prompt) | |
if styles_Radio: | |
for style_name in styles_Radio: | |
for style in config.style_list: | |
if style["name"] == style_name: | |
prompt += style["prompt"].replace("{prompt}", "the ") | |
# print("222 " + prompt) | |
if FooocusExpansion_select: | |
prompt = expansion(prompt, seed) | |
# print("333 " + prompt) | |
# print("000 " + prompt) | |
# 生成图像 | |
image = pipe( | |
prompt="", | |
prompt_2=prompt, | |
width=width, | |
height=height, | |
num_inference_steps=num_inference_steps, | |
generator=generator, | |
guidance_scale=guidance_scale, | |
output_type="pil", | |
).images[0] | |
if sharpened_select: | |
# 将PIL图像转换为NumPy数组 | |
image_np = np.array(image) | |
# 将NumPy数组转换为PyTorch张量 | |
image_tensor = (torch.tensor(image_np).permute( | |
2, 0, 1).unsqueeze(0).float().to("cuda")) | |
# 定义锐化滤镜,并调整中心值 | |
strength = num_strength | |
sharpen_kernel = (torch.tensor( | |
[ | |
[0, -1 * strength, 0], | |
[-1 * strength, 1 + 4 * strength, -1 * strength], | |
[0, -1 * strength, 0], | |
], | |
dtype=torch.float32, | |
).unsqueeze(0).unsqueeze(0).to("cuda")) | |
# 分别对每个通道应用卷积核 | |
sharpened_channels = [] | |
for i in range(3): | |
channel_tensor = image_tensor[:, i:i + 1, :, :] | |
sharpened_channel = F.conv2d(channel_tensor, | |
sharpen_kernel, | |
padding=1) | |
sharpened_channels.append(sharpened_channel) | |
# 合并通道 | |
sharpened_image_tensor = torch.cat(sharpened_channels, dim=1) | |
# 将增强后的图像转换回PIL格式 | |
sharpened_image_np = (sharpened_image_tensor.squeeze(0).permute( | |
1, 2, 0).cpu().numpy()) | |
sharpened_image_np = np.clip(sharpened_image_np, 0, | |
255).astype(np.uint8) | |
image = Image.fromarray(sharpened_image_np) | |
return image, seed | |