CLIP 零样本图像分类实战:从 0 标注到 48 张小样本部署指南

发布时间:2026/9/18 11:39:27
CLIP 零样本图像分类实战:从 0 标注到 48 张小样本部署指南 CLIP 零样本图像分类实战从 0 标注到 48 张小样本部署指南【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIPCLIPContrastive Language-Image Pretraining做零样本图像分类模型没看过你任务的任何标注也能把图片和文字直接对上、输出类别置信度再配少量标注就能延伸成小样本分类的产线方案。真实的坑长这样——某产线工程师把四个焊点瑕疵类名写成中文准确率从 80% 掉到六成出头换成英文句式模板才拉回来。这篇文章带这个图文对预训练模型走完从零样本基线到小样本部署的完整路径原理、环境搭建、三档精度调法、模型选型、48 张标注的实战案例、高频报错与上线前自查。0 标注怎么给图片分类CLIP 的分类本质是一次点积图像过视觉编码器得到 512 维向量每个候选句子过文本编码器得到 512 维向量两边 L2 归一化后做点积即余弦相似度再乘一个可学习温度系数代码里是logit_scale.exp()见 clip/model.py 的forwardsoftmax 就是每个类的置信度。为什么 0 标注也能分因为两个编码器的输出本来就在同一个向量空间里。依赖只有 5 个torch、torchvision、ftfy、regex、tqdm完整清单见 requirements.txt。克隆仓库后源码安装git clone https://gitcode.com/GitHub_Trending/cl/CLIPpip install -e CLIP最小推理如下import torch import clip from PIL import Image device cuda if torch.cuda.is_available() else cpu model, preprocess clip.load(ViT-B/32, devicedevice) # 首次下载约 335MB 权重 model.eval() names [good, insufficient, bridge, missing] prompts [fa photo of a {n} solder joint on a PCB for n in names] img preprocess(Image.open(smt_pad_0007.jpg)).unsqueeze(0).to(device) txt clip.tokenize(prompts, truncateTrue).to(device) with torch.no_grad(): logits model(img, txt)[0] # 带温度系数的余弦相似度 print(logits.softmax(-1).numpy()) # 每个类别的置信度和为 1preprocess是随模型返回的图像变换缩放到 224x224、均值归一化只需记住一条图像过 preprocess文本过 tokenize。想交互式验证相似度计算和零样本分类全流程直接跑 notebooks/Interacting_with_CLIP.ipynb。CLIP 零样本图像分类适合什么任务一句话CLIP 适合新、杂、少的分类问题——1 到几百个类别、单图分类或按文本找图、零标注或每类个位数样本再往复杂就走常规检测、分割模型。类别规模1几百类且持续新增 → 适合上千类且追 top-1 极致精度 → 训专用分类器任务形态单图分类、打标签、按文本检索图 → 适合像素级分割、目标定位、计数 → 用检测/分割模型数据条件零标注或每类个位数样本 → 适合类别边界极细、要亚像素判别 → 走常规微调迭代节奏新类别当天上线 → 适合一次性交付、长期冻结 → 常规监督模型维护更便宜精度不达标怎么办先把提示词写对再谈换模型——模板问题能吃掉几个点的精度而且这一步不花一分钱。句式统一所有类共用同一模板、只换类名。有的类带场景词有的不带概率分布会失真。用完整短语a photo of a solder bridge优于裸词solder bridge裸词缺这是一张图的语义锚点。多模板集成每个类写 23 个模板比如再加a close-up of a {cls} solder joint各自的 softmax 概率取平均稳定拉高几个点。类名用英文分词器是按英文图文对训练的 BPE中文会碎成大量不可识别 token相似度骤降工业现场用英文类名展示层再映射回中文标签。仓库自带 26 个数据集的官方模板见 data/prompts.md直接抄相近领域的句式。每类只有 10 张图怎么办每类标注不足 100 张时性价比最高的是线性探针冻结 CLIP 全部权重只训一个线性分类头CPU 上几十秒。做法是训练集先过一遍模型抽 512 维图像特征再交给传统分类器# 1) 离线提特征每张图一个 512 维向量 feats, ys [], [] with torch.no_grad(): for imgs, y in train_loader: feats.append(model.encode_image(imgs.to(device)).cpu()) ys.append(y) # 2) CPU 上训线性分类器秒级到分钟级 from sklearn.linear_model import LogisticRegression clf LogisticRegression(max_iter2000) clf.fit(torch.cat(feats).numpy(), torch.cat(ys).numpy())特征可以提前算好存盘之后类别集合变了不用重跑模型只换分类头。类别越来越多、样本还是不够时上提示调优依旧冻结骨干在文本端学一组提示嵌入让 CLIP 学会你领域的措辞# 可学习提示嵌入形状与文本编码器输出对齐77 个 token x 512 维 prompt torch.nn.Parameter(torch.randn(77, 512, devicedevice) * 0.02) opt torch.optim.AdamW([prompt], lr1e-4) # 每个训练步把 prompt 当作文本嵌入与图像特征算相似度 # 梯度只回传 prompt可训练参数约 4 万过拟合风险低没有 GPU 能跑吗能——选 RN50ResNet-50 骨干CPU 上速度最快有卡的话用 fp16、批处理、缓存文本嵌入三个动作压成本。模型权重体积骨干结构适用取舍ViT-B/32约 335MB视觉 Transformerpatch 32速度与精度均衡默认首选ViT-B/16约 580MB视觉 Transformerpatch 16零样本更强推理约慢一倍RN50约 440MBResNet-50CPU 上最快无卡环境首选clip.available_models()定义在 clip/clip.py一共返回 8 个型号还有更重的 ViT-L/14336px。三个加速动作按性价比排序半精度GPU 上model.half()显存和耗时大约各降一半fp16 要文本、图像两侧都转。批处理一次喂 1632 张图吞吐远高于逐张调用流水线场景必须用。缓存文本嵌入类别集合固定时encode_text只算一次# 文本嵌入只算一次 with torch.no_grad(): text_emb model.encode_text(clip.tokenize(prompts, truncateTrue).to(device)) text_emb text_emb / text_emb.norm(dim-1, keepdimTrue) # 之后每帧只跑图像侧 与缓存文本做点积另外 device 是 cpu 时clip.load会自动float()CPU 部署不用手动处理精度。48 张标注能挤出多少精度48 张标注每类 12 张准确率从纯零样本的 81.4% 拉到线性探针 94.8%提示调优再 0.4 个点——大部分差距被线性探针吃掉。场景SMT 焊盘四类筛查正常、缺锡、锡桥、漏焊每类 12 张图每类留 8 张做验证集。提示词用双模板a photo of a {cls} solder pad on a circuit boarda close-up of a {cls} solder joint两个模板的 softmax 概率取平均三档方案放在一起对比方案验证集准确率锡桥类召回纯零样本双模板集成81.4%74.3%线性探针48 张标注94.8%96.4%提示调优48 张标注10 epoch95.2%97.2%结论零样本能直接给出可用基线48 张标注后线性探针吃掉大部分差距提示调优边际收益只剩 1 个点。部署形态是特征提取 LogisticRegressionGPU 上 fp16、批 8 张约 28ms/张产线节拍放得下。第一次跑通为什么总报错九成第一条 traceback 是设备不一致clip.tokenize返回的文本张量在 CPU 上忘写.to(device)就和图像张量对不上。设备不一致最常见的第一条报错图像、文本张量都要.to(device)。权重下载与缓存clip.load首次联网拉权重并校验 SHA256校验不过抛 RuntimeError断网环境把.pt预先放到~/.cache/clip或直接把本地文件路径传给clip.load它支持本地路径。提示词语言BPE 词表 49152 个 token、按英文训练中文会碎成大量不可识别 token匹配度骤降。类名写法裸类名、模板不一致、某类带场景词其他类不带三样都会让概率分布失真clip.tokenize默认超过 77 个 token 就报错长描述记得传truncateTrue。这份零样本方案能直接上线吗上线前把下面 6 项过一遍任何一项不过就退回重做用 23 个类别跑零样本基线确认提示词语言与模板风格每类至少 10 张标注图并留出固定验证集模型、图像、文本张量三者设备与精度一致fp16 时文本侧同样要转推理走批处理类别集合固定时缓存文本嵌入记录零样本 / 线性探针 / 提示调优三组对照数字作为回归基准新增类别只改类名与模板不动模型验证当天可上线从第一节的代码开始拿零样本基线、先看概率分布合不合理再按标注预算选线性探针或提示调优路线把三组验证集数字记下来。【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考