文生图——DALL-E 3 —论文解读——第一版-CSDN博客文章浏览阅读236次。本文主要是DALL·E 3官方第一版技术报告(论文)的解读。 一句话省流版,数据方面,训练时使用95%模型(CoCa)合成详细描述caption + 5%原本人类 caption,测试时使用GPT-4v 扩写人类caption;模型方面使用T5xxl + vae encoder + diffusion latent + 自家decoder 取得最好效果。https://blog.csdn.net/u012863603/article/details/134028230DALL-E 3技术报告阅读笔记 - 知乎在大家都在猜测 DALL-E 3技术架构的时候,没想到OpenAI在最近放出了DALL-E 3的技术报告,这不得不给OpenAI点个赞。但是,DALL-E 3的这篇技术报告重点是放在了如何通过合成图像的文本描述(caption)来提升模型的生…https://zhuanlan.zhihu.com/p/662745543
dalle3,数据方面,训练时使用95%模型(CoCa)合成详细描述caption + 5%原本人类 caption,测试时使用GPT-4v 扩写人类caption;模型方面使用T5xxl + vae encoder + diffusion latent + lcm decoder 取得最好效果,其中lcm decoder已经开源了。
dalle3的技术报告主要是两个问题:1.如何通过合成图像的文本描述caption来提升模型的生成能力,提升的主要是prompt following能力,即生成的图像和输入的text prompt的一致性;2.关于dalle3和其它文生图算法的对比。
1.合成图像caption
文生图算法的文本理解能力,对于稍微复杂的文本,生成的图像往往会容易忽略部分文本描述,甚至无法生成文本所描述的图像,主要是训练数据集的caption不够准确,1.图像常规的文本描述过于简单(coco),大部分只描述图像中的主体而忽略图像中的其它信息,比如背景,物体的位置和数量,图像中的文字等,2.目前训练的图像文本对(laion)都是从网页上爬取的,文本的描述是alt-text(图片替代文本),这种描述很多是不太相关的内容,比如广告。
openai的解决方案是训练一个image caption来合成图像的caption,在合成caption上,blip之前就做过,laion在2022年也推出了基于blip来生成caption的laion-coco数据集,不过是生成的短caption,也没有使用GPT-4V来生成caption。这里选用的模型是谷歌的CoCa,CoCa相比clip额外增加了一个multimodel text encoder来生成caption,训练损失包括clip的对比损失和caption生成的交叉熵损失(自回归损失)。
为了提升模型生成擦菩提哦您的质量,对预训练好的image captioner进行了微调,包括两个部分,1.微调数据是只描述图像主体的短caption,2.微调数据是详细描述图像内容的长caption,相应的两个模型分别生成ssc短caption和dsc长短语。下图中很明显ssc和dsc。
实验部分主要讨论两点,1.合成caption对文生图模型的影响;2.训练中合成caption和原始caption的最佳混合比例。混合主要是为了防止模型过拟合到合成caption的某些范式,比如合成的caption往往以a和an开头,在训练中,在合成caption中混入原始caption,相当于一种模型正则化。
1.合成caption对文生图算法的影响。
训练了三个模型,1.只用原始caption;2.5%的原始caption+95%的合成短caption;3.5%的原始caption和95%的合成长caption。文生图算法是latent diffusion模型,其VAE和sd一样都是8x下采样,text encoder采用T5-XXL,T5-XXL可以编码更长的文本且其编码能力更强,训练图像尺寸为256x256,bs=2048,训练50w步,相当于采样了1B样本,unet结构估计和sdxl差不多,包含了3个stages,sdxl包含了3个sdxl,下采样2次,其中第一个stage是纯卷积,后面2个包含attention。
采用CLIP score来评测, CLIP score是image embedding和text prompt对应的text embedding计算余弦相似度得出的值,基于CLIP ViT-B/32。
左图中计算clip score时text采用原始caption,蓝线是长文本生成的图和原始caption计算的score,还是要好于红线,右图text采样的是长caption,明显长caption>短caption>原始caption。
采用95%长caption>90%长caption>80%长caption。
因此合成的长caption对模型最终的结果帮助很大,不过采用95%合成长caption,也会过拟合到长caption上,如果采用常规的短caption,效果就会差很多,为了解决这个问题,openai采用GPT4来upsample用户的caption,就是用户输入的短caption,进过GPT4之后变成长caption,优化之后效果确实要好一点。
2.dalle3
对于dalle3的实现,1.dalle3采用了95%的合成长caption和5%的原始caption混合训练,这是关键之一,2.dalle3应该是一个更大版本的T5xxl + vae encoder + diffusion latent + lcm decoder模型。目前生成的图片分辨率是1024x1024以上,应该也是类似于sdxl,采用渐进式的训练策略,256->512->1024,采用多尺度训练策略来使模型能够输出各种长宽比的图像,lcm decoder目前已经开源了,主要是提升图像的细节,特别是文字和人脸,为了解决VAE所产生的图像畸变。主要是替换vae decoder,可以和sd的vae encoder一起用。
import torch
from diffusers import StableDiffusionPipeline
from consistencydecoder import ConsistencyDecoder, save_image, load_image
# encode with stable diffusion vae
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, device="cuda:0"
)
pipe.vae.cuda()
decoder_consistency = ConsistencyDecoder(device="cuda:0") # Model size: 2.49 GB
image = load_image("assets/gt1.png", size=(256, 256), center_crop=True)
latent = pipe.vae.encode(image.half().cuda()).latent_dist.mean
# decode with gan
sample_gan = pipe.vae.decode(latent).sample.detach()
save_image(sample_gan, "gan.png")
# decode with vae
sample_consistency = decoder_consistency(latent)
save_image(sample_consistency, "con.png")
3.评测
评测这块还是很值得借鉴,从之前的sd_eval,图像生成如何去评估一直是个值得研究的点。dalle3的测评分为自动评测和人工评测。
自动评测有3个指标,1.CLIP score,测评数据集是从COCO2014中选出的4096个captions,2.采用GPT4V,测评数据集是imagen中所提出的DrawBench,共包括200个不同类型的prompt,将生成的图像和对应的text送入GPT4V,让模型判定图像和text是否一致,一致就正确。3.采用T2I-CompBench,包括6000个组合类型的text prompt,选择了color binding/shape binding/texture binding测评,通过BLIP-VQA model评分,三个方面都是难点,sdxl都搞不定的。
这三个指标可能也不能反应很多图像质量问题吧,直观感觉xl生成的图还是要比dalle2要好的。
第二部分是人工测评:1.给两张图,判断哪一张和文本更相符,2.style,不给文本,判断更喜欢两张图中的哪一张,3.coherence,从两张图中选择包含更多真实物体的图像。
4.问题
1.空间位置关系;2.文字生成能力;3.合成的caption中会幻想图像中的重要细节,可能画出错误类型的植物。