如何生成CLIP文本嵌入:深入UniDetector的80组Prompt模板引擎(dump_clip_features_manyprompt.py完整解析)
如何生成CLIP文本嵌入深入UniDetector的80组Prompt模板引擎dump_clip_features_manyprompt.py完整解析【免费下载链接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.项目地址: https://gitcode.com/gh_mirrors/un/UniDetectorUniDetector 是 CVPR 2023 论文《Detecting Everything in the Open World: Towards Universal Object Detection》的开源实现致力于开放世界通用目标检测。它用 CLIP 文本嵌入替代传统检测器的固定分类层从而让模型能检测任意类别。本文带你完整解析其中的核心工具 dump_clip_features_manyprompt.py——一个基于80 组 Prompt 模板批量生成 CLIP 文本嵌入language embeddings的脚本 为什么开放世界检测需要文本嵌入传统 Faster R-CNN 的分类头输出固定数量的类别分数比如 COCO 的 80 类想检测新类别就必须重新训练。UniDetector 的思路是把类别名变成向量用相似度代替分类器。训练侧区域特征与类别文本向量做余弦相似度得到检测分数推理侧换一组类别名换一组.npy嵌入文件检测器就听懂了新类别这一机制由 RoI 分类头 BBoxHeadCLIP 实现它对区域特征和文本嵌入分别做 L2 归一化后做矩阵乘法温度系数 100等价于放大的余弦相似度 也就是说文本嵌入的质量直接决定了开放世界检测的精度——这正是dump_clip_features_manyprompt.py要解决的问题。三步走从标注文件到 .npy 嵌入整个脚本 dump_clip_features_manyprompt.py 不到 140 行流程非常清晰第 1 步提取并清洗类别名脚本读取 COCO/LVIS 格式的标注 JSON--ann参数按id排序取出所有类别名并做两处清洗去掉类别名中的逗号如back pack场景把替换为空格如 LVIS 中cellphone mobile phone这类名称类别顺序严格对应 id 升序这保证了后面生成的嵌入与标注一一对应 ⚠️第 2 步80 组 Prompt 模板展开这是脚本的灵魂。每个类别名会被代入80 个英文句式模板生成 80 个句子。模板列表位于脚本第 12–94 行的prompt_templates中覆盖面相当广模板类型示例基础描述a photo of a {}画质扰动a blurry photo of the {}、a jpeg corrupted photo of a {}艺术形式a painting of a {}、graffiti of a {}、a cartoon {}特殊材质a plushie {}、the origami {}、a plastic {}视角/场景a close-up photo of a {}、a {} in a video game以bench长椅为例它会变成a photo of a bench.、a blurry photo of the bench.、a cartoon bench.……共 80 句。第 3 步CLIP 编码 多 Prompt 平均Manyprompt Averaging对每个类别的 80 个句子用clip.tokenize分词后送入 CLIP 文本编码器默认设备自动选择 GPU/CPU若单次文本数超过 10000 会自动切成两半分别编码再拼接避免显存不足对 80 个句子的向量取平均得到该类别的唯一文本嵌入最后把所有类别的向量垂直拼接用np.save保存为.npy文件。输出形状为(类别数, 嵌入维度)——ViT-B/32 是 512 维RN50 是 1024 维。为什么要多 Prompt 平均单一句式比如只用a photo of a {}会让嵌入偏向某种特定的文字风格80 种表达的平均能显著降低对措辞的敏感度让向量更中立地代表这个物体本身——这就是文件名中manyprompt的含义 如何运行一键生成命令项目已提供运行命令见 README.mdpython scripts/dump_clip_features_manyprompt.py \ --ann path_to_annotation_for_datasets \ --clip_model RN50 \ --out_path path_to_language_embeddings三个参数速查--ann标注文件路径COCO/LVIS 格式 JSON决定生成哪些类别--clip_modelCLIP 模型名。建议用 RN50与 UniDetector 骨干网络 CLIPResNet 保持一致--out_path输出.npy路径留空则只打印不保存生成后嵌入文件如何被检测器加载项目已在clip_embeddings/目录预计算好 4 个常用数据集的嵌入不跑脚本也能直接训练文件对应数据集coco_clip_acname_rn50_manyprompt.npyCOCO80 类objects365_clip_acname_rn50_manyprompt.npyObjects365oid_clip_acname_rn50_manyprompt.npyOpen Imageslvis_v0.5_clip_acname_rn50_manyprompt.npyLVIS v0.5开放世界评测在配置文件中通过zeroshot_path指定路径即可例如 clip_end2end_faster_rcnn_r50_c4_1x_coco.py 中的这一行zeroshot_path./clip_embeddings/coco_clip_acname_rn50_manyprompt.npy加载时见 BBoxHeadCLIP.build_zs_layer会自动做三件事转 float32 张量、转置为(维度, 类别数)、末尾追加一行全零向量作为背景类。多数据集训练时则用 BBoxHeadCLIPPartitioned 支持传入多个.npy列表。常见问题 FAQQ1换了数据集或类别名必须重新生成嵌入吗必须。.npy的行序与标注文件的类别 id 顺序严格绑定类别集合或排序一变就需要重新运行脚本。Q2可以自定义 Prompt 模板吗可以。直接编辑脚本中的prompt_templates列表即可增删句式平均机制会自动适配模板数量。Q3没有 GPU 能跑吗能。脚本会自动回退到 CPU只是速度较慢RN50 规模下数百个类别的 80×N 句子编码在消费级 GPU 上通常几分钟即可完成。Q4输出文件名里acname是什么意思指a photo of a 类别名风格的模板集即 80 组 manyprompt 平均rn50表示使用的 CLIP 主干。小结dump_clip_features_manyprompt.py用不到 140 行代码串起了开放世界检测的关键一环标注类别名 → 80 组 Prompt 展开 → CLIP 编码平均 →.npy嵌入。理解了这套Prompt 模板引擎你就掌握了 UniDetector 检测任意类别的核心密码——文本嵌入即分类器 【免费下载链接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.项目地址: https://gitcode.com/gh_mirrors/un/UniDetector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考