mirror of
https://github.com/kohya-ss/sd-scripts.git
synced 2026-04-08 22:35:09 +00:00
Merge branch 'dev' into dev_device_support
This commit is contained in:
451
sdxl_gen_img.py
451
sdxl_gen_img.py
@@ -54,9 +54,12 @@ from networks.lora import LoRANetwork
|
||||
from library.sdxl_original_unet import InferSdxlUNet2DConditionModel
|
||||
from library.original_unet import FlashAttentionFunction
|
||||
from networks.control_net_lllite import ControlNetLLLite
|
||||
from library.utils import setup_logging
|
||||
from library.utils import GradualLatent, EulerAncestralDiscreteSchedulerGL
|
||||
from library.utils import setup_logging, add_logging_arguments
|
||||
|
||||
setup_logging()
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# scheduler:
|
||||
@@ -343,6 +346,8 @@ class PipelineLike:
|
||||
self.control_nets: List[ControlNetLLLite] = []
|
||||
self.control_net_enabled = True # control_netsが空ならTrueでもFalseでもControlNetは動作しない
|
||||
|
||||
self.gradual_latent: GradualLatent = None
|
||||
|
||||
# Textual Inversion
|
||||
def add_token_replacement(self, text_encoder_index, target_token_id, rep_token_ids):
|
||||
self.token_replacements_list[text_encoder_index][target_token_id] = rep_token_ids
|
||||
@@ -373,6 +378,14 @@ class PipelineLike:
|
||||
def set_control_nets(self, ctrl_nets):
|
||||
self.control_nets = ctrl_nets
|
||||
|
||||
def set_gradual_latent(self, gradual_latent):
|
||||
if gradual_latent is None:
|
||||
print("gradual_latent is disabled")
|
||||
self.gradual_latent = None
|
||||
else:
|
||||
print(f"gradual_latent is enabled: {gradual_latent}")
|
||||
self.gradual_latent = gradual_latent # (ds_ratio, start_timesteps, every_n_steps, ratio_step)
|
||||
|
||||
@torch.no_grad()
|
||||
def __call__(
|
||||
self,
|
||||
@@ -706,7 +719,116 @@ class PipelineLike:
|
||||
control_net.set_cond_image(None)
|
||||
|
||||
each_control_net_enabled = [self.control_net_enabled] * len(self.control_nets)
|
||||
|
||||
# # first, we downscale the latents to the half of the size
|
||||
# # 最初に1/2に縮小する
|
||||
# height, width = latents.shape[-2:]
|
||||
# # latents = torch.nn.functional.interpolate(latents.float(), scale_factor=0.5, mode="bicubic", align_corners=False).to(
|
||||
# # latents.dtype
|
||||
# # )
|
||||
# latents = latents[:, :, ::2, ::2]
|
||||
# current_scale = 0.5
|
||||
|
||||
# # how much to increase the scale at each step: .125 seems to work well (because it's 1/8?)
|
||||
# # 各ステップに拡大率をどのくらい増やすか:.125がよさそう(たぶん1/8なので)
|
||||
# scale_step = 0.125
|
||||
|
||||
# # timesteps at which to start increasing the scale: 1000 seems to be enough
|
||||
# # 拡大を開始するtimesteps: 1000で十分そうである
|
||||
# start_timesteps = 1000
|
||||
|
||||
# # how many steps to wait before increasing the scale again
|
||||
# # small values leads to blurry images (because the latents are blurry after the upscale, so some denoising might be needed)
|
||||
# # large values leads to flat images
|
||||
|
||||
# # 何ステップごとに拡大するか
|
||||
# # 小さいとボケる(拡大後のlatentsはボケた感じになるので、そこから数stepのdenoiseが必要と思われる)
|
||||
# # 大きすぎると細部が書き込まれずのっぺりした感じになる
|
||||
# every_n_steps = 5
|
||||
|
||||
# scale_step = input("scale step:")
|
||||
# scale_step = float(scale_step)
|
||||
# start_timesteps = input("start timesteps:")
|
||||
# start_timesteps = int(start_timesteps)
|
||||
# every_n_steps = input("every n steps:")
|
||||
# every_n_steps = int(every_n_steps)
|
||||
|
||||
# # for i, t in enumerate(tqdm(timesteps)):
|
||||
# i = 0
|
||||
# last_step = 0
|
||||
# while i < len(timesteps):
|
||||
# t = timesteps[i]
|
||||
# print(f"[{i}] t={t}")
|
||||
|
||||
# print(i, t, current_scale, latents.shape)
|
||||
# if t < start_timesteps and current_scale < 1.0 and i % every_n_steps == 0:
|
||||
# if i == last_step:
|
||||
# pass
|
||||
# else:
|
||||
# print("upscale")
|
||||
# current_scale = min(current_scale + scale_step, 1.0)
|
||||
|
||||
# h = int(height * current_scale) // 8 * 8
|
||||
# w = int(width * current_scale) // 8 * 8
|
||||
|
||||
# latents = torch.nn.functional.interpolate(latents.float(), size=(h, w), mode="bicubic", align_corners=False).to(
|
||||
# latents.dtype
|
||||
# )
|
||||
# last_step = i
|
||||
# i = max(0, i - every_n_steps + 1)
|
||||
|
||||
# diff = timesteps[i] - timesteps[last_step]
|
||||
# # resized_init_noise = torch.nn.functional.interpolate(
|
||||
# # init_noise.float(), size=(h, w), mode="bicubic", align_corners=False
|
||||
# # ).to(latents.dtype)
|
||||
# # latents = self.scheduler.add_noise(latents, resized_init_noise, diff)
|
||||
# latents = self.scheduler.add_noise(latents, torch.randn_like(latents), diff * 4)
|
||||
# # latents += torch.randn_like(latents) / 100 * diff
|
||||
# continue
|
||||
|
||||
enable_gradual_latent = False
|
||||
if self.gradual_latent:
|
||||
if not hasattr(self.scheduler, "set_gradual_latent_params"):
|
||||
print("gradual_latent is not supported for this scheduler. Ignoring.")
|
||||
print(self.scheduler.__class__.__name__)
|
||||
else:
|
||||
enable_gradual_latent = True
|
||||
step_elapsed = 1000
|
||||
current_ratio = self.gradual_latent.ratio
|
||||
|
||||
# first, we downscale the latents to the specified ratio / 最初に指定された比率にlatentsをダウンスケールする
|
||||
height, width = latents.shape[-2:]
|
||||
org_dtype = latents.dtype
|
||||
if org_dtype == torch.bfloat16:
|
||||
latents = latents.float()
|
||||
latents = torch.nn.functional.interpolate(
|
||||
latents, scale_factor=current_ratio, mode="bicubic", align_corners=False
|
||||
).to(org_dtype)
|
||||
|
||||
# apply unsharp mask / アンシャープマスクを適用する
|
||||
if self.gradual_latent.gaussian_blur_ksize:
|
||||
latents = self.gradual_latent.apply_unshark_mask(latents)
|
||||
|
||||
for i, t in enumerate(tqdm(timesteps)):
|
||||
resized_size = None
|
||||
if enable_gradual_latent:
|
||||
# gradually upscale the latents / latentsを徐々にアップスケールする
|
||||
if (
|
||||
t < self.gradual_latent.start_timesteps
|
||||
and current_ratio < 1.0
|
||||
and step_elapsed >= self.gradual_latent.every_n_steps
|
||||
):
|
||||
current_ratio = min(current_ratio + self.gradual_latent.ratio_step, 1.0)
|
||||
# make divisible by 8 because size of latents must be divisible at bottom of UNet
|
||||
h = int(height * current_ratio) // 8 * 8
|
||||
w = int(width * current_ratio) // 8 * 8
|
||||
resized_size = (h, w)
|
||||
self.scheduler.set_gradual_latent_params(resized_size, self.gradual_latent)
|
||||
step_elapsed = 0
|
||||
else:
|
||||
self.scheduler.set_gradual_latent_params(None, None)
|
||||
step_elapsed += 1
|
||||
|
||||
# expand the latents if we are doing classifier free guidance
|
||||
latent_model_input = latents.repeat((num_latent_input, 1, 1, 1))
|
||||
latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
|
||||
@@ -775,6 +897,8 @@ class PipelineLike:
|
||||
if is_cancelled_callback is not None and is_cancelled_callback():
|
||||
return None
|
||||
|
||||
i += 1
|
||||
|
||||
if return_latents:
|
||||
return latents
|
||||
|
||||
@@ -1306,7 +1430,6 @@ def handle_dynamic_prompt_variants(prompt, repeat_count):
|
||||
|
||||
# endregion
|
||||
|
||||
|
||||
# def load_clip_l14_336(dtype):
|
||||
# logger.info(f"loading CLIP: {CLIP_ID_L14_336}")
|
||||
# text_encoder = CLIPTextModel.from_pretrained(CLIP_ID_L14_336, torch_dtype=dtype)
|
||||
@@ -1323,6 +1446,7 @@ class BatchDataBase(NamedTuple):
|
||||
mask_image: Any
|
||||
clip_prompt: str
|
||||
guide_image: Any
|
||||
raw_prompt: str
|
||||
|
||||
|
||||
class BatchDataExt(NamedTuple):
|
||||
@@ -1406,7 +1530,7 @@ def main(args):
|
||||
scheduler_module = diffusers.schedulers.scheduling_euler_discrete
|
||||
has_clip_sample = False
|
||||
elif args.sampler == "euler_a" or args.sampler == "k_euler_a":
|
||||
scheduler_cls = EulerAncestralDiscreteScheduler
|
||||
scheduler_cls = EulerAncestralDiscreteSchedulerGL
|
||||
scheduler_module = diffusers.schedulers.scheduling_euler_ancestral_discrete
|
||||
has_clip_sample = False
|
||||
elif args.sampler == "dpmsolver" or args.sampler == "dpmsolver++":
|
||||
@@ -1703,6 +1827,29 @@ def main(args):
|
||||
if args.ds_depth_1 is not None:
|
||||
unet.set_deep_shrink(args.ds_depth_1, args.ds_timesteps_1, args.ds_depth_2, args.ds_timesteps_2, args.ds_ratio)
|
||||
|
||||
# Gradual Latent
|
||||
if args.gradual_latent_timesteps is not None:
|
||||
if args.gradual_latent_unsharp_params:
|
||||
us_params = args.gradual_latent_unsharp_params.split(",")
|
||||
us_ksize, us_sigma, us_strength = [float(v) for v in us_params[:3]]
|
||||
us_target_x = True if len(us_params) <= 3 else bool(int(us_params[3]))
|
||||
us_ksize = int(us_ksize)
|
||||
else:
|
||||
us_ksize, us_sigma, us_strength, us_target_x = None, None, None, None
|
||||
|
||||
gradual_latent = GradualLatent(
|
||||
args.gradual_latent_ratio,
|
||||
args.gradual_latent_timesteps,
|
||||
args.gradual_latent_every_n_steps,
|
||||
args.gradual_latent_ratio_step,
|
||||
args.gradual_latent_s_noise,
|
||||
us_ksize,
|
||||
us_sigma,
|
||||
us_strength,
|
||||
us_target_x,
|
||||
)
|
||||
pipe.set_gradual_latent(gradual_latent)
|
||||
|
||||
# Textual Inversionを処理する
|
||||
if args.textual_inversion_embeddings:
|
||||
token_ids_embeds1 = []
|
||||
@@ -1769,7 +1916,7 @@ def main(args):
|
||||
logger.info(f"reading prompts from {args.from_file}")
|
||||
with open(args.from_file, "r", encoding="utf-8") as f:
|
||||
prompt_list = f.read().splitlines()
|
||||
prompt_list = [d for d in prompt_list if len(d.strip()) > 0]
|
||||
prompt_list = [d for d in prompt_list if len(d.strip()) > 0 and d[0] != "#"]
|
||||
elif args.prompt is not None:
|
||||
prompt_list = [args.prompt]
|
||||
else:
|
||||
@@ -1912,7 +2059,9 @@ def main(args):
|
||||
|
||||
logger.info(f"loaded {len(guide_images)} guide images for guidance")
|
||||
if len(guide_images) == 0:
|
||||
logger.warning(f"No guide image, use previous generated image. / ガイド画像がありません。直前に生成した画像を使います: {args.image_path}")
|
||||
logger.warning(
|
||||
f"No guide image, use previous generated image. / ガイド画像がありません。直前に生成した画像を使います: {args.image_path}"
|
||||
)
|
||||
guide_images = None
|
||||
else:
|
||||
guide_images = None
|
||||
@@ -2041,7 +2190,7 @@ def main(args):
|
||||
# このバッチの情報を取り出す
|
||||
(
|
||||
return_latents,
|
||||
(step_first, _, _, _, init_image, mask_image, _, guide_image),
|
||||
(step_first, _, _, _, init_image, mask_image, _, guide_image, _),
|
||||
(
|
||||
width,
|
||||
height,
|
||||
@@ -2063,6 +2212,7 @@ def main(args):
|
||||
|
||||
prompts = []
|
||||
negative_prompts = []
|
||||
raw_prompts = []
|
||||
start_code = torch.zeros((batch_size, *noise_shape), device=device, dtype=dtype)
|
||||
noises = [
|
||||
torch.zeros((batch_size, *noise_shape), device=device, dtype=dtype)
|
||||
@@ -2093,11 +2243,16 @@ def main(args):
|
||||
all_images_are_same = True
|
||||
all_masks_are_same = True
|
||||
all_guide_images_are_same = True
|
||||
for i, (_, (_, prompt, negative_prompt, seed, init_image, mask_image, clip_prompt, guide_image), _) in enumerate(batch):
|
||||
for i, (
|
||||
_,
|
||||
(_, prompt, negative_prompt, seed, init_image, mask_image, clip_prompt, guide_image, raw_prompt),
|
||||
_,
|
||||
) in enumerate(batch):
|
||||
prompts.append(prompt)
|
||||
negative_prompts.append(negative_prompt)
|
||||
seeds.append(seed)
|
||||
clip_prompts.append(clip_prompt)
|
||||
raw_prompts.append(raw_prompt)
|
||||
|
||||
if init_image is not None:
|
||||
init_images.append(init_image)
|
||||
@@ -2195,8 +2350,8 @@ def main(args):
|
||||
# save image
|
||||
highres_prefix = ("0" if highres_1st else "1") if highres_fix else ""
|
||||
ts_str = time.strftime("%Y%m%d%H%M%S", time.localtime())
|
||||
for i, (image, prompt, negative_prompts, seed, clip_prompt) in enumerate(
|
||||
zip(images, prompts, negative_prompts, seeds, clip_prompts)
|
||||
for i, (image, prompt, negative_prompts, seed, clip_prompt, raw_prompt) in enumerate(
|
||||
zip(images, prompts, negative_prompts, seeds, clip_prompts, raw_prompts)
|
||||
):
|
||||
if highres_fix:
|
||||
seed -= 1 # record original seed
|
||||
@@ -2212,6 +2367,8 @@ def main(args):
|
||||
metadata.add_text("negative-scale", str(negative_scale))
|
||||
if clip_prompt is not None:
|
||||
metadata.add_text("clip-prompt", clip_prompt)
|
||||
if raw_prompt is not None:
|
||||
metadata.add_text("raw-prompt", raw_prompt)
|
||||
metadata.add_text("original-height", str(original_height))
|
||||
metadata.add_text("original-width", str(original_width))
|
||||
metadata.add_text("original-height-negative", str(original_height_negative))
|
||||
@@ -2240,7 +2397,9 @@ def main(args):
|
||||
cv2.waitKey()
|
||||
cv2.destroyAllWindows()
|
||||
except ImportError:
|
||||
logger.error("opencv-python is not installed, cannot preview / opencv-pythonがインストールされていないためプレビューできません")
|
||||
logger.error(
|
||||
"opencv-python is not installed, cannot preview / opencv-pythonがインストールされていないためプレビューできません"
|
||||
)
|
||||
|
||||
return images
|
||||
|
||||
@@ -2301,6 +2460,14 @@ def main(args):
|
||||
ds_timesteps_2 = args.ds_timesteps_2
|
||||
ds_ratio = args.ds_ratio
|
||||
|
||||
# Gradual Latent
|
||||
gl_timesteps = None # means no override
|
||||
gl_ratio = args.gradual_latent_ratio
|
||||
gl_every_n_steps = args.gradual_latent_every_n_steps
|
||||
gl_ratio_step = args.gradual_latent_ratio_step
|
||||
gl_s_noise = args.gradual_latent_s_noise
|
||||
gl_unsharp_params = args.gradual_latent_unsharp_params
|
||||
|
||||
prompt_args = raw_prompt.strip().split(" --")
|
||||
prompt = prompt_args[0]
|
||||
logger.info(f"prompt {prompt_index+1}/{len(prompt_list)}: {prompt}")
|
||||
@@ -2443,6 +2610,90 @@ def main(args):
|
||||
logger.info(f"deep shrink ratio: {ds_ratio}")
|
||||
continue
|
||||
|
||||
# Gradual Latent
|
||||
m = re.match(r"glt ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent timesteps
|
||||
gl_timesteps = int(m.group(1))
|
||||
print(f"gradual latent timesteps: {gl_timesteps}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glr ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent ratio
|
||||
gl_ratio = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent ratio: {ds_ratio}")
|
||||
continue
|
||||
|
||||
m = re.match(r"gle ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent every n steps
|
||||
gl_every_n_steps = int(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent every n steps: {gl_every_n_steps}")
|
||||
continue
|
||||
|
||||
m = re.match(r"gls ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent ratio step
|
||||
gl_ratio_step = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent ratio step: {gl_ratio_step}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glsn ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent s noise
|
||||
gl_s_noise = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent s noise: {gl_s_noise}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glus ([\d\.\-,]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent unsharp params
|
||||
gl_unsharp_params = m.group(1)
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent unsharp params: {gl_unsharp_params}")
|
||||
continue
|
||||
|
||||
# Gradual Latent
|
||||
m = re.match(r"glt ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent timesteps
|
||||
gl_timesteps = int(m.group(1))
|
||||
print(f"gradual latent timesteps: {gl_timesteps}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glr ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent ratio
|
||||
gl_ratio = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent ratio: {ds_ratio}")
|
||||
continue
|
||||
|
||||
m = re.match(r"gle ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent every n steps
|
||||
gl_every_n_steps = int(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent every n steps: {gl_every_n_steps}")
|
||||
continue
|
||||
|
||||
m = re.match(r"gls ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent ratio step
|
||||
gl_ratio_step = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent ratio step: {gl_ratio_step}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glsn ([\d\.]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent s noise
|
||||
gl_s_noise = float(m.group(1))
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent s noise: {gl_s_noise}")
|
||||
continue
|
||||
|
||||
m = re.match(r"glus ([\d\.\-,]+)", parg, re.IGNORECASE)
|
||||
if m: # gradual latent unsharp params
|
||||
gl_unsharp_params = m.group(1)
|
||||
gl_timesteps = gl_timesteps if gl_timesteps is not None else -1 # -1 means override
|
||||
print(f"gradual latent unsharp params: {gl_unsharp_params}")
|
||||
continue
|
||||
|
||||
except ValueError as ex:
|
||||
logger.error(f"Exception in parsing / 解析エラー: {parg}")
|
||||
logger.error(f"{ex}")
|
||||
@@ -2453,6 +2704,30 @@ def main(args):
|
||||
ds_depth_1 = args.ds_depth_1 or 3
|
||||
unet.set_deep_shrink(ds_depth_1, ds_timesteps_1, ds_depth_2, ds_timesteps_2, ds_ratio)
|
||||
|
||||
# override Gradual Latent
|
||||
if gl_timesteps is not None:
|
||||
if gl_timesteps < 0:
|
||||
gl_timesteps = args.gradual_latent_timesteps or 650
|
||||
if gl_unsharp_params is not None:
|
||||
unsharp_params = gl_unsharp_params.split(",")
|
||||
us_ksize, us_sigma, us_strength = [float(v) for v in unsharp_params[:3]]
|
||||
us_target_x = True if len(unsharp_params) < 4 else bool(int(unsharp_params[3]))
|
||||
us_ksize = int(us_ksize)
|
||||
else:
|
||||
us_ksize, us_sigma, us_strength, us_target_x = None, None, None, None
|
||||
gradual_latent = GradualLatent(
|
||||
gl_ratio,
|
||||
gl_timesteps,
|
||||
gl_every_n_steps,
|
||||
gl_ratio_step,
|
||||
gl_s_noise,
|
||||
us_ksize,
|
||||
us_sigma,
|
||||
us_strength,
|
||||
us_target_x,
|
||||
)
|
||||
pipe.set_gradual_latent(gradual_latent)
|
||||
|
||||
# prepare seed
|
||||
if seeds is not None: # given in prompt
|
||||
# 数が足りないなら前のをそのまま使う
|
||||
@@ -2514,7 +2789,9 @@ def main(args):
|
||||
|
||||
b1 = BatchData(
|
||||
False,
|
||||
BatchDataBase(global_step, prompt, negative_prompt, seed, init_image, mask_image, clip_prompt, guide_image),
|
||||
BatchDataBase(
|
||||
global_step, prompt, negative_prompt, seed, init_image, mask_image, clip_prompt, guide_image, raw_prompt
|
||||
),
|
||||
BatchDataExt(
|
||||
width,
|
||||
height,
|
||||
@@ -2555,12 +2832,19 @@ def main(args):
|
||||
def setup_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
add_logging_arguments(parser)
|
||||
|
||||
parser.add_argument("--prompt", type=str, default=None, help="prompt / プロンプト")
|
||||
parser.add_argument(
|
||||
"--from_file", type=str, default=None, help="if specified, load prompts from this file / 指定時はプロンプトをファイルから読み込む"
|
||||
"--from_file",
|
||||
type=str,
|
||||
default=None,
|
||||
help="if specified, load prompts from this file / 指定時はプロンプトをファイルから読み込む",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--interactive", action="store_true", help="interactive mode (generates one image) / 対話モード(生成される画像は1枚になります)"
|
||||
"--interactive",
|
||||
action="store_true",
|
||||
help="interactive mode (generates one image) / 対話モード(生成される画像は1枚になります)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no_preview", action="store_true", help="do not show generated image in interactive mode / 対話モードで画像を表示しない"
|
||||
@@ -2572,7 +2856,9 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("--strength", type=float, default=None, help="img2img strength / img2img時のstrength")
|
||||
parser.add_argument("--images_per_prompt", type=int, default=1, help="number of images per prompt / プロンプトあたりの出力枚数")
|
||||
parser.add_argument("--outdir", type=str, default="outputs", help="dir to write results to / 生成画像の出力先")
|
||||
parser.add_argument("--sequential_file_name", action="store_true", help="sequential output file name / 生成画像のファイル名を連番にする")
|
||||
parser.add_argument(
|
||||
"--sequential_file_name", action="store_true", help="sequential output file name / 生成画像のファイル名を連番にする"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--use_original_file_name",
|
||||
action="store_true",
|
||||
@@ -2583,10 +2869,16 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("--H", type=int, default=None, help="image height, in pixel space / 生成画像高さ")
|
||||
parser.add_argument("--W", type=int, default=None, help="image width, in pixel space / 生成画像幅")
|
||||
parser.add_argument(
|
||||
"--original_height", type=int, default=None, help="original height for SDXL conditioning / SDXLの条件付けに用いるoriginal heightの値"
|
||||
"--original_height",
|
||||
type=int,
|
||||
default=None,
|
||||
help="original height for SDXL conditioning / SDXLの条件付けに用いるoriginal heightの値",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--original_width", type=int, default=None, help="original width for SDXL conditioning / SDXLの条件付けに用いるoriginal widthの値"
|
||||
"--original_width",
|
||||
type=int,
|
||||
default=None,
|
||||
help="original width for SDXL conditioning / SDXLの条件付けに用いるoriginal widthの値",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--original_height_negative",
|
||||
@@ -2600,8 +2892,12 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
default=None,
|
||||
help="original width for SDXL unconditioning / SDXLのネガティブ条件付けに用いるoriginal widthの値",
|
||||
)
|
||||
parser.add_argument("--crop_top", type=int, default=None, help="crop top for SDXL conditioning / SDXLの条件付けに用いるcrop topの値")
|
||||
parser.add_argument("--crop_left", type=int, default=None, help="crop left for SDXL conditioning / SDXLの条件付けに用いるcrop leftの値")
|
||||
parser.add_argument(
|
||||
"--crop_top", type=int, default=None, help="crop top for SDXL conditioning / SDXLの条件付けに用いるcrop topの値"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--crop_left", type=int, default=None, help="crop left for SDXL conditioning / SDXLの条件付けに用いるcrop leftの値"
|
||||
)
|
||||
parser.add_argument("--batch_size", type=int, default=1, help="batch size / バッチサイズ")
|
||||
parser.add_argument(
|
||||
"--vae_batch_size",
|
||||
@@ -2615,7 +2911,9 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
default=None,
|
||||
help="number of slices to split image into for VAE to reduce VRAM usage, None for no splitting (default), slower if specified. 16 or 32 recommended / VAE処理時にVRAM使用量削減のため画像を分割するスライス数、Noneの場合は分割しない(デフォルト)、指定すると遅くなる。16か32程度を推奨",
|
||||
)
|
||||
parser.add_argument("--no_half_vae", action="store_true", help="do not use fp16/bf16 precision for VAE / VAE処理時にfp16/bf16を使わない")
|
||||
parser.add_argument(
|
||||
"--no_half_vae", action="store_true", help="do not use fp16/bf16 precision for VAE / VAE処理時にfp16/bf16を使わない"
|
||||
)
|
||||
parser.add_argument("--steps", type=int, default=50, help="number of ddim sampling steps / サンプリングステップ数")
|
||||
parser.add_argument(
|
||||
"--sampler",
|
||||
@@ -2647,9 +2945,14 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
default=7.5,
|
||||
help="unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty)) / guidance scale",
|
||||
)
|
||||
parser.add_argument("--ckpt", type=str, default=None, help="path to checkpoint of model / モデルのcheckpointファイルまたはディレクトリ")
|
||||
parser.add_argument(
|
||||
"--vae", type=str, default=None, help="path to checkpoint of vae to replace / VAEを入れ替える場合、VAEのcheckpointファイルまたはディレクトリ"
|
||||
"--ckpt", type=str, default=None, help="path to checkpoint of model / モデルのcheckpointファイルまたはディレクトリ"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--vae",
|
||||
type=str,
|
||||
default=None,
|
||||
help="path to checkpoint of vae to replace / VAEを入れ替える場合、VAEのcheckpointファイルまたはディレクトリ",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--tokenizer_cache_dir",
|
||||
@@ -2680,25 +2983,46 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
help="use xformers by diffusers (Hypernetworks doesn't work) / Diffusersでxformersを使用する(Hypernetwork利用不可)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--opt_channels_last", action="store_true", help="set channels last option to model / モデルにchannels lastを指定し最適化する"
|
||||
"--opt_channels_last",
|
||||
action="store_true",
|
||||
help="set channels last option to model / モデルにchannels lastを指定し最適化する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_module", type=str, default=None, nargs="*", help="additional network module to use / 追加ネットワークを使う時そのモジュール名"
|
||||
"--network_module",
|
||||
type=str,
|
||||
default=None,
|
||||
nargs="*",
|
||||
help="additional network module to use / 追加ネットワークを使う時そのモジュール名",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_weights", type=str, default=None, nargs="*", help="additional network weights to load / 追加ネットワークの重み"
|
||||
)
|
||||
parser.add_argument("--network_mul", type=float, default=None, nargs="*", help="additional network multiplier / 追加ネットワークの効果の倍率")
|
||||
parser.add_argument(
|
||||
"--network_args", type=str, default=None, nargs="*", help="additional arguments for network (key=value) / ネットワークへの追加の引数"
|
||||
"--network_mul", type=float, default=None, nargs="*", help="additional network multiplier / 追加ネットワークの効果の倍率"
|
||||
)
|
||||
parser.add_argument("--network_show_meta", action="store_true", help="show metadata of network model / ネットワークモデルのメタデータを表示する")
|
||||
parser.add_argument(
|
||||
"--network_merge_n_models", type=int, default=None, help="merge this number of networks / この数だけネットワークをマージする"
|
||||
"--network_args",
|
||||
type=str,
|
||||
default=None,
|
||||
nargs="*",
|
||||
help="additional arguments for network (key=value) / ネットワークへの追加の引数",
|
||||
)
|
||||
parser.add_argument("--network_merge", action="store_true", help="merge network weights to original model / ネットワークの重みをマージする")
|
||||
parser.add_argument(
|
||||
"--network_pre_calc", action="store_true", help="pre-calculate network for generation / ネットワークのあらかじめ計算して生成する"
|
||||
"--network_show_meta", action="store_true", help="show metadata of network model / ネットワークモデルのメタデータを表示する"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_merge_n_models",
|
||||
type=int,
|
||||
default=None,
|
||||
help="merge this number of networks / この数だけネットワークをマージする",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_merge", action="store_true", help="merge network weights to original model / ネットワークの重みをマージする"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_pre_calc",
|
||||
action="store_true",
|
||||
help="pre-calculate network for generation / ネットワークのあらかじめ計算して生成する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--network_regional_mask_max_color_codes",
|
||||
@@ -2713,7 +3037,9 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
nargs="*",
|
||||
help="Embeddings files of Textual Inversion / Textual Inversionのembeddings",
|
||||
)
|
||||
parser.add_argument("--clip_skip", type=int, default=None, help="layer number from bottom to use in CLIP / CLIPの後ろからn層目の出力を使う")
|
||||
parser.add_argument(
|
||||
"--clip_skip", type=int, default=None, help="layer number from bottom to use in CLIP / CLIPの後ろからn層目の出力を使う"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--max_embeddings_multiples",
|
||||
type=int,
|
||||
@@ -2730,7 +3056,10 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
help="enable highres fix, reso scale for 1st stage / highres fixを有効にして最初の解像度をこのscaleにする",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_steps", type=int, default=28, help="1st stage steps for highres fix / highres fixの最初のステージのステップ数"
|
||||
"--highres_fix_steps",
|
||||
type=int,
|
||||
default=28,
|
||||
help="1st stage steps for highres fix / highres fixの最初のステージのステップ数",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_strength",
|
||||
@@ -2739,7 +3068,9 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
help="1st stage img2img strength for highres fix / highres fixの最初のステージのimg2img時のstrength、省略時はstrengthと同じ",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_save_1st", action="store_true", help="save 1st stage images for highres fix / highres fixの最初のステージの画像を保存する"
|
||||
"--highres_fix_save_1st",
|
||||
action="store_true",
|
||||
help="save 1st stage images for highres fix / highres fixの最初のステージの画像を保存する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_latents_upscaling",
|
||||
@@ -2747,7 +3078,10 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
help="use latents upscaling for highres fix / highres fixでlatentで拡大する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_upscaler", type=str, default=None, help="upscaler module for highres fix / highres fixで使うupscalerのモジュール名"
|
||||
"--highres_fix_upscaler",
|
||||
type=str,
|
||||
default=None,
|
||||
help="upscaler module for highres fix / highres fixで使うupscalerのモジュール名",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--highres_fix_upscaler_args",
|
||||
@@ -2762,11 +3096,18 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--negative_scale", type=float, default=None, help="set another guidance scale for negative prompt / ネガティブプロンプトのscaleを指定する"
|
||||
"--negative_scale",
|
||||
type=float,
|
||||
default=None,
|
||||
help="set another guidance scale for negative prompt / ネガティブプロンプトのscaleを指定する",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--control_net_lllite_models", type=str, default=None, nargs="*", help="ControlNet models to use / 使用するControlNetのモデル名"
|
||||
"--control_net_lllite_models",
|
||||
type=str,
|
||||
default=None,
|
||||
nargs="*",
|
||||
help="ControlNet models to use / 使用するControlNetのモデル名",
|
||||
)
|
||||
# parser.add_argument(
|
||||
# "--control_net_models", type=str, default=None, nargs="*", help="ControlNet models to use / 使用するControlNetのモデル名"
|
||||
@@ -2815,6 +3156,45 @@ def setup_parser() -> argparse.ArgumentParser:
|
||||
"--ds_ratio", type=float, default=0.5, help="Deep Shrink ratio for downsampling / Deep Shrinkのdownsampling比率"
|
||||
)
|
||||
|
||||
# gradual latent
|
||||
parser.add_argument(
|
||||
"--gradual_latent_timesteps",
|
||||
type=int,
|
||||
default=None,
|
||||
help="enable Gradual Latent hires fix and apply upscaling from this timesteps / Gradual Latent hires fixをこのtimestepsで有効にし、このtimestepsからアップスケーリングを適用する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--gradual_latent_ratio",
|
||||
type=float,
|
||||
default=0.5,
|
||||
help=" this size ratio, 0.5 means 1/2 / Gradual Latent hires fixをこのサイズ比率で有効にする、0.5は1/2を意味する",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--gradual_latent_ratio_step",
|
||||
type=float,
|
||||
default=0.125,
|
||||
help="step to increase ratio for Gradual Latent / Gradual Latentのratioをどのくらいずつ上げるか",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--gradual_latent_every_n_steps",
|
||||
type=int,
|
||||
default=3,
|
||||
help="steps to increase size of latents every this steps for Gradual Latent / Gradual Latentでlatentsのサイズをこのステップごとに上げる",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--gradual_latent_s_noise",
|
||||
type=float,
|
||||
default=1.0,
|
||||
help="s_noise for Gradual Latent / Gradual Latentのs_noise",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--gradual_latent_unsharp_params",
|
||||
type=str,
|
||||
default=None,
|
||||
help="unsharp mask parameters for Gradual Latent: ksize, sigma, strength, target-x (1 means True). `3,0.5,0.5,1` or `3,1.0,1.0,0` is recommended /"
|
||||
+ " Gradual Latentのunsharp maskのパラメータ: ksize, sigma, strength, target-x. `3,0.5,0.5,1` または `3,1.0,1.0,0` が推奨",
|
||||
)
|
||||
|
||||
# # parser.add_argument(
|
||||
# "--control_net_image_path", type=str, default=None, nargs="*", help="image for ControlNet guidance / ControlNetでガイドに使う画像"
|
||||
# )
|
||||
@@ -2826,4 +3206,5 @@ if __name__ == "__main__":
|
||||
parser = setup_parser()
|
||||
|
||||
args = parser.parse_args()
|
||||
setup_logging(args, reset=True)
|
||||
main(args)
|
||||
|
||||
Reference in New Issue
Block a user