CLIP实战:15分钟跑通零样本图像分类

CLIP实战:15分钟跑通零样本图像分类 CLIP实战15分钟跑通零样本图像分类【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP没有标注数据还能做图像分类吗你接到一个需求从一批商品图里找出狗但手头没有任何标注数据集从头训练一个分类器得先收几千张带标签的样本。这时可以请出 CLIPContrastive Language-Image Pretraining——一个图像编码器和文本编码器一起训练出来的模型用它给图像做零样本分类不需要再标注、再训练。接下来要解决的事情很具体把 CLIP 克隆下来、装好环境、跑出第一次推理以及中途卡住时该怎么办。用3分钟看懂 CLIP 的结构名字很长结构其实就两个塔加一张表。双塔编码器把图像和文本放进同一个向量空间CLIP 内部是两个编码器图像编码器ResNet 或 Vision Transformer 的变体和文本编码器一个 Transformer。图像塔吃 224x224 的像素张量吐出一个向量文本塔吃 token 序列吐出同维度的向量。同维度是重点——训练目标就是让配对出现的图文对向量互相靠近于是原本毫不相关的两种模态被拉进同一套坐标系里。坐标系对齐之后一张图和一句话像不像就变成了一次内积后面所有用法都建立在这一次内积上。余弦相似度与 logit_scale相似度分数怎么算拿到两组向量后前向传播只有三件事先对特征做 L2 归一化内积就变成了余弦相似度再乘上一个可学习的系数 logit_scale得到 logits。这个系数初始值约 14.3即 1/0.07可以理解为温度——原始余弦相似度的差异往往太小交叉熵损失学不动需要放大一下才分得开正负样本。这段逻辑就写在 clip/model.py 的forward方法里扫一眼最后十几行就能看懂整个匹配流程。零样本推理把文本提示变成分类器图像向量去匹配一组文本向量等于现场造了一个分类器——这组文本就是候选类别。想识别 100 种动物写 100 句 a photo of a snake、a photo of a turtle 之类的描述就行不用收集一张标签也不用重新训练。zero-shot 的名字由此而来这也是 CLIP 日常使用的主路径。结构理顺了下面动手跑起来。5步安装 CLIP 并跑通第一次推理先准备环境Python 和 pip 就绪即可。机器有 NVIDIA GPU 的装带对应 CUDA 的 PyTorch 1.7.1 以上版本没有 GPU 就装 CPU 版 PyTorch流程一样只是慢一些。克隆仓库git clone https://gitcode.com/GitHub_Trending/cl/CLIP跑完当前目录会出现一个 CLIP 文件夹里面有 clip/ 源码目录说明这步成功了。安装依赖并安装为 Python 包在克隆目录的上级执行pip install ftfy regex tqdm packaging pip install ./CLIP两条命令都无报错输出即完成第二条把仓库装成纯 Python 包不会改动仓库里的任何文件。验证导入和模型清单import clip print(clip.available_models())输出应为 8 个模型名RN50、ViT-B/32、ViT-L/14 等。下一步要从这个清单里挑一个所以务必照抄原文。跑第一次推理import torch, clip from PIL import Image device cuda if torch.cuda.is_available() else cpu model, preprocess clip.load(ViT-B/32, devicedevice) # 首次运行自动下载权重 image preprocess(Image.open(CLIP.png)).unsqueeze(0).to(device) text clip.tokenize([a diagram, a dog, a cat]).to(device) with torch.no_grad(): logits_per_image, _ model(image, text) print(logits_per_image.softmax(dim-1).cpu().numpy())上面这段加载 ViT-B/32 权重把仓库里的 CLIP.png 转成模型输入再算出图像与三个文本候选的匹配概率。输出形如[[0.9927, 0.0042, 0.0030]]——a diagram 拿到 0.99说明模型认出了这张图是一张示意图。此处建议放置终端运行上述代码、打印出 probs 数值的实际输出截图选做体验零样本分类照 README 里 Zero-Shot Prediction 一节的做法下载 CIFAR-100取一张样本图和 100 个类别的文本描述算 top-5 匹配。输出会是带百分比的排序第一名通常落在 snake、turtle 这类真实标签上。这步可以稍后再做读完文末速查表再做更顺。流程很短但第一次跑几乎必然撞上下面三个错。三个最常见的报错及修法 症状根因修复RuntimeError: Model xxx not found; available models [...]模型名与官方清单不完全一致大小写或斜杠写错执行print(clip.available_models())从输出里原样复制名字RuntimeError: Input ... is too long for context length 77提示文本分词后超过 77 个 token缩短类别描述或给clip.tokenize()传truncateTrue自动截断下载权重时报SHA256 checksum does not match下载中断缓存里留下不完整的文件删掉~/.cache/clip/下损坏的.pt文件再次执行clip.load触发重新下载跑通之后问题就从能不能用变成准不准。让零样本精度提升的两组配置 ⚙️提示词模板平均默认行为是自己写一句 a photo of a {} 模板直接推理改成同一类别写 2-3 种措辞、分别算出概率分布再取平均在 CIFAR-100 这类数据集上 top-1 精度会明显高于单模板官方 notebook 里有完整的 ImageNet 提示词实验可对照。改动只有几行image_input和classes沿用前面准备好的张量和类别列表# 图像只编码一次然后对多个提示词模板取平均概率 img_feat model.encode_image(image_input) img_feat / img_feat.norm(dim-1, keepdimTrue) probs_list [] for t in [a photo of a {}., a blurry photo of a {}., a photo of the {} in the wild.]: txt model.encode_text(clip.tokenize([t.format(c) for c in classes]).to(device)) txt / txt.norm(dim-1, keepdimTrue) probs_list.append((100.0 * img_feat txt.T).softmax(dim-1)) avg_probs torch.stack(probs_list, dim0).mean(dim0) # 拿它做 topk 即可输出avg_probs是一个归一化概率分布对它执行topk(5)得到的排序比单模板稳定。26 个数据集的现成模板在 data/prompts.md 里可以直接挑用。模型规格取舍默认用 ViT-B/32 速度最快适合快速验证单卡上单张图推理以秒计追求精度就换 ViT-L/14336px输入分辨率从 224 提到 336精度上去了但显存和耗时都成倍增加先用小规格验证逻辑再换大规格。这两组和前面几步的常用操作都收进下面这张表。高频操作速查与延伸阅读你想做什么怎么做查看可用模型清单clip.available_models()加载模型及其预处理函数clip.load(ViT-B/32, devicecpu)修改权重下载目录clip.load(..., download_root你的路径)加载自定义 checkpoint把本地.pt文件路径直接传给clip.load()把文本转成模型输入clip.tokenize([a photo of a dog])获取图像特征model.encode_image(image)获取文本特征model.encode_text(text)获取图文相似度分数logitsmodel(image, text)延伸阅读都指向仓库内的具体文件clip/clip.pyload/tokenize入口含模型下载与 SHA256 校验逻辑clip/model.py双塔编码器定义与forward匹配流程notebooks/Interacting_with_CLIP.ipynb官方交互示例可逐步跟随运行如果零样本的精度对你的场景够用到这里就可以收手如果还不够下一步是把图像特征喂给线性探针做轻量微调仓库 README 的 Linear-probe evaluation 一节有完整示例照着换成自己的数据集即可。【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考