killwithabass's picture
Update app.py
061ad1a verified
import spaces
import gradio as gr
import torch
from PIL import Image, PngImagePlugin
from diffusers import DiffusionPipeline
import random
import os
import pygsheets
from datetime import datetime
import json
from gradio_client import Client as client_gradio
from supabase import create_client, Client
# Initialize supabase
url: str = os.getenv('SUPABASE_URL')
key: str = os.getenv('SUPABASE_KEY')
supabase: Client = create_client(url, key)
# Initialize the base model and specific LoRA
base_model = "black-forest-labs/FLUX.1-dev"
pipe = DiffusionPipeline.from_pretrained(base_model, torch_dtype=torch.bfloat16)
lora_repo = "markury/AndroFlux"
trigger_word = "" # Leave trigger_word blank if not used.
pipe.load_lora_weights(lora_repo, weight_name = "AndroFlux-v19.safetensors")
pipe.to("cuda")
MAX_SEED = 2**32-1
@spaces.GPU(duration=80)
def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale, progress=gr.Progress(track_tqdm=True)):
# Set random seed for reproducibility
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator(device="cuda").manual_seed(seed)
#Moderation
moderation_client = client_gradio("duchaba/Friendly_Text_Moderation")
result = moderation_client.predict(
msg=f"{prompt}",
safer=0.02,
api_name="/fetch_toxicity_level"
)
if float(json.loads(result[1])['sexual_minors']) > 0.03 :
print('Minors')
response_data = (supabase.table("requests")
.insert({"prompt":prompt, "cfg_scale":cfg_scale, "steps":steps, "randomized_seed": randomize_seed, "seed":seed, "lora_scale" : lora_scale, "moderated" : 'true'})
.execute()
)
raise gr.Error("Unauthorized request 💥!")
# Update progress bar (0% saat mulai)
progress(0, "Starting image generation...")
# Generate image using the pipeline
image = pipe(
prompt=f"{prompt} {trigger_word}",
num_inference_steps=steps,
guidance_scale=cfg_scale,
width=width,
height=height,
generator=generator,
joint_attention_kwargs={"scale": lora_scale},
max_sequence_length=512
).images[0]
# Save the image to a file with a unique name in /tmp directory
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
image_filename = f"generated_image_{timestamp}.png"
image_path = os.path.join("/tmp/gradio", image_filename)
# Add Metadata
new_metadata_string = f"{prompt}\nNegative prompt: none \nSteps: {steps}, CFG scale: {cfg_scale}, Seed: {seed}, Lora hashes: AndroFlux-v19: c44afd41ece1"
metadata = PngImagePlugin.PngInfo()
metadata.add_text("parameters", new_metadata_string)
#Save the tmp image
image.save(image_path, pnginfo=metadata)
#Log queries
try:
if "girl" not in prompt and "woman" not in prompt:
#Save image in supabase
response = supabase.storage.from_('generated_images').upload(image_filename, image_path,file_options={"content-type":"image/png;charset=UTF-8"})
print(response.dict)
#Log request in supabase
response_data = (supabase.table("requests")
.insert({"prompt":prompt, "cfg_scale":cfg_scale, "steps":steps, "randomized_seed": randomize_seed, "seed":seed, "lora_scale" : lora_scale, "image_url" : response.full_path})
.execute()
)
except Exception as error:
# handle the exception
print("An exception occurred:", error)
yield image, seed
# Example cached image and settings
example_image_path = "blond_5.webp" # Replace with the actual path to the example image
example_prompt = """a full frontal view photo of a athletic man with olive skin in his late twenties standing on a flowery terrace at golden hour. He is fully naked with a thick uncut penis and blond pubic hair. The man has long blond hair and has a dominant expression. The setting is outdoors, with a peaceful and aesthetic atmosphere."""
example_cfg_scale = 3.5
example_steps = 25
example_width = 896
example_height = 1152
example_seed = 556215326
example_lora_scale = 1
def load_example():
# Load example image from file
example_image = Image.open(example_image_path)
return example_prompt, example_cfg_scale, example_steps, True, example_seed, example_width, example_height, example_lora_scale, example_image
gr_theme = os.getenv("THEME")
with gr.Blocks(theme=gr_theme) as app:
gr.Markdown("# Androflux Image Generator")
with gr.Row():
with gr.Column(scale=3):
prompt = gr.TextArea(label="Prompt", placeholder="Type a prompt of max 77 characters", lines=3)
generate_button = gr.Button("Generate")
cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=example_cfg_scale)
steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=example_steps)
width = gr.Slider(label="Width", minimum=256, maximum=1536, step=64, value=example_width)
height = gr.Slider(label="Height", minimum=256, maximum=1536, step=64, value=example_height)
randomize_seed = gr.Checkbox(False, label="Randomize seed")
seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=example_seed)
lora_scale = gr.Slider(label="LoRA Scale", minimum=0, maximum=1, step=0.01, value=example_lora_scale)
with gr.Column(scale=1):
result = gr.Image(label="Generated Image")
gr.Markdown("Generate images using Androflux Lora and a text prompt.\n[[non-commercial license, Flux.1 Dev](https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md)]")
# Automatically load example data and image when the interface is launched
app.load(load_example, inputs=[], outputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale, result])
generate_button.click(
run_lora,
inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale],
outputs=[result, seed],
)
app.queue()
app.launch()