thuanz123 commited on
Commit
9c5c95e
·
1 Parent(s): 095fa61

Upload 7 files

Browse files
Files changed (5) hide show
  1. app.py +1 -1
  2. app_inference.py +6 -2
  3. inference.py +15 -5
  4. train_realfill.py +2 -60
  5. 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=False)
 
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', interactive=False)
 
 
95
  target_mask = gr.Image(
96
- label='Target Mask', interactive=False)
 
 
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
- ) -> PIL.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
  out = self.pipe(
76
  "a photo of sks",
77
- image=target_image,
78
- mask_image=target_mask,
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", "key", "query", "value"],
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, resolution: int,
28
- target_image: PIL.Image, target_mask: PIL.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 = PIL.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 = PIL.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
 
47
- target_mask = PIL.Image.open(target_mask[0].name)
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: PIL.ImageFile | None,
62
- target_mask: PIL.ImageFile | None,
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, resolution, target_image, target_mask, train_data_dir)
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=train_data_dir / 'target' / 'target.jpg',
147
- target_mask=train_data_dir / 'target' / 'mask.jpg')
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)