使用 Transformers 构建统一视觉语言模型:BLIP 架构、配置与三大任务实战指南
使用 Transformers 构建统一视觉语言模型BLIP 架构、配置与三大任务实战指南【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersBLIPBootstrapping Language-Image Pre-training是一个统一的视觉语言预训练框架在同一套架构内同时支持图像描述生成Image Captioning、视觉问答VQA与图像-文本检索ITM三类任务。本文以 Transformers 仓库中 BLIP 的官方文档为主线结合 configuration_blip.py、modeling_blip.py 等源码实现与 test_modeling_blip.py 中的集成测试系统讲解 BLIP 的设计思想、配置体系、处理器管线以及三类任务的推理与微调实战帮助你直接上手把 BLIP 用于自己的多模态应用。BLIP 是什么一个兼顾理解与生成的视觉语言预训练框架BLIP 模型由 Junnan Li、Dongxu Li、Caiming Xiong、Steven Hoi 在论文BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation论文链接中提出。与以往大多只在理解类或生成类任务上表现优异的预训练模型不同BLIP 是一个能够灵活迁移到视觉语言理解与生成两类任务的统一框架。BLIP 的核心思想是利用带噪 Web 数据的自举Bootstrapping策略由 Captioner 为网络图片生成合成描述再由 Filter 过滤掉噪声描述从而高效利用大规模、弱监督的图文对数据。根据论文摘要这一方法在多项基准上带来了可观的提升图像-文本检索平均召回率Recall1提升 2.7%图像描述生成CIDEr 指标提升 2.8%视觉问答VQA 分数提升 1.6%同时BLIP 在零样本迁移到视频-语言任务时也展现出较强的泛化能力。BLIP 可以完成的核心多模态任务包括视觉问答Visual Question Answering给定图片与问题生成答案图像-文本检索Image-Text Retrieval / Image-Text Matching判断图文对是否匹配或计算图文相似度图像描述生成Image Captioning为图片生成自然语言描述。在 Transformers 中该模型的实现由 ybelkada官方也提供了在自定义数据集上微调 BLIP 做图像描述生成的 Jupyter Notebook 资源。架构总览视觉编码器 文本编码器/解码器的组合从 modeling_blip.py 的源码结构可以看出BLIP 家族由三个基础子模块组成BlipVisionModel基于 Vision TransformerViT的视觉编码器将图像编码为视觉特征序列。其main_input_name为pixel_values内部包含BlipVisionEmbeddingsPatch 嵌入 位置编码、BlipEncoder12 层 Transformer Encoder与post_layernorm层归一化见 modeling_blip.py。BlipTextModel基于 BERT 结构的文本模型支持自注意力与交叉注意力cross-attention既可充当文本编码器也可作为解码器的一部分实现于 modeling_blip_text.py。BlipTextLMHeadModel在文本模型之上叠加语言建模输出头LM Head用于生成式任务实现于 modeling_blip_text.py。在视觉分支中BlipVisionEmbeddings采用nn.Conv2d将图像切分为 patch 并线性投影modeling_blip.py默认image_size384、patch_size16得到 24×24576 个 patch 加上 1 个 class token共 577 个位置。它还实现了interpolate_pos_encoding方法支持对位置编码做双三次插值从而在更高分辨率输入下仍可使用预训练权重modeling_blip.py。三个任务模型以不同方式组合这些子模块任务模型组成用途BlipForConditionalGeneration视觉编码器 文本解码器图像描述生成BlipForQuestionAnswering视觉编码器 文本编码器 文本解码器视觉问答BlipForImageTextRetrieval视觉编码器 文本编码器 ITM 分类头图像-文本匹配/检索此外BlipModel作为双塔dual-encoder模型通过对比学习contrastive loss训练图文嵌入的对齐提供get_text_features、get_image_features、get_multimodal_features与forward返回logits_per_image、logits_per_text。需要说明的是源码中标注BlipModel未来版本将被弃用deprecated建议按任务选择上述三个专用模型modeling_blip.py。配置体系BlipConfig、BlipTextConfig 与 BlipVisionConfigBLIP 采用总配置 子配置的设计BlipConfig是总配置通过sub_configs {text_config: BlipTextConfig, vision_config: BlipVisionConfig}将文本子配置与视觉子配置组合在一起见 configuration_blip.py。BlipTextConfig文本子配置BlipTextConfig的model_type为blip_text_model默认值如下configuration_blip.py参数默认值说明vocab_size30524词表大小hidden_size768隐藏层维度encoder_hidden_size768交叉注意力中编码器视觉隐藏维度intermediate_size3072FFN 中间层维度projection_dim768投影层输出维度num_hidden_layers12Transformer 层数num_attention_heads8注意力头数max_position_embeddings512最大序列长度hidden_actgelu激活函数layer_norm_eps1e-12LayerNorm 精度hidden_dropout_prob/attention_probs_dropout_prob0.0各层 Dropoutbos_token_id30522起始符eos_token_id2结束符pad_token_id0填充符sep_token_id102分隔符is_decoderTrue作为解码器使用use_cacheTrue生成时使用 KV 缓存tie_word_embeddingsTrue输入输出嵌入共享label_smoothing0.0损失计算时的标签平滑系数取值 [0.0, 1.0]0.0 表示不平滑注意文本子配置的label_smoothing参数来自Rethinking the Inception Architecture for Computer Vision中提出的标签平滑思想训练时可将目标分布与均匀分布混合。BlipVisionConfig视觉子配置BlipVisionConfig的model_type为blip_vision_model默认值如下configuration_blip.py参数默认值说明hidden_size768视觉隐藏层维度intermediate_size3072FFN 中间层维度projection_dim512投影层输出维度num_hidden_layers12Transformer 层数num_attention_heads12注意力头数image_size384输入图像尺寸patch_size16Patch 尺寸hidden_actgelu激活函数layer_norm_eps1e-5LayerNorm 精度attention_dropout0.0注意力 Dropoutinitializer_range1e-10初始化范围BlipConfig总配置BlipConfig的model_type为blip额外提供configuration_blip.pyprojection_dim默认 512图文投影层的目标维度logit_scale_init_value默认 2.6592对比学习相似度 logit 缩放的初始值image_text_hidden_size默认 256图像-文本融合层的隐藏维度label_smoothing默认 0.0总配置级别的标签平滑tie_word_embeddings默认 Trueinitializer_factor默认 1.0与initializer_range默认 0.02权重初始化相关。在__post_init__中若text_config/vision_config为None则自动用默认子配置填充若传入 dict 则实例化为对应子配置类同时会强制text_config.encoder_hidden_size vision_config.hidden_size保证文本分支交叉注意力与视觉分支维度一致。配置使用示例from transformers import BlipConfig, BlipTextConfig, BlipVisionConfig, BlipModel # 方式一直接使用默认配置初始化 configuration BlipConfig() model BlipModel(configuration) # 方式二分别初始化文本与视觉子配置再组合成总配置 config_text BlipTextConfig() config_vision BlipVisionConfig() config BlipConfig(text_configconfig_text, vision_configconfig_vision)数据预处理BlipProcessor 与图像处理器BlipProcessor是一个组合处理器ProcessorMixin同时封装了图像处理器与分词器tokenizer负责把原始图片和文本统一转换成模型输入实现于 processing_blip.py。初始化时会强制tokenizer.return_token_type_ids False因为 BLIP 输入不需要 token type idsunused_input_names返回[token_type_ids]。文本侧的默认预处理参数BlipProcessorKwargs._defaults包括add_special_tokensTrue、paddingFalse、return_overflowing_tokensFalse、return_offsets_mappingFalse、return_token_type_idsFalse等。图像侧由BlipImageProcessor负责实现于 image_processing_blip.py其默认行为重采样方式双三次插值BICUBIC归一化均值/方差使用 OpenAI CLIP 的统计值OPENAI_CLIP_MEAN/OPENAI_CLIP_STD目标尺寸{height: 384, width: 384}预处理流水线do_resize缩放到 384×384、do_rescale像素值缩放到 [0,1]、do_normalize按 CLIP 均值方差归一化、do_convert_rgb统一转为 RGB。仓库中还有BlipImageProcessorFast对应快速图像处理器类文档中同样以preprocess方法导出与基于 PIL 后端的BlipImageProcessorPil见 image_processing_pil_blip.py参数与上述保持一致。实际使用中通常直接通过AutoProcessor.from_pretrained(...)加载处理器例如from transformers import AutoProcessor processor AutoProcessor.from_pretrained(Salesforce/blip-image-captioning-base) inputs processor(imagesimage, textA picture of, return_tensorspt)实战一图像描述生成BlipForConditionalGenerationBlipForConditionalGeneration由视觉编码器BlipVisionModel与文本解码器BlipTextLMHeadModel构成modeling_blip.py。其工作方式为视觉编码器先编码图像得到image_embeds文本解码器以该视觉特征为交叉注意力的encoder_hidden_states进行自回归生成。推理示例from PIL import Image import httpx from io import BytesIO from transformers import AutoProcessor, BlipForConditionalGeneration processor AutoProcessor.from_pretrained(Salesforce/blip-image-captioning-base) model BlipForConditionalGeneration.from_pretrained(Salesforce/blip-image-captioning-base) url http://images.cocodataset.org/val2017/000000039769.jpg with httpx.stream(GET, url) as response: image Image.open(BytesIO(response.read())) # 仅输入图像解码器从 [BOS] 标记开始生成描述 inputs processor(imagesimage, return_tensorspt) outputs model.generate(**inputs) print(processor.decode(outputs[0], skip_special_tokensTrue)) # 例如输出two cats sleeping on a couch要点说明若不传input_idsgenerate内部会构造以bos_token_id30522起始、以eos_token_id2结尾的初始序列modeling_blip.py并以sep_token_id102作为生成结束符若要引导生成可传入前缀文本例如processor(imagesimage, textA picture of, ...)解码器会延续该提示继续生成interpolate_pos_encodingTrue时允许输入非 384×384 的任意尺寸图像内部通过位置编码插值实现。微调训练与标准语言模型微调类似传入labels即可计算解码器的语言建模损失reductionmeaninputs processor(imagesimage, textcaption, return_tensorspt) inputs[labels] inputs[input_ids] outputs model(**inputs) loss outputs.loss # 语言建模损失 loss.backward()forward返回的BlipForConditionalGenerationModelOutput包含loss、logits、image_embeds、last_hidden_state、hidden_states与attentions等字段modeling_blip.py。在集成测试 test_modeling_blip.py 中官方验证了纯图像输入与带上下文输入两种场景下的生成 token 序列并测试了 fp16 精度下的生成一致性test_inference_interpolate_pos_encoding则验证了将image_processor.size改为 500×500 并开启位置编码插值后依然能稳定生成描述。实战二视觉问答BlipForQuestionAnsweringBlipForQuestionAnswering由三部分组成视觉编码器、文本编码器BlipTextModel不使用池化层与文本解码器BlipTextLMHeadModelmodeling_blip.py。流程为视觉编码器编码图片 → 文本编码器结合图片特征与问题做交叉注意力编码 → 文本解码器生成答案。from PIL import Image import httpx from io import BytesIO from transformers import AutoProcessor, BlipForQuestionAnswering model BlipForQuestionAnswering.from_pretrained(Salesforce/blip-vqa-base) processor AutoProcessor.from_pretrained(Salesforce/blip-vqa-base) url http://images.cocodataset.org/val2017/000000039769.jpg with httpx.stream(GET, url) as response: image Image.open(BytesIO(response.read())) # 推理给定图片 问题生成答案 text How many cats are in the picture? inputs processor(imagesimage, texttext, return_tensorspt) outputs model.generate(**inputs) print(processor.decode(outputs[0], skip_special_tokensTrue)) # 例如输出2训练时需同时提供问题与答案标签labels 已右移无需手动 shifttext How many cats are in the picture? label 2 inputs processor(imagesimage, texttext, return_tensorspt) labels processor(textlabel, return_tensorspt).input_ids inputs[labels] labels outputs model(**inputs) loss outputs.loss loss.backward()注意forward要求必须提供decoder_input_ids或labels否则会抛出ValueErrormodeling_blip.py。generate内部会将问题编码结果作为解码器的交叉注意力输入并从bos_token_id开始生成以sep_token_id结束。实战三图像-文本检索 / 匹配BlipForImageTextRetrievalBlipForImageTextRetrieval用于判断给定图文对是否匹配由视觉编码器、文本编码器、视觉/文本投影层vision_proj、text_proj输出维度为image_text_hidden_size以及二分类的 ITM 头itm_head输出维度 2构成modeling_blip.py。from PIL import Image import httpx from io import BytesIO from transformers import AutoProcessor, BlipForImageTextRetrieval model BlipForImageTextRetrieval.from_pretrained(Salesforce/blip-itm-base-coco) processor AutoProcessor.from_pretrained(Salesforce/blip-itm-base-coco) url http://images.cocodataset.org/val2017/000000039769.jpg with httpx.stream(GET, url) as response: image Image.open(BytesIO(response.read())) text an image of a cat inputs processor(imagesimage, texttext, return_tensorspt) outputs model(**inputs) # outputs.itm_score图像-文本匹配得分forward的关键参数是use_itm_head默认True当use_itm_headTrue时使用 ITM 二分类头输出图文匹配分数modeling_blip.py当use_itm_headFalse时退化为计算图像特征与文本特征的归一化内积余弦相似度可用于大规模图文检索排序modeling_blip.py。在集成测试 test_modeling_blip.py 中官方对 A woman and her dog sitting in a beach 与图片的匹配结果做了断言开启 ITM 头时 softmax 后的得分为[0.0029, 0.9971]即不匹配/匹配二分类概率关闭 ITM 头时相似度分数约为0.5162。补充BlipTextModel 与 BlipVisionModel 独立使用除了三个任务模型BlipTextModel与BlipVisionModel也可独立使用如提取图文特征。BlipTextModel的forward支持input_ids、attention_mask、position_ids、inputs_embeds、encoder_embeds、encoder_hidden_states、encoder_attention_mask、past_key_values、use_cache、is_decoder等参数返回带池化输出与交叉注意力的BaseModelOutputWithPoolingAndCrossAttentions实现于 modeling_blip_text.py。BlipVisionModel的forward接收pixel_values与interpolate_pos_encoding返回BaseModelOutputWithPoolingmodeling_blip.py。from transformers import BlipTextConfig, BlipTextModel from transformers import BlipVisionConfig, BlipVisionModel # 使用默认配置初始化随机权重 text_config BlipTextConfig() text_model BlipTextModel(text_config) vision_config BlipVisionConfig() vision_model BlipVisionModel(vision_config)模型检查点与转换脚本本仓库的测试与文档中涉及的官方预训练检查点包括Salesforce/blip-image-captioning-base图像描述生成用于BlipForConditionalGenerationSalesforce/blip-vqa-base视觉问答用于BlipForQuestionAnswering也是BlipTextConfig/BlipVisionConfig/BlipConfig文档中auto_docstring使用的示例检查点Salesforce/blip-itm-base-coco图像-文本匹配用于BlipForImageTextRetrieval。此外仓库提供了 convert_blip_original_pytorch_to_hf.py包含convert_blip_checkpoint函数与rename_key键名映射逻辑可将 Salesforce 原始 PyTorch 检查点转换为 Hugging Face 格式相关测试覆盖见 test_modeling_blip.py 与 test_processing_blip.py。小结BLIP 在 Transformers 中的实现提供了完整且统一的多模态能力通过BlipConfig内含BlipTextConfig与BlipVisionConfig灵活配置双塔结构借助BlipProcessor一键完成图文预处理并由三个任务模型分别支撑图像描述生成、视觉问答与图文检索。无论你是要快速跑通推理、在自定义数据集上微调还是提取图文特征做检索排序都可以从本文给出的示例代码出发进一步阅读 src/transformers/models/blip 下的源码与 tests/models/blip 下的测试用例深入理解其内部实现细节。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考