ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CLIP 零样本图像分类指南:从首次安装到小样本落地的三条路线

2026/9/18 10:22:36 拓冰建站 浏览量
CLIP 零样本图像分类指南:从首次安装到小样本落地的三条路线 CLIP 零样本图像分类指南从首次安装到小样本落地的三条路线【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP标注是新项目里最贵的环节一个类别的头批图往往只有几十张。CLIP 零样本图像分类改掉了这件事用一句英文描述每个类别就能拿到一个直接可用的基线分类器。这篇文章带你把从安装到小样本落地的路线完整走一遍。适用场景哪些活儿适合交给 CLIP先给结论类别的边界能不能用一句人话写清楚是判断合不合用 CLIP 的试金石。能它大概率就能干。这张图是 CLIP 的训练与推理流程。左半边是预训练阶段图像编码器与文本编码器把各自输入映射到同一个向量空间同一对图文的特征点积被拉高、跨对被压低。右半边就是零样本zero-shot的推理方式不需要任何标注——把类名套进统一句式过一遍文本编码器再与新图像取相似度最高的一项。模型从没见过这些类别却可以直接分类。视觉侧有 ViT 与 ResNet 两类骨干文本侧是 Transformer 编码器实现在 clip/model.py 里。CLIP 是图文配对的开源图像分类项目新、杂、少的分类问题是它的长项。下面这几类任务比较合适单图分类类别从几个到几百个且会持续新增按文本检索图像或做粗粒度的图文相似度匹配标注预算紧零标注或每类只有个位数样本新类别要当天上线不想维护重训流水线这几类则交给专用模型去做分割、检测、计数这类像素级任务上千个类别、且追求 top-1 极致精度的场景类别边界细到一句话写不出差别比如物种级的细粒度区分CLIP 怎么从安装跑到第一次预测依赖很少装好就能跑。克隆仓库并按包安装git clone https://gitcode.com/GitHub_Trending/cl/CLIP pip install -r CLIP/requirements.txt pip install -e CLIP第一步是加载模型。clip.load返回两样东西模型本身和一个图像变换preprocess缩放到 224、做归一化。推理时记住一条规则图像过preprocess文本过tokenize两边的输出已经处在同一个向量空间里。import torch import clip from PIL import Image device cuda if torch.cuda.is_available() else cpu # 首次运行自动下载约 335MB 权重缓存在 ~/.cache/clip model, preprocess clip.load(ViT-B/32, devicedevice) model.eval()再走一次图文相似度推理就能拿到分类结果names [good solder joint, insufficient solder, solder bridge, missing solder] # 句式统一只有类名部分变化 prompts [fa photo of a {n} solder pad on a circuit board for n in names] img preprocess(Image.open(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()) # 每类概率和为 1输出是每类的概率取最大值对应的类名即可。想交互式验证可以打开 notebooks/Interacting_with_CLIP.ipynb里面有相似度计算与零样本分类的完整过程。效果不够时按手里的标注量选路升级路径不用拍脑袋只看你手里有多少张标注图。一共三档先试便宜的。零标注把零样本提示词写对没有数据时提示词就是唯一的调参旋钮。它对小样本分类的影响经常比换模型更大。三条规则零成本句式统一所有类别共用同一模板只替换类名别让有的类带场景词、有的不带用完整短语a photo of a solder bridge优于裸词solder bridge裸词缺少这是一张图的语义锚点多模板集成同一类写 2 到 3 个模板各自 softmax 概率取平均能稳定拉高几个点。仓库自带 20 多个数据集的现成提示词库见 data/prompts.md每类 10 到 50 张冻结权重加一个线性头有了少量标注后模型一个参数都不动只接一个分类头。做法是先把图像特征离线抽出来存盘再交给传统分类器# 训练集过一遍只取 512 维图像特征 X torch.cat([model.encode_image(imgs) for imgs in batched_train]) clf LogisticRegression(max_iter2000) clf.fit(X.numpy(), y.numpy())训练在 CPU 上几十秒就能完成特征已存盘换类别时不用重跑模型。这个标注体量下这一档通常能吃掉大部分精度差距。还不够去文本端学措辞类别很多、数据仍然不够时还有最后一档权重全部继续冻结只在文本端学一组提示嵌入让模型学会你领域的措辞习惯。这一档常被叫作 CLIP 微调但它并不动原模型的任何一个参数。# 形状与文本编码器输出对齐序列长 77维度 512 prompt torch.nn.Parameter(torch.randn(77, 512) * 0.02) opt torch.optim.AdamW([prompt], lr1e-4)可训练参数只有几万量级过拟合风险低数据真正紧张时这一档的收益通常比线性头更大。CLIP 模型怎么选推理再快一半clip.available_models()能列出全部型号定义在 clip/clip.py 里。常用的三个取舍如下模型适用取舍ViT-B/32约 335MB速度与精度均衡默认首选ViT-B/16约 580MBpatch 更小零样本精度更高、推理更慢RN50ResNet-50CPU 上最快无卡环境优先想要精度余量先试 ViT-B/16完全没有卡直接用 RN50。模型选定后三个动作能压掉大部分推理耗时半精度GPU 上跑model.half()显存和耗时大约各降一半批处理一次喂 16 到 32 张图吞吐远高于逐张流水线场景务必使用缓存文本嵌入类别集固定时encode_text的结果算一次存下来之后每帧只跑图像侧小样本图像分类复盘PCB 焊点瑕疵筛查场景一条 SMT 产线要对焊盘做四类筛查——正常、缺锡、锡桥相邻焊点连锡、漏焊。立项时标注预算很紧每类 15 张、共 60 张其中每类留出 10 张做固定验证集。做法先用双模板集成出纯零样本基线模板分别是a photo of a {cls} solder pad on a circuit board与a close-up of a {cls} solder joint两套概率取平均再把 60 张标注拿去训线性头同一验证集上对比。方法验证集准确率纯零样本双模板集成约 78%线性头60 张标注约 93%提示嵌入微调在此基础上还能再抬 2 个点示意数据。结论很典型零样本直接给出可用基线线性头吃掉大部分差距微调只补零头。最终部署形态是特征提取 逻辑回归头批处理 8 张、fp16 推理单张约 40 毫秒示意数字产线节拍内放得下。CLIP 部署卡住了这四个问题出现得最多问断网环境怎么拿权重 答clip.load首次会联网拉取并做 SHA256 校验校验不过直接抛 RuntimeError。可以预先下好.pt文件放到~/.cache/clip也可以把本地文件路径直接传给clip.load它支持本地路径。问提示词为什么不用中文 答tokenizer 是按英文训练的 BPE 分词器中文会碎成大量未知 token相似度骤降。生产上用英文类名展示层再映射回中文标签。问类名和模板不一致会怎样 答裸类名、模板不统一、只有个别类带场景词任何一项都会让概率分布失真。先固定一套模板再逐类替换词面。描述超过 77 个 token 时clip.tokenize记得传truncateTrue否则直接报错。问为什么报设备不一致 答clip.tokenize返回的张量在 CPU 上忘记.to(device)就会和图像张量不在同一设备。这是新手遇到的第一条 traceback。精度同理跑 fp16 时文本侧同样要转。今天就先把零样本基线跑起来先跑一遍从安装跑到第一次预测里的那两段代码用 2 到 3 个类别拿到基线每个类别备齐至少 10 张标注图验证集固定下来模型、图像、文本三个张量的设备与精度对齐推理切换成批处理文本嵌入缓存起来把零样本、线性、微调三组数字记下来作为后续回归的基准你现在就可以从CLIP 怎么从安装跑到第一次预测里的那段代码开始先拿到基线再按标注预算决定走哪条路。【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考