腾讯WeMM-Embedding:重新定义多模态检索的通用嵌入模型

> WeMM-Embedding 是腾讯微信视觉团队推出的通用多模态嵌入模型家族,支持图文统一表征与跨模态检索。 ## 一、项目背景与痛点 在大模型与多模态应用爆发式增长的今天,文本、图像、视频、音频等异构数据之间的语义对齐成为检索、推荐、问答等场景的核心瓶颈。传统做法通常依赖两套独立的编码器(如CLIP),将文本和图像映射到同一向量空间,但存在以下明显痛点: 1. **模态覆盖不全**:多数模型仅支持图文对,对视频、音频、长文档等多模态输入支持薄弱。 2. **细粒度语义丢失**:CLIP类模型擅长粗粒度匹配(图-文整体),但在细粒度物体、属性、关系、OCR文本等局部语义上表现不佳。 3. **检索精度不足**:在复杂查询(如“穿红色裙子的女孩在跑步”或“包含‘2024年报’字样的PPT截图”)中,现有嵌入模型易产生误匹配。 4. **部署与微调成本高**:很多多模态模型参数量巨大,难以在业务侧快速落地。 WeMM-Embedding 正是针对上述问题,由腾讯微信视觉团队(WeChat Vision Team)开源的一套**通用多模态嵌入模型家族**,旨在提供高精度、多模态、可扩展的语义表征能力。 ## 二、项目核心特性与技术亮点 ### 1. 真正的“多模态”而非“双模态” WeMM-Embedding 不仅支持文本-图像,还支持**视频帧、OCR文本、物体框、属性标签、关系三元组**等多种输入形式。其训练数据覆盖了: - 图文对(Web图像-描述) - 视觉问答(VQA)样本 - 检测/分割任务中的区域-文本对 - 视频-字幕对 这使得模型能够理解“图中有猫,猫旁边有沙发,沙发是蓝色的”这种细粒度空间关系,而非仅仅“图中有猫”。 ### 2. 统一向量空间,支持跨模态检索 所有模态(图像、文本、区域、视频帧)被映射到同一个高维向量空间。这意味着你可以: - 用文本检索图像(文搜图) - 用图像检索文本(图搜文) - 用区域图像检索对应描述(区域-文本匹配) - 用视频帧检索相关文本片段 ### 3. 基于LLM的视觉编码器改进 WeMM-Embedding 采用**视觉编码器 + 大语言模型(LLM)投影层**的结构。与CLIP的简单线性投影不同,它利用LLM的强语义理解能力对视觉特征进行“再解释”,从而提升对复杂查询的鲁棒性。具体来说,视觉token经过视觉编码器后,与文本token一起送入LLM,LLM的输出经过池化得到最终嵌入向量。 ### 4. 多尺寸模型家族,按需选择 项目提供多个规格的模型(如base、large等),用户可根据计算资源与精度需求灵活选择。小模型适合移动端/边缘部署,大模型适合高精度离线索引。 ### 5. 训练策略:对比学习 + 难负样本挖掘 训练过程中采用**InfoNCE对比损失**,并特别设计了难负样本(hard negatives)挖掘策略——例如将同一图像的不同描述作为负样本,或使用OCR文本作为干扰项,迫使模型学习更细致的判别特征。 ## 三、安装与快速上手 ### 环境要求 - Python 3.8+ - PyTorch 1.13+(推荐2.0+) - CUDA 11.7+(GPU训练/推理) ### 安装 bash # 克隆仓库 git clone https://github.com/Tencent/WeMM-Embedding.git cd WeMM-Embedding # 创建虚拟环境(建议) python -m venv wemm_env source wemm_env/bin/activate # 安装依赖 pip install -r requirements.txt ### 模型加载与推理示例 python import torch from PIL import Image from wemm import WeMMModel, load_transform # 加载模型(自动下载权重) model = WeMMModel.from_pretrained("Tencent/wemm-embedding-base") model.eval() # 加载预处理 transform = load_transform(model.config) # 准备数据 image = Image.open("example.jpg").convert("RGB") texts = ["一只橘猫坐在蓝色沙发上", "一个男孩在踢足球", "2024年财务报告图表"] # 编码图像和文本 with torch.no_grad(): image_emb = model.encode_image(image, transform) text_embs = model.encode_text(texts) # 计算相似度 similarities = torch.matmul(text_embs, image_emb.T) print("最匹配的文本:", texts[similarities.argmax()]) ### 批量检索与索引构建 python # 构建文本索引 all_texts = [...] # 你的文本库 with torch.no_grad(): all_text_embs = model.encode_text(all_texts, batch_size=64) # 查询图像 query_image = Image.open("query.jpg") with torch.no_grad(): query_emb = model.encode_image(query_image) # 使用faiss或numpy进行相似度检索 import numpy as np scores = np.dot(all_text_embs.numpy(), query_emb.numpy()) topk = np.argsort(scores)[::-1][:10] ### 微调自定义数据 python # 训练脚本示例(简化版) from wemm import WeMMModel, WeMMTrainer model = WeMMModel.from_pretrained("Tencent/wemm-embedding-base") trainer = WeMMTrainer(model, train_dataset, batch_size=32, lr=1e-5) trainer.train(epochs=3) ## 四、适用场景详解 ### 1. 电商搜索与推荐 - **场景**:用户输入“白色运动鞋,带红色条纹” - **传统模型**:可能匹配到“白鞋”或“红条纹T恤” - **WeMM**:能准确理解颜色+物体+位置关系,返回精准结果 ### 2. 视频内容理解与检索 - 提取视频关键帧,使用WeMM编码帧与字幕,实现“用文字搜索视频片段” - 支持“一个男人在厨房煎蛋”这种动作+场景的查询 ### 3. 多模态RAG(检索增强生成) - 在RAG系统中,将文档中的图像、表格、文字段落统一编码,实现多模态知识库检索 - 大模型生成回答时,可引用相关图像证据 ### 4. 图像-文本跨模态相似度计算 - 用于图片去重、版权检测、内容审核(判断图像是否包含违规文本) ### 5. 视觉问答与对话系统 - 在客服机器人中,用户发送截图,机器人理解截图内容并回答问题 ## 五、与其他同类项目对比 | 模型 | 模态支持 | 细粒度语义 | 参数量 | 开源程度 | 特色 | |------|---------|-----------|--------|----------|------| | **CLIP (OpenAI)** | 图文 | 弱 | 400M | 权重开源 | 经典双塔,粗粒度匹配 | | **SigLIP (Google)** | 图文 | 中 | 400M-2B | 权重开源 | 改进损失函数,更稳定 | | **BLIP-2 (Salesforce)** | 图文 | 中 | 1.2B+ | 权重开源 | 引入Q-Former,多任务 | | **ImageBind (Meta)** | 6种模态 | 中 | 1.3B | 权重开源 | 模态对齐,但非检索优化 | | **Jina CLIP v2** | 图文+OCR | 较强 | 约500M | 权重开源 | 支持多语言,但区域级弱 | | **WeMM-Embedding** | 图文+区域+视频帧 | **强** | 300M-1B | 权重+代码全开源 | 区域级细粒度,LLM增强 | ### 对比分析 - **vs CLIP**:WeMM在细粒度(如“红车旁边的白狗”)上显著优于CLIP,CLIP容易将“红车”和“白狗”分别匹配到单独图像。 - **vs BLIP-2**:BLIP-2更侧重于生成任务,其嵌入表征并非专门为检索优化;WeMM的训练目标就是检索(对比损失)。 - **vs ImageBind**:ImageBind支持模态多,但每种模态的编码器相对独立,跨模态对齐精度不如WeMM在图文细粒度上的表现。 - **vs Jina CLIP v2**:Jina支持OCR文本,但WeMM进一步支持区域级(bounding box)输入,这是Jina不具备的。 ## 六、技术深度解析 ### 模型架构细节 图像输入 → ViT编码器 → 视觉token序列 文本输入 → 文本嵌入层 → 文本token序列 两者拼接 → 送入LLM(如Qwen-1.5B或LLaMA-2)→ 输出联合表示 对LLM输出做池化(mean/CLS)→ 得到最终嵌入向量 关键设计:**视觉token不直接池化,而是先经过LLM的交叉注意力层**。这样LLM可以“理解”图像中的上下文关系,再生成语义向量。 ### 训练数据规模与配方 根据官方技术报告,训练数据约**1亿条多模态样本**,包括: - 公开数据集(CC3M, CC12M, LAION-400M的子集) - 微信业务侧的脱敏图文数据(去除隐私信息) - 自动生成的区域-文本对(使用检测模型+OCR) 训练分两阶段: 1. 预训练:大规模图文对比学习 2. 微调:难负样本+区域级任务(如指代理解) ### 性能评测 在MSCOCO、Flickr30K、Zero-shot分类等基准上,WeMM-Embedding-base在**图像-文本检索**的R@1指标上,比CLIP ViT-L/14高出约**8-12个百分点**(具体数值见官方README)。在**区域-文本检索**任务(如RefCOCO)上,优势更为明显。 ## 七、局限与未来展望 ### 已知局限 1. **语言支持**:目前主要支持中英文,其他语言需额外微调。 2. **视频处理**:虽然支持视频帧,但未提供端到端的视频时序建模(如时间注意力)。 3. **音频模态**:暂不支持音频输入(与ImageBind相比)。 4. **推理速度**:由于使用LLM作为融合器,推理延迟高于纯双塔模型(大约慢2-3倍)。 ### 改进方向 - 引入时序建模,支持真正的视频嵌入 - 支持音频、3D点云等更多模态 - 蒸馏小模型,降低推理成本 - 开放更多语言版本 ## 八、总结与推荐 **WeMM-Embedding 是目前开源社区中少有的、在细粒度多模态检索上做到“工程可用”级别的模型**。它解决了CLIP系模型“看得见但看不清”的痛点,特别适合需要理解图像中物体关系、属性、OCR文字的业务场景。 如果你正在做以下事情,强烈建议尝试: - 电商图片搜索(带属性/颜色/位置描述) - 多模态知识库RAG(图文混合文档) - 视频内容检索(基于帧+字幕) - 视觉问答系统(需要精确理解截图) 项目代码质量高,文档清晰,且由腾讯微信视觉团队持续维护,值得信赖。 > 项目地址:https://github.com/Tencent/WeMM-Embedding
查看工具