多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CLIP 零样本图像分类实战:0 张标注推理 100 个类别

CLIP 零样本图像分类实战:0 张标注推理 100 个类别 CLIP 零样本图像分类实战0 张标注推理 100 个类别【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP新分类需求常卡在等数据类别下周要上线标注还没到位。CLIP 做零样本图像分类文字描述代替标注图片加英文类名即出每类概率。0 张标注、100 个类别可推理权重约 338MB。一、最短路径安装加 12 行代码拿到第一次概率依赖只有 torch、torchvision、ftfy、regex、tqdm 等几个包从源码安装即可git clone https://gitcode.com/GitHub_Trending/cl/CLIP pip install -e CLIPimport torch, clip from PIL import Image device cuda if torch.cuda.is_available() else cpu model, preprocess clip.load(ViT-B/32, devicedevice) # 首次自动下载约 338MB 权重 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(): probs model(image, text)[0].softmax(dim-1).cpu().numpy() print(Label probs:, probs) # [[0.9927937 0.00421068 0.00299572]]输出是 3 个和为 1 的概率0.9928 说明这张图被判为 a diagram。想交互式验证跑 notebooks/Interacting_with_CLIP.ipynb 就能看到相似度计算与分类全过程。二、真实案例100 类 CIFAR-100 的零样本推理场景CIFAR-100 共 100 个类别不标注任何图只用 100 句 a photo of a 类名 做候选文本。仓库官方示例取一张测试图一条蛇Top-5 输出排名类别概率1snake65.31%2turtle12.29%3sweet_pepper3.83%4lizard1.88%5crocodile1.75%三组对照数字top-1 领先第二名 53 个点分布集中、可判读100 个候选类别全程 0 张标注README 另给出 ImageNet 上零样本对齐原版 ResNet50 的成绩而 1.28M 张原始标注一张都没用。三、Go/No-Go 速查哪些任务值得上维度适合 CLIP别硬上换方案任务形态单图分类、按文本找图像素级分割、目标定位、计数model-card 自认 counting 吃力类别集合个位到百位数量级、频繁新增上千类且抠 top-1 极限精度标注预算0 张起步或每类个位数样本已有大规模标注直接训专用模型更快提示语言英文模型仅在英文数据上训练依赖中文提示词的分类判断标准就一条类集会变、数据没到位选 CLIP类集冻结、标注充足别绕路。四、按标注预算加码0 张 → 每类几十张 → 上千张L00 张标注把提示词写对零成本。三条规则模板统一、只换类名用完整短语a photo of a snake 优于裸词 snake同类写 23 个模板softmax 后取平均。data/prompts.md 收录 26 个数据集的官方类名与模板可直接借结构。 何时升级零样本低于业务线且能给每类标出 10 张以上。L1每类 10100 张CPU 可训线性探针。冻结模型在特征上拟合逻辑回归README 官方示例的核心就是下面这段from sklearn.linear_model import LogisticRegression from torch.utils.data import DataLoader feats, labels [], [] with torch.no_grad(): for imgs, y in DataLoader(train, batch_size100): feats.append(model.encode_image(imgs.to(device)).cpu()) # 冻结模型只取特征 labels.append(y) clf LogisticRegression(C0.316, max_iter1000) # C 建议用验证集搜索 clf.fit(torch.cat(feats).numpy(), torch.cat(labels).numpy())跑完整示例会打印一行Accuracy xx.xxx。特征可提前算好存盘换类别不用重跑模型逻辑回归本身不占 GPU。 何时升级线性探针涨不动、类多而每类样本仍少且有 GPU。L2每类上千张GPU微调。按论文方法整网微调代价最大但这是精度敏感场景唯一能继续抬曲线的路。模型结构见 clip/model.py。五、模型档位怎么选和最省事的加速设置clip.available_models()定义在 clip/clip.py列出全部 9 个型号常用三档的权重体积以官方下载源实测为准型号权重体积结构取舍RN50244MBResNet-50体积最小CPU 优先选它ViT-B/32338MB视觉 Transformer32px 分块默认均衡档ViT-B/16335MB视觉 Transformer16px 分块分块更细推理更慢要更大精度选 RN50x16、ViT-L/14 等代价是显存和下载量同步上涨。三个最省事的加速动作缓存文本特征类集固定时encode_text只跑一次之后每张图只走图像侧。半精度GPU 上model.half()fp16 的权重与激活存储是 fp32 的一半显存直接减半。批处理README 示例按 100 张一批取特征流水线别逐张调用。CPU 部署时clip.load会自动把模型转 float32不用手动处理。六、排错速查5 个高频报错RuntimeError: Model xxx not found→ 名字不在型号表里 → 跑clip.available_models()复制精确名字大小写敏感。SHA256 checksum does not match→ 下载不完整或文件损坏clip/clip.py校验不过直接抛错 → 删掉~/.cache/clip下对应文件重跑离线环境可把本地.pt路径直接传给clip.load。too long for context length 77→ 提示词超过 77 个 token → 传clip.tokenize(..., truncateTrue)或把描述写短。报设备不匹配expected same device→tokenize返回的是 CPU 张量和图像不在同一设备 → 给文本张量补.to(device)再进模型。Warning: PyTorch version 1.7.1 or higher is recommended→ torch 太旧 → 按 README 升到 1.7.1 以上。七、上线前检查清单先用 23 个类、英文提示词跑通确认模板统一、概率分布合理固定类集后把encode_text结果算一次存盘留一份固定验证集记下零样本与线性探针两组对照数字图像、文本、模型三者设备与精度一致fp16 时三处全转新增类别只加一条文本候选当天即可验证上线下一步把第一部分的 12 行代码跑起来换成你自己的 3 个类名先拿到零样本基线数字。【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表