diff --git a/ldm/simplet2i.py b/ldm/simplet2i.py index e7b7b524b0..c32f57c388 100644 --- a/ldm/simplet2i.py +++ b/ldm/simplet2i.py @@ -286,7 +286,7 @@ class T2I: 0.0 <= variation_amount <= 1.0 ), '-v --variation_amount must be in [0.0, 1.0]' - if len(with_variations) > 0: + if len(with_variations) > 0 or variation_amount > 1.0: assert seed is not None,\ 'seed must be specified when using with_variations' if variation_amount == 0.0: @@ -324,6 +324,7 @@ class T2I: self.model.encode_first_stage(init_image) ) # move to latent space + print(f' DEBUG: seed at make_image time ={seed}') make_image = self._img2img( prompt, steps=steps, @@ -346,35 +347,15 @@ class T2I: callback=step_callback, ) - def get_noise(): - if init_img: - if self.device.type == 'mps': - return torch.randn_like(init_latent, device='cpu').to(self.device) - else: - return torch.randn_like(init_latent, device=self.device) - else: - if self.device.type == 'mps': - return torch.randn([1, - self.latent_channels, - height // self.downsampling_factor, - width // self.downsampling_factor], - device='cpu').to(self.device) - else: - return torch.randn([1, - self.latent_channels, - height // self.downsampling_factor, - width // self.downsampling_factor], - device=self.device) - initial_noise = None if variation_amount > 0 or len(with_variations) > 0: # use fixed initial noise plus random noise per iteration seed_everything(seed) - initial_noise = get_noise() + initial_noise = self._get_noise(init_img,width,height) for v_seed, v_weight in with_variations: seed = v_seed seed_everything(seed) - next_noise = get_noise() + next_noise = self._get_noise(init_img,width,height) initial_noise = self.slerp(v_weight, initial_noise, next_noise) if variation_amount > 0: random.seed() # reset RNG to an actually random state, so we can get a random seed for variations @@ -386,7 +367,7 @@ class T2I: x_T = None if variation_amount > 0: seed_everything(seed) - target_noise = get_noise() + target_noise = self._get_noise(init_img,width,height) x_T = self.slerp(variation_amount, initial_noise, target_noise) elif initial_noise is not None: # i.e. we specified particular variations @@ -394,8 +375,9 @@ class T2I: else: seed_everything(seed) if self.device.type == 'mps': - x_T = get_noise() + x_T = self._get_noise(init_img,width,height) # make_image will do the equivalent of get_noise itself + print(f' DEBUG: seed at make_image() invocation time ={seed}') image = make_image(x_T) results.append([image, seed]) if image_callback is not None: @@ -623,6 +605,27 @@ class T2I: return self.model + # returns a tensor filled with random numbers from a normal distribution + def _get_noise(self,init_img,width,height): + if init_img: + if self.device.type == 'mps': + return torch.randn_like(init_latent, device='cpu').to(self.device) + else: + return torch.randn_like(init_latent, device=self.device) + else: + if self.device.type == 'mps': + return torch.randn([1, + self.latent_channels, + height // self.downsampling_factor, + width // self.downsampling_factor], + device='cpu').to(self.device) + else: + return torch.randn([1, + self.latent_channels, + height // self.downsampling_factor, + width // self.downsampling_factor], + device=self.device) + def _set_sampler(self): msg = f'>> Setting Sampler to {self.sampler_name}' if self.sampler_name == 'plms':