尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLO-World Prompt Tuning 实战指南:基于 SimpleYOLOWorldDetector 的 Embedding 化开放词汇检测与提示词调优

YOLO-World Prompt Tuning 实战指南:基于 SimpleYOLOWorldDetector 的 Embedding 化开放词汇检测与提示词调优 人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载本文以 docs/prompt_yolo_world.md 为核心骨架系统讲解 YOLO-World 中去语言模型化的SimpleYOLOWorldDetector它如何用预计算 Embedding文本、图像、图文融合、随机四种来源替代 CLIP 语言编码器完成零样本检测以及如何在保持零样本能力的同时通过Prompt Tuning仅微调提示向量在 COCO 等自定义数据集上提升精度。读完本文你将掌握SimpleYOLOWorldDetector的全部关键参数、.npy提示文件的标准格式与生成方法、两份可复现的 Prompt Tuning 配置的逐段解读以及从训练到评估的完整命令行流程。1. 为什么需要Simple版去掉语言模型的 YOLO-World原版YOLOWorldDetector位于 yolo_world/models/detectors/yolo_world.py在推理时需要通过内置的 CLIP 文本编码器HuggingCLIPLanguageBackbone见 mm_backbone.py将用户输入的自然语言文本实时编码为文本特征。这在零样本场景下灵活但也带来两个问题模型结构里耦合了一个较大的语言模型参数多、部署负担重每次推理都要走一遍文本编码影响速度。因此仓库定义了一个新的基础检测器SimpleYOLOWorldDetector它直接以提示向量prompt embeddings作为语言输入不再包含任何语言模型。语言侧的计算被前置到离线阶段推理时只需要加载一个NxD的 Embedding 张量即可。README 中将其概括为prompt-then-detect范式先把词汇表prompt编码好并参数化进模型再进行高效检测。1.1 四种可用的 Embedding 来源按原文档的定义SimpleYOLOWorldDetector支持的 embeddings 分为四类编号Embedding 来源说明(1)文本 Embedding来自语言模型如 CLIP text encoder对类别文本的编码(2)图像 Embedding来自视觉模型如 CLIP vision encoder对示例图像的编码(3)图文融合 Embedding文本与图像编码的融合结果(4)随机 Embedding随机初始化向量随训练更新其中(1)(2)(3) 支持零样本推理不需要任何训练即可检测对应类别(4) 以及 (1)(2)(3) 都可用于在自定义数据上进行 Prompt Tuning——即把提示向量当作可学习参数用你的数据把提示调得更贴合目标域。2. SimpleYOLOWorldDetector类定义与参数全解原文档给出的基础检测器定义如下仓库实现位于 yolo_world/models/detectors/yolo_world.pyclass SimpleYOLOWorldDetector(YOLODetector): Implementation of YOLO World Series def __init__(self, *args, mm_neck: bool False, num_train_classes80, num_test_classes80, prompt_dim512, num_prompts80, embedding_path, freeze_promptFalse, use_mlp_adapterFalse, **kwargs)各参数的语义与仓库源码中的处理逻辑对应如下参数默认值作用与源码依据mm_neckFalse是否使用 YOLO-World 的多模态 NeckYOLOWorldPAFPN进行文本引导的跨模态融合。源码extract_feat中self.neck(img_feats, txt_feats)与self.neck(img_feats)分支即由它决定yolo_world.pynum_train_classes80训练阶段的类别数在loss()中会写入bbox_head.num_classesyolo_world.pynum_test_classes80测试/推理阶段的类别数在predict()中生效yolo_world.pyprompt_dim512提示向量的维度必须与预计算 Embedding 的特征维一致COCO 的 CLIP-B/32 文本特征即 512 维num_prompts80提示类别总数决定随机初始化或加载的 Embedding 行数embedding_path.npy文件路径。为空时随机初始化非空时加载预计算向量yolo_world.pyfreeze_promptFalse是否冻结提示向量。True时embeddings.requires_grad False向量保持不变yolo_world.pyuse_mlp_adapterFalse是否在提示向量后附加一个两层 MLP 适配器Linear(prompt_dim, 2*prompt_dim) → ReLU → Linear(2*prompt_dim, prompt_dim)输出与输入残差相加并做 L2 归一化yolo_world.py2.1 源码中的初始化与推理逻辑从源码看__init__中的关键分支yolo_world.py若embedding_path非空torch.from_numpy(np.load(embedding_path)).float()直接转为nn.Parameter否则normalize(randn(num_prompts, prompt_dim), dim-1)随机初始化并做 L2 归一化freeze_prompt控制该参数的requires_graduse_mlp_adapter为True时额外构建适配器。推理/训练时的特征提取extract_featyolo_world.py则简洁地表现为只对图像做前向img_feats, _ self.backbone(batch_inputs, None)因为with_text_modelFalse文本侧不再前向直接取提示参数txt_feats self.embeddings[None]若启用适配器txt_feats self.adapter(txt_feats) txt_feats后再归一化按 batch 大小复制txt_feats txt_feats.repeat(img_feats[0].shape[0], 1, 1)送入YOLOWorldPAFPN完成图像-文本跨模态融合后交给检测头。可以看到文本编码成本被完全移出模型这是 Prompt 化检测器速度与部署友好性的根本来源。3. 预计算 EmbeddingNxD 文件格式与生成工具原文档明确规定要零样本使用需要预先计算文本或图像Embedding 并保存为numpy数组*.npy形状为NxD——N是提示类别数量D是 Embedding 维度。例如 COCO 的 80 个类别对应80×512。同时文档提醒当前实现每个类别只支持一个提示one prompt for one class。如果你希望一个类别使用多个提示多模板需要自行在后续处理post-processing阶段合并这些结果。3.1 文本 Embedding用 generate_text_prompts.py 一键生成仓库提供了官方生成脚本 tools/generate_text_prompts.py流程与源码完全对应python tools/generate_text_prompts.py \ --model ./pretrained_models/clip-vit-base-patch32-projection \ --text data/texts/coco_class_texts.json \ --out output.npy脚本核心逻辑generate_text_prompts.py用AutoTokenizerCLIPTextModelWithProjection加载 CLIP 文本编码器从 JSON 读取类别文本texts [x[0] for x in data]批量 tokenize 后前向取text_outputs.text_embedsL2 归一化txt_feats / txt_feats.norm(p2, dim-1, keepdimTrue)后reshape(-1, D)并np.save。其中--text默认指向的类别文本文件在仓库中即为 data/texts/coco_class_texts.json其内容为 COCO 80 类标准名称例如[person], [bicycle], [car], ..., [toothbrush]每个类恰好一个文本提示——这与一个类别一个 prompt的设计一致。该脚本导出的.npy可直接作为embedding_path使用。3.2 图像 Embedding用 generate_image_prompts.py 生成对于纯图像提示仓库提供 tools/generate_image_prompts.py。它同时加载CLIPVisionModelWithProjection与CLIPTextModelWithProjection遍历--image-dir下每个类别的示例图像用AutoProcessor处理图像前向视觉模型取image_embeds并 L2 归一化generate_image_prompts.py把每个类别的图像向量按顺序堆叠最后附加一个空白文本向量作为 paddingnp.stack后保存为指定文件。其用法形如python tools/generate_image_prompts.py \ --model ../pretrained_models/open-ai-clip-vit-base-patch32 \ --image-dir data/samples \ --out-dir embeddings \ --out-file coco_80_image_embeddings.npy3.3 官方预计算文件与自生成路径原文档提及clip_vit_b32_coco_80_embeddings.npyCLIP ViT-B/32 在 COCO 80 类上预计算的文本 Embedding随官方模型资源发布可直接下载使用。若无法获取该文件也完全可以按 3.1 节用仓库脚本自行生成——生成结果与预训练时使用的特征空间一致即可。4. Prompt Tuning 配置实战Prompt Tuning 的目标原文档表述得很清楚在保持零样本能力的同时提升模型在自定义数据集上的性能。做法是只让提示向量必要时连同少量外围层参与训练而让主干网络与 Neck 的大部分参数冻结从而用很小的计算开销完成领域适配。原文档给出的参考配置为 configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py对应 configs/prompt_tuning_coco/ 目录下的实验配置。下面先还原文档中的两种写法再逐段拆解完整配置。4.1 方案一随机 Prompt不提供embedding_path让SimpleYOLOWorldDetector随机初始化 80 个提示向量并随训练更新dict(typeSimpleYOLOWorldDetector, mm_neckTrue, num_train_classesnum_training_classes, num_test_classesnum_classes, prompt_dimtext_channels, num_prompts80, ...)这是最轻量的调优方式所有类别语义都从零学起相当于把类别提示当作 80 个可学习参数融入模型。4.2 方案二CLIP Embedding文本 / 图像 / 图文融合提供embedding_path指向预计算的.npy如clip_vit_b32_coco_80_embeddings.npydict(typeSimpleYOLOWorldDetector, mm_neckTrue, num_train_classesnum_training_classes, num_test_classesnum_classes, embedding_pathembeddings/clip_vit_b32_coco_80_embeddings.npy, prompt_dimtext_channels, num_prompts80, ...)原文档强调使用 CLIP 模型得到的图像与文本 Embedding可以维持零样本性能。这是因为提示的初始值已经携带了 CLIP 对齐的语义先验即使不训练也能直接检测 80 类训练则是在此基础上微调这些向量。4.3 完整配置逐段拆解mask-refine 变体以 mask-refine 版本配置 为例与方案二写法一致关键片段如下_base_ (../../third_party/mmyolo/configs/yolov8/ yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py) custom_imports dict(imports[yolo_world], allow_failed_importsFalse) num_classes 80 num_training_classes 80 max_epochs 80 close_mosaic_epochs 10 save_epoch_intervals 5 text_channels 512 base_lr 2e-3 weight_decay 0.05 train_batch_size_per_gpu 16 load_from pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth model dict(typeSimpleYOLOWorldDetector, mm_neckTrue, num_train_classesnum_training_classes, num_test_classesnum_classes, embedding_pathembeddings/clip_vit_b32_coco_80_embeddings.npy, prompt_dimtext_channels, num_prompts80, data_preprocessordict(typeYOLOv5DetDataPreprocessor), backbonedict(_delete_True, typeMultiModalYOLOBackbone, text_modelNone, image_model{{_base_.model.backbone}}, frozen_stages4, with_text_modelFalse), neckdict(typeYOLOWorldPAFPN, freeze_allTrue, guide_channelstext_channels, embed_channelsneck_embed_channels, num_headsneck_num_heads, block_cfgdict(typeMaxSigmoidCSPLayerWithTwoConv)), bbox_headdict(typeYOLOWorldHead, head_moduledict( typeYOLOWorldHeadModule, freeze_allTrue, use_bn_headTrue, embed_dimstext_channels, num_classesnum_training_classes)), train_cfgdict(assignerdict(num_classesnum_training_classes)))各配置点与源码的对应关系MultiModalYOLOBackbone去文本模型text_modelNone且with_text_modelFalse对应 mm_backbone.py 中不构建text_model的分支frozen_stages4冻结主干的前 4 个 stage_freeze_stages逻辑见 mm_backbone.py保留底层特征提取能力。Neck 全冻结YOLOWorldPAFPN实现见 yolo_world/models/necks/yolo_world_pafpn.py设置freeze_allTrue其guide_channels、embed_channels、num_heads分别对应跨模态融合时文本向量的引导通道数512、各层嵌入通道数与多头注意力头数block_cfgMaxSigmoidCSPLayerWithTwoConv指定融合模块类型。检测头冻结YOLOWorldHeadModule的freeze_allTrue、embed_dimstext_channels即分类头也只依赖提示向量计算 logits。训练/测试类别数分离num_train_classes80用于训练阶段的 assigner 与 loss推理时predict()会以num_test_classes覆盖头的类别数yolo_world.py。训练设置同文件后半部分同样值得注意optim_wrapper dict(optimizerdict( _delete_True, typeAdamW, lrbase_lr, weight_decayweight_decay, batch_size_per_gputrain_batch_size_per_gpu), paramwise_cfgdict(bias_decay_mult0.0, norm_decay_mult0.0, custom_keys{ backbone.text_model: dict(lr_mult0.01), logit_scale: dict(weight_decay0.0), embeddings: dict(weight_decay0.0)}), constructorYOLOWv5OptimizerConstructor) custom_hooks [ dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0001, update_buffersTrue, strict_loadFalse, priority49), dict(typemmdet.PipelineSwitchHook, switch_epochmax_epochs - close_mosaic_epochs, switch_pipelinetrain_pipeline_stage2) ] train_cfg dict(max_epochsmax_epochs, val_interval5, dynamic_intervals[((max_epochs - close_mosaic_epochs), _base_.val_interval_stage2)])embeddings的 weight_decay 显式置 0提示向量不做权重衰减避免语义先验被稀释backbone.text_model的 lr_mult0.01即使文本模型存在也仅用极小学习率本配置中它根本未构建属于兼容保留YOLOWv5OptimizerConstructor为 YOLO-World 自定义优化器构造器见 yolo_world/engine/optimizers/yolow_v5_optim_constructor.pyEMA 末段关闭 MosaicExpMomentumEMA平滑权重PipelineSwitchHook在第80-1070epoch 切换到第二阶段 pipeline关闭 Mosaic/混合增强用于稳定收敛数据侧使用Mosaic、YOLOv5CopyPaste、YOLOv5RandomAffineuse_mask_refine_base_.use_mask2refine即 mask-refine 数据增强、YOLOv5MixUp并用collate_fndict(typeyolow_collate)组装 batch。若不需要 mask-refine 增强仓库还提供简化版本 yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py其base_lr 2e-4结构与上述配置一致但直接继承yolov8_l_syncbn_fast_8xb16-500e_coco.py的数据管线此外 yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py 则是全量微调对照实验SGD、freeze_promptTrue、Neck/Head 不冻结用于对比不同冻结策略的效果。注意 configs/prompt_tuning_coco/READEME.md 中说明该目录包含的是实验性配置后续可能清理生产使用时请以最新发布版本为准。5. 实验结果零样本 vs Prompt Tuning原文档给出了 COCO 上 YOLO-World-v2-L 的对比结果仓库 configs/prompt_tuning_coco/READEME.md 中有同款数据ModelConfigAPAP50AP75APSAPMAPLYOLO-World-v2-LZero-shot45.761.649.829.950.060.8YOLO-World-v2-LPrompt tuning47.964.352.531.952.661.3即在 COCO 验证集上Prompt Tuning 相对零样本基线将 AP 从45.7 提升到 47.9AP50 从 61.6 提升到 64.3尤其对小目标APS29.9 → 31.9和中等目标APM50.0 → 52.6提升明显同时保持了类别的开放词汇语义先验。6. 从训练到评估的完整流程将以上配置落到实际运行可复用仓库根目录的训练/测试脚本与 docs/finetuning.md 一致的 mmyolo 流程。以tools/下的脚本为例仓库中dist_train.sh、dist_test.sh位于 tools/# 1. 训练以 mask-refine prompt tuning 配置为例8 卡分布式训练并启用 AMP ./tools/dist_train.sh \ configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py \ 8 --amp # 2. 评估加载训练权重在 COCO val 上评测 ./tools/dist_test.sh \ configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py \ path/to/weights 8训练前请确保依赖环境就绪pip install -e .详见 docs/installation.mdCOCO 数据按 mmyolo 约定放在data/coco/train2017/、val2017/及对应 annotations预训练权重load_from指定的文件已下载到pretrained_models/目录embedding_path指向的embeddings/clip_vit_b32_coco_80_embeddings.npy已就位可从官方资源获取或用 tools/generate_text_prompts.py 自行生成。评估器使用mmdet.CocoMetricproposal_nums(100, 1, 10)、metricbbox输出即上文的 AP/AP50/AP75/APS/APM/APL 全套指标可与零样本基线直接对比。7. 小结与选型建议围绕 docs/prompt_yolo_world.md 的核心脉络可以总结出三条实操准则追求零样本用预计算的 CLIP 文本/图像 Embedding 加载embedding_path配合mm_neckTrue与预训练权重即可开箱检测无需任何训练兼顾零样本与领域精度在方案 (1) 基础上开启 Prompt Tuning——只让embeddings参数可学习freeze_promptFalse、冻结 Neck 与检测头freeze_allTrue用 COCO 上 45.7 → 47.9 的收益证明这是一条低成本的适配路径彻底脱离文本侧SimpleYOLOWorldDetector将语言编码完全前置离线推理期只有图像前向 一次张量广播yolo_world.py对部署和实时推理场景友好若需结合重参数化部署可进一步参考 docs/reparameterize.md 与 tools/reparameterize_yoloworld.py。如果你想在自有数据上做类别扩展只需把类别文本写进类似 data/texts/coco_class_texts.json 的 JSON用仓库脚本重新生成.npy再按第 4 节的配置模板替换num_prompts、prompt_dim与embedding_path即可复用整套 Prompt Tuning 流程。赞分享人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载相关推荐YOLO-World Prompt Tuning 实战指南基于 COCO 的可学习提示词微调全解析YOLO World Prompt Tuning 实战指南基于 COCO 的可学习提示词微调全解析 导读 本篇指南以 YOLO World 仓库中 confi人工智能计算机视觉深度学习YOLO-World 开放词汇目标检测实战指南基于 Ultralytics YOLOv8 的实时零样本检测框架YOLO World 开放词汇目标检测实战指南基于 Ultralytics YOLOv8 的实时零样本检测框架 YOLO World 是在本仓库所集成的 Ul人工智能深度学习计算机视觉YOLO-World 演示指南从 Gradio、单图到视频的开放词汇检测实战YOLO World 演示指南从 Gradio、单图到视频的开放词汇检测实战 本篇指南以仓库 demo/README.md https://link.gitc人工智能计算机视觉深度学习上一篇Tkinter布局助手零基础Python GUI可视化设计终极指南下一篇Google Ad Manager vs AdMob终极选择指南为你的Android应用找到最佳广告平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表