モデル概要
モデル特徴
モデル能力
使用事例
🚀 【ICLR 2024 🔥】LanguageBind: Extending Video-Language Pretraining to N-modality by Language-based Semantic Alignment
LanguageBindは、言語ベースのセマンティックアラインメントによって、ビデオと言語の事前学習をNモダリティに拡張する手法です。高い性能を発揮し、多様なモダリティのタスクに適用可能です。
【ICLR 2024 🔥】LanguageBind: Extending Video-Language Pretraining to N-modality by Language-based Semantic Alignment
もし当プロジェクトが気に入っていただけたら、最新情報を得るためにGitHubでスター⭐をしていただけると幸いです。
📰 ニュース
- [2024.01.27] 👀👀👀 当社のMoE-LLaVAがリリースされました!30億パラメータのスパースモデルが、70億パラメータの密モデルを上回る性能を発揮します。
- [2024.01.16] 🔥🔥🔥 当社のLanguageBindがICLR 2024に採択されました!こちらで6(3)8(6)6(6)6(6)の評価を獲得しました。
- [2023.12.15] 💪💪💪 当社は💥💥💥 VIDALデータセットを拡張し、現在は1000万件のビデオとテキストのデータを保有しています。LanguageBind_Video 1.5をリリースしましたので、モデルズーをご確認ください。
- [2023.12.10] 当社は💥💥💥 VIDALデータセットを拡張し、現在は1000万件の深度データと1000万件の熱画像データを保有しています。熱画像と深度データをHugging Faceにアップロード中で、全体のプロセスは1~2か月かかる見込みです。
- [2023.11.27] 🔥🔥🔥 当社は論文を緊急ゼロショットの結果で更新しました。✨ 結果をご確認ください。
- [2023.11.26] 💥💥💥 当社はすべてのテキストソースと対応するYouTube IDをこちらでオープンソース化しました。
- [2023.11.26] 📣📣📣 当社は完全にファインチューニングされたビデオと音声をオープンソース化し、再び性能を向上させました。モデルズーをご確認ください。
- [2023.11.22] 当社は完全にファインチューニングされたバージョンをリリース予定で、巨大なバージョンは現在トレーニング中です。
- [2023.11.21] 💥 当社はDATASETS.mdでサンプルデータを公開していますので、興味のある方はコードを修正して独自のデータでトレーニングすることができます。
- [2023.11.20] 🚀🚀🚀 Video-LLaVAは、LanguageBindエンコーダをベースに大規模なビジュアル言語モデルを構築し、🎉SOTAの性能を達成します。
- [2023.10.23] 🎶 LanguageBind-Audioは、🎉🎉🎉5つのデータセットで最先端(SOTA)の性能を達成しました。✨ 結果をご確認ください。
- [2023.10.14] 😱 より強力なLanguageBind-Videoをリリースしました。✨ 結果をご確認ください!ビデオのチェックポイントは🤗 Huggingface Model Hubで更新されました!
- [2023.10.10] 当社はサンプルデータを提供しており、assetsで見つけることができます。また、緊急ゼロショットの使い方についても説明しています。
- [2023.10.07] チェックポイントは🤗 Huggingface Modelで利用可能です。
- [2023.10.04] コードとデモが公開されました!最新の更新情報を得るために、このリポジトリを👀「ウォッチ」していただけると幸いです。
😮 特長
💡 高性能で、中間モダリティを必要としない
LanguageBindは言語を中心としたマルチモーダル事前学習アプローチで、言語を異なるモダリティ間の結びつけとして利用しています。言語モダリティは十分に研究されており、豊富なセマンティクスを含んでいるためです。
- 以下の最初の図は、LanguageBindのアーキテクチャを示しています。LanguageBindは、セグメンテーション、検出タスクに簡単に拡張でき、潜在的に無制限のモダリティに拡張することも可能です。
⚡️ マルチモーダルで、完全にアラインされた大容量のデータセット
当社はVIDAL-10Mを提案しています。これは、ビデオ、赤外線、深度、音声とそれに対応する言語を含む1000万件のデータで、視覚モダリティを超えたデータを大幅に拡張しています。
- 2番目の図は、当社が提案するVIDAL-10Mデータセットを示しており、ビデオ、赤外線、深度、音声、言語の5つのモダリティを含んでいます。
🔥 トレーニングのためのマルチビュー強化記述
当社は言語にマルチビュー強化を施しています。メタデータ、空間、時間を組み合わせたマルチビュー記述を生成し、言語のセマンティック情報を大幅に強化しています。さらに、ChatGPTで言語を強化し、各モダリティの言語をアラインさせるための良好なセマンティック空間を作成しています。
🤗 デモ
- ローカルデモ:LanguageBindが現在サポートしているすべての機能を組み込んだウェブデモを試すことを強くおすすめします。
python gradio_app.py
- オンラインデモ:当社は🤗 Huggingface Spacesでオンラインデモを提供しています。このデモでは、音声と言語、ビデオと言語、深度と画像など、モダリティと言語の類似度を計算することができます。
🛠️ 必要条件とインストール
- Python >= 3.8
- Pytorch >= 1.13.1
- CUDA Version >= 11.6
- 必要なパッケージをインストールします。
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の使い方では、自由に置き換えることができます。完全にファインチューニングされたバージョンを使用することをおすすめします。これは、より強力な性能を提供するためです。
モダリティ | LoRAチューニング | ファインチューニング |
---|---|---|
ビデオ | LanguageBind_Video | LanguageBind_Video_FT |
音声 | LanguageBind_Audio | LanguageBind_Audio_FT |
深度 | LanguageBind_Depth | - |
熱画像 | LanguageBind_Thermal | - |
バージョン | チューニング | モデルサイズ | フレーム数 | HFリンク | MSR-VTT | DiDeMo | ActivityNet | MSVD |
---|---|---|---|---|---|---|---|---|
LanguageBind_Video | LoRA | 大規模 | 8 | リンク | 42.6 | 37.8 | 35.1 | 52.2 |
LanguageBind_Video_FT | 完全チューニング | 大規模 | 8 | リンク | 42.7 | 38.1 | 36.9 | 53.5 |
LanguageBind_Video_V1.5_FT | 完全チューニング | 大規模 | 8 | リンク | 42.8 | 39.7 | 38.4 | 54.1 |
LanguageBind_Video_V1.5_FT | 完全チューニング | 大規模 | 12 | 近日公開 | ||||
LanguageBind_Video_Huge_V1.5_FT | 完全チューニング | 巨大 | 8 | リンク | 44.8 | 39.9 | 41.0 | 53.7 |
LanguageBind_Video_Huge_V1.5_FT | 完全チューニング | 巨大 | 12 | 近日公開 |
🤖 API
当社はすべてのモダリティの前処理コードをオープンソース化しています。 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', # also LanguageBind_Video
'audio': 'LanguageBind_Audio_FT', # also 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 = ["Training a parakeet to climb up a ladder.", 'A lion climbing a tree to catch a monkey.']
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("Video x Text: \n",
torch.softmax(embeddings['video'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
print("Image x Text: \n",
torch.softmax(embeddings['image'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
print("Depth x Text: \n",
torch.softmax(embeddings['depth'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
print("Audio x Text: \n",
torch.softmax(embeddings['audio'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
print("Thermal x Text: \n",
torch.softmax(embeddings['thermal'] @ embeddings['language'].T, dim=-1).detach().cpu().numpy())
すると、以下の結果が返されます。
Video x Text:
[[9.9989331e-01 1.0667283e-04]
[1.3255903e-03 9.9867439e-01]]
Image x Text:
[[9.9990666e-01 9.3292067e-05]
[4.6132666e-08 1.0000000e+00]]
Depth x Text:
[[0.9954276 0.00457235]
[0.12042473 0.8795753 ]]
Audio x Text:
[[0.97634876 0.02365119]
[0.02917843 0.97082156]]
Thermal x Text:
[[0.9482511 0.0517489 ]
[0.48746133 0.5125386 ]]
緊急ゼロショット
LanguageBindは各モダリティを結びつけるため、緊急ゼロショットも見つけました。使い方は非常に簡単です。
print("Video x Audio: \n", torch.softmax(embeddings['video'] @ embeddings['audio'].T, dim=-1).detach().cpu().numpy())
print("Image x Depth: \n", torch.softmax(embeddings['image'] @ embeddings['depth'].T, dim=-1).detach().cpu().numpy())
print("Image x Thermal: \n", torch.softmax(embeddings['image'] @ embeddings['thermal'].T, dim=-1).detach().cpu().numpy())
すると、以下の結果が得られます。
Video x Audio:
[[1.0000000e+00 0.0000000e+00]
[3.1150486e-32 1.0000000e+00]]
Image x Depth:
[[1. 0.]
[0. 1.]]
Image x Thermal:
[[1. 0.]
[0. 1.]]
異なる分岐でのX言語タスク
さらに、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"your/thermal.jpg"], ['your text'], 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"your/depth.png"], ['your text.'], 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' # also '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(["your/video.mp4"], ['your text.'], 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' # also '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"your/audio.wav"], ['your audio.'], return_tensors='pt')
with torch.no_grad():
out = model(**data)
print(out.text_embeds @ out.image_embeds.T)
画像
当社の画像エンコーダはOpenCLIPと同じです。ファインチューニングされていません。
📄 ライセンス
このプロジェクトはMITライセンスの下で公開されています。










