Spaces:
Running
on
Zero
Running
on
Zero
import os | |
import torch | |
import uuid | |
from pathlib import Path | |
import gradio as gr | |
from gradio_imageslider import ImageSlider # Ensure this library is installed | |
if os.environ.get("SPACES_ZERO_GPU") is not None: | |
import spaces | |
else: | |
class spaces: | |
def GPU(func): | |
def wrapper(*args, **kwargs): | |
return func(*args, **kwargs) | |
return wrapper | |
from diffusers.utils import check_min_version | |
from flux.controlnet_flux import FluxControlNetModel | |
from flux.transformer_flux import FluxTransformer2DModel | |
from flux.pipeline_flux_controlnet_inpaint import FluxControlNetInpaintingPipeline | |
# Import configuration | |
import config | |
# Define the output folder | |
output_folder = Path('output_images') | |
output_folder.mkdir(exist_ok=True) | |
# Login to Hugging Face Hub | |
# huggingface_hub.login(os.getenv('HF_TOKEN_FLUX')) | |
check_min_version("0.30.2") | |
# Load models | |
transformer = FluxTransformer2DModel.from_pretrained( | |
"black-forest-labs/FLUX.1-dev", subfolder='transformer', torch_dtype=torch.bfloat16 | |
) | |
controlnet = FluxControlNetModel.from_pretrained( | |
"alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta", torch_dtype=torch.bfloat16 | |
) | |
# Build pipeline | |
pipe = FluxControlNetInpaintingPipeline.from_pretrained( | |
"black-forest-labs/FLUX.1-dev", | |
controlnet=controlnet, | |
transformer=transformer, | |
torch_dtype=torch.bfloat16 | |
).to("cuda") | |
pipe.transformer.to(torch.bfloat16) | |
pipe.controlnet.to(torch.bfloat16) | |
def process(input_image_editor): | |
# Use default values from config | |
negative_prompt = config.DEFAULT_NEGATIVE_PROMPT | |
controlnet_conditioning_scale = config.DEFAULT_CONTROLNET_CONDITIONING_SCALE | |
guidance_scale = config.DEFAULT_GUIDANCE_SCALE | |
seed = config.DEFAULT_SEED | |
num_inference_steps = config.DEFAULT_NUM_INFERENCE_STEPS | |
true_guidance_scale = config.DEFAULT_TRUE_GUIDANCE_SCALE | |
# Process image and mask | |
image = input_image_editor['background'] | |
mask = input_image_editor['layers'][0] | |
size = (768, 768) | |
image_or = image.copy() | |
image = image.convert("RGB").resize(size) | |
mask = mask.convert("RGB").resize(size) | |
generator = torch.Generator(device="cuda").manual_seed(seed) | |
# Generate result | |
result = pipe( | |
prompt="nothing",#os.getenv('MAGIC_PROMPT'), | |
height=size[1], | |
width=size[0], | |
control_image=image, | |
control_mask=mask, | |
num_inference_steps=num_inference_steps, | |
generator=generator, | |
controlnet_conditioning_scale=controlnet_conditioning_scale, | |
guidance_scale=guidance_scale, | |
negative_prompt=negative_prompt, | |
true_guidance_scale=true_guidance_scale | |
).images[0] | |
processed_image = result.resize(image_or.size[:2]) | |
# Save the processed image | |
output_folder = Path("output") # Make sure this folder exists or create it | |
output_folder.mkdir(parents=True, exist_ok=True) | |
image_path = output_folder / f"no_bg_image_{uuid.uuid4().hex}.png" | |
processed_image.save(image_path) | |
return (processed_image, image), str(image_path) | |
################################################################# | |
# Define inputs and outputs for the Gradio interface | |
image = gr.ImageEditor( | |
label='Image', | |
type='pil', | |
sources=["upload", "webcam"], | |
image_mode='RGB', | |
layers=False, | |
brush=gr.Brush(colors=["#FFFFFF"], color_mode="fixed") | |
) | |
output_slider = ImageSlider(label="Processed photo", type="pil") | |
demo = gr.Interface( | |
fn=process, | |
inputs=image, | |
outputs=[output_slider, gr.File(label="output png file")], | |
#title="🫧 Snap Clean 🧽", | |
description=config.DESCRIPTION | |
) | |
demo.launch(debug=False, show_error=True, share=True) |