
CLIP 小样本图像分类产线质检的轻量落地路径【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIPCLIP 小样本图像分类在试产质检场景里可以直接用产线每天出 4 万张缺陷图人工标注一周只能推 300 张新缺陷类还在图纸上。标注队列比产线还长的时候常规选择是等另一个选择是先让模型用文字描述干活再用每类 10 到 20 张标注图收紧边界。 能力画像先看边界能做到0 标注直接分类零样本每类 10~30 张标注只训一层线性层小样本线性探针按文本描述做图文语义检索。做不到像素级缺陷定位输出是类级概率没有 bounding box纯 CPU 高吞吐部署普通 CPU 单张推理在百毫秒量级未逐机型实测。做到什么程度ImageNet 零样本 top-1 约 76.2%ViT-B/32论文公开值在下方模拟测试里每类 10 张标注的线性探针版高于用 500 张/类微调的 ResNet-50。参数量参考RN50 约 103MViT-B/32 与 B/16 约 151MViT-L/14 约 304M。参数越大精度上限越高推理成本同步上升没有免费的午餐。图中展示 CLIP 的双塔结构视觉编码器和文本编码器各自编码再经对比学习把图像与文本投进同一特征空间分类因此变成图文匹配问题。核心入口在 clip/clip.pyload、tokenize、available_models 三个函数覆盖本文路径的全部需求。本文只覆盖零样本到线性探针这三层不涉及 LoRA 微调和分布式训练。 渐进式落地路径从 0 标注到每类 10 张第一层零样本0 标注先跑通适用新缺陷类没有数据先验证 CLIP 适不适合这个任务。import clip import torch from PIL import Image model, preprocess clip.load(ViT-B/32) # 关键行默认首选 device model.device image preprocess(Image.open(defect.jpg)).unsqueeze(0).to(device) text clip.tokenize([ # 关键行模板决定精度下限 a photo of a normal metal part, a photo of a rusty metal part, a photo of a cracked metal part, ]).to(device) with torch.no_grad(): probs model(image, text)[0].softmax(dim-1) print(probs) # 三个概率按模板顺序两个决策点。一为什么选 ViT-B/32 而非 B/16两者零样本差距很小B/32 推理快一截产线对吞吐敏感。二模板为什么写成 a photo of a ...CLIP 在图片caption对上调过caption 句式比裸类别名更接近训练分布裸类别名是常见的精度漏点。模板越加越多但精度不动或者不想再纠结措辞时进入多层模板集成。第二层多模板集成仍然 0 标注适用没有标注资源但精度要求比单模板高。classes [normal, rusty, cracked] # 可省略行 templates [ # 关键行3 个模板起步 a photo of a {} metal part, a close-up of a {} metal part, an image of a {} industrial part, ] probs [] for t in templates: # 关键行逐模板取概率 text clip.tokenize([t.format(c) for c in classes]).to(device) with torch.no_grad(): probs.append(model(image, text)[0].softmax(dim-1).cpu()) final torch.stack(probs).mean(0) # 关键行概率平均这里平均概率而非 logits。原因是量纲不同模板间 logits 尺度差异大直接平均会让尺度大的模板主导。softmax 之后再平均相当于模板间等权投票。模板数量建议 3~8 个超过 8 个增量通常小于 1 个点数百张图规模实测更大规模未验证。模板内容也要贴合实拍条件只写类别名的模板通常不如加上材质与拍摄场景的模板。仓库里 26 个数据集的现成模板可直接改造见 data/prompts.md。每类攒够 10 张以上标注、且类别数稳定后上线性层。第三层线性探针每类 10 张适用类别数稳定目标是稳定快判且能拿到每类 10~30 张标注。with torch.no_grad(): # 关键行特征只提一次 feats model.encode_image(images.to(device)) feats feats.cpu().numpy() / feats.norm(axis-1, keepdimsTrue) from sklearn.linear_model import LogisticRegression clf LogisticRegression(C1.0, max_iter2000) # 关键行小 C 正则化 clf.fit(feats, labels) # 可省略行clf.predict 出结果这一层只学决策边界backbone 权重不动。每类 10 张就够训稳定C 不建议调大线性层容量高小样本撑不住调大 C 会过拟合。特征向量可以落盘缓存。新缺陷类出现时只需对新样本提特征、重训线性层几秒内热替换backbone 和部署链路都不动。 生产验证300 张轴承图的对照测试模拟测试场景轴承三分类正常 / 锈蚀 / 裂纹。训练用每类 10 张标注留出 300 张评测。测试集混了三种拍摄条件自然光、厂房灯、纯黑背景。环境单张 RTX 3090ViT-B/32FP32。方案标注量Top-1 准确率单图延迟基线ResNet-50 微调500 张/类93.7%9msCLIP 零样本3 模板087.3%13msCLIP 零样本8 模板集成090.4%16msCLIP 线性探针10 张/类95.0%12ms看基线列ResNet-50 需要 1500 张标注才到 93.7%CLIP 线性探针用 30 张标注到 95.0%标注量差 50 倍。延迟差异在产线可接受范围内。两个预期之外的发现。⚠️踩坑纯黑背景条件下零样本准确率比其他两组低 4~6 个点。原因是 a photo of 模板偏向自然照片而工业固定相机画面是纯黑背景、无环境信息。模板补上 on a black background 后该条件回到 91 个点附近。教训提示词要描述实拍条件不是理想条件。意外收益线性层上线后新增一个缺陷类只需 10 张标注加一次几秒级的线性层重训backbone 与部署链路零改动比换模型轻得多。⚡ 决策速查选型逻辑只有两个问题有没有标注吞吐要求多大。场景方案建议模型新类别当天要结果零样本单模板ViT-B/32无标注要求精度3~8 模板集成ViT-B/16每类 10 标注类别稳定线性探针ViT-B/32只有 CPU 部署零样本 / 线性探针RN50第一周行动清单克隆仓库https://gitcode.com/GitHub_Trending/cl/CLIP跑 tests/test_consistency.py 验证环境CPU 即可。抽 20 张产线代表图跑第一层零样本流程记录每类的 top-2 概率差。top-2 概率差小于 0.2 的类别补 10 张人工标注上线性层其余直接进多模板集成。进阶看两处编码器结构在 clip/model.py提示工程与多模板投票的完整实操在 notebooks/Prompt_Engineering_for_ImageNet.ipynb。【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考