InvokeAI 2.2.4.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. backend/__init__.py +0 -0
  2. backend/invoke_ai_web_server.py +1724 -0
  3. backend/modules/__init__.py +0 -0
  4. backend/modules/create_cmd_parser.py +55 -0
  5. backend/modules/get_canvas_generation_mode.py +117 -0
  6. backend/modules/parameters.py +71 -0
  7. backend/modules/parse_seed_weights.py +47 -0
  8. configs/INITIAL_MODELS.yaml +80 -0
  9. configs/models.yaml.example +29 -0
  10. configs/sd-concepts.txt +803 -0
  11. configs/stable-diffusion/v1-finetune.yaml +110 -0
  12. configs/stable-diffusion/v1-finetune_style.yaml +103 -0
  13. configs/stable-diffusion/v1-inference.yaml +79 -0
  14. configs/stable-diffusion/v1-inpainting-inference.yaml +79 -0
  15. configs/stable-diffusion/v1-m1-finetune.yaml +110 -0
  16. docs/assets/invoke-web-server-1.png +0 -0
  17. docs/assets/invoke_ai_banner.png +0 -0
  18. invokeai-2.2.4.5.data/data/assets/caution.png +0 -0
  19. invokeai-2.2.4.5.data/data/configs/INITIAL_MODELS.yaml +80 -0
  20. invokeai-2.2.4.5.data/data/configs/models.yaml.example +29 -0
  21. invokeai-2.2.4.5.data/data/configs/sd-concepts.txt +803 -0
  22. invokeai-2.2.4.5.data/data/configs/stable-diffusion/v1-finetune.yaml +110 -0
  23. invokeai-2.2.4.5.data/data/configs/stable-diffusion/v1-finetune_style.yaml +103 -0
  24. invokeai-2.2.4.5.data/data/configs/stable-diffusion/v1-inference.yaml +79 -0
  25. invokeai-2.2.4.5.data/data/configs/stable-diffusion/v1-inpainting-inference.yaml +79 -0
  26. invokeai-2.2.4.5.data/data/configs/stable-diffusion/v1-m1-finetune.yaml +110 -0
  27. invokeai-2.2.4.5.data/data/frontend/dist/assets/Inter-Bold.790c108b.ttf +0 -0
  28. invokeai-2.2.4.5.data/data/frontend/dist/assets/Inter.b9a8e5e2.ttf +0 -0
  29. invokeai-2.2.4.5.data/data/frontend/dist/assets/favicon.0d253ced.ico +0 -0
  30. invokeai-2.2.4.5.data/data/frontend/dist/assets/index-legacy-b741077f.js +48 -0
  31. invokeai-2.2.4.5.data/data/frontend/dist/assets/index.0dadf5d0.css +1 -0
  32. invokeai-2.2.4.5.data/data/frontend/dist/assets/index.21ff81eb.js +625 -0
  33. invokeai-2.2.4.5.data/data/frontend/dist/assets/logo.13003d72.png +0 -0
  34. invokeai-2.2.4.5.data/data/frontend/dist/assets/polyfills-legacy-dde3a68a.js +4 -0
  35. invokeai-2.2.4.5.data/data/frontend/dist/assets/polyfills.1ff60148.js +1 -0
  36. invokeai-2.2.4.5.data/data/frontend/dist/index.html +23 -0
  37. invokeai-2.2.4.5.data/data/scripts/configure_invokeai.py +797 -0
  38. invokeai-2.2.4.5.data/data/scripts/create_root.py +43 -0
  39. invokeai-2.2.4.5.data/data/scripts/dream.py +10 -0
  40. invokeai-2.2.4.5.data/data/scripts/images2prompt.py +30 -0
  41. invokeai-2.2.4.5.data/data/scripts/invoke.py +5 -0
  42. invokeai-2.2.4.5.data/data/scripts/legacy_api.py +681 -0
  43. invokeai-2.2.4.5.data/data/scripts/load_models.py +12 -0
  44. invokeai-2.2.4.5.data/data/scripts/merge_embeddings.py +124 -0
  45. invokeai-2.2.4.5.data/data/scripts/preload_models.py +12 -0
  46. invokeai-2.2.4.5.data/data/scripts/sd-metadata.py +22 -0
  47. invokeai-2.2.4.5.dist-info/LICENSE +21 -0
  48. invokeai-2.2.4.5.dist-info/LICENSE-ModelWeights.txt +294 -0
  49. invokeai-2.2.4.5.dist-info/METADATA +288 -0
  50. invokeai-2.2.4.5.dist-info/RECORD +169 -0
  51. invokeai-2.2.4.5.dist-info/WHEEL +5 -0
  52. invokeai-2.2.4.5.dist-info/entry_points.txt +4 -0
  53. invokeai-2.2.4.5.dist-info/top_level.txt +6 -0
  54. invokeai-2.2.4.5.dist-info/zip-safe +1 -0
  55. ldm/__init__.py +0 -0
  56. ldm/data/__init__.py +0 -0
  57. ldm/data/base.py +31 -0
  58. ldm/data/imagenet.py +466 -0
  59. ldm/data/lsun.py +126 -0
  60. ldm/data/personalized.py +202 -0
  61. ldm/data/personalized_style.py +169 -0
  62. ldm/generate.py +1159 -0
  63. ldm/invoke/CLI.py +960 -0
  64. ldm/invoke/__init__.py +3 -0
  65. ldm/invoke/args.py +1257 -0
  66. ldm/invoke/concepts_lib.py +169 -0
  67. ldm/invoke/conditioning.py +289 -0
  68. ldm/invoke/devices.py +27 -0
  69. ldm/invoke/generator/__init__.py +4 -0
  70. ldm/invoke/generator/base.py +335 -0
  71. ldm/invoke/generator/embiggen.py +501 -0
  72. ldm/invoke/generator/img2img.py +97 -0
  73. ldm/invoke/generator/inpaint.py +358 -0
  74. ldm/invoke/generator/omnibus.py +175 -0
  75. ldm/invoke/generator/txt2img.py +88 -0
  76. ldm/invoke/generator/txt2img2img.py +182 -0
  77. ldm/invoke/globals.py +31 -0
  78. ldm/invoke/image_util.py +70 -0
  79. ldm/invoke/log.py +66 -0
  80. ldm/invoke/model_cache.py +449 -0
  81. ldm/invoke/patchmatch.py +44 -0
  82. ldm/invoke/pngwriter.py +113 -0
  83. ldm/invoke/prompt_parser.py +655 -0
  84. ldm/invoke/readline.py +442 -0
  85. ldm/invoke/restoration/__init__.py +4 -0
  86. ldm/invoke/restoration/base.py +38 -0
  87. ldm/invoke/restoration/codeformer.py +103 -0
  88. ldm/invoke/restoration/codeformer_arch.py +276 -0
  89. ldm/invoke/restoration/gfpgan.py +84 -0
  90. ldm/invoke/restoration/outcrop.py +108 -0
  91. ldm/invoke/restoration/outpaint.py +92 -0
  92. ldm/invoke/restoration/realesrgan.py +90 -0
  93. ldm/invoke/restoration/vqgan_arch.py +435 -0
  94. ldm/invoke/seamless.py +30 -0
  95. ldm/invoke/server.py +282 -0
  96. ldm/invoke/server_legacy.py +246 -0
  97. ldm/invoke/txt2mask.py +136 -0
  98. ldm/lr_scheduler.py +143 -0
  99. ldm/models/__init__.py +0 -0
  100. ldm/models/autoencoder.py +596 -0
  101. ldm/models/diffusion/__init__.py +0 -0
  102. ldm/models/diffusion/classifier.py +355 -0
  103. ldm/models/diffusion/cross_attention_control.py +443 -0
  104. ldm/models/diffusion/cross_attention_map_saving.py +95 -0
  105. ldm/models/diffusion/ddim.py +111 -0
  106. ldm/models/diffusion/ddpm.py +2263 -0
  107. ldm/models/diffusion/ksampler.py +312 -0
  108. ldm/models/diffusion/plms.py +146 -0
  109. ldm/models/diffusion/sampler.py +450 -0
  110. ldm/models/diffusion/shared_invokeai_diffusion.py +244 -0
  111. ldm/modules/__init__.py +0 -0
  112. ldm/modules/attention.py +274 -0
  113. ldm/modules/diffusionmodules/__init__.py +0 -0
  114. ldm/modules/diffusionmodules/model.py +894 -0
  115. ldm/modules/diffusionmodules/openaimodel.py +1036 -0
  116. ldm/modules/diffusionmodules/util.py +314 -0
  117. ldm/modules/distributions/__init__.py +0 -0
  118. ldm/modules/distributions/distributions.py +104 -0
  119. ldm/modules/ema.py +88 -0
  120. ldm/modules/embedding_manager.py +413 -0
  121. ldm/modules/encoders/__init__.py +0 -0
  122. ldm/modules/encoders/modules.py +772 -0
  123. ldm/modules/image_degradation/__init__.py +6 -0
  124. ldm/modules/image_degradation/bsrgan.py +846 -0
  125. ldm/modules/image_degradation/bsrgan_light.py +751 -0
  126. ldm/modules/image_degradation/utils_image.py +1024 -0
  127. ldm/modules/losses/__init__.py +1 -0
  128. ldm/modules/losses/contperceptual.py +175 -0
  129. ldm/modules/losses/vqperceptual.py +240 -0
  130. ldm/modules/x_transformer.py +752 -0
  131. ldm/simplet2i.py +13 -0
  132. ldm/util.py +264 -0
  133. scripts/configure_invokeai.py +797 -0
  134. scripts/create_root.py +43 -0
  135. scripts/dream.py +10 -0
  136. scripts/images2prompt.py +30 -0
  137. scripts/invoke.py +5 -0
  138. scripts/legacy_api.py +681 -0
  139. scripts/load_models.py +12 -0
  140. scripts/merge_embeddings.py +124 -0
  141. scripts/orig_scripts/img2img.py +296 -0
  142. scripts/orig_scripts/inpaint.py +98 -0
  143. scripts/orig_scripts/knn2img.py +397 -0
  144. scripts/orig_scripts/sample_diffusion.py +313 -0
  145. scripts/orig_scripts/train_searcher.py +147 -0
  146. scripts/orig_scripts/txt2img.py +324 -0
  147. scripts/preload_models.py +12 -0
  148. scripts/sd-metadata.py +22 -0
  149. vendored/clip/clip/__init__.py +1 -0
  150. vendored/clip/clip/bpe_simple_vocab_16e6.txt.gz +0 -0
  151. vendored/clip/clip/clip.py +237 -0
  152. vendored/clip/clip/model.py +436 -0
  153. vendored/clip/clip/simple_tokenizer.py +132 -0
  154. vendored/clip/hubconf.py +42 -0
  155. vendored/clip/setup.py +21 -0
  156. vendored/clip/tests/test_consistency.py +25 -0
  157. vendored/clipseg/datasets/coco_wrapper.py +99 -0
  158. vendored/clipseg/datasets/pascal_zeroshot.py +60 -0
  159. vendored/clipseg/datasets/pfe_dataset.py +129 -0
  160. vendored/clipseg/datasets/phrasecut.py +380 -0
  161. vendored/clipseg/datasets/utils.py +68 -0
  162. vendored/clipseg/evaluation_utils.py +292 -0
  163. vendored/clipseg/general_utils.py +272 -0
  164. vendored/clipseg/metrics.py +271 -0
  165. vendored/clipseg/models/clipseg.py +538 -0
  166. vendored/clipseg/models/vitseg.py +286 -0
  167. vendored/clipseg/score.py +453 -0
  168. vendored/clipseg/setup.py +30 -0
  169. vendored/clipseg/training.py +266 -0
