
通过语言绑定实现跨模态语义对齐
LanguageBind是一种基于语言的多模态预训练方法,通过语言将不同模态进行语义关联。该方法引入了VIDAL-10M数据集,包含1000万条视频、红外、深度、音频及对应语言数据。通过多视角增强的语言描述训练,LanguageBind在多个跨模态任务上实现了先进性能,无需中间模态即可完成跨模态语义对齐。
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
大型视觉语言模型的专家混合:MoE-LLaVA <br> 林斌、唐振宇、叶阳、崔嘉熙、朱斌、金鹏、张俊武、宁沐楠、袁礼 <br>
![]()
![]()
<br>
</p></details>Video-Bench: 评估基于视频的大型语言模型的综合基准和工具包 <br> 宁沐楠、朱斌、谢雨佳、林斌、崔嘉熙、袁路、陈东东、袁礼 <br>
![]()
![]()
<br>
LanguageBind是一种以语言为中心的多模态预训练方法,以语言作为不同模态之间的纽带,因为语言模态已被充分探索并包含丰富的语义。
我们提出了VIDAL-10M,1000万条数据包含视频、红外、深度、音频及其对应的语言,极大地扩展了视觉模态之外的数据。
我们对语言进行 了多视角增强。我们生成了结合元数据、空间和时间的多视角描述,极大地增强了语言的语义信息。此外,我们进一步用ChatGPT增强语言,为每个模态对齐的语言创建了良好的语义空间。
<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/8ddcb1e2-7f76-4f29-a1d5-616ec09d8e0d.jpg" width=100%> </p> <p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/fcce7e3a-ba2b-44f8-9c6a-eb04c6b681f1.jpg" width=99%> </p>python gradio_app.py
LanguageBind在四个数据集上实现了最先进的(SOTA)性能,*表示完全微调的结果。
<p align="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/e024488a-8c51-4a86-9902-d2f2a90249d4.jpg" width=80%> </p> ### 多模态 视频-语言、红外-语言、深度-语言和音频-语言零样本分类,*表示全量微调的结果。 <p align="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/cc18020d-8c6a-443e-9360-3d43d29d06fb.jpg" width=80%> </p> 我们报告了文本到音频的检索结果,*表示全量微调的结果。 <p align="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/a28cbaa1-17d7-4aab-a15f-b7a43ae54f46.jpg" width=35%> </p>git clone https://github.com/PKU-YuanGroup/LanguageBind cd LanguageBind pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116 pip install -r requirements.txt
表格中的名称代表不同的编码器模型。例如,LanguageBind/LanguageBind_Video_FT代表全量微调版本,而LanguageBind/LanguageBind_Video代表LoRA微调版本。
您可以在推荐的API使用中自由替换它们。我们建议使用全量微调版本,因为它提供更强的性能。
<div align="center"> <table border="1" width="100%"> <tr align="center"> <th>模态</th><th>LoRA微调</th><th>全量微调</th> </tr> <tr align="center"> <td>视频</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video">LanguageBind_Video</a></td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video_FT">LanguageBind_Video_FT</a></td> </tr> <tr align="center"> <td>音频</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Audio">LanguageBind_Audio</a></td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Audio_FT">LanguageBind_Audio_FT</a></td> </tr> <tr align="center"> <td>深度</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Depth">LanguageBind_Depth</a></td><td>-</td> </tr> <tr align="center"> <td>热成像</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Thermal">LanguageBind_Thermal</a></td><td>-</td> </tr> </table> </div> <div align="center"> <table border="1" width="100%"> <tr align="center"> <th>版本</th><th>微调</th><th>模型大小</th><th>帧数</th><th>HF链接</th><th>MSR-VTT</th><th>DiDeMo</th><th>ActivityNet</th><th>MSVD</th> </tr> <tr align="center"> <td>LanguageBind_Video</td><td>LoRA</td><td>Large</td><td>8</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video">链接</a></td><td>42.6</td><td>37.8</td><td>35.1</td><td>52.2</td> </tr> <tr align="center"> <td>LanguageBind_Video_FT</td><td>全量微调</td><td>Large</td><td>8</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video_FT">链接</a></td><td>42.7</td><td>38.1</td><td>36.9</td><td>53.5</td> </tr> <tr align="center"> <td>LanguageBind_Video_V1.5_FT</td><td>全量微调</td><td>Large</td><td>8</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video_V1.5_FT">链接</a></td><td>42.8</td><td>39.7</td><td>38.4</td><td>54.1</td> </tr> <tr align="center"> <td>LanguageBind_Video_V1.5_FT</td><td>全量微调</td><td>Large</td><td>12</td><td>即将推出</td> </tr> <tr align="center"> <td>LanguageBind_Video_Huge_V1.5_FT</td><td>全量微调</td><td>Huge</td><td>8</td><td><a href="https://huggingface.co/LanguageBind/LanguageBind_Video_Huge_V1.5_FT">链接</a></td><td>44.8</td><td>39.9</td><td>41.0</td><td>53.7</td> </tr> <tr align="center"> <td>LanguageBind_Video_Huge_V1.5_FT</td><td>全量微调</td><td>Huge</td><td>12</td><td>即将推出</td> </tr> </table> </div>我们开源了所有模态的预处理代码。 如果您想从Huggingface的模型仓库或本地加载模型(例如 LanguageBind/LanguageBind_Thermal),可以使用以下代码片段!
我们在assets中提供了一些示例数据集,以快速查看languagebind的工作原理。
import torch from languagebind import LanguageBind, to_device, transform_dict, LanguageBindImageTokenizer if __name__ == '__main__': device = 'cuda:0' device = torch.device(device) clip_type = { 'video': 'LanguageBind_Video_FT', # 也可以是LanguageBind_Video 'audio': 'LanguageBind_Audio_FT', # 也可以是LanguageBind_Audio 'thermal': 'LanguageBind_Thermal', 'image': 'LanguageBind_Image', 'depth': 'LanguageBind_Depth', } model = LanguageBind(clip_type=clip_type, cache_dir='./cache_dir') model = model.to(device) model.eval() pretrained_ckpt = f'lb203/LanguageBind_Image' tokenizer = LanguageBindImageTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir/tokenizer_cache_dir') modality_transform = {c: transform_dict[c](model.modality_config[c]) for c in clip_type.keys()} image = ['assets/image/0.jpg', 'assets/image/1.jpg'] audio = ['assets/audio/0.wav', 'assets/audio/1.wav'] video = ['assets/video/0.mp4', 'assets/video/1.mp4'] depth = ['assets/depth/0.png', 'assets/depth/1.png'] thermal = ['assets/thermal/0.jpg', 'assets/thermal/1.jpg'] language = ["训练一只鹦鹉爬梯子。", '一只狮子爬树捕猴子。'] inputs = { 'image': to_device(modality_transform['image'](image), device), 'video': to_device(modality_transform['video'](video), device), 'audio': to_device(modality_transform['audio'](audio), device), 'depth': to_device(modality_transform['depth'](depth), device), 'thermal': to_device(modality_transform['thermal'](thermal), device), } inputs['language'] = to_device(tokenizer(language, max_length=77, padding='max_length', truncation=True, return_tensors='pt'), device) with torch.no_grad(): embeddings = model(inputs) print("视频 x 文本:\n", torch.softmax(embeddings['video'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy()) print("图像 x 文本:\n", torch.softmax(embeddings['image'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy()) print("深度 x 文本:\n", torch.softmax(embeddings['depth'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy()) print("音频 x 文本:\n", torch.softmax(embeddings['audio'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy()) print("热成像 x 文本:\n", torch.softmax(embeddings['thermal'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
然后返回以下结果。
视频 x 文本: [[9.9989331e-01 1.0667283e-04] [1.3255903e-03 9.9867439e-01]] 图像 x 文本: [[9.9990666e-01 9.3292067e-05] [4.6132666e-08 1.0000000e+00]] 深度 x 文本: [[0.9954276 0.00457235] [0.12042473 0.8795753 ]] 音频 x 文本: [[0.97634876 0.02365119] [0.02917843 0.97082156]] 热成像 x 文本: [[0.9482511 0.0517489 ] [0.48746133 0.5125386 ]]
由于LanguageBind将每种模态绑定在一起,我们还发现了应急零样本。使用非常简单。
print("视频 x 音频:\n", torch.softmax(embeddings['video'] @ embeddings['audio'].T, dim=-1).detach().cpu().numpy()) print("图像 x 深度:\n", torch.softmax(embeddings['image'] @ embeddings['depth'].T, dim=-1).detach().cpu().numpy()) print("图像 x 热成像:\n", torch.softmax(embeddings['image'] @ embeddings['thermal'].T, dim=-1).detach().cpu().numpy())
然后,你会得到:
视频 x 音频:
[[1.0000000e+00 0.0000000e+00]
[3.1150486e-32 1.0000000e+00]]
图像 x 深度:
[[1. 0.]
[0. 1.]]
图像 x 热成像:
[[1. 0.]
[0. 1.]]
此外,LanguageBind可以拆解成不同的分支来处理不同的任务。请注意,我们没有训练图像,只是从OpenCLIP初始化。
import torch from languagebind import LanguageBindThermal, LanguageBindThermalTokenizer, LanguageBindThermalProcessor pretrained_ckpt = 'LanguageBind/LanguageBind_Thermal' model = LanguageBindThermal.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') tokenizer = LanguageBindThermalTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') thermal_process = LanguageBindThermalProcessor(model.config, tokenizer) model.eval() data = thermal_process([r"你的/热成像.jpg"], ['你的文本'], return_tensors='pt') with torch.no_grad(): out = model(**data) print(out.text_embeds @ out.image_embeds.T)
import torch from languagebind import LanguageBindDepth, LanguageBindDepthTokenizer, LanguageBindDepthProcessor pretrained_ckpt = 'LanguageBind/LanguageBind_Depth' model = LanguageBindDepth.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') tokenizer = LanguageBindDepthTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') depth_process = LanguageBindDepthProcessor(model.config, tokenizer) model.eval() data = depth_process([r"你的/深度.png"], ['你的文本。'], return_tensors='pt') with torch.no_grad(): out = model(**data) print(out.text_embeds @ out.image_embeds.T)
import torch from languagebind import LanguageBindVideo, LanguageBindVideoTokenizer, LanguageBindVideoProcessor pretrained_ckpt = 'LanguageBind/LanguageBind_Video_FT' # 也可以是 'LanguageBind/LanguageBind_Video' model = LanguageBindVideo.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') tokenizer = LanguageBindVideoTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') video_process = LanguageBindVideoProcessor(model.config, tokenizer) model.eval() data = video_process(["你的/视频.mp4"], ['你的文本。'], return_tensors='pt') with torch.no_grad(): out = model(**data) print(out.text_embeds @ out.image_embeds.T)
import torch from languagebind import LanguageBindAudio, LanguageBindAudioTokenizer, LanguageBindAudioProcessor pretrained_ckpt = 'LanguageBind/LanguageBind_Audio_FT' # 也可以是 'LanguageBind/LanguageBind_Audio' model = LanguageBindAudio.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') tokenizer = LanguageBindAudioTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') audio_process = LanguageBindAudioProcessor(model.config, tokenizer) model.eval() data = audio_process([r"你的/音频.wav"], ['你的音频。'], return_tensors='pt') with torch.no_grad(): out = model(**data) print(out.text_embeds @ out.image_embeds.T)
请注意,我们的图像编码器与OpenCLIP相同。没有像其他模态那样进行微调。
import torch from languagebind import LanguageBindImage, LanguageBindImageTokenizer, LanguageBindImageProcessor pretrained_ckpt = 'LanguageBind/LanguageBind_Image' model = LanguageBindImage.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') tokenizer = LanguageBindImageTokenizer.from_pretrained(pretrained_ckpt, cache_dir='./cache_dir') image_process = LanguageBindImageProcessor(model.config, tokenizer) model.eval() data = image_process([r"你的/图像.jpg"], ['你的文本。'], return_tensors='pt') with torch.no_grad(): out = model(**data) print(out.text_embeds @ out.image_embeds.T)
数据集信息在DATASETS.md中。
训练和验证说明在TRAIN_AND_VALIDATE.md中。
如果您发现我们的论文和代码对您的研究有用,请考虑给个星标 :star: 和引用 :pencil:。
@misc{zhu2023languagebind, title={LanguageBind: Extending Video-Language Pretraining to N-modality by Language-based Semantic Alignment}, author={Bin Zhu and Bin Lin and Munan Ning and Yang Yan and Jiaxi Cui and Wang HongFa and Yatian Pang and Wenhao Jiang and Junwu Zhang and Zongwei Li and Cai Wan Zhang and Zhifeng Li and Wei Liu and Li Yuan}, year={2023}, eprint={2310.01852}, archivePrefix={arXiv}, primaryClass={cs.CV} }


职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供 工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号