(
self,
prompt,
local_prompts=[],
masks=[],
mask_scales=[],
negative_prompt="",
cfg_scale=7.5,
clip_skip=1,
input_image=None,
ipadapter_images=None,
ipadapter_scale=1.0,
controlnet_image=None,
denoising_strength=1.0,
height=512,
width=512,
num_inference_steps=20,
tiled=False,
tile_size=64,
tile_stride=32,
seed=None,
progress_bar_cmd=tqdm,
progress_bar_st=None,
)
| 89 | |
| 90 | @torch.no_grad() |
| 91 | def __call__( |
| 92 | self, |
| 93 | prompt, |
| 94 | local_prompts=[], |
| 95 | masks=[], |
| 96 | mask_scales=[], |
| 97 | negative_prompt="", |
| 98 | cfg_scale=7.5, |
| 99 | clip_skip=1, |
| 100 | input_image=None, |
| 101 | ipadapter_images=None, |
| 102 | ipadapter_scale=1.0, |
| 103 | controlnet_image=None, |
| 104 | denoising_strength=1.0, |
| 105 | height=512, |
| 106 | width=512, |
| 107 | num_inference_steps=20, |
| 108 | tiled=False, |
| 109 | tile_size=64, |
| 110 | tile_stride=32, |
| 111 | seed=None, |
| 112 | progress_bar_cmd=tqdm, |
| 113 | progress_bar_st=None, |
| 114 | ): |
| 115 | height, width = self.check_resize_height_width(height, width) |
| 116 | |
| 117 | # Tiler parameters |
| 118 | tiler_kwargs = {"tiled": tiled, "tile_size": tile_size, "tile_stride": tile_stride} |
| 119 | |
| 120 | # Prepare scheduler |
| 121 | self.scheduler.set_timesteps(num_inference_steps, denoising_strength) |
| 122 | |
| 123 | # Prepare latent tensors |
| 124 | if input_image is not None: |
| 125 | self.load_models_to_device(['vae_encoder']) |
| 126 | image = self.preprocess_image(input_image).to(device=self.device, dtype=self.torch_dtype) |
| 127 | latents = self.encode_image(image, **tiler_kwargs) |
| 128 | noise = self.generate_noise((1, 4, height//8, width//8), seed=seed, device=self.device, dtype=self.torch_dtype) |
| 129 | latents = self.scheduler.add_noise(latents, noise, timestep=self.scheduler.timesteps[0]) |
| 130 | else: |
| 131 | latents = self.generate_noise((1, 4, height//8, width//8), seed=seed, device=self.device, dtype=self.torch_dtype) |
| 132 | |
| 133 | # Encode prompts |
| 134 | self.load_models_to_device(['text_encoder']) |
| 135 | prompt_emb_posi = self.encode_prompt(prompt, clip_skip=clip_skip, positive=True) |
| 136 | prompt_emb_nega = self.encode_prompt(negative_prompt, clip_skip=clip_skip, positive=False) |
| 137 | prompt_emb_locals = [self.encode_prompt(prompt_local, clip_skip=clip_skip, positive=True) for prompt_local in local_prompts] |
| 138 | |
| 139 | # IP-Adapter |
| 140 | if ipadapter_images is not None: |
| 141 | self.load_models_to_device(['ipadapter_image_encoder']) |
| 142 | ipadapter_image_encoding = self.ipadapter_image_encoder(ipadapter_images) |
| 143 | self.load_models_to_device(['ipadapter']) |
| 144 | ipadapter_kwargs_list_posi = {"ipadapter_kwargs_list": self.ipadapter(ipadapter_image_encoding, scale=ipadapter_scale)} |
| 145 | ipadapter_kwargs_list_nega = {"ipadapter_kwargs_list": self.ipadapter(torch.zeros_like(ipadapter_image_encoding))} |
| 146 | else: |
| 147 | ipadapter_kwargs_list_posi, ipadapter_kwargs_list_nega = {"ipadapter_kwargs_list": {}}, {"ipadapter_kwargs_list": {}} |
| 148 |
nothing calls this directly
no test coverage detected