ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入理解 Transformers 中的 CLIPSeg:基于冻结 CLIP 的零样本与一次性图像分割模型

深入理解 Transformers 中的 CLIPSeg:基于冻结 CLIP 的零样本与一次性图像分割模型 深入理解 Transformers 中的 CLIPSeg基于冻结 CLIP 的零样本与一次性图像分割模型【免费下载链接】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导读CLIPSegCLIP Segmentation是 Transformer 库中一个以“文本 / 图像提示驱动图像分割”为核心能力的模型家族。本文以 clipseg 模型文档 为骨架结合 配置源码、建模源码、处理源码 与集成测试系统讲解为什么 CLIPSeg 能在不重新训练分割模型的情况下理解任意提示它的文本、视觉、解码器三大子模块如何组织每个配置项的含义与默认值以及如何仅凭数行代码完成一次零样本zero-shot或一次性one-shot分割推理。读完本文你将能独立加载CIDAS/clipseg-rd64-refined这类检查点并把它接入基于图像生成式文本查询的实际业务。模型概览一份提示、三类分割任务CLIPSeg 由 Timo Lüddecke 与 Alexander Ecker 提出论文题目为Image Segmentation Using Text and Image Prompts于 2021 年 12 月 18 日在 Hugging Face Papers 发布并在此后2022 年 11 月 8 日正式合入 Transformers 代码库。它的核心思想非常直接在冻结的 CLIP 骨干之上添加一个极小的 Transformer 解码器从而实现零样本与一次性图像分割。传统图像分割通常针对固定的类别集合训练想要加入新类别或更复杂的查询就得在包含这些表达的数据集上重新训练。CLIPSeg 的方案是一次训练、随时查询推理阶段允许任意提示prompt提示可以是一段文本也可以是一张图片。由此同一个统一模型可覆盖三种常见分割任务指代表达分割Referring Expression Segmentation用自然语言指代图中某个对象并分割出来零样本分割Zero-shot Segmentation分割训练时从未见过的类别一次性分割One-shot Segmentation用一张查询图片作为示例分割出同类对象。该混合输入设计还支持动态适应任何能用文本或图片表达的二值分割任务包括关于物体 affordance可操作性或属性properties的泛化查询。模型在扩展版 PhraseCut 数据集上训练后能为图像基于自由文本提示或表达查询的附加图像生成二值分割图。事实来源上述信息直接出自 clipseg.md 中论文摘要的转述仓库未对其训练数据集规模做更多声明故本文不补充任何额外性能数字。该模型由 nielsr 贡献到本仓库源码级入口与实现集中在src/transformers/models/clipseg/目录下。架构解读冻结的 CLIP 骨干 轻量 Transformer 解码器从源码结构看src/transformers/models/clipseg/目录将 CLIPSeg 拆成了清晰的三层结构模块文件职责配置类configuration_clipseg.py定义文本、视觉、整体三类 Config模型类modeling_clipseg.py双塔编码器、解码器与前向逻辑处理器processing_clipseg.py将文本与图像统一打包成模型输入转换脚本convert_clipseg_original_pytorch_to_hf.py官方原始权重转换工具模型相关的模块化源文件为 modular_clipseg.py该文件会自动生成上面的建模与配置文件文件头注释明确提示不要手动编辑生成产物。双塔基础模型 CLIPSegModelCLIPSegModel与标准CLIPModel结构一致构成方式是文本塔 视觉塔 投影层。在 modeling_clipseg.py 的构造函数中可以看到self.text_model CLIPSegTextModel(...)文本编码器输出序列级 hidden statesself.vision_model CLIPSegVisionModel(...)视觉编码器ViT 风格 patch embedding Transformer 编码器self.visual_projection与self.text_projection将两塔输出投影到共同的projection_dimself.logit_scale可学习的对比学习缩放参数初始值取logit_scale_init_value默认 2.6592。CLIPSegModel对外暴露三个主要方法forward计算图像与文本的相似度 logits可用于训练对比学习损失get_text_features返回文本侧特征供条件 embedding 使用get_image_features返回图像侧特征视觉塔前向的正式入口。当作为分割模型使用时CLIP 双塔几乎全程处于torch.no_grad()冻结状态只有新增的轻量解码器参与梯度计算这是 CLIPSeg 最小解码器 冻结骨干设计的直接体现。文本子模型 CLIPSegTextModelCLIPSegTextModel以input_ids为唯一必选输入内部流程为token embedding → causal mask 的 Transformer encoder → final LayerNorm → 取EOS token位置向量作为pooler_output。实现细节见 modeling_clipseg.py中有一处值得注意的历史处理若配置中eos_token_id 2PR #24773 之前的旧行为会退回到取序列最大 token id位置的老逻辑否则按第一个等于eos_token_id的位置取值以兼容 tokenizer 新增 token 的场景。默认文本配置CLIPSegTextConfig对应 CLIP 风格vocab_size49408、hidden_size512、intermediate_size2048、num_hidden_layers12、num_attention_heads8、max_position_embeddings77、激活函数为quick_gelu、pad_token_id1、bos_token_id49406、eos_token_id49407。视觉子模型 CLIPSegVisionModelCLIPSegVisionModel以pixel_values为输入流程为patch embedding含 class token→ pre LayerNorm → Transformer encoder → 取 CLS token 做 post LayerNorm 得到pooler_output。默认视觉配置CLIPSegVisionConfighidden_size768、image_size224、patch_size32、num_hidden_layers12、num_attention_heads12这也是 CLIP ViT-B/32 的规格。视觉塔前向支持interpolate_pos_encoding参数默认True允许把预训练的位置编码插值到更高分辨率输入上使用——集成测试 test_inference_interpolate_pos_encoding 验证了 180×180 分辨率下该能力关闭插值会因 patch 数量不匹配而抛出ValueError开启后则正常输出(1, 26, 768)的 hidden states。分割头 CLIPSegDecoder 与三步前向真正把 CLIPSeg 与纯 CLIP 区分开的是CLIPSegDecoder与CLIPSegForImageSegmentation。CLIPSegForImageSegmentation的前向见 modeling_clipseg.py可归纳为严格的三步流水线冻结视觉塔前向查询图像以torch.no_grad()调用clip.get_image_features同时要求output_hidden_statesTrue按extract_layers默认第 3、6、9 层取出对应激活值并记录pooler_output计算条件 embedding优先使用调用方直接传入的conditional_embeddings否则根据input_ids文本提示或conditional_pixel_values图像提示调用get_conditional_embeddings见 modeling_clipseg.py在no_grad下生成。代码里校验了提示数量必须等于查询图像 batch 数且自定义 embedding 的维度必须等于projection_dim解码器产出 logits把多层视觉激活与条件 embedding 一起送入CLIPSegDecoder得到逐像素二值分割 logits。条件 embedding 的三种来源文档 Usage tips 明确列出正好对应三种输入形态提示形式传入字段说明文本提示input_ids文本经冻结文本塔编码为条件向量图像提示conditional_pixel_values示例图片经冻结视觉塔编码为条件向量用于一次性分割自定义条件conditional_embeddings调用方预先算好的任意条件向量可跳过模型内部计算解码器内部多尺度激活 FiLM 调制 转置卷积上采样CLIPSeg 之所以能输出精细的分割图得益于解码器对多尺度中间层激活的利用。CLIPSegDecoder 的实现要点把extract_layers指定的多层激活逆序处理hidden_states[::-1]每层先用一个线性层reduces[i]把hidden_size压缩到reduce_dim默认 64并逐层累加形成由粗到细的特征在conditional_layer默认 0含义是若为 0 则使用最后一层指定的那一层通过FiLMFeature-wise Linear Modulation把条件向量注入特征film_mul生成逐通道缩放、film_add生成逐通道偏移两者与激活相乘相加实现条件调制主干特征的效果每步累加结果送入一个CLIPSegDecoderLayer。该层与编码层唯一的区别是归一化放在残差之后post-layer norm见 modeling_clipseg.py这是解码器在结构上区别于编码器的核心最后移除 CLS token、把序列重排成(batch, reduce_dim, h, w)的空间网格再用转置卷积上采样回图像分辨率输出单通道 logits。转置卷积有两档实现由配置开关use_complex_transposed_convolution控制默认False简单版是一个reduce_dim → 1、kernel/stride 等于patch_size的单层ConvTranspose2d复杂版则叠加了 3×3 卷积与两层 ReLU 转置卷积的级联kernel 尺寸取patch_size // 4以支持更细粒度的分割上采样。当labels二值掩码shape(batch, height, width)存在时模型用BCEWithLogitsLoss计算分割损失——因此同一模型既能推理也能在自有数据上做二值分割微调。配置体系从单 Config 到三 ConfigCLIPSeg 遵循复合 Config设计整体CLIPSegConfig内部持有text_config与vision_config两个子配置源码见 configuration_clipseg.py。构造时可以只给CLIPSegConfig()两个子配置自动取默认值并打印日志也可以显式传入两个子 Config 实例from transformers import CLIPSegConfig, CLIPSegTextConfig, CLIPSegVisionConfig config_text CLIPSegTextConfig() config_vision CLIPSegVisionConfig() config CLIPSegConfig(text_configconfig_text, vision_configconfig_vision)向后兼容层面__post_init__还会处理历史参数text_config_dict/vision_config_dict若某个键同时出现在旧字典与新 Config 中且值不同以旧字典为准并打印日志提示。CLIPSegConfig独有的、与分割任务强相关的参数如下configuration_clipseg.py参数默认值作用extract_layers[3, 6, 9]从冻结视觉骨干提取中间激活的层号列表解码器据此获得多尺度信息reduce_dim64每层视觉 embedding 压缩后的维度decoder_num_attention_heads4解码器各层自注意力的头数decoder_attention_dropout0.0解码器注意力 dropoutdecoder_hidden_actquick_gelu解码器 MLP 的激活函数配置解码层内部层归一化配置还会将 MLP 激活硬编码为reludecoder_intermediate_size2048解码器 MLP 中间维度conditional_layer0应用 FiLM 调制的编码层序号0 表示最后一层use_complex_transposed_convolutionFalse是否使用级联的多级转置卷积做更细粒度上采样projection_dim512文本/视觉投影到的公共对比学习维度logit_scale_init_value2.6592对比学习 logit 缩放的初始化值在 CLIPSegDecoder 构造中解码器会深拷贝vision_config再覆写hidden_sizereduce_dim、num_attention_headsdecoder_num_attention_heads、intermediate_sizedecoder_intermediate_size因此extract_layers、reduce_dim与视觉塔patch_size的数值会直接影响最终 logits 的空间分辨率与感受野。Processor把文本与图像统一打包CLIPSegProcessor见 processing_clipseg.py同时持有文本 tokenizer 与图像 image processor。__call__方法的组合逻辑覆盖了推理的全部四种场景text images文本提示分割查询图 → 输出input_ids、attention_mask、pixel_valuesvisual_prompt images一次性one-shot提示分割 → 输出pixel_values与conditional_pixel_values仅传 text 或 visual_prompt 时返回对应单项编码三者全空或 text 与 visual_prompt 同时给出都会抛出ValueError强制文本提示与图像提示二选一。由于同一批图片会被图像处理器执行相同的尺寸归一化文本提示与图像提示可以自由切换而无需改动下游模型代码。开箱即用的推理示例官方文档给出的端到端零样本分割示例如下可在transformers安装环境中直接运行import torch from transformers import AutoProcessor, CLIPSegForImageSegmentation from transformers.image_utils import load_image processor AutoProcessor.from_pretrained(CIDAS/clipseg-rd64-refined) model CLIPSegForImageSegmentation.from_pretrained(CIDAS/clipseg-rd64-refined) url http://images.cocodataset.org/val2017/000000039769.jpg image load_image(url) texts [a cat, a remote, a blanket] inputs processor(texttexts, images[image] * len(texts), paddingTrue, return_tensorspt) with torch.inference_mode(): outputs model(**inputs) logits outputs.logits print(logits.shape) # torch.Size([3, 352, 352])几个关键点官方与社区最常用的检查点是CIDAS/clipseg-rd64-refinedrd64即reduce_dim64架构的命名来源CLIPSegForImageSegmentation通过AutoProcessor 类名直接加载无需手工拼装 tokenizer/image processor同一条image被重复len(texts)次后与各文本一一配对模型为每个图, 文本对输出一张352×352的 logits 掩码本尺寸来自检查点内置的图像预处理与解码器上采样配置而非模型 docstring 中数值的臆测——集成测试 test_inference_image_segmentation 用同一检查点精确断言了(3, 352, 352)的输出形状与 logits 取值把 logits 过 Sigmoid 即得到 0~1 的软掩码可继续做阈值化、叠加到原图、计算目标裁剪框等下游处理若把processor(text..., images...)换成processor(visual_prompt示例图, images查询图, ...)同一套模型即可切换到一次性分割模式。如果想先看清CLIPSegForImageSegmentation输出对象的完整字段其返回类型CLIPSegImageSegmentationOutputmodeling_clipseg.py包含loss可选传入 labels 时返回 BCE 损失、logits、conditional_embeddings、pooled_output、vision_model_output与decoder_output。纯文本与纯视觉子模型也可独立加载——例如 CLIPSegTextModel 的 docstring 示例演示了如何仅用 tokenizer 提取pooler_output。支持的注意力实现与质量保障CLIPSegPreTrainedModelmodeling_clipseg.py继承自PreTrainedModel并声明了多项现代能力支持 gradient checkpointing、SDPA_supports_sdpa True、Flash Attention 与 Flex Attention_supports_flash_attn/_supports_flex_attn以及基于ALL_ATTENTION_FUNCTIONS的注意力后端选择_no_split_modules保证了其在设备并行、TP 等场景下可以正确切分。模型自带的自定义初始化_init_weights遵循 OpenAI CLIP 风格的缩放规则。模型的回归质量由 tests/models/clipseg/test_modeling_clipseg.py 覆盖包括三套 TesterCLIPSegVisionModelTester、CLIPSegTextModelTester、CLIPSegModelTester对应文本/视觉/完整模型以及继承自ModelTesterMixin/PipelineTesterMixin的通用能力测试forward signature、gradient checkpointing、hidden states、SDPA 编译、feature-extractionpipeline 映射等。两个slow集成测试直接以真实权重做端到端数值对齐可作为接入新输入前自行校验的参考基线。CLIPSegModel同时也被注册为feature-extractionpipeline 的支持模型而图像分割任务通常更适合直接调用CLIPSegForImageSegmentation类以获得掩码输出。总结CLIPSeg 在 Transformers 中的落地形态可概括为一句话冻结的 CLIP 双塔负责把任意文本/图片提示翻译成条件向量一个后置归一化的轻量 Transformer 解码器用 FiLM 把这些条件调制进多尺度视觉特征最终由转置卷积上采样为二值分割图。整个实现被井井有条地拆分为配置CLIPSegConfig及双子配置、模型CLIPSegModel/CLIPSegForImageSegmentation与处理CLIPSegProcessor三部分无论做零样本文本分割、一次性示例分割还是自定义条件向量的特殊分割任务都可以用同一套 API 完成且无需任何针对新类别的重新训练。深入阅读时建议按 模型文档 → 配置源码 → 建模源码 → 集成测试 的顺序从对外用法逐步下沉到数值如何产生能获得对该模型最完整的理解。【免费下载链接】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),仅供参考
返回列表