@@ -0,0 +1,355 @@
1
+ import os
2
+ import torch
3
+ import pytorch_lightning as pl
4
+ from omegaconf import OmegaConf
5
+ from torch.nn import functional as F
6
+ from torch.optim import AdamW
7
+ from torch.optim.lr_scheduler import LambdaLR
8
+ from copy import deepcopy
9
+ from einops import rearrange
10
+ from glob import glob
11
+ from natsort import natsorted
12
+
13
+ from ldm.modules.diffusionmodules.openaimodel import (
14
+ EncoderUNetModel,
15
+ UNetModel,
16
+ )
17
+ from ldm.util import log_txt_as_img, default, ismap, instantiate_from_config
18
+
19
+ __models__ = {'class_label': EncoderUNetModel, 'segmentation': UNetModel}
20
+
21
+
22
+ def disabled_train(self, mode=True):
23
+ """Overwrite model.train with this function to make sure train/eval mode
24
+ does not change anymore."""
25
+ return self
26
+
27
+
28
+ class NoisyLatentImageClassifier(pl.LightningModule):
29
+ def __init__(
30
+ self,
31
+ diffusion_path,
32
+ num_classes,
33
+ ckpt_path=None,
34
+ pool='attention',
35
+ label_key=None,
36
+ diffusion_ckpt_path=None,
37
+ scheduler_config=None,
38
+ weight_decay=1.0e-2,
39
+ log_steps=10,
40
+ monitor='val/loss',
41
+ *args,
42
+ **kwargs,
43
+ ):
44
+ super().__init__(*args, **kwargs)
45
+ self.num_classes = num_classes
46
+ # get latest config of diffusion model
47
+ diffusion_config = natsorted(
48
+ glob(os.path.join(diffusion_path, 'configs', '*-project.yaml'))
49
+ )[-1]
50
+ self.diffusion_config = OmegaConf.load(diffusion_config).model
51
+ self.diffusion_config.params.ckpt_path = diffusion_ckpt_path
52
+ self.load_diffusion()
53
+
54
+ self.monitor = monitor
55
+ self.numd = (
56
+ self.diffusion_model.first_stage_model.encoder.num_resolutions - 1
57
+ )
58
+ self.log_time_interval = (
59
+ self.diffusion_model.num_timesteps // log_steps
60
+ )
61
+ self.log_steps = log_steps
62
+
63
+ self.label_key = (
64
+ label_key
65
+ if not hasattr(self.diffusion_model, 'cond_stage_key')
66
+ else self.diffusion_model.cond_stage_key
67
+ )
68
+
69
+ assert (
70
+ self.label_key is not None
71
+ ), 'label_key neither in diffusion model nor in model.params'
72
+
73
+ if self.label_key not in __models__:
74
+ raise NotImplementedError()
75
+
76
+ self.load_classifier(ckpt_path, pool)
77
+
78
+ self.scheduler_config = scheduler_config
79
+ self.use_scheduler = self.scheduler_config is not None
80
+ self.weight_decay = weight_decay
81
+
82
+ def init_from_ckpt(self, path, ignore_keys=list(), only_model=False):
83
+ sd = torch.load(path, map_location='cpu')
84
+ if 'state_dict' in list(sd.keys()):
85
+ sd = sd['state_dict']
86
+ keys = list(sd.keys())
87
+ for k in keys:
88
+ for ik in ignore_keys:
89
+ if k.startswith(ik):
90
+ print('Deleting key {} from state_dict.'.format(k))
91
+ del sd[k]
92
+ missing, unexpected = (
93
+ self.load_state_dict(sd, strict=False)
94
+ if not only_model
95
+ else self.model.load_state_dict(sd, strict=False)
96
+ )
97
+ print(
98
+ f'Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys'
99
+ )
100
+ if len(missing) > 0:
101
+ print(f'Missing Keys: {missing}')
102
+ if len(unexpected) > 0:
103
+ print(f'Unexpected Keys: {unexpected}')
104
+
105
+ def load_diffusion(self):
106
+ model = instantiate_from_config(self.diffusion_config)
107
+ self.diffusion_model = model.eval()
108
+ self.diffusion_model.train = disabled_train
109
+ for param in self.diffusion_model.parameters():
110
+ param.requires_grad = False
111
+
112
+ def load_classifier(self, ckpt_path, pool):
113
+ model_config = deepcopy(
114
+ self.diffusion_config.params.unet_config.params
115
+ )
116
+ model_config.in_channels = (
117
+ self.diffusion_config.params.unet_config.params.out_channels
118
+ )
119
+ model_config.out_channels = self.num_classes
120
+ if self.label_key == 'class_label':
121
+ model_config.pool = pool
122
+
123
+ self.model = __models__[self.label_key](**model_config)
124
+ if ckpt_path is not None:
125
+ print(
126
+ '#####################################################################'
127
+ )
128
+ print(f'load from ckpt "{ckpt_path}"')
129
+ print(
130
+ '#####################################################################'
131
+ )
132
+ self.init_from_ckpt(ckpt_path)
133
+
134
+ @torch.no_grad()
135
+ def get_x_noisy(self, x, t, noise=None):
136
+ noise = default(noise, lambda: torch.randn_like(x))
137
+ continuous_sqrt_alpha_cumprod = None
138
+ if self.diffusion_model.use_continuous_noise:
139
+ continuous_sqrt_alpha_cumprod = (
140
+ self.diffusion_model.sample_continuous_noise_level(
141
+ x.shape[0], t + 1
142
+ )
143
+ )
144
+ # todo: make sure t+1 is correct here
145
+
146
+ return self.diffusion_model.q_sample(
147
+ x_start=x,
148
+ t=t,
149
+ noise=noise,
150
+ continuous_sqrt_alpha_cumprod=continuous_sqrt_alpha_cumprod,
151
+ )
152
+
153
+ def forward(self, x_noisy, t, *args, **kwargs):
154
+ return self.model(x_noisy, t)
155
+
156
+ @torch.no_grad()
157
+ def get_input(self, batch, k):
158
+ x = batch[k]
159
+ if len(x.shape) == 3:
160
+ x = x[..., None]
161
+ x = rearrange(x, 'b h w c -> b c h w')
162
+ x = x.to(memory_format=torch.contiguous_format).float()
163
+ return x
164
+
165
+ @torch.no_grad()
166
+ def get_conditioning(self, batch, k=None):
167
+ if k is None:
168
+ k = self.label_key
169
+ assert k is not None, 'Needs to provide label key'
170
+
171
+ targets = batch[k].to(self.device)
172
+
173
+ if self.label_key == 'segmentation':
174
+ targets = rearrange(targets, 'b h w c -> b c h w')
175
+ for down in range(self.numd):
176
+ h, w = targets.shape[-2:]
177
+ targets = F.interpolate(
178
+ targets, size=(h // 2, w // 2), mode='nearest'
179
+ )
180
+
181
+ # targets = rearrange(targets,'b c h w -> b h w c')
182
+
183
+ return targets
184
+
185
+ def compute_top_k(self, logits, labels, k, reduction='mean'):
186
+ _, top_ks = torch.topk(logits, k, dim=1)
187
+ if reduction == 'mean':
188
+ return (
189
+ (top_ks == labels[:, None]).float().sum(dim=-1).mean().item()
190
+ )
191
+ elif reduction == 'none':
192
+ return (top_ks == labels[:, None]).float().sum(dim=-1)
193
+
194
+ def on_train_epoch_start(self):
195
+ # save some memory
196
+ self.diffusion_model.model.to('cpu')
197
+
198
+ @torch.no_grad()
199
+ def write_logs(self, loss, logits, targets):
200
+ log_prefix = 'train' if self.training else 'val'
201
+ log = {}
202
+ log[f'{log_prefix}/loss'] = loss.mean()
203
+ log[f'{log_prefix}/acc@1'] = self.compute_top_k(
204
+ logits, targets, k=1, reduction='mean'
205
+ )
206
+ log[f'{log_prefix}/acc@5'] = self.compute_top_k(
207
+ logits, targets, k=5, reduction='mean'
208
+ )
209
+
210
+ self.log_dict(
211
+ log,
212
+ prog_bar=False,
213
+ logger=True,
214
+ on_step=self.training,
215
+ on_epoch=True,
216
+ )
217
+ self.log(
218
+ 'loss', log[f'{log_prefix}/loss'], prog_bar=True, logger=False
219
+ )
220
+ self.log(
221
+ 'global_step',
222
+ self.global_step,
223
+ logger=False,
224
+ on_epoch=False,
225
+ prog_bar=True,
226
+ )
227
+ lr = self.optimizers().param_groups[0]['lr']
228
+ self.log(
229
+ 'lr_abs',
230
+ lr,
231
+ on_step=True,
232
+ logger=True,
233
+ on_epoch=False,
234
+ prog_bar=True,
235
+ )
236
+
237
+ def shared_step(self, batch, t=None):
238
+ x, *_ = self.diffusion_model.get_input(
239
+ batch, k=self.diffusion_model.first_stage_key
240
+ )
241
+ targets = self.get_conditioning(batch)
242
+ if targets.dim() == 4:
243
+ targets = targets.argmax(dim=1)
244
+ if t is None:
245
+ t = torch.randint(
246
+ 0,
247
+ self.diffusion_model.num_timesteps,
248
+ (x.shape[0],),
249
+ device=self.device,
250
+ ).long()
251
+ else:
252
+ t = torch.full(
253
+ size=(x.shape[0],), fill_value=t, device=self.device
254
+ ).long()
255
+ x_noisy = self.get_x_noisy(x, t)
256
+ logits = self(x_noisy, t)
257
+
258
+ loss = F.cross_entropy(logits, targets, reduction='none')
259
+
260
+ self.write_logs(loss.detach(), logits.detach(), targets.detach())
261
+
262
+ loss = loss.mean()
263
+ return loss, logits, x_noisy, targets
264
+
265
+ def training_step(self, batch, batch_idx):
266
+ loss, *_ = self.shared_step(batch)
267
+ return loss
268
+
269
+ def reset_noise_accs(self):
270
+ self.noisy_acc = {
271
+ t: {'acc@1': [], 'acc@5': []}
272
+ for t in range(
273
+ 0,
274
+ self.diffusion_model.num_timesteps,
275
+ self.diffusion_model.log_every_t,
276
+ )
277
+ }
278
+
279
+ def on_validation_start(self):
280
+ self.reset_noise_accs()
281
+
282
+ @torch.no_grad()
283
+ def validation_step(self, batch, batch_idx):
284
+ loss, *_ = self.shared_step(batch)
285
+
286
+ for t in self.noisy_acc:
287
+ _, logits, _, targets = self.shared_step(batch, t)
288
+ self.noisy_acc[t]['acc@1'].append(
289
+ self.compute_top_k(logits, targets, k=1, reduction='mean')
290
+ )
291
+ self.noisy_acc[t]['acc@5'].append(
292
+ self.compute_top_k(logits, targets, k=5, reduction='mean')
293
+ )
294
+
295
+ return loss
296
+
297
+ def configure_optimizers(self):
298
+ optimizer = AdamW(
299
+ self.model.parameters(),
300
+ lr=self.learning_rate,
301
+ weight_decay=self.weight_decay,
302
+ )
303
+
304
+ if self.use_scheduler:
305
+ scheduler = instantiate_from_config(self.scheduler_config)
306
+
307
+ print('Setting up LambdaLR scheduler...')
308
+ scheduler = [
309
+ {
310
+ 'scheduler': LambdaLR(
311
+ optimizer, lr_lambda=scheduler.schedule
312
+ ),
313
+ 'interval': 'step',
314
+ 'frequency': 1,
315
+ }
316
+ ]
317
+ return [optimizer], scheduler
318
+
319
+ return optimizer
320
+
321
+ @torch.no_grad()
322
+ def log_images(self, batch, N=8, *args, **kwargs):
323
+ log = dict()
324
+ x = self.get_input(batch, self.diffusion_model.first_stage_key)
325
+ log['inputs'] = x
326
+
327
+ y = self.get_conditioning(batch)
328
+
329
+ if self.label_key == 'class_label':
330
+ y = log_txt_as_img((x.shape[2], x.shape[3]), batch['human_label'])
331
+ log['labels'] = y
332
+
333
+ if ismap(y):
334
+ log['labels'] = self.diffusion_model.to_rgb(y)
335
+
336
+ for step in range(self.log_steps):
337
+ current_time = step * self.log_time_interval
338
+
339
+ _, logits, x_noisy, _ = self.shared_step(batch, t=current_time)
340
+
341
+ log[f'inputs@t{current_time}'] = x_noisy
342
+
343
+ pred = F.one_hot(
344
+ logits.argmax(dim=1), num_classes=self.num_classes
345
+ )
346
+ pred = rearrange(pred, 'b h w c -> b c h w')
347
+
348
+ log[f'pred@t{current_time}'] = self.diffusion_model.to_rgb(
349
+ pred
350
+ )
351
+
352
+ for key in log:
353
+ log[key] = log[key][:N]
354
+
355
+ return log