计算机视觉课程时做的分享,附带课程分享时使用的PPT

CLIP原文:Learning Transferable Visual Models From Natural Language Supervision

链接:proceedings.mlr.press/v139/radford21a/radford21a.pdf

引入:

        我的方向是谣言检测,也就是搞自然语言处理的,随着社交媒体的发展,发文配图基本上成了标配,甚至很多时候是为了发这张图片才配个文本,之前一段时间很多人都喜欢说 配个合适的文案。那么进行文本和图像的检测就变的很有必要,也就是多模态。最近在使用一个多模态模型,也就是CLIP,简单介绍一下CLIP。(原文48页) 

        图像检索实现:

        在我们平常使用视频软件的时候,例如抖音,B站等等,都会有检索的功能,虽然一部分是基于标题实现的,但也有一部分是基于视频的内容实现的。视频其实可以看做是多张图片进行的拼接,那么就可以通过这段文字检索到含有信息的某一帧。或者使用的一些搜图工具,或者淘宝的以图搜图,就比如我想要搜索“好吃的苹果”,那么搜索引擎就会根据图片内容与我想要搜索文本的相似度对结果进行排序展示。

       那怎么实现?

        其实就是 在 这些图片或者视频等在上传的时候经过编码转化为向量存在了数据库上,但是视频存在很多帧,于是从视频中抽取一些帧(例如,每隔几秒抽取一帧或基于场景变化抽取关键帧)来代表视频。使用深度学习模型(如VGG, ResNet, 或者更先进的模型如DINO等)对这些帧进行处理,以提取出描述图像内容的特征向量  这部分称为图像编码器。其实就是将图像转为向量的这么一个过程。提取出的特征向量会被存储到一个高效的数据库或者索引结构中(比如倒排索引、矢量数据库如Milvus等),以便后续能够快速检索。当用户发起搜索请求时,输入(可能是一个图像、一组关键词或者其他形式的查询)同样被转化为特征向量(这部分成为文本编码器),然后与数据库中的特征向量进行比较。常用的相似性度量方法包括余弦相似度、欧氏距离等。

图:胡志军,徐勇.基于内容的视频检索综述[J].计算机科学,2020,47(01):117-123.

        相似度计算 就是和图像对应的文本为正相关样本,和图像不对应的文本就是负相关样本。例如微信朋友圈发一段文字配上一个图,一般都是具有相关性的,这样的就是正相关。其他人朋友圈的文字和我朋友圈的文字那就是负相关的。

        那问题出现了,现实生活中一个图片可以对应多个不同的描述,那岂不是存在很多个正相关的图像描述,这样的话我们想要一个实现检索的模型训练起来岂不是数据量非常庞大?

        这是我的两张朋友圈截图,第一张图片中除了雪,还有一个交通指示灯,几块亮着灯的招牌等等物品,第二张图片就是一些海,围栏,汽车等等。而Openai提出使用文本图片配对的方式进行训练。图文配对的方法更容易训练。

CLIP的基本实现

训练

        这是CLIP文章中给出的图,CLIP对文本和图像进行配对也相当简洁直接。

        例如这里的文本,经过文本编码后得到文本的向量表示,图像经过图像编码得到图像的向量表示,再分别通过一个线性投射层,投射到一个共同的多模态向量空间里,然后计算他们的余弦相似度,尽量拉近配对文本和图像的向量,让不配对的文本和图像尽可能地远。使得正样本的余弦相似度尽可能接近1,负样本的余弦相似度尽可能接近0。OpenAI使用的4亿个图片文本样本进行训练, 输入的TN和IN就是4亿,就可以得到4亿X4亿个样本,对角线上的表示是正样本,其余的表示负样本。采用余弦相似度计算两个向量之间的相似度。

        而这里的文本encoder或者图像encoder使用什么模型都可以,只要能把图像和文本变为向量即可。作者实现时也尝试的很多模型。这点后面详细给大家讲解。

        举个详细点的例子:

        比如这里描述小狗的文本和小狗的图片,对应的就是正样本也就是配对的文本和图像,两者向量要尽可能地近,而下一句是描述小猫的文本,那么对于这张小狗的图片,就是负样本也就是不配对的文本和图像,则需要尽可能地远离。

 测试

