上月,由OpenAI开源的大规模图文预训练模型CLIP凭借其优越的性能,已经取得大量关注,并在社区得到了广泛讨论。

CLIP(Contrastive Language-Image Pre-Training)是由OpenAI开源基于对比学习的大规模图文预模型,其中CLIP的文本和图像编码器都是基于transformer结构,图文的相似度直接使用文本和图像特征的余弦相似度,代码层面上实现难度不大。整个项目最大的亮点和难点在于OpenAI采集的4个亿的图文Pair。CLIP已提供官方预训练模型,但由于CLIP的训练语料主要为英文,所以暂时不支持别的语言,可以事先使用翻译模型进行翻译。

此前,已有开发者基于CLIP模型,开源了一个使用预训练CLIP在Unsplash数据集上进行图像和视频的检索。近日,一位来自CMU的开发者基于CLIP进行了更多的尝试,在常规图文检索的基础上,支持多种类型的图文联合检索(图文检索、以图搜图、多文本搜索、图文联合搜索),并实现了CLIP注意力机制的可视化,便于对CLIP检索结果进行分析。

项目地址:https://github.com/haofanwang/natural-language-joint-query-search

该项目主要基于natural-language-image-search(https://github.com/haltakov/natural-language-image-search),同样在Unsplash数据集上进行检索。作者也提供了Colab Notebook,可以直接运行。项目包含两个内容,一个是联合检索,一个是注意力机制可视化,其中由于可视化阶段修改了部分CLIP项目中参数返回的代码,所以需要使用作者提供的CLIP版本。具体修改的代码在model.py,具体细节可参考CLIP官方贡献者在issue(https://github.com/openai/CLIP/issues/18)中给出的建议。

model.py:

https://github.com/haofanwang/natural-language-joint-query-search/blob/acd70e9b8e7b4161edb5ab3dedd45a97a4393ade/CLIP/clip/model.py

本质上,CLIP模型检索的原理是比较特征空间中两个特征编码的余弦相似度,所以并不局限在文本特征与图像特征的比较。该项目正是基于此进行尝试,作者在实际测试中发现,CLIP对于多特征联合检索,也能够取得一些不错的结果。作者提供了一些测试样例。

文本-图像检索

检索文本:“Tokyo tower at night.”

Image

检索文本:“People come and go on the street.”

Image

上图中是给出文本检索图像的结果,这也是最常见的检索方式。可以看到,CLIP都能够检索出非常匹配的图片。

图像-图像检索

源图像是一张街景图,下图最左

Image

除了图文搜索,在现实场景中,以图搜图也是很常见的应用场景。上面是作者提供的例子。源图像(左图)是一张空旷的街景图,而检索结果(右边三张)都是非常相似的街景。

文本-图像以及图像-图像的检索,都是利用了单一特征之间的相似度进行检索,那么如果同时有多个文本,每一个文本都描述独立的场景,但希望检索结果中尽可能同时包含多个场景呢?CLIP是否仍然有效呢?所以在这里,作者还尝试了联合搜索的形式,得到了非常有意思的结果。

文本+文本-图像检索

检索文本1:“Flower”,检索文本2:“Blue sky”

Image

检索文本1:“Flower”,检索文本2:“Bee”

Image

上图是多文本-图像的检索示例。可以看到,检索的结果中同时包含了两个独立文本描述的主体。而实现的代码非常简单。首先是对两个文本各自进行编码,然后将两个文本特征进行线性相加,此外并未进行额外的归一化操作,最后将合并后的特征与图像进行相似度计算。不同的权重用于调整不同文本的重要性。比如在第二个示例中,“Bee”和“Flower”的权重分别是2和1,所以可以看到,检索结果中会更突出“蜜蜂”。

图像+文本-图像检索

检索图像:街景图(无车辆),下图最左 检索文本:“cars”

Image

之前已经说到CLIP可以实现以图搜图的效果,在此基础上,作者还尝试在文本的限制条件下,进行以图搜图。上面的示例中,图像仍然是一张空旷的街景图,而文本则是“cars”,通过联合检索,可以得到右边三张包含车辆的接近图,效果也非常不错。

对于长文本,可能包含多个实体名词,那么对于检索的结果,如何知道检索的依据是什么呢?所以除了检索外,作者还提供了CLIP文本的可视化分析,以增强模型的后验可解释性。单词的权重来自于CLIP模型中的文本编码器里multi-head attention模块的权重,来可视化文本中每一个词汇的重要性(注:关于attention的权重是否是有效的可解释性方法还有待商榷)。以下是作者提供的可视化例子。

可视化 

检索文本:“A woman holding an umbrella standing next to a man in a rainy day”

Image

检索文本:“A red flower is under the blue sky and there is a bee on the flower”

Image

从作者提供的两个例子中,可以看到,文本中只有部分单词得到了较高的权重,这些单词基本对应了图像中的物体。

讨论

目前,多模态检索、预训练模型受到越来越多的关注,在知乎上也引起关于“视频搜索会成为新的趋势吗”的讨论,CLIP在多模态迈出了第一步,即在大规模数据的情况下,模型对于图像和文本的学习能力会很很大的提升。相较于学术界常见的图文匹配数据集中,文本通常非常具像化地描述了图像中出现的各种物体,CLIP使用的文本数据噪声更大,而在实际测试阶段,也可以发现,CLIP对于一些偏风格的抽象文本也能够检索出不错的结果。CLIP预计也会成为多模态领域一个重要的baseline。

视频搜索会成为新的趋势吗?

https://www.zhihu.com/question/444565876/answer/1733424884

此外,近期除了OpenAI的CLIP模型外,还有很多多模态的论文或项目提出,比如南大开源了CPD模型,微软开源的ClipBERT(这里的Clip与上文的CLIP无关),还有结合CLIP与StyleGAN来实现图像编辑的StyleCLIP。值得一提的是,同样由OpenAI开源的生成模型DALLE近日也提供了官方代码。考虑到实际生活中多模数据(最常见包括图像、语音、文本)的广泛存在,多模态未来预计会有很大应用空间。

CPD:

https://github.com/MCG-NJU/CPD-Video

ClipBERT:

https://github.com/jayleicn/ClipBERT

StyleCLIP:

https://github.com/orpatashnik/StyleCLIP