Shortcuts

图像生成

HCP-Diffusion基于workflow来生成图像,workflow的配置文件同样是一个python文件,可以通过.py文件来描述生成图像的过程。使用workflow可以在生成过程中加入超分,局部修改等各种操作。甚至可以让每个step都使用不同的prompt,CFG强度,或使用不同的模型。

# 运行workflow
hcp_run --cfg cfgs/workflow/text2img.yaml

单词注意力加强

注解

生成图像时可以单独加强部分词的注意力:

格式为: {加强的文本:倍率},默认1.1倍 例如: a {cat} running {in the {city}:1.2}

其中cat会被加强1.1倍,in the会被加强1.2倍,city则会被加强1.2*1.1倍。

配置基础结构

workflow的执行入口在make_cfg函数中,返回的dict中的workflow项是定义的workflow。

使用Stable Diffusion生成图像:

cfgs/workflow/easy/text2img.yaml提供了简化的图像生成配置,只需要设置少量参数选项就可以生成图像,但是自由度较低,可以实现的功能有限。

常用配置:

from hcpdiff.easy.cfg import SD15_t2i
from rainbowneko.parser import neko_cfg

@neko_cfg
def make_cfg():
    return SD15_t2i(
        pretrained_model='Lykon/DreamShaper', # 预训练模型路径
        prompt='masterpiece, best quality, 1girl, cat ears, outside', # 正面描述
        # negative_prompt='', # 添加负面描述
        bs=4, # 批次大小
        width=512, # 图片宽度
        height=512, # 图片高度
        guidance_scale=7.0 # CFG引导强度
    )

如果需要修改采样器,可以配置参数noise_sampler,默认为dpmpp_2m_karras:

from hcpdiff.easy import Diffusers_SD

SD15_t2i(
        pretrained_model='Lykon/DreamShaper', # 预训练模型路径
        prompt='masterpiece, best quality, 1girl, cat ears, outside', # 正面描述
        bs=4, # 批次大小
        width=512, # 图片宽度
        height=512, # 图片高度
        guidance_scale=7.0, # CFG引导强度
        noise_sampler=Diffusers_SD.euler_a # 替换采样器
    )

可以选择的采样器:

采样器 说明
dpmpp_2m 步数少
dpmpp_2m_karras 步数少,效果好,比较常用
ddim 步数较多
euler
euler_a 二次元常用,比较平滑

其他配置:

from hcpdiff.easy.cfg import SD15_t2i
from rainbowneko.parser import neko_cfg

@neko_cfg
def make_cfg():
    return SD15_t2i(
        pretrained_model='Lykon/DreamShaper', # 预训练模型路径
        prompt='masterpiece, best quality, 1girl, cat ears, outside', # 正面描述
        # negative_prompt='', # 添加负面描述
        bs=4, # 批次大小
        width=512, # 图片宽度
        height=512, # 图片高度
        guidance_scale=7.0, # CFG引导强度
        
        seed=42, # 固定随机种子
        N_steps=30, # 设置采样步数
        save_root='output_pipe/', # 输出结果保存目录
    )

cfgs/workflow/text2img.yaml提供了图像生成工作流配置,自由度高,可以实现各种功能。文生图功能一般由以下几个模块构成。其他更多的工作流可以参考cfgs/workflow/目录下的配置文件。

模型加载
import torch
from rainbowneko.parser import neko_cfg
from hcpdiff.easy import Diffusers_SD, SD15_auto_loader
from rainbowneko.infer import Actions, PrepareAction
from hcpdiff.workflow import BuildModelsAction

@neko_cfg
def build_model(pretrained_model='ckpts/any5', noise_sampler=Diffusers_SD.dpmpp_2m_karras) -> Actions:
    return Actions([
        PrepareAction(device='cuda', dtype=torch.float16), # 配置设备和精度
        BuildModelsAction( # 构建模型,此次加载预训练的
            model_loader=SD15_auto_loader(_partial_=True,
                ckpt_path=pretrained_model,
                noise_sampler=noise_sampler # 设置采样器,预设
            )
        ),
    ])

注解

这里的noise_sampler使用了预设的简化配置,预设的配置包括:

采样器 说明
dpmpp_2m 步数少
dpmpp_2m_karras 步数少,效果好,比较常用
ddim 步数较多
euler
euler_a 二次元常用,比较平滑

如果需要其他采样器配置,可以使用完整的配置:

from diffusers import DPMSolverMultistepScheduler
from hcpdiff.diffusion.sampler import DiffusersSampler

# 使用diffusers的采样器
noise_sampler=DiffusersSampler(
    DPMSolverMultistepScheduler(
        beta_start=0.00085,
        beta_end=0.012,
        beta_schedule='scaled_linear',
        algorithm_type='sde-dpmsolver++',
        use_karras_sigmas=True,
    )
)
模型优化
from hcpdiff.workflow import PrepareDiffusionAction, XformersEnableAction, VaeOptimizeAction

@neko_cfg
def optimize_model() -> Actions:
    return Actions([
        PrepareDiffusionAction(), # 配置模型相关参数
        XformersEnableAction(), # 开启xformers优化显存
        VaeOptimizeAction(slicing=True), # VAE相关优化,减少显存
    ])
文本编码
from hcpdiff.workflow import TextHookAction, AttnMultTextEncodeAction

@neko_cfg
def text(prompt=prompt, negative_prompt=negative_prompt, bs=4, N_repeats=1, layer_skip=1) -> Actions:
    return Actions([
        # 支持高级文本编码器功能。
        # N_repeats: 最大prompt长度拓展
        # layer_skip: 跳过最后N层 (clip skip), 这里0和webui的1一样
        TextHookAction(N_repeats=N_repeats, layer_skip=layer_skip),
        # 文本编码操作,支持token权重
        AttnMultTextEncodeAction(
            prompt=prompt, # 正面提示词
            negative_prompt=negative_prompt, # 负面提示词
            bs=bs # 批次大小
        ),
    ])
图像信息设置
from hcpdiff.workflow import SeedAction, MakeTimestepsAction, MakeLatentAction

@neko_cfg
def config_diffusion(seed=42, N_steps=20, width=512, height=512) -> Actions:
    return Actions([
        SeedAction(seed), # 设置随机种子
        MakeTimestepsAction(N_steps=N_steps), # 设置采样步数
        # MakeTimestepsAction(N_steps=N_steps, strength=0.6), # 去噪强度,用于图生图
        MakeLatentAction(width=width, height=height) # 设置图像大小
    ])
图像生成
from rainbowneko.infer import LoopAction
from hcpdiff.workflow import DiffusionStepAction, time_iter

@neko_cfg
def diffusion(guidance_scale=7.0) -> Actions:
    return Actions([
        LoopAction( # 循环执行Action
            iterator=time_iter, # 时间步迭代器 [{'t':t} for t in timesteps]
            actions=[
                DiffusionStepAction(guidance_scale=guidance_scale) # 进行一步去噪
            ]
        )
    ])
图像解码
from hcpdiff.workflow import DecodeAction, SaveImageAction

@neko_cfg
def decode() -> Actions:
    return Actions([
        DecodeAction(), # 使用VAE解码latent变成图像
        SaveImageAction(save_root='output_pipe/', image_type='png'), # 保存图像
    ])

支持的Action

TODO