import torch from torch import nn from transformers import AutoConfig from .image.configuration_image import LanguageBindImageConfig from .image.modeling_image import LanguageBindImage from .image.tokenization_image import LanguageBindImageTokenizer from .image.processing_image import LanguageBindImageProcessor from .video.configuration_video import LanguageBindVideoConfig from .video.modeling_video import LanguageBindVideo from .video.tokenization_video import LanguageBindVideoTokenizer from .video.processing_video import LanguageBindVideoProcessor from .depth.configuration_depth import LanguageBindDepthConfig from .depth.modeling_depth import LanguageBindDepth from .depth.tokenization_depth import LanguageBindDepthTokenizer from .depth.processing_depth import LanguageBindDepthProcessor from .audio.configuration_audio import LanguageBindAudioConfig from .audio.modeling_audio import LanguageBindAudio from .audio.tokenization_audio import LanguageBindAudioTokenizer from .audio.processing_audio import LanguageBindAudioProcessor from .thermal.configuration_thermal import LanguageBindThermalConfig from .thermal.modeling_thermal import LanguageBindThermal from .thermal.tokenization_thermal import LanguageBindThermalTokenizer from .thermal.processing_thermal import LanguageBindThermalProcessor config_dict = { 'thermal': LanguageBindThermalConfig, 'image': LanguageBindImageConfig, 'video': LanguageBindVideoConfig, 'depth': LanguageBindDepthConfig, 'audio': LanguageBindAudioConfig } model_dict = { 'thermal': LanguageBindThermal, 'image': LanguageBindImage, 'video': LanguageBindVideo, 'depth': LanguageBindDepth, 'audio': LanguageBindAudio } transform_dict = { 'video': LanguageBindVideoProcessor, 'audio': LanguageBindAudioProcessor, 'depth': LanguageBindDepthProcessor, 'thermal': LanguageBindThermalProcessor, 'image': LanguageBindImageProcessor, } class LanguageBind(nn.Module): def __init__(self, clip_type, use_temp=True, cache_dir='./cache_dir'): super(LanguageBind, self).__init__() self.use_temp = use_temp self.modality_encoder = {} self.modality_proj = {} self.modality_scale = {} self.modality_config = {} for k, v in clip_type.items(): pretrained_ckpt = f'LanguageBind/{v}' model = model_dict[k].from_pretrained(pretrained_ckpt, cache_dir=cache_dir) self.modality_encoder[k] = model.vision_model self.modality_proj[k] = model.visual_projection self.modality_scale[k] = model.logit_scale self.modality_config[k] = model.config self.modality_encoder['language'] = model.text_model self.modality_proj['language'] = model.text_projection self.modality_encoder = nn.ModuleDict(self.modality_encoder) self.modality_proj = nn.ModuleDict(self.modality_proj) def forward(self, inputs): outputs = {} for key, value in inputs.items(): value = self.modality_encoder[key](**value)[1] value = self.modality_proj[key](value) value = value / value.norm(p=2, dim=-1, keepdim=True) if self.use_temp: if key != 'language': value = value * self.modality_scale[key].exp() outputs[key] = value return outputs def to_device(x, device): out_dict = {k: v.to(device) for k, v in x.items()} return out_dict