モデル概要
モデル特徴
モデル能力
使用事例
🚀 【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.]]
異なる言語タスクのためのブランチ
さらに、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ライセンスの下で公開されています。










