以文搜图(Text-to-Image Search)是一种利用文本描述来检索相关图像的技术。基于CLIP(Contrastive Language-Image Pre-training)和Chinese-CLIP模型的以文搜图系统在近年来得到了广泛应用和研究。以下是对这两种模型及其应用的概述。
CLIP模型
CLIP是由OpenAI开发的一种多模态模型,能够将图像和文本映射到同一个潜在向量空间中,从而实现跨模态检索。CLIP模型的核心思想是通过对比学习(contrastive learning)来训练模型,使得相似的图像和文本在向量空间中的距离更近,而不相似的图像和文本距离更远。
CLIP的主要特点
-
多模态对齐:CLIP能够同时处理图像和文本,将它们映射到同一个向量空间中。
-
高效检索:通过计算文本和图像向量的相似度,可以快速检索出与文本描述最匹配的图像。
-
广泛应用:CLIP在图像分类、图像生成、图像检索等多个领域都有应用。
Chinese-CLIP模型
Chinese-CLIP是针对中文数据进行优化的CLIP模型版本。它使用大规模的中文图文对进行训练,能够更好地处理中文文本和图像的匹配任务。
Chinese-CLIP的主要特点
-
中文优化:专为中文数据设计,能够更准确地理解和处理中文文本。
-
大规模训练:使用约2亿对中文图文数据进行训练,确保模型在中文环境中的高性能。
-
多样化应用:适用于中文图文检索、零样本图片分类等任务
构建基于CLIP和Chinese-CLIP的以文搜图系统通常包括以下几个步骤:
- 数据准备:
-
收集并清洗图像和对应的文本描述数据。
-
将图像和文本数据进行预处理,生成嵌入向量。
- 模型训练:
-
使用CLIP或Chinese-CLIP模型对图像和文本进行训练,生成图像和文本的嵌入向量。
-
通过对比学习优化模型,使得相似的图像和文本在向量空间中的距离更近。
- 索引和检索:
-
将训练好的图像嵌入向量存储在向量数据库中。
-
对用户输入的文本查询进行向量化,并计算与数据库中图像嵌入向量的相似度。
-
返回相似度最高的图像作为检索结果。
from functools import partial``import json``from multiprocessing.pool import ThreadPool as Pool``import gradio as gr``from utils import *`` `` ``def text2image_gr():` ` ` `examples = [` `["游泳的狗", 20, clip_base, "是"],` `["夜晚盛开的荷花", 20, clip_base, "是"],` `["一个走在公园里的女孩", 20, clip_base, "是"],` `["抱着孩子的男人", 20, clip_base, "是"]` `]`` ` `title = "<h1 align='center'>中文CLIP文到图搜索应用</h1>"`` ` `with gr.Blocks() as demo:` `gr.Markdown(title)` `gr.Markdown(description)` `with gr.Row():` `with gr.Column(scale=1):` `with gr.Column(scale=2):` `text = gr.Textbox(value="戴着眼镜的猫", label="请填写文本", elem_id=0, interactive=True)` `num = gr.components.Slider(minimum=0, maximum=50, step=1, value=8, label="返回图片数(可能被过滤部分)", elem_id=2)` `model = gr.components.Radio(label="模型选择", choices=[clip_base, clip_large, clip_large_336],` `value=clip_base, elem_id=3)` `thumbnail = gr.components.Radio(label="是否返回缩略图", choices=[yes, no],` `value=yes, elem_id=4)` `btn = gr.Button("搜索", )` `with gr.Column(scale=100):` `out = gr.Gallery(label="检索结果为:").style(grid=4, height=200)` `inputs = [text, num, model, thumbnail]` `btn.click(fn=clip_api, inputs=inputs, outputs=out)` `gr.Examples(examples, inputs=inputs)` `return demo`` `` ``if __name__ == "__main__":` `with gr.TabbedInterface(` `[text2image_gr()],` `["文到图搜索"],` `) as demo:` `demo.launch(` `enable_queue=True,``)
由于Chinese-clip库并没有教程构建自己的数据集,这里为了用Chinese-clip库进行微调,将自己构建的数据进行了对齐,其中
Flickr8K-CN数据集已经给出(数据来源https://github.com/bubbliiiing/clip-pytorch)。
Chinese-clip的图片与文本都有一个id,但是下列给出的数据集并没有id。要用Chinese-clip训练自己构建的数据集,必须满足其库的数据集要求。其中Flickr8K-CN的json文件格式如下,image代表图片的路径,caption代表图片的描述。构建自己的数据库,请使用该库下面的process.ipynb。运行后会生成包含id的图片(base_64格式)、生成包含id的文本。
[` `{` `"image": "flickr8k-images/2513260012_03d33305cf.jpg",` `"caption": [` `"A black dog is running after a white dog in the snow .",` `"Black dog chasing brown dog through snow",` `"Two dogs chase each other across the snowy ground .",` `"Two dogs play together in the snow .",` `"Two dogs running through a low lying body of water ."` `]` `},``]
其中利用process.ipynb生成后的文本、图片如下所示。
# 文本形式``{"text_id": 1, "text": "在玩滑板的两个女孩。", "image_ids": [1]}``# 图片tsv格式``id image``1 img的base64格式
经过上述过程,我们已经包含包含图片与文本的tsv、jsonl文件,如下所示。由于训练的时候Chinese-clip这个库需要利用到lmdb数据库,我们需要把下列文件转成其对应的形式。利用如下脚本。
`├── train_imgs.tsv # 图片id & 图片内容``├── train_texts.jsonl # 文本id & 文本内容,连同匹配的图片id列表``├── valid_imgs.tsv``├── valid_texts.jsonl`` ``# DATAPATH代表你创建的文件夹名字,假如你的文件夹叫Flickr8K-CN。其结构可以如下列所示。``Flickr8K-CN` `datasets` `Flickr8K-CN` `├── train_imgs.tsv # 图片id & 图片内容` `├── train_texts.jsonl # 文本id & 文本内容,连同匹配的图片id列表` `├── valid_imgs.tsv` `├── valid_texts.jsonl`` lmdb` `train` `imgs` `pair` `valid`` imgs` `pair`
# 注意你先需要把Chinese-clip拉取下来,本次Demo是基于Chinese-clip构建的。``python cn_clip/preprocess/build_lmdb_dataset.py \` `--data_dir ${DATAPATH}/datasets/${dataset_name}` `--splits train,valid`` ``# 把DATAPATH换成自己的``python cn_clip/preprocess/build_lmdb_dataset.py \` `--data_dir Flickr8K-CN/datasets/Flickr8K-CN` `--splits train,valid
至此,我们已经把自己的数据集构建成Chinese-clip对应的数据格式,还可以进行模型微调。
项目地址:https://github.com/sugarandgugu/Text2Image-Retrieval
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。