本文主要记录不同的SD模型代码中实现的一些细节,如text2img,img2img,inpaint等等
1. 文生图
第一步:生成随机的latent feature (n,4,64,64);n为生成的图片个数;
第二步:对于prompt用clip生成特征,正向提示词的特征(n,77,768),反向提示词的特征(n,77,768)。后续用公式得到最终的噪声:
第三步:生成时间步伐的特征(n,320);
第四步:latent feature放入UNet中,用cnn和多头注意提取特征并下采样,每次都要先加上时间特征,然后和提示词特征用交叉注意力生成新的特征;
第五步:最终UNet输出的是噪声(n,4,64,64);
第六步:根据之前文章的公式对latent feature (n,4,64,64)去燥,得到新的latent feature (n,4,64,64);不断的采样得到最终的latent feature
第七步:最终的latent feature 放到VAE解码器中,放大8倍得到输出图片(n,3,512,512);
2. 图生图
第一步:与文生图不同,这里的latent feature (n,4,64,64)不是随机生成的,是输入图片用VAE编码器得到的;注意这里有个系数strength,0表示对latent feature不加噪声,1表示加很多噪声完全摧毁原有的信息;
第二步:对于prompt用clip生成特征,正向提示词的特征(n,77,768),反向提示词的特征(n,77,768)。
第三步:生成时间步伐的特征(n,320);
第四步:latent feature放入UNet中,用cnn和多头注意提取特征并下采样,每次都要先加上时间特征,然后和提示词特征用交叉注意力生成新的特征;
第五步:最终UNet输出的是噪声(n,4,64,64);
第六步:根据之前文章的公式对latent feature (n,4,64,64)去燥,得到新的latent feature (n,4,64,64);不断的采样得到最终的latent feature
第七步:最终的latent feature 放到VAE解码器中,放大8倍得到输出图片(n,3,512,512);
3. Inpainting
第一步:生成随机的latent feature (n,4,64,64);n为生成的图片个数;
第二步:得到mask img (n,3,512,512)和mask(n,1,512,512);
第三步:mask下采样到(n,1,64,64);mask img用编码器得到(n,4,64,64);把这两个cat起来得到c_cat (n,5,64,64);
第四步:对于prompt用clip生成特征,正向提示词的特征(n,77,768),反向提示词的特征(n,77,768);
第五步:生成时间步伐的特征(n,320);
第六步:把c_cat (n,5,64,64)和latent feature (n,4,64,64) 连接起来得到网络的输入 (n,9,64,64);也就是说输入UNet的xc是图像特征加上latent feature;而cc是prompt的特征,out = self.diffusion_model(xc, t, context=cc)
;如下图所示:4个latent feature+4个mask img feature+1 mask;
第七步:把上面这些输入UNet中,用cnn和多头注意提取特征并下采样,每次都要先加上时间特征,然后和提示词特征用交叉注意力生成新的特征;
第八步:最终UNet同样输出噪声(n,4,64,64);
第九步:根据之前文章的公式对latent feature (n,4,64,64)去燥,得到新的latent feature (n,4,64,64);不断的采样得到最终的latent feature;
第十步:最终的latent feature 放到VAE解码器中,放大8倍得到输出图片(n,3,512,512);