Update !1-custom-hires-fix-mod-for-automatic1111-2.9.5/scripts/!!custom_hires_fix.py
Browse files
!1-custom-hires-fix-mod-for-automatic1111-2.9.5/scripts/!!custom_hires_fix.py
CHANGED
|
@@ -2376,17 +2376,22 @@ class CustomHiresFix(scripts.Script):
|
|
| 2376 |
"""
|
| 2377 |
Вешает временный колбэк на on_cfg_denoiser и снимает его по выходу из контекста.
|
| 2378 |
На/после limit_steps:
|
| 2379 |
-
- выставляет shared.state.
|
| 2380 |
- кидает sd_samplers_common.InterruptedException() (жёстко, как Anti-Burn)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2381 |
"""
|
| 2382 |
cb_ref = None
|
| 2383 |
limit_steps = int(max(1, limit_steps))
|
| 2384 |
|
| 2385 |
-
# Save
|
|
|
|
| 2386 |
try:
|
| 2387 |
-
|
| 2388 |
except Exception:
|
| 2389 |
-
|
| 2390 |
|
| 2391 |
try:
|
| 2392 |
def _cb(params):
|
|
@@ -2397,7 +2402,7 @@ class CustomHiresFix(scripts.Script):
|
|
| 2397 |
# params.sampling_step обычно 0-based → останавливаем на «человеческом» шаге
|
| 2398 |
if (int(step) + 1) >= limit_steps:
|
| 2399 |
try:
|
| 2400 |
-
shared.state.
|
| 2401 |
except Exception:
|
| 2402 |
pass
|
| 2403 |
# жёсткий способ, как в Anti-Burn:
|
|
@@ -2434,9 +2439,9 @@ class CustomHiresFix(scripts.Script):
|
|
| 2434 |
pass
|
| 2435 |
except Exception as e:
|
| 2436 |
logger.warning(f"stop-hook remove warning: {e}")
|
| 2437 |
-
# Restore
|
| 2438 |
try:
|
| 2439 |
-
shared.state.
|
| 2440 |
except Exception:
|
| 2441 |
pass
|
| 2442 |
|
|
@@ -2510,11 +2515,15 @@ class CustomHiresFix(scripts.Script):
|
|
| 2510 |
sample = F.interpolate(sample, size=(sh, sw), mode="bicubic", align_corners=False, antialias=True)
|
| 2511 |
sample = F.interpolate(sample, size=(h, w), mode="bicubic", align_corners=False, antialias=True)
|
| 2512 |
except TypeError:
|
| 2513 |
-
|
| 2514 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2515 |
|
| 2516 |
first_latent = float(self.config.get("first_latent", 0.3))
|
| 2517 |
-
if 0.0 <= first_latent <= 1.0:
|
| 2518 |
invert = bool(self.config.get("first_latent_invert", False)) # NEW
|
| 2519 |
if invert:
|
| 2520 |
# Новая семантика: слайдер = вес исходного латента, как на 2-м проходе
|
|
|
|
| 2376 |
"""
|
| 2377 |
Вешает временный колбэк на on_cfg_denoiser и снимает его по выходу из контекста.
|
| 2378 |
На/после limit_steps:
|
| 2379 |
+
- выставляет shared.state.interrupted = True (мягко)
|
| 2380 |
- кидает sd_samplers_common.InterruptedException() (жёстко, как Anti-Burn)
|
| 2381 |
+
|
| 2382 |
+
ВАЖНО: используем shared.state.interrupted (bool-флаг), а НЕ
|
| 2383 |
+
shared.state.interrupt (это метод в A1111). Перезапись метода булем
|
| 2384 |
+
ломает кнопку Interrupt в UI с TypeError: 'bool' object is not callable.
|
| 2385 |
"""
|
| 2386 |
cb_ref = None
|
| 2387 |
limit_steps = int(max(1, limit_steps))
|
| 2388 |
|
| 2389 |
+
# Save interrupted flag so we can reliably restore it even if we set it ourselves.
|
| 2390 |
+
# NB: getattr with bool default — interrupt is a method, interrupted is the flag.
|
| 2391 |
try:
|
| 2392 |
+
prev_interrupted = bool(getattr(shared.state, "interrupted", False))
|
| 2393 |
except Exception:
|
| 2394 |
+
prev_interrupted = False
|
| 2395 |
|
| 2396 |
try:
|
| 2397 |
def _cb(params):
|
|
|
|
| 2402 |
# params.sampling_step обычно 0-based → останавливаем на «человеческом» шаге
|
| 2403 |
if (int(step) + 1) >= limit_steps:
|
| 2404 |
try:
|
| 2405 |
+
shared.state.interrupted = True # мягкий флаг
|
| 2406 |
except Exception:
|
| 2407 |
pass
|
| 2408 |
# жёсткий способ, как в Anti-Burn:
|
|
|
|
| 2439 |
pass
|
| 2440 |
except Exception as e:
|
| 2441 |
logger.warning(f"stop-hook remove warning: {e}")
|
| 2442 |
+
# Restore interrupted flag to avoid leaking into subsequent generations
|
| 2443 |
try:
|
| 2444 |
+
shared.state.interrupted = prev_interrupted
|
| 2445 |
except Exception:
|
| 2446 |
pass
|
| 2447 |
|
|
|
|
| 2515 |
sample = F.interpolate(sample, size=(sh, sw), mode="bicubic", align_corners=False, antialias=True)
|
| 2516 |
sample = F.interpolate(sample, size=(h, w), mode="bicubic", align_corners=False, antialias=True)
|
| 2517 |
except TypeError:
|
| 2518 |
+
_s1 = self._interp(sample, size=(sh, sw), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
|
| 2519 |
+
if _s1 is not None:
|
| 2520 |
+
sample = _s1
|
| 2521 |
+
_s2 = self._interp(sample, size=(h, w), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
|
| 2522 |
+
if _s2 is not None:
|
| 2523 |
+
sample = _s2
|
| 2524 |
|
| 2525 |
first_latent = float(self.config.get("first_latent", 0.3))
|
| 2526 |
+
if x_latent is not None and 0.0 <= first_latent <= 1.0:
|
| 2527 |
invert = bool(self.config.get("first_latent_invert", False)) # NEW
|
| 2528 |
if invert:
|
| 2529 |
# Новая семантика: слайдер = вес исходного латента, как на 2-м проходе
|