返回列表

36th place solution

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

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

第36名解决方案

作者:Frank
发布时间:2023年5月16日

排名稳定。祝贺所有获奖者!!

这是我第二次 solo 银牌。在结果最终确定后,我终于成为了Kaggle竞赛 Master!!!


我的最终集成包含微调和零样本模型。

简述:KNN回归 + CLIP interrogator + 4个微调模型的集成,手动权重分别为0.3、0.1和0.6。提交笔记本可在这里找到。

微调模型

数据预处理

对于这部分,甚至整个竞赛,数据预处理和数据集的多样性是最重要的两点。对于每个模型的训练,我使用了来自Diffusion-2M、Diffusion-14M、公开的90万和8万数据集。

预处理的必要性有两个原因:

  1. 过滤高相关性数据,避免模型过拟合
  2. 减小训练集规模,使训练成本可接受

每个数据集的预处理流程如下:

  1. 根据现有数据集去重
  2. 手工规则过滤:
    1. 移除单词数 < 5的文本
    2. 移除开头/结尾4个单词相同的重复文本
    3. 移除非英文字符的文本
    4. 移除超过77个token的文本(使用Stable Diffusion v2的CLIPTokenizer)
  3. 数据集内部相关性过滤(余弦相似度),阈值0.8
  4. 与现有数据集相关性过滤,阈值0.8

进行相关性过滤时,利用GPU批处理非常重要。例如使用"Sentence Transformer"库的encode函数时,启用"normalize_embeddings=True"参数可得到单位长度嵌入,方便用torch.matmul计算余弦相似度。

数据生成

我使用Stable Diffusion v2按照数据集描述中的设置重新生成了图像。

训练

  • CV划分:根据token长度划分验证集,分为12~15折,取第一折作为验证集
  • 微调层数:发现验证分数在可训练参数达到约8000万后不再提升,因此手动调整解冻起始层
  • 数据增强:HorizontalFlipMixUp有效
  • 训练轮数:4轮,验证分数通常在第3轮达到最高

模型集成

模型 公开榜分数 权重
clip-vit-large-patch14-336 0.57954 0.3
clip-vit-large-patch14 0.57665 0.2
blip-image-captioning-large 0.57621 0.2
convnext_large_mlp.clip_laion2b_ft_soup_320 0.57907 0.3
  • 集成公开榜分数:0.59314
  • 集成前归一化输出的公开榜分数:0.59673

KNN回归

参考公开笔记本,并添加了我自己处理的数据集。

CLIP interrogator

参考公开笔记本

总结思考

有几项未能深入探索:

  1. 生成更多数据集以提升多样性
  2. 过滤更多公开数据集并加入KNN模型
  3. 探索更多零样本方法

我对多模态领域仍是新手,但这次竞赛是个很好的起点!

同比赛其他方案