在模型进行测试的时候,采用的是ImageNET数据集,这个数据集中有一千类,每张图片都有一个真实的类别。每张图片经过图像编码器会得到一个图像向量,这个图像向量再与一千类的文本向量做相似度计算。这里的TN中的N就是1000,这一行最高的就是图文相似度最高的哪个,就是预测出来的类别。

        在测试的时候,进行了提示词,然后把填充后的句子送入文本编码器,这样的测试准确度会高一些。ImageNet有一千个类,这样产生一千个句子,传入文本编码器,变为一千个向量,再拿去跟图像做匹配。如果只是用dog作为语句进行匹配效果并不好,可能是因为训练都是使用的网络上的语句的描述,很少是单词的描述,测试的时候仅用dog单词来描述表达效果的是不好的。

编码器

        图像编码器作者尝试过很多模型,上面的ResNet就是基于CNN卷积的模型,目标检测yolo以及动作识别slowfast也是基于CNN卷积。而CLIP不用CNN卷积,纯用Transformer,也就是下面的vit的模型。CLIP作为大模型、多模态开山之作的经典之处。这样文本和图像处理都是基于Transformer技术栈,方便做融合。文本编码器与图像编码器类似,不过区别在于一个是图像经过Transformer编码器,一个是文本向量经过Transformer编码器,这两个编码器都可以将输入转化为一个固定长度的向量表示。

        这里举例:把图片(224X224X3)分割为9块,就变成了(16x16x3)的小图,把图片拉平后就变成了1x768,这里有九个小图,就是9x768,但是我们只想要这九个图的类别,就再加一个向量用于分类,其他九个向量去学习这个图片块的特征的。经过Transformer处理后,0向量(类别向量)传入MLP中,MLP是多层感知机(由输入层、输出层和至少一层的隐藏层构成),然后进行分类。如果输入的是文本也是取类别向量后进行分类。

        右边就是transformer的细节图,二维矩阵经过一个归一化层,再经过一个多头注意力机制,再残差连接原始的二维矩阵然后进行相加,然后再经过一个归一化层,再经过全连接层,再进行残差连接进行相加再传入下一个transformer encoder编码器。L表示12,说明连接了12次(CLIP)

CLIP是处理多模态的开山作,VIT则是transformer处理视觉的开山之作。

之前在介绍基本实现的时候提到使用了4亿样本,其计算量相当大。

论文上说训练训练VIT要256台V100,用了12天

那么一台V100从头开始训练,就要3072天,一年365天,3072天就要8.4年。计算成本高昂。

伪码

        I表示n个图片数据,T表示n个文本数据。

        图像数据经过图像编码器,文本数据经过文本编码器分别得到原始的图像向量表示和文本向量表示,然后分别通过一个线性映射层映射到多模态向量空间,然后得到相似度。乘的部分是温度系数,作为可学习的参数,为了防止为负数所以做了一个指数运算。温度值越高结果经过softmax就会被平滑。最后就是计算损失,横向和纵向,然后计算均值。

效果分析

        最左边是数据集的名称,中间部分是数据集中的例子,后面是三列指标,第一列是ResNet在ImageNet数据集上经过训练后的测试效果,可以看到测试效果越来越差,尤其是下面的素描数据集和生成式对抗数据集。但是CLIP在海量的数据集上进行训练,直接拿这些数据集的测试集进行测试,效果相对稳健。最后一列则是相对增幅。

        这个图表示以ResNet50为基准。CLIP相对ResNet50的得分。这个Linear Probe on ResNet50 表示以ResNet50为主干网络,在ImageNet数据集上以有监督的方式学习好了,把抽取特征的层给冻住,然后在下游任务的数据集上微调分类头 。横轴0表示ResNet50的效果,如果CLIP的效果更好就列在上面。可以看出在MNIST的手写数据集上的效果不好,作者认为网络上的手写数据较小,作者总结对普通物体的分类一般表现的都比较好,车、食物、动作这些常见的分类。CLIP可以很好的做迁移。对于一些困难任务,例如DTD这种纹理分类的数据集对于CLIP来说就相对困难。

        但是如果添加分类头进行微调(few-shot):

        每个类别只给1个例子,2个例子,四个例子,八个例子的情况下。的效果都比较好。

但是在每个类别只给四个例子的情况下还不如不给例子。

        如果整个数据都进行训练:

效果遥遥领先!

参考内容:多模态模型CLIP深度讲解_哔哩哔哩_bilibili

【有字幕】零基础【大模型、多模态】CLIP论文 模型讲解 !_哔哩哔哩_bilibili

PPT模板来自:B站 旁门左道PPT

非常感谢三位大佬!

PPT链接:分享版.pptx

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