|
14 | 14 | from textwrap import wrap
|
15 | 15 |
|
16 | 16 | import html
|
| 17 | +import latent_preview |
17 | 18 | import requests
|
18 | 19 | import numpy as np
|
19 | 20 | from PIL import Image, ImageOps, ImageDraw, ImageFilter, ImageChops, ImageFont
|
|
41 | 42 | from nodes import LoraLoader, ConditioningAverage, common_ksampler, ImageScale, ImageScaleBy, VAEEncode, VAEDecode
|
42 | 43 | import comfy.utils
|
43 | 44 | from comfy_extras.chainner_models import model_loading
|
| 45 | +from comfy_extras.nodes_custom_sampler import Noise_EmptyNoise, Noise_RandomNoise |
44 | 46 | from comfy import model_management, model_base
|
45 | 47 |
|
46 | 48 | def calculate_file_hash(file_path):
|
@@ -3264,6 +3266,66 @@ def sample(self, seed, base_model, samples, positive, negative,
|
3264 | 3266 | latent["samples"] = stitch_latent_tensors(latent_samples.shape, resampled_tiles)
|
3265 | 3267 | return (latent,)
|
3266 | 3268 |
|
| 3269 | +class MikeyLatentTileSamplerCustom: |
| 3270 | + @classmethod |
| 3271 | + def INPUT_TYPES(s): |
| 3272 | + return {"required": |
| 3273 | + {"model": ("MODEL",), |
| 3274 | + "add_noise": ("BOOLEAN", {"default": True}), |
| 3275 | + "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), |
| 3276 | + "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0, "step":0.1, "round": 0.01}), |
| 3277 | + "positive": ("CONDITIONING", ), |
| 3278 | + "negative": ("CONDITIONING", ), |
| 3279 | + "sampler": ("SAMPLER", ), |
| 3280 | + "sigmas": ("SIGMAS", ), |
| 3281 | + "latent_image": ("LATENT", ), |
| 3282 | + "tile_size": ("INT", {"default": 1024, "min": 256, "max": 4096, "step": 64}), |
| 3283 | + } |
| 3284 | + } |
| 3285 | + |
| 3286 | + RETURN_TYPES = ("LATENT", ) |
| 3287 | + RETURN_NAMES = ("samples", ) |
| 3288 | + FUNCTION = "tile_sample" |
| 3289 | + CATEGORY = "Mikey/Sampling" |
| 3290 | + |
| 3291 | + def sample(self, model, add_noise, noise_seed, cfg, positive, negative, sampler, sigmas, latent_image): |
| 3292 | + latent = latent_image |
| 3293 | + latent_image = latent["samples"] |
| 3294 | + if not add_noise: |
| 3295 | + noise = Noise_EmptyNoise().generate_noise(latent) |
| 3296 | + else: |
| 3297 | + noise = Noise_RandomNoise(noise_seed).generate_noise(latent) |
| 3298 | + |
| 3299 | + noise_mask = None |
| 3300 | + if "noise_mask" in latent: |
| 3301 | + noise_mask = latent["noise_mask"] |
| 3302 | + |
| 3303 | + x0_output = {} |
| 3304 | + callback = latent_preview.prepare_callback(model, sigmas.shape[-1] - 1, x0_output) |
| 3305 | + |
| 3306 | + disable_pbar = not comfy.utils.PROGRESS_BAR_ENABLED |
| 3307 | + samples = comfy.sample.sample_custom(model, noise, cfg, sampler, sigmas, positive, negative, latent_image, noise_mask=noise_mask, callback=callback, disable_pbar=disable_pbar, seed=noise_seed) |
| 3308 | + |
| 3309 | + out = latent.copy() |
| 3310 | + out["samples"] = samples |
| 3311 | + if "x0" in x0_output: |
| 3312 | + out_denoised = latent.copy() |
| 3313 | + out_denoised["samples"] = model.model.process_latent_out(x0_output["x0"].cpu()) |
| 3314 | + else: |
| 3315 | + out_denoised = out |
| 3316 | + return out_denoised |
| 3317 | + |
| 3318 | + def tile_sample(self, model, add_noise, noise_seed, cfg, positive, negative, sampler, sigmas, latent_image, tile_size): |
| 3319 | + latent = latent_image.copy() |
| 3320 | + # split image into tiles |
| 3321 | + latent_samples = latent["samples"] |
| 3322 | + tiles = split_latent_tensor(latent_samples, tile_size) |
| 3323 | + # resample each tile using self.sample |
| 3324 | + resampled_tiles = [(coords, self.sample(model, add_noise, noise_seed, cfg, positive, negative, sampler, sigmas, {"samples": tile})["samples"]) for coords, tile in tiles] |
| 3325 | + # stitch the tiles to get the final upscaled latent tensor |
| 3326 | + latent["samples"] = stitch_latent_tensors(latent_samples.shape, resampled_tiles) |
| 3327 | + return (latent, ) |
| 3328 | + |
3267 | 3329 | class FaceFixerOpenCV:
|
3268 | 3330 | @classmethod
|
3269 | 3331 | def INPUT_TYPES(s):
|
@@ -5073,6 +5135,7 @@ def get_subdirectories(self, directory):
|
5073 | 5135 | 'Mikey Sampler Tiled': MikeySamplerTiled,
|
5074 | 5136 | 'Mikey Sampler Tiled Base Only': MikeySamplerTiledBaseOnly,
|
5075 | 5137 | 'MikeyLatentTileSampler': MikeyLatentTileSampler,
|
| 5138 | + 'MikeyLatentTileSamplerCustom': MikeyLatentTileSamplerCustom, |
5076 | 5139 | 'FaceFixerOpenCV': FaceFixerOpenCV,
|
5077 | 5140 | 'AddMetaData': AddMetaData,
|
5078 | 5141 | 'SaveMetaData': SaveMetaData,
|
@@ -5141,6 +5204,7 @@ def get_subdirectories(self, directory):
|
5141 | 5204 | 'MikeySamplerTiledAdvancedBaseOnly': 'Mikey Sampler Tiled Advanced Base Only',
|
5142 | 5205 | 'Mikey Sampler Tiled Base Only': 'Mikey Sampler Tiled Base Only',
|
5143 | 5206 | 'MikeyLatentTileSampler': 'Latent Tile Sampler (Mikey)',
|
| 5207 | + 'MikeyLatentTileSamplerCustom': 'Latent Tile Sampler Custom (Mikey)', |
5144 | 5208 | 'FaceFixerOpenCV': 'Face Fixer OpenCV (Mikey)',
|
5145 | 5209 | 'AddMetaData': 'AddMetaData (Mikey)',
|
5146 | 5210 | 'SaveMetaData': 'SaveMetaData (Mikey)',
|
|
0 commit comments