0 综述

Stable Diffusion是一种文本到图像的模型。相对于Disco Diffusion,SD的速度会更快一些。经过我的比较发现,Disco Diffusion对于现存的需求会比SD少一些,并且DD在生成景色上有一些更好的效果。SD会更重视对与prompt内容的还原。

这一类文本到图像的算法都是根据CLIP这个文本图像预练习模型的,之前已经讲过了。

Stable Diffusion模型自身建立潜在分散模型的基础上,并且结合了Dall-E2和Imagen的条件分散模型的看法。核心数据在LAION-Aesthetics上练习。

1 代码库房

repo:github.com/CompVis/sta…

上面讲的很详细,很简单就跑起来了。当然,作为一名算法从事人员,还是有必要把里边的详细细节剖开看一看。个人之前不是从事这个diffusion范畴的,所以有一些见解或许存在过错。

其中关键是一个叫做txt2img.py的文件。

1.1 模型加载

def load_model_from_config(config, ckpt, verbose=False):
    print(f"Loading model from {ckpt}")
    #  加载模型的经典语句
    pl_sd = torch.load(ckpt, map_location="cpu")
    if "global_step" in pl_sd:
        print(f"Global Step: {pl_sd['global_step']}")
    sd = pl_sd["state_dict"]
    # 上面咱们加载出来了模型的参数,还需要一个模型来接着参数。
    # 这儿是根据配置文件生成对应的模型,配置文件可见附图1
    model = instantiate_from_config(config.model)
    m, u = model.load_state_dict(sd, strict=False)
    if len(m) > 0 and verbose:
        print("missing keys:")
        print(m)
    if len(u) > 0 and verbose:
        print("unexpected keys:")
        print(u)
    model.cuda()
    model.eval()
    return model
def instantiate_from_config(config):
    if not "target" in config:
        if config == '__is_first_stage__':
            return None
        elif config == "__is_unconditional__":
            return None
        raise KeyError("Expected key `target` to instantiate.")
    # 这儿的config["target"] = "ldm.models.diffusion.ddpm.LatentDiffusion"
    return get_obj_from_str(config["target"])(**config.get("params", dict()))
def get_obj_from_str(string, reload=False):
    # module = "ldm.models.diffusion.ddpm"
    # cls = "LatentDiffusion"
    # 咱们能够自然的猜测出,module是py文件的途径,cls是该py文件当中的模型modulemodule, cls = string.rsplit(".", 1)
    if reload:
        module_imp = importlib.import_module(module)
        importlib.reload(module_imp)
    return getattr(importlib.import_module(module, package=None), cls)

至此,咱们了解了该算法如何经过配置文件yaml来控制模型类的加载。

1.2 模型结构

翻开模型文件后,发现LatentDiffusion模型文件有1k多行,并且继承了DDPM类。此处暂时搁置。

附图

Stable Diffusion算法代码详解