返回列表

11th Place Solution

549. Stable Diffusion - Image to Prompts | stable-diffusion-image-to-prompts

开始: 2023-02-13 结束: 2023-05-15 AIGC与多模态 数据算法赛
第11名解决方案

第11名解决方案

作者:knshnb

团队成员:charmqyoichi7yamakawa

发布日期:2023-05-16

排名:第11名

感谢 Kaggle 的工作人员和主办方组织本次竞赛,并向获奖者表示祝贺。感谢我的队友 @charmq@yoichi7yamakawa

概述

我们采用训练图像模型直接预测目标嵌入的方法。在竞赛的绝大部分时间里,我们使用 OpenCLIP-ViT/H 的图像编码器作为骨干网络,它是 Stable Diffusion v2 中文本编码器的对应部分。在本次竞赛中,它比通常的 ImageNet 预训练模型(如 EfficientNet 或 ConvNeXt)表现更强。然而,我们在最后 1-2 天发现 OpenCLIP-ViT/bigG 和 BLIP-2 效果更好,但已没有足够时间进行充分调优和训练。我们的最终提交是 OpenCLIP-ViT/H、OpenCLIP-ViT/g、OpenCLIP-ViT/bigG 和 BLIP-2 的集成。

数据集

我们总共下载并生成了超过 450 万张图像,并使用其中一部分作为验证集。验证分数与 LB 分数高度相关,尽管验证分数更高(0.7+)。我们使用的数据集如下。我们提取了彼此余弦相似度较低的提示词。此外,我们还从数据集中随机抽取一部分,拼接 Open Prompts 中的修饰词

我们最初使用了 官方脚本,主要使用 Diffusers 库生成图像。guidance_scale 的默认参数与官方脚本不同,但我们仍采用默认参数,因为它对性能影响不大。

哪些方法有效

我们使用的骨干网络只能处理 (224, 224) 的图像。我们将 (448, 448) 的图像分割成 4 个 (224, 224) 的块,并将每个块(以及整张图像)的嵌入向量拼接起来。这提升了性能,但使训练和推理速度慢了 5 倍,因此我们将其与输入为 (224, 224) 的普通模型一起使用。

以下这些小技巧在微调大型模型时非常有效。

  • 冻结前几层
  • 逐层学习率衰减
  • 预训练权重衰减

此外,使用文本编码器的对比损失对 CLIP 模型也有效。

哪些方法无效

  • 使用 Stable Diffusion 的权重,如 encoder、decoder、unet
  • 在 Stable Diffusion 的潜在空间上训练
  • Image2text
  • 辅助损失,如 CLIP 文本嵌入或提示词预测
  • 减小图像生成时的步长(我们曾认为它可作为数据增强)
  • 使用训练好的模型进行 knn
  • CLIP Interrogator

致谢

我们衷心感谢 PyTorch、PyTorch Lightning、Hugging Face 等优秀的开源软件。同时感谢 Preferred Networks, Inc 为我们提供计算资源。

同比赛其他方案