Spaces:
Runtime error
Runtime error
Upload 7 files
Browse files- app.py +1 -1
- app_inference.py +6 -2
- inference.py +15 -5
- train_realfill.py +2 -60
- trainer.py +16 -12
app.py
CHANGED
@@ -72,4 +72,4 @@ with gr.Blocks(css='style.css') as demo:
|
|
72 |
''')
|
73 |
create_upload_demo(HF_TOKEN)
|
74 |
|
75 |
-
demo.queue(max_size=1).launch(share=
|
|
|
72 |
''')
|
73 |
create_upload_demo(HF_TOKEN)
|
74 |
|
75 |
+
demo.queue(max_size=1).launch(share=True)
|
app_inference.py
CHANGED
@@ -91,9 +91,13 @@ def create_inference_demo(pipe: InferencePipeline,
|
|
91 |
open=False):
|
92 |
with gr.Row():
|
93 |
target_image = gr.Image(
|
94 |
-
label='Target Image',
|
|
|
|
|
95 |
target_mask = gr.Image(
|
96 |
-
label='Target Mask',
|
|
|
|
|
97 |
seed = gr.Slider(label='Seed',
|
98 |
minimum=0,
|
99 |
maximum=100000,
|
|
|
91 |
open=False):
|
92 |
with gr.Row():
|
93 |
target_image = gr.Image(
|
94 |
+
label='Target Image',
|
95 |
+
interactive=False,
|
96 |
+
type='filepath')
|
97 |
target_mask = gr.Image(
|
98 |
+
label='Target Mask',
|
99 |
+
interactive=False,
|
100 |
+
type='filepath')
|
101 |
seed = gr.Slider(label='Seed',
|
102 |
minimum=0,
|
103 |
maximum=100000,
|
inference.py
CHANGED
@@ -4,8 +4,8 @@ import gc
|
|
4 |
import pathlib
|
5 |
|
6 |
import gradio as gr
|
7 |
-
import PIL.Image
|
8 |
import torch
|
|
|
9 |
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
|
10 |
from huggingface_hub import ModelCard
|
11 |
|
@@ -60,22 +60,32 @@ class InferencePipeline:
|
|
60 |
def run(
|
61 |
self,
|
62 |
model_id: str,
|
|
|
63 |
target_image: str,
|
64 |
target_mask: str,
|
65 |
-
seed: int,
|
66 |
n_steps: int,
|
67 |
guidance_scale: float,
|
68 |
-
) ->
|
69 |
if not torch.cuda.is_available():
|
70 |
raise gr.Error('CUDA is not available.')
|
71 |
|
72 |
self.load_pipe(model_id)
|
73 |
|
74 |
generator = torch.Generator(device=self.device).manual_seed(seed)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
out = self.pipe(
|
76 |
"a photo of sks",
|
77 |
-
image=
|
78 |
-
mask_image=
|
79 |
num_inference_steps=n_steps,
|
80 |
guidance_scale=guidance_scale,
|
81 |
generator=generator,
|
|
|
4 |
import pathlib
|
5 |
|
6 |
import gradio as gr
|
|
|
7 |
import torch
|
8 |
+
from PIL import Image, ImageFilter
|
9 |
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
|
10 |
from huggingface_hub import ModelCard
|
11 |
|
|
|
60 |
def run(
|
61 |
self,
|
62 |
model_id: str,
|
63 |
+
seed: int,
|
64 |
target_image: str,
|
65 |
target_mask: str,
|
|
|
66 |
n_steps: int,
|
67 |
guidance_scale: float,
|
68 |
+
) -> Image.Image:
|
69 |
if not torch.cuda.is_available():
|
70 |
raise gr.Error('CUDA is not available.')
|
71 |
|
72 |
self.load_pipe(model_id)
|
73 |
|
74 |
generator = torch.Generator(device=self.device).manual_seed(seed)
|
75 |
+
|
76 |
+
image, mask_image = Image.open(target_image), Image.open(target_mask)
|
77 |
+
image, mask_image = image.convert("RGB"), mask_image.convert("L")
|
78 |
+
|
79 |
+
erode_kernel = ImageFilter.MaxFilter(3)
|
80 |
+
mask_image = mask_image.filter(erode_kernel)
|
81 |
+
|
82 |
+
blur_kernel = ImageFilter.BoxBlur(1)
|
83 |
+
mask_image = mask_image.filter(blur_kernel)
|
84 |
+
|
85 |
out = self.pipe(
|
86 |
"a photo of sks",
|
87 |
+
image=image,
|
88 |
+
mask_image=mask_image,
|
89 |
num_inference_steps=n_steps,
|
90 |
guidance_scale=guidance_scale,
|
91 |
generator=generator,
|
train_realfill.py
CHANGED
@@ -16,7 +16,6 @@ import transformers
|
|
16 |
from accelerate import Accelerator
|
17 |
from accelerate.logging import get_logger
|
18 |
from accelerate.utils import set_seed
|
19 |
-
from huggingface_hub import create_repo, upload_folder
|
20 |
from packaging import version
|
21 |
from PIL import Image
|
22 |
from PIL.ImageOps import exif_transpose
|
@@ -60,36 +59,6 @@ def make_mask(images, resolution, times=30):
|
|
60 |
mask = 1 - mask if random.random() < 0.5 else mask
|
61 |
return mask
|
62 |
|
63 |
-
def save_model_card(
|
64 |
-
repo_id: str,
|
65 |
-
base_model: str,
|
66 |
-
target_image: str,
|
67 |
-
target_mask: str,
|
68 |
-
repo_folder=None,
|
69 |
-
):
|
70 |
-
yaml = f"""
|
71 |
-
---
|
72 |
-
license: creativeml-openrail-m
|
73 |
-
base_model: {base_model}
|
74 |
-
target_image: {target_image}
|
75 |
-
target_mask: {target_mask}
|
76 |
-
tags:
|
77 |
-
- stable-diffusion-inpainting
|
78 |
-
- stable-diffusion-inpainting-diffusers
|
79 |
-
- text-to-image
|
80 |
-
- diffusers
|
81 |
-
- realfill
|
82 |
-
inference: true
|
83 |
-
---
|
84 |
-
"""
|
85 |
-
model_card = f"""
|
86 |
-
# RealFill - {repo_id}
|
87 |
-
|
88 |
-
This is a realfill model derived from {base_model}. The weights were trained using [RealFill](https://realfill.github.io/).
|
89 |
-
"""
|
90 |
-
with open(os.path.join(repo_folder, "README.md"), "w") as f:
|
91 |
-
f.write(yaml + model_card)
|
92 |
-
|
93 |
def log_validation(
|
94 |
text_encoder,
|
95 |
tokenizer,
|
@@ -306,14 +275,6 @@ def parse_args(input_args=None):
|
|
306 |
parser.add_argument("--adam_weight_decay", type=float, default=1e-2, help="Weight decay to use.")
|
307 |
parser.add_argument("--adam_epsilon", type=float, default=1e-08, help="Epsilon value for the Adam optimizer")
|
308 |
parser.add_argument("--max_grad_norm", default=1.0, type=float, help="Max gradient norm.")
|
309 |
-
parser.add_argument("--push_to_hub", action="store_true", help="Whether or not to push the model to the Hub.")
|
310 |
-
parser.add_argument("--hub_token", type=str, default=None, help="The token to use to push to the Model Hub.")
|
311 |
-
parser.add_argument(
|
312 |
-
"--hub_model_id",
|
313 |
-
type=str,
|
314 |
-
default=None,
|
315 |
-
help="The name of the repository to keep in sync with the local `output_dir`.",
|
316 |
-
)
|
317 |
parser.add_argument(
|
318 |
"--logging_dir",
|
319 |
type=str,
|
@@ -559,11 +520,6 @@ def main(args):
|
|
559 |
if args.output_dir is not None:
|
560 |
os.makedirs(args.output_dir, exist_ok=True)
|
561 |
|
562 |
-
if args.push_to_hub:
|
563 |
-
repo_id = create_repo(
|
564 |
-
repo_id=args.hub_model_id or Path(args.output_dir).name, exist_ok=True, token=args.hub_token
|
565 |
-
).repo_id
|
566 |
-
|
567 |
# Load the tokenizer
|
568 |
if args.tokenizer_name:
|
569 |
tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)
|
@@ -588,7 +544,7 @@ def main(args):
|
|
588 |
config = LoraConfig(
|
589 |
r=args.lora_rank,
|
590 |
lora_alpha=args.lora_alpha,
|
591 |
-
target_modules=["to_k", "to_q", "to_v", "
|
592 |
lora_dropout=args.lora_dropout,
|
593 |
bias=args.lora_bias,
|
594 |
)
|
@@ -597,7 +553,7 @@ def main(args):
|
|
597 |
config = LoraConfig(
|
598 |
r=args.lora_rank,
|
599 |
lora_alpha=args.lora_alpha,
|
600 |
-
target_modules=["k_proj", "q_proj", "v_proj"],
|
601 |
lora_dropout=args.lora_dropout,
|
602 |
bias=args.lora_bias,
|
603 |
)
|
@@ -930,20 +886,6 @@ def main(args):
|
|
930 |
global_step,
|
931 |
)
|
932 |
|
933 |
-
if args.push_to_hub:
|
934 |
-
save_model_card(
|
935 |
-
repo_id,
|
936 |
-
images=images,
|
937 |
-
base_model=args.pretrained_model_name_or_path,
|
938 |
-
repo_folder=args.output_dir,
|
939 |
-
)
|
940 |
-
upload_folder(
|
941 |
-
repo_id=repo_id,
|
942 |
-
folder_path=args.output_dir,
|
943 |
-
commit_message="End of training",
|
944 |
-
ignore_patterns=["step_*", "epoch_*"],
|
945 |
-
)
|
946 |
-
|
947 |
accelerator.end_training()
|
948 |
|
949 |
if __name__ == "__main__":
|
|
|
16 |
from accelerate import Accelerator
|
17 |
from accelerate.logging import get_logger
|
18 |
from accelerate.utils import set_seed
|
|
|
19 |
from packaging import version
|
20 |
from PIL import Image
|
21 |
from PIL.ImageOps import exif_transpose
|
|
|
59 |
mask = 1 - mask if random.random() < 0.5 else mask
|
60 |
return mask
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
def log_validation(
|
63 |
text_encoder,
|
64 |
tokenizer,
|
|
|
275 |
parser.add_argument("--adam_weight_decay", type=float, default=1e-2, help="Weight decay to use.")
|
276 |
parser.add_argument("--adam_epsilon", type=float, default=1e-08, help="Epsilon value for the Adam optimizer")
|
277 |
parser.add_argument("--max_grad_norm", default=1.0, type=float, help="Max gradient norm.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
278 |
parser.add_argument(
|
279 |
"--logging_dir",
|
280 |
type=str,
|
|
|
520 |
if args.output_dir is not None:
|
521 |
os.makedirs(args.output_dir, exist_ok=True)
|
522 |
|
|
|
|
|
|
|
|
|
|
|
523 |
# Load the tokenizer
|
524 |
if args.tokenizer_name:
|
525 |
tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)
|
|
|
544 |
config = LoraConfig(
|
545 |
r=args.lora_rank,
|
546 |
lora_alpha=args.lora_alpha,
|
547 |
+
target_modules=["to_k", "to_q", "to_v", "out.0"],
|
548 |
lora_dropout=args.lora_dropout,
|
549 |
bias=args.lora_bias,
|
550 |
)
|
|
|
553 |
config = LoraConfig(
|
554 |
r=args.lora_rank,
|
555 |
lora_alpha=args.lora_alpha,
|
556 |
+
target_modules=["k_proj", "q_proj", "v_proj", "out_proj"],
|
557 |
lora_dropout=args.lora_dropout,
|
558 |
bias=args.lora_bias,
|
559 |
)
|
|
|
886 |
global_step,
|
887 |
)
|
888 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
889 |
accelerator.end_training()
|
890 |
|
891 |
if __name__ == "__main__":
|
trainer.py
CHANGED
@@ -8,9 +8,9 @@ import shutil
|
|
8 |
import subprocess
|
9 |
|
10 |
import gradio as gr
|
11 |
-
import PIL.Image
|
12 |
import slugify
|
13 |
import torch
|
|
|
14 |
from huggingface_hub import HfApi
|
15 |
|
16 |
from app_upload import ModelUploader
|
@@ -24,9 +24,9 @@ class Trainer:
|
|
24 |
self.api = HfApi(token=hf_token)
|
25 |
self.model_uploader = ModelUploader(hf_token)
|
26 |
|
27 |
-
def prepare_dataset(self, reference_images: list,
|
28 |
-
target_image:
|
29 |
-
train_data_dir: pathlib.Path) -> None:
|
30 |
shutil.rmtree(train_data_dir, ignore_errors=True)
|
31 |
train_data_dir.mkdir(parents=True)
|
32 |
|
@@ -34,20 +34,24 @@ class Trainer:
|
|
34 |
(train_data_dir / 'target').mkdir(parents=True)
|
35 |
|
36 |
for i, temp_path in enumerate(reference_images):
|
37 |
-
image =
|
38 |
image = image.convert('RGB')
|
39 |
out_path = train_data_dir / 'ref' / f'{i:03d}.jpg'
|
40 |
image.save(out_path, format='JPEG', quality=100)
|
41 |
|
42 |
-
target_image =
|
43 |
target_image = target_image.convert('RGB')
|
44 |
out_path = train_data_dir / 'target' / f'target.jpg'
|
45 |
target_image.save(out_path, format='JPEG', quality=100)
|
|
|
|
|
46 |
|
47 |
-
target_mask =
|
48 |
target_mask = target_mask.convert('L')
|
49 |
out_path = train_data_dir / 'target' / f'mask.jpg'
|
50 |
target_mask.save(out_path, format='JPEG', quality=100)
|
|
|
|
|
51 |
|
52 |
def join_library_org(self) -> None:
|
53 |
subprocess.run(
|
@@ -58,8 +62,8 @@ class Trainer:
|
|
58 |
def run(
|
59 |
self,
|
60 |
reference_images: list | None,
|
61 |
-
target_image:
|
62 |
-
target_mask:
|
63 |
output_model_name: str,
|
64 |
overwrite_existing_model: bool,
|
65 |
base_model: str,
|
@@ -104,7 +108,7 @@ class Trainer:
|
|
104 |
output_dir.mkdir(parents=True)
|
105 |
|
106 |
train_data_dir = repo_dir / 'training_data' / output_model_name
|
107 |
-
self.prepare_dataset(reference_images,
|
108 |
|
109 |
if upload_to_hub:
|
110 |
self.join_library_org()
|
@@ -143,8 +147,8 @@ class Trainer:
|
|
143 |
subprocess.run(shlex.split(command))
|
144 |
save_model_card(save_dir=output_dir,
|
145 |
base_model=base_model,
|
146 |
-
target_image=
|
147 |
-
target_mask=
|
148 |
|
149 |
message = 'Training completed!'
|
150 |
print(message)
|
|
|
8 |
import subprocess
|
9 |
|
10 |
import gradio as gr
|
|
|
11 |
import slugify
|
12 |
import torch
|
13 |
+
from PIL import Image
|
14 |
from huggingface_hub import HfApi
|
15 |
|
16 |
from app_upload import ModelUploader
|
|
|
24 |
self.api = HfApi(token=hf_token)
|
25 |
self.model_uploader = ModelUploader(hf_token)
|
26 |
|
27 |
+
def prepare_dataset(self, reference_images: list,
|
28 |
+
target_image: Image.Image, target_mask: Image.Image,
|
29 |
+
train_data_dir: pathlib.Path, output_dir: pathlib.Path) -> None:
|
30 |
shutil.rmtree(train_data_dir, ignore_errors=True)
|
31 |
train_data_dir.mkdir(parents=True)
|
32 |
|
|
|
34 |
(train_data_dir / 'target').mkdir(parents=True)
|
35 |
|
36 |
for i, temp_path in enumerate(reference_images):
|
37 |
+
image = Image.open(temp_path.name)
|
38 |
image = image.convert('RGB')
|
39 |
out_path = train_data_dir / 'ref' / f'{i:03d}.jpg'
|
40 |
image.save(out_path, format='JPEG', quality=100)
|
41 |
|
42 |
+
target_image = Image.open(target_image[0].name)
|
43 |
target_image = target_image.convert('RGB')
|
44 |
out_path = train_data_dir / 'target' / f'target.jpg'
|
45 |
target_image.save(out_path, format='JPEG', quality=100)
|
46 |
+
out_path = output_dir / f'target.jpg'
|
47 |
+
target_image.save(out_path, format='JPEG', quality=100)
|
48 |
|
49 |
+
target_mask = Image.open(target_mask[0].name)
|
50 |
target_mask = target_mask.convert('L')
|
51 |
out_path = train_data_dir / 'target' / f'mask.jpg'
|
52 |
target_mask.save(out_path, format='JPEG', quality=100)
|
53 |
+
out_path = output_dir / f'mask.jpg'
|
54 |
+
target_image.save(out_path, format='JPEG', quality=100)
|
55 |
|
56 |
def join_library_org(self) -> None:
|
57 |
subprocess.run(
|
|
|
62 |
def run(
|
63 |
self,
|
64 |
reference_images: list | None,
|
65 |
+
target_image: Image.Image | None,
|
66 |
+
target_mask: Image.Image | None,
|
67 |
output_model_name: str,
|
68 |
overwrite_existing_model: bool,
|
69 |
base_model: str,
|
|
|
108 |
output_dir.mkdir(parents=True)
|
109 |
|
110 |
train_data_dir = repo_dir / 'training_data' / output_model_name
|
111 |
+
self.prepare_dataset(reference_images, target_image, target_mask, train_data_dir, output_dir)
|
112 |
|
113 |
if upload_to_hub:
|
114 |
self.join_library_org()
|
|
|
147 |
subprocess.run(shlex.split(command))
|
148 |
save_model_card(save_dir=output_dir,
|
149 |
base_model=base_model,
|
150 |
+
target_image=output_dir / 'target.jpg',
|
151 |
+
target_mask=output_dir / 'mask.jpg')
|
152 |
|
153 |
message = 'Training completed!'
|
154 |
print(message)
|