# Documentation - Class name: WAS_VAEEncodeForInpaint - Category: latent/inpaint - Output node: False - Repo Ref: https://github.com/WASasquatch/WAS_Extras WAS_VAEEncodeForInpaint节点旨在将图像像素编码为适合图像修复任务的潜在空间表示。它利用预训练的VAE(变分自编码器)实现这种转换,同时还考虑了一个定义图像修复区域的掩码。该节点的功能集中在为VAE准备输入数据并生成可用于后续修复过程的潜在表示上。 # Input types ## Required - pixels - ‘pixels’参数是节点处理的原始图像数据。它对编码过程至关重要,因为它是VAE的输入。图像数据的质量和分辨率直接影响生成的潜在表示,进而影响修复结果。 - Comfy dtype: IMAGE - Python dtype: torch.Tensor - vae - ‘vae’参数代表节点使用的预训练变分自编码器模型,用于将图像数据编码到潜在空间。VAE模型的选择对编码过程和潜在表示的质量有显著影响。 - Comfy dtype: VAE - Python dtype: torch.nn.Module - mask - ‘mask’参数是一个二进制掩码,用于标识图像中需要修复的区域。它对于指导编码过程专注于图像的相关部分至关重要。 - Comfy dtype: MASK - Python dtype: torch.Tensor ## Optional - mask_offset - ‘mask_offset’参数允许修改掩码的边界,这对于控制修复的范围很有用。正值扩展掩码,而负值收缩掩码。这个参数间接影响VAE在编码时考虑的区域。 - Comfy dtype: INT - Python dtype: int # Output types - samples - ‘samples’输出代表输入图像的编码潜在空间表示。它是编码过程的核心结果,并将作为后续修复任务的输入。这种潜在表示捕获了图像的本质特征,剔除了不必要的细节,并针对修复区域的重建进行了优化。 - Comfy dtype: LATENT - Python dtype: torch.Tensor - noise_mask - ‘noise_mask’输出是一个二进制掩码,指示了图像中针对修复的区域。它由原始掩码衍生而来,用于确保修复过程仅专注于指定区域。这个掩码对于指导生成修复内容至关重要。 - Comfy dtype: LATENT - Python dtype: torch.Tensor # Usage tips - Infra type: GPU # Source code ``` class WAS_VAEEncodeForInpaint: @classmethod def INPUT_TYPES(s): return {'required': {'pixels': ('IMAGE',), 'vae': ('VAE',), 'mask': ('MASK',), 'mask_offset': ('INT', {'default': 6, 'min': -128, 'max': 128, 'step': 1})}} RETURN_TYPES = ('LATENT',) FUNCTION = 'encode' CATEGORY = 'latent/inpaint' def encode(self, vae, pixels, mask, mask_offset=6): x = pixels.shape[1] // 8 * 8 y = pixels.shape[2] // 8 * 8 mask = torch.nn.functional.interpolate(mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])), size=(pixels.shape[1], pixels.shape[2]), mode='bilinear') pixels = pixels.clone() if pixels.shape[1] != x or pixels.shape[2] != y: x_offset = pixels.shape[1] % 8 // 2 y_offset = pixels.shape[2] % 8 // 2 pixels = pixels[:, x_offset:x + x_offset, y_offset:y + y_offset, :] mask = mask[:, :, x_offset:x + x_offset, y_offset:y + y_offset] mask_erosion = self.modify_mask(mask, mask_offset) m = (1.0 - mask_erosion.round()).squeeze(1) for i in range(3): pixels[:, :, :, i] -= 0.5 pixels[:, :, :, i] *= m pixels[:, :, :, i] += 0.5 t = vae.encode(pixels) return ({'samples': t, 'noise_mask': mask_erosion[:, :, :x, :y].round()},) def modify_mask(self, mask, modify_by): if modify_by == 0: return mask if modify_by > 0: kernel_size = 2 * modify_by + 1 kernel_tensor = torch.ones((1, 1, kernel_size, kernel_size)) padding = modify_by modified_mask = torch.clamp(torch.nn.functional.conv2d(mask.round(), kernel_tensor, padding=padding), 0, 1) else: kernel_size = 2 * abs(modify_by) + 1 kernel_tensor = torch.ones((1, 1, kernel_size, kernel_size)) padding = abs(modify_by) eroded_mask = torch.nn.functional.conv2d(1 - mask.round(), kernel_tensor, padding=padding) modified_mask = torch.clamp(1 - eroded_mask, 0, 1) return modified_mask ```