549. Stable Diffusion - Image to Prompts | stable-diffusion-image-to-prompts
感谢所有参赛者带来的精彩比赛,特别感谢我的队友 @evilpsycho42。不要被他的"evilpsycho"用户名欺骗了——他是一位出色的队友,在整个比赛过程中,我们通过Slack进行了愉快的交流,讨论策略,并在许多最佳想法未能达到预期效果时一起相互慰藉。
我们假设训练数据将在比赛中发挥重要作用,因此尽快开始生成自定义图像。我们尝试收集多样化的提示词,通常限制它们在使用比赛指标时的余弦相似度低于0.7。我们从以下来源筛选了我们认为质量最高、相关性最低的提示词:
最重要的是,我们设计了一个自定义提示词生成器,发现它非常有效。它通过随机组合主题(4万人、地点和事物)、艺术媒介、形容词和动词来形成提示词。
我相信我们大多数人最初都在为找到一个好的验证集而挣扎。我们发现确保验证提示词来自不同来源且与训练数据相关性较低非常重要。
我们最好的模型是CLIP视觉塔,特别是 'convnext_xxlarge.clip_laion2b_soup' 和 'eva02_large_patch14_clip_336.merged2b',我们还在最终集成中包含了一些来自open_clip/timm的较小ViT和convnext模型。
虽然这些CLIP骨干网络具有最佳的单模型分数,但我们发现从包含零样本图像字幕模型中获得了鲁棒性益处,尽管使用哪一个模型并没有太大差异。我们的顶级模型使用GIT模型字幕模型 (https://arxiv.org/abs/2205.14100)
由于我们使用的是CLIP模型,我们发现了一个预训练技巧,可以初始化模型的投影头,将CLIP骨干网络输出映射到比赛使用的384维嵌入。我们使用自定义提示词生成器生成了100万个随机提示词,并使用CLIP模型的文本塔以及比赛指标 (all-MiniLM-L6-v2) 创建了它们的文本嵌入。然后我们训练了一个简单的线性层,将CLIP嵌入映射到比赛嵌入 (例如 nn.Linear(in_features=clip_embeddings_size,out_features=384,bias=True) )
我们将此用作模型投影头的预训练权重,相比使用随机权重初始化头部,这增加了信息并表现更好。
我们尝试了几种不同的训练技术变体,我们最喜欢的运行通常包括:
我们发现WiSE-FT技术对提高单模型分数非常有效,但在我们的集成中没有帮助。
如果您好奇,以下是我们的顶级模型的LB分数:

感谢组织者,祝贺其他参赛者!
根据下面的评论,我们分享了以下内容:
提示词生成器数据集 https://www.kaggle.com/datasets/rturley/custom-prompt 提示词生成器示例代码 https://www.kaggle.com/code/rturley/custom-prompt-generator-for-image-generation 10万张自定义提示词和图像数据集 https://www.kaggle.com/datasets/rturley/stable-diffusion-100k-custom-prompts-and-images 数据集浏览示例 https://www.kaggle.com/rturley/tour-of-stable-diffusion-custom-prompt-dataset