diff --git a/CHANGELOG.md b/CHANGELOG.md index 6650290b6..71749b1ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log for SD.Next +## Update for 2023-12-05 + +- **General** + - **Extra networks** new settting -> extra networks -> build info on first access + indexes all networks on first access instead of server startup + - disable google fonts check on server startup + - fix torchvision/basicsr compatibility + ## Update for 2023-12-04 What's new? Native video in SD.Next via both **AnimateDiff** and **Stable-Video-Diffusion** - and including native MP4 encoding and smooth video outputs out-of-the-box, not just animated-GIFs. diff --git a/html/locale_en.json b/html/locale_en.json index 27d4beaa7..82383808f 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -484,8 +484,8 @@ {"id":"","label":"Dark","localized":"","hint":""}, {"id":"","label":"Light","localized":"","hint":""}, {"id":"","label":"Show grid in results","localized":"","hint":""}, - {"id":"","label":"For inpainting, include the greyscale mask in results","localized":"","hint":""}, - {"id":"","label":"For inpainting, include masked composite in results","localized":"","hint":""}, + {"id":"","label":"Inpainting include greyscale mask in results","localized":"","hint":""}, + {"id":"","label":"Inpainting include masked composite in results","localized":"","hint":""}, {"id":"","label":"Do not change selected model when reading generation parameters","localized":"","hint":""}, {"id":"","label":"Send seed when sending prompt or image to other interface","localized":"","hint":""}, {"id":"","label":"Send size when sending prompt or image to another interface","localized":"","hint":""}, diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 216673ede..075b10f80 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -90,14 +90,23 @@ function readCardDescription(page, item) { }); } -async function filterExtraNetworksForTab(tabname, searchTerm) { +function getCardsForActivePage() { + const pagename = getENActivePage(); + if (!pagename) return []; + const allCards = Array.from(gradioApp().querySelectorAll('.extra-network-cards > .card')); + const cards = allCards.filter((el) => el.dataset.page.toLowerCase().includes(pagename.toLowerCase())); + log('getCardsForActivePage', pagename, cards.length); + return allCards; +} + +async function filterExtraNetworksForTab(searchTerm) { let found = 0; let items = 0; const t0 = performance.now(); const pagename = getENActivePage(); if (!pagename) return; const allPages = Array.from(gradioApp().querySelectorAll('.extra-network-cards')); - const pages = allPages.filter((el) => el.id.includes(pagename.toLowerCase())); + const pages = allPages.filter((el) => el.id.toLowerCase().includes(pagename.toLowerCase())); for (const pg of pages) { const cards = Array.from(pg.querySelectorAll('.card') || []); cards.forEach((elem) => { @@ -158,7 +167,7 @@ function sortExtraNetworks() { const pagename = getENActivePage(); if (!pagename) return 'sort error: unknown page'; const allPages = Array.from(gradioApp().querySelectorAll('.extra-network-cards')); - const pages = allPages.filter((el) => el.id.includes(pagename.toLowerCase())); + const pages = allPages.filter((el) => el.id.toLowerCase().includes(pagename.toLowerCase())); let num = 0; for (const pg of pages) { const cards = Array.from(pg.querySelectorAll('.card') || []); @@ -255,8 +264,17 @@ function refeshDetailsEN(args) { return args; } -// init +// refresh on en show +function refreshENpage() { + if (getCardsForActivePage().length === 0) { + log('refreshENpage'); + const tabname = getENActiveTab(); + const btnRefresh = gradioApp().getElementById(`${tabname}_extra_refresh`); + if (btnRefresh) btnRefresh.click(); + } +} +// init function setupExtraNetworksForTab(tabname) { gradioApp().querySelector(`#${tabname}_extra_tabs`).classList.add('extra-networks'); const en = gradioApp().getElementById(`${tabname}_extra_networks`); @@ -307,7 +325,7 @@ function setupExtraNetworksForTab(tabname) { txtSearchValue.addEventListener('input', (evt) => { if (searchTimer) clearTimeout(searchTimer); searchTimer = setTimeout(() => { - filterExtraNetworksForTab(tabname, txtSearchValue.value.toLowerCase()); + filterExtraNetworksForTab(txtSearchValue.value.toLowerCase()); searchTimer = null; }, 150); }); @@ -339,6 +357,7 @@ function setupExtraNetworksForTab(tabname) { el.parentElement.style.width = '-webkit-fill-available'; } if (entries[0].intersectionRatio > 0) { + refreshENpage(); if (window.opts.extra_networks_card_cover === 'cover') { en.style.transition = ''; en.style.zIndex = 100; diff --git a/modules/extensions.py b/modules/extensions.py index 4e37e4611..3ad20acec 100644 --- a/modules/extensions.py +++ b/modules/extensions.py @@ -153,3 +153,4 @@ def list_extensions(): for dirname, path, is_builtin in extension_paths: extension = Extension(name=dirname, path=path, enabled=dirname not in disabled_extensions, is_builtin=is_builtin) extensions.append(extension) + shared.log.info(f'Disabled extensions: {[e.name for e in extensions if not e.enabled]}') diff --git a/modules/loader.py b/modules/loader.py index 8b06f09ac..bb6b120a1 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -1,5 +1,6 @@ from __future__ import annotations import re +import sys import logging import warnings import urllib3 @@ -55,3 +56,12 @@ try: errors.log.debug(f'Detected: cores={cores} affinity={affinity} set threads={threads}') except Exception: pass + +try: # fix changed import in torchvision 0.17+, which breaks basicsr + import torchvision.transforms.functional_tensor # pylint: disable=unused-import, ungrouped-imports +except ImportError: + try: + import torchvision.transforms.functional as functional + sys.modules["torchvision.transforms.functional_tensor"] = functional + except ImportError: + pass # shrug... diff --git a/modules/sd_models.py b/modules/sd_models.py index 0956353ce..e123a64b2 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -806,7 +806,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No sd_model = None try: - if shared.cmd_opts.ckpt is not None and model_data.initial: # initial load + if shared.cmd_opts.ckpt is not None and os.path.isdir(shared.cmd_opts.ckpt) and model_data.initial: # initial load ckpt_basename = os.path.basename(shared.cmd_opts.ckpt) model_name = modelloader.find_diffuser(ckpt_basename) if model_name is not None: @@ -833,6 +833,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No if vae is not None: diffusers_load_config["vae"] = vae + shared.log.debug(f'Diffusers loading: path="{checkpoint_info.path}"') if os.path.isdir(checkpoint_info.path): err1 = None err2 = None diff --git a/modules/shared.py b/modules/shared.py index 7c2bea684..2808f7f2a 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -166,17 +166,14 @@ def temp_disable_extensions(): for ext in disable_safe: if ext not in opts.disabled_extensions: disabled.append(ext) - log.info(f'Safe mode disabling extensions: {disabled}') if backend == Backend.DIFFUSERS: for ext in disable_diffusers: if ext not in opts.disabled_extensions: disabled.append(ext) - log.info(f'Disabling uncompatible extensions: backend={backend} {disabled}') if backend == Backend.ORIGINAL: for ext in disable_original: if ext not in opts.disabled_extensions: disabled.append(ext) - log.info(f'Disabling uncompatible extensions: backend={backend} {disabled}') cmd_opts.controlnet_loglevel = 'WARNING' return disabled @@ -469,8 +466,8 @@ options_templates.update(options_section(('ui', "User Interface"), { "gallery_height": OptionInfo("", "Gallery height", gr.Textbox), "compact_view": OptionInfo(False, "Compact view"), "return_grid": OptionInfo(True, "Show grid in results"), - "return_mask": OptionInfo(False, "For inpainting, include the greyscale mask in results"), - "return_mask_composite": OptionInfo(False, "For inpainting, include masked composite in results"), + "return_mask": OptionInfo(False, "Inpainting include greyscale mask in results"), + "return_mask_composite": OptionInfo(False, "Inpainting include masked composite in results"), "disable_weights_auto_swap": OptionInfo(True, "Do not change selected model when reading generation parameters"), "send_seed": OptionInfo(True, "Send seed when sending prompt or image to other interface"), "send_size": OptionInfo(True, "Send size when sending prompt or image to another interface"), @@ -601,18 +598,15 @@ options_templates.update(options_section(('extra_networks', "Extra Networks"), { "extra_networks_card_size": OptionInfo(160, "UI card size (px)", gr.Slider, {"minimum": 20, "maximum": 2000, "step": 1}), "extra_networks_card_square": OptionInfo(True, "UI disable variable aspect ratio"), "extra_networks_card_fit": OptionInfo("cover", "UI image contain method", gr.Radio, {"choices": ["contain", "cover", "fill"], "visible": False}), - "extra_networks_sep2": OptionInfo("