ARTICLE DETAIL

资讯详情

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

OpenCLIP零样本分类:10分钟跑通图像识别与跨模态检索

OpenCLIP零样本分类:10分钟跑通图像识别与跨模态检索 OpenCLIP零样本分类10分钟跑通图像识别与跨模态检索【免费下载链接】open_clipAn open source implementation of CLIP.项目地址: https://gitcode.com/GitHub_Trending/op/open_clip当你拿到一批照片想知道每张图里有什么却不想为它们单独训练一个分类器时OpenCLIP 的零样本分类正好解决这个麻烦把类别名写成一句话模型就能直接判断。OpenCLIP 是 CLIP用图文对做对比预训练的模型的开源实现一行create_model_and_transforms就能加载几十个预训练好的图文模型装好后即可用于零样本分类、以文搜图等跨模态检索任务。本文全程只用 ViT-B-32 这一个模型带你在 15 分钟左右跑通三个真实场景并附显存对照表和常见报错的修复方法。读者只需要会基本的 PyTorch 张量操作不需要理解对比学习的数学细节。 快速开始一行代码加载 ViT-B-32跑通第一次零样本分类先装依赖模型权重会在首次加载时自动下载约 600MBpip install open_clip_torch下面这段代码把一张图和三个候选文本分别编码成向量算出图最可能属于哪个文本预期打印出Label probs: [[0. 1. 0.]]这样的结果import torch from PIL import Image import open_clip # 一行加载模型预处理变换pretrained 是权重的名字用 list_pretrained() 可查 model, _, preprocess open_clip.create_model_and_transforms(ViT-B-32, pretrainedlaion2b_s34b_b79k) model.eval() # 关键不设置的话 BatchNorm 类模型结果会波动 tokenizer open_clip.get_tokenizer(ViT-B-32) image preprocess(Image.open(cat.jpg)).unsqueeze(0) # 加 batch 维 text tokenizer([a diagram, a dog, a cat]) with torch.no_grad(), torch.autocast(cuda): image_features model.encode_image(image) text_features model.encode_text(text) image_features / image_features.norm(dim-1, keepdimTrue) # L2归一化把向量缩成单位长度 text_features / text_features.norm(dim-1, keepdimTrue) probs (100.0 * image_features text_features.T).softmax(dim-1) print(Label probs:, probs)几个细节值得提前知道model.eval()很多人漏掉对带 BatchNorm 的 ResNet 系模型RN50 等影响尤其大L2 归一化把向量长度压成 1之后两个向量的点积就等于余弦相似度所以后续所有检索场景都靠这一招如果想换模型open_clip.list_models()列出全部架构名open_clip.list_pretrained()列出对应可用权重两者搭配传给create_model_and_transforms即可。核心机制拆解两个编码器凭什么能判断图文是否匹配先看官方仓库里这张图它把 OpenCLIP 的完整逻辑画完了三句话概括它的设计双塔结构图像和文本各走一个独立编码器互不通信最终都投影到同一个 512 维空间。好处是推理时两边可以分开算、分开缓存——图库特征算一次就能反复用来检索这正是后面场景二的基础。对比学习简单说一个 batch 里配对的图文向量被拉近不配对的被推远。训练目标只有配对相似度要高于所有非配对相似度这一件事没有任何标签。相似度乘一个可学习温度。源码里就一行在 src/open_clip/model.py 中# logit_scale 是可学习参数初始化 exp(logit_scale) ≈ 14.3推理时经验值 100 即可 image_logits self.logit_scale.exp() * image_features text_features.T零样本分类就是这套机制的副产品把类别名套进 a photo of a {}. 模板得到文本向量当成软分类器新图像向量与它们点积取 softmax就得到了分类概率。推理时的数据流向如下三个真实场景零样本分类、跨模态检索、领域微调场景一零样本分类内置分类器构建器不用自己拼模板上面快速开始里是手写点积实际项目里更推荐直接用库提供的 build_zero_shot_classifier它替你做了模板展开 → 批量编码 → 模板内平均 → 归一化整套流程# SIMPLE_IMAGENET_TEMPLATES 是内置的 8 条 a photo of a {} 式模板 weights open_clip.build_zero_shot_classifier( model, tokenizer, classnames[cat, dog, bird, car], templatesopen_clip.SIMPLE_IMAGENET_TEMPLATES, ) with torch.no_grad(): feats model.encode_image(image, normalizeTrue) probs (feats weights).softmax(dim-1)注意一个量化事实同一个类别套 8 条模板后取平均比单用一条 a photo of 更稳因为单模板对措辞过于敏感。另外类别数超过 100 之后建议直接换 ViT-L-14——按仓库 README 的官方数据DataComp-1B 权重下 ViT-B-16 的 ImageNet 零样本精度 73.5%LAION-2B 的 ViT-L-14 能到 75.3%小模型的余量在大类别集上会明显吃紧。场景二跨模态检索图搜文、文搜图一次编码反复查以文搜图的关键是图库特征离线算好存下来查询时只编码一句短文本代价极低# 图库特征只算一次并缓存形状 (N, 512) db model.encode_image(all_images, normalizeTrue) # all_images: 预处理后的整库图像 # 文本查询编码一句文本与整库点积取 Top5 q model.encode_text(tokenizer([a cat jumping in a garden]), normalizeTrue) scores, idx (q db.T).topk(5, dim-1)以图搜图完全对称把encode_text换成encode_image查询侧和库侧用同一套特征。两个实用数字512 维 float16 特征每个向量仅 1KB100 万张图的索引约 1GB 内存单卡 CPU 上纯点积毫秒级等图库到千万级再考虑换倒排/量化索引别过早优化。场景三领域微调冻结大头只放开尾巴把自己的图文对数据CSV两列图片路径 描述文本拿来继续训练时最省事的起点是冻结双塔、只训投影头代码里对应两个 lock 方法定义在 CLIP 模型上model.lock_image_tower(unlocked_groups0) # 冻结整个视觉塔0一组都不解锁 model.lock_text_tower(unlocked_layers0) # 冻结整个文本塔然后用仓库自带的训练入口跑起来src/open_clip_train/ 目录python -m open_clip_train.main \ --model ViT-B-32 --pretrained laion2b_s34b_b79k \ --train-data /path/to/train.csv --csv-img-key filepath --csv-caption-key title \ --batch-size 64 --epochs 3 --lr 1e-5 # 微调学习率比预训练低两个数量级这里我一般建议数据量小于 10 万对时保持全冻结只训投影层就够了效果不够再逐步放开unlocked_groups1、2。学习率上预训练脚本常用 1e-3微调直接沿用会瞬间灾难遗忘1e-5 是更安全的起点。性能与资源三档配置的显存与精度对照推理时最常见的纠结是选多大的模型下面这张表按仓库 README 的官方精度整理显存为 fp16 推理的大致经验值batch 32未含数据加载开销模型ImageNet 零样本精度推理显存约适用场景ViT-B-3273.5%DataComp-1B~5GB消费级 4-8GB 显卡、快速验证ViT-L-1475.3%LAION-2B~10GB12GB 以上显卡、正式部署ViT-H-1478.0%LAION-2B~22GB服务器、离线批处理两条调优建议比调任何超参都立竿见影显存不够先上 int8 量化。仓库提供了现成路径tutorials/int8_tutorial.ipynb 里有完整例子用open_clip.utils.replace_linear把 MLP 线性层换成 bitsandbytes 的 8bit 层。官方实测量化后精度基本无损CIFAR-10 上 88.76% vs 88.83%量化层权重内存减半——注意收益是省显存速度反而略慢约 5%。固定图库的场景把编码和检索彻底拆开。特征缓存之后在线部分只剩一句文本的编码和一次矩阵乘整条链路可以压进毫秒级反过来如果每次查询都重新编码整库显存和时间都会被白白烧掉。⚠️ 踩坑清单五个高频报错及一行修复精度莫名掉几个点没有任何报错→ 原因OpenAI 系权重用的是 QuickGELU 激活但你加载了默认的 GELU 定义两者数值不同→ 修复加载 OpenAI 权重时模型名换成ViT-B-32-quickgelu。报Unknown model但模型名确认没打错→ 原因convnext、siglip、eva 这些编码器来自 timm 库版本太旧时未注册 → 修复pip install -U timm。加载 xlm-roberta 系模型报缺依赖/词表错误→ 原因这类 HF 文本塔需要 transformers 提供 tokenizer基础安装不含 → 修复pip install transformers。同一张图两次调用结果不一致RN50 等模型→ 原因加载后没调model.eval()BatchNorm 的滑动统计在训练模式下被更新 → 修复加载后紧跟model.eval()。长文本或中文文本分类结果全错→ 原因SimpleTokenizer 上下文只有 77 个 token超长部分被静默截断且它不是多语言分词器中文基本切不开 → 修复换 xlm-roberta 系多语言模型模型配置在 src/open_clip/model_configs/ 下可直接查到或把提示词压短。OpenCLIP 的能力边界要心里有数推理侧接口稳定、生态成熟但 main 分支的训练栈已重构为 Task 架构FSDP2、dict 格式 batch 等README 顶部有专门的迁移公告要训练的话升级前先读一遍。下一步按需求走要处理多语言文本就去看 xlm-roberta 系列模型要处理音频就找同仓库的 CLAP 配置——它们共用同一套加载和检索接口。【免费下载链接】open_clipAn open source implementation of CLIP.项目地址: https://gitcode.com/GitHub_Trending/op/open_clip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表