AkashKumarave commited on
Commit
38dc649
·
verified ·
1 Parent(s): 5c9bdb7

Upload folder using huggingface_hub

Browse files
Files changed (5) hide show
  1. .gitattributes +35 -35
  2. Dockerfile +30 -0
  3. README.md +7 -0
  4. app.py +169 -0
  5. requirements.txt +25 -0
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use Python 3.10 as base image
2
+ FROM python:3.10
3
+
4
+ # Set the working directory inside the container
5
+ WORKDIR /app
6
+
7
+ # Install required system packages
8
+ RUN apt-get update && apt-get install -y \
9
+ git \
10
+ ffmpeg \
11
+ libsm6 \
12
+ libxext6 \
13
+ && rm -rf /var/lib/apt/lists/*
14
+
15
+ # Clone and install Roop manually before other dependencies
16
+ RUN git clone https://github.com/s0md3v/roop.git /app/roop && \
17
+ pip install --no-cache-dir /app/roop
18
+
19
+ # Copy the requirements file and install dependencies
20
+ COPY requirements.txt .
21
+ RUN pip install --no-cache-dir -r requirements.txt || true
22
+
23
+ # Copy application files
24
+ COPY . .
25
+
26
+ # Expose port for Gradio or Flask
27
+ EXPOSE 7860
28
+
29
+ # Run the application
30
+ CMD ["python", "app.py"]
README.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ title: Testing
2
+ emoji: 🚀
3
+ colorFrom: green
4
+ colorTo: blue
5
+ sdk: gradio
6
+ app_file: app.py
7
+ pinned: false
app.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import time
3
+ import os
4
+ import gradio as gr
5
+ import torch
6
+ from einops import rearrange
7
+ from PIL import Image
8
+ from transformers import pipeline
9
+ from flux.cli import SamplingOptions
10
+ from flux.sampling import denoise, get_noise, get_schedule, prepare, unpack
11
+ from flux.util import load_ae, load_clip, load_flow_model, load_t5
12
+ from pulid.pipeline_flux import PuLIDPipeline
13
+ from pulid.utils import resize_numpy_image_long
14
+
15
+ NSFW_THRESHOLD = 0.85
16
+
17
+ def get_models(name: str, device: torch.device, offload: bool):
18
+ t5 = load_t5(device, max_length=128)
19
+ clip = load_clip(device)
20
+ model = load_flow_model(name, device="cpu" if offload else device)
21
+ model.eval()
22
+ ae = load_ae(name, device="cpu" if offload else device)
23
+ nsfw_classifier = pipeline("image-classification", model="Falconsai/nsfw_image_detection", device=device)
24
+ return model, ae, t5, clip, nsfw_classifier
25
+
26
+ class FluxGenerator:
27
+ def __init__(self):
28
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
29
+ self.offload = True # Enable offloading for free tier
30
+ self.model_name = "flux-schnell" # Use flux-schnell
31
+ self.model, self.ae, self.t5, self.clip, self.nsfw_classifier = get_models(
32
+ self.model_name,
33
+ device=self.device,
34
+ offload=self.offload,
35
+ )
36
+ self.pulid_model = PuLIDPipeline(self.model, "cuda", weight_dtype=torch.bfloat16)
37
+ self.pulid_model.load_pretrain()
38
+
39
+ flux_generator = FluxGenerator()
40
+
41
+ @spaces.GPU
42
+ @torch.inference_mode()
43
+ def generate_image(
44
+ prompt,
45
+ id_image,
46
+ seed,
47
+ width=512, # Reduced for free tier
48
+ height=512, # Reduced for free tier
49
+ num_steps=4, # Optimized for schnell
50
+ id_weight=1.0,
51
+ ):
52
+ flux_generator.t5.max_length = 128
53
+ seed = int(seed) if seed != -1 else torch.Generator(device="cpu").seed()
54
+
55
+ opts = SamplingOptions(
56
+ prompt=prompt,
57
+ width=width,
58
+ height=height,
59
+ num_steps=num_steps,
60
+ guidance=0.0, # No guidance for schnell
61
+ seed=seed,
62
+ )
63
+
64
+ print(f"Generating '{opts.prompt}' with seed {opts.seed}")
65
+ t0 = time.perf_counter()
66
+
67
+ # Process ID image if provided
68
+ if id_image is not None:
69
+ id_image = resize_numpy_image_long(id_image, 512) # Smaller size for memory
70
+ id_embeddings, uncond_id_embeddings = flux_generator.pulid_model.get_id_embedding(id_image, cal_uncond=False)
71
+ else:
72
+ id_embeddings = None
73
+ uncond_id_embeddings = None
74
+
75
+ # Prepare noise and schedule
76
+ x = get_noise(
77
+ 1,
78
+ opts.height,
79
+ opts.width,
80
+ device=flux_generator.device,
81
+ dtype=torch.bfloat16,
82
+ seed=opts.seed,
83
+ )
84
+ timesteps = get_schedule(
85
+ opts.num_steps,
86
+ x.shape[-1] * x.shape[-2] // 4,
87
+ shift=True,
88
+ )
89
+
90
+ if flux_generator.offload:
91
+ flux_generator.t5, flux_generator.clip = flux_generator.t5.to(flux_generator.device), flux_generator.clip.to(flux_generator.device)
92
+ inp = prepare(t5=flux_generator.t5, clip=flux_generator.clip, img=x, prompt=opts.prompt)
93
+
94
+ if flux_generator.offload:
95
+ flux_generator.t5, flux_generator.clip = flux_generator.t5.cpu(), flux_generator.clip.cpu()
96
+ torch.cuda.empty_cache()
97
+ flux_generator.model = flux_generator.model.to(flux_generator.device)
98
+
99
+ # Denoise
100
+ x = denoise(
101
+ flux_generator.model,
102
+ **inp,
103
+ timesteps=timesteps,
104
+ guidance=opts.guidance,
105
+ id=id_embeddings,
106
+ id_weight=id_weight,
107
+ start_step=0,
108
+ uncond_id=uncond_id_embeddings,
109
+ true_cfg=1.0, # No true CFG for schnell
110
+ )
111
+
112
+ if flux_generator.offload:
113
+ flux_generator.model.cpu()
114
+ torch.cuda.empty_cache()
115
+ flux_generator.ae.decoder.to(x.device)
116
+
117
+ # Decode
118
+ x = unpack(x.float(), opts.height, opts.width)
119
+ with torch.autocast(device_type=flux_generator.device.type, dtype=torch.bfloat16):
120
+ x = flux_generator.ae.decode(x)
121
+
122
+ if flux_generator.offload:
123
+ flux_generator.ae.decoder.cpu()
124
+ torch.cuda.empty_cache()
125
+
126
+ t1 = time.perf_counter()
127
+ print(f"Done in {t1 - t0:.1f}s.")
128
+
129
+ # Convert to PIL
130
+ x = x.clamp(-1, 1)
131
+ x = rearrange(x[0], "c h w -> h w c")
132
+ img = Image.fromarray((127.5 * (x + 1.0)).cpu().byte().numpy())
133
+
134
+ # NSFW check
135
+ nsfw_score = [x["score"] for x in flux_generator.nsfw_classifier(img) if x["label"] == "nsfw"][0]
136
+ if nsfw_score < NSFW_THRESHOLD:
137
+ return img, str(opts.seed)
138
+ else:
139
+ return None, f"Image may contain NSFW content (score: {nsfw_score})"
140
+
141
+ def create_demo():
142
+ with gr.Blocks() as demo:
143
+ gr.Markdown("# PuLID with FLUX.1 Schnell Demo")
144
+ with gr.Row():
145
+ with gr.Column():
146
+ prompt = gr.Textbox(label="Prompt", value="A person in a futuristic city")
147
+ id_image = gr.Image(label="Reference Image (ID)")
148
+ seed = gr.Textbox(label="Seed (-1 for random)", value="-1")
149
+ width = gr.Slider(256, 1024, 512, step=16, label="Width")
150
+ height = gr.Slider(256, 1024, 512, step=16, label="Height")
151
+ num_steps = gr.Slider(1, 4, 4, step=1, label="Number of Steps")
152
+ id_weight = gr.Slider(0.0, 2.0, 1.0, step=0.05, label="ID Weight")
153
+ generate_btn = gr.Button("Generate")
154
+ with gr.Column():
155
+ output_image = gr.Image(label="Generated Image")
156
+ seed_output = gr.Textbox(label="Used Seed")
157
+
158
+ generate_btn.click(
159
+ fn=generate_image,
160
+ inputs=[prompt, id_image, seed, width, height, num_steps, id_weight],
161
+ outputs=[output_image, seed_output]
162
+ )
163
+ return demo
164
+
165
+ if __name__ == "__main__":
166
+ import huggingface_hub
167
+ huggingface_hub.login(os.getenv("HF_TOKEN"))
168
+ demo = create_demo()
169
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ torch==2.1.0
2
+ torchvision==0.16.0
3
+ transformers==4.43.3
4
+ opencv-python
5
+ einops
6
+ ftfy
7
+ basicsr
8
+ facexlib
9
+ insightface
10
+ onnx==1.13.1
11
+ onnxruntime==1.14.1
12
+ accelerate
13
+ huggingface-hub>=0.19.0
14
+ timm
15
+ SentencePiece
16
+ fire
17
+ fastapi
18
+ uvicorn
19
+ numpy==1.23.5
20
+ pillow
21
+ requests
22
+ diffusers>=0.25.0
23
+ tensorflow==2.12.0
24
+ git+https://github.com/black-forest-labs/flux.git
25
+ git+https://github.com/ToTheBeginning/PuLID.git