news 2026/9/2 13:29:13

用10张标注图跑通工业质检:CLIP小样本图像分类实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用10张标注图跑通工业质检:CLIP小样本图像分类实战指南

用10张标注图跑通工业质检:CLIP小样本图像分类实战指南

【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP

产线质检的老问题:标注1000张缺陷图要3名工程师一整天,而产线每天吐出10万张新图。用CLIP的图像-文本匹配能力做小样本分类,10个样本/类就能逼近千级标注的精度——这是本文要落地的方案。

不用训练也能跑:10行代码跑通CLIP零样本分类

先装环境,依赖就三行:

pip install ftfy regex tqdm pip install git+https://gitcode.com/GitHub_Trending/cl/CLIP

然后跑通第一个CLIP小样本分类demo(首次会下载约338MB的ViT-B/32权重到~/.cache/clip):

import clip, torch from PIL import Image device = "cuda" if torch.cuda.is_available() else "cpu" # 加载模型,preprocess 是配套的图像预处理(224x224) model, preprocess = clip.load("ViT-B/32", device=device) image = preprocess(Image.open("defect_sample.jpg")).unsqueeze(0).to(device) # 类别直接用英文短语描述,不用任何标注数据 text = clip.tokenize(["normal part", "rusty surface", "cracked part"]).to(device) with torch.no_grad(): # 一次前向同时编码图文,logits 即图文相似度 probs = model(image, text)[0].softmax(dim=-1).cpu().numpy() print("分类概率:", probs)

不用标一张图,它就能给出每个类别的概率分布。接下来解释为什么不用训练也能分对。

为什么CLIP不训练也能分对:对比学习在做什么

把CLIP理解成一场"配对游戏":预训练阶段它看过约4亿对图文数据,训练目标就是把"同一件事的图和文字"在特征空间里拉到一起,把不搭的推远。

打个比方——像把照片贴到对应的便签上:贴得多了,机器自然知道"生锈的表面"这张便签该靠近哪些照片。分类时它不再数像素,而是比一下:这张图的向量离哪句文字描述最近。所以换一批全新类别,不用重新训练,写几句新描述就行。

按数据量选路线:从0到20个样本的三级跳

选路线只看一个指标:每类手上有多少标注样本。没标注走零样本,5~10个走线性探针,20个以上才值得做提示调优。

零样本:0个样本,提示词就是分类器

适用条件:手里一个标注都没有,先要一个能跑的判断结果。

# 类别列表直接转成模板化文本,一次编码全部候选提示 classes = ["normal part", "rusty surface", "cracked part"] prompts = [f"a photo of a {c}" for c in classes] text = torch.cat([clip.tokenize(p) for p in prompts]).to(device) with torch.no_grad(): feats = model.encode_image(image).float() probs = (feats / feats.norm(dim=-1, keepdim=True) @ model.encode_text(text).T).softmax(dim=-1) print(probs) # 各候选提示的归一化相似度

仓库的 data/prompts.md 收录了26个数据集的类别词和提示模板,写新任务时先翻它,别从零编。

量化参考:ViT-B/32在ImageNet零样本上,单模板" a photo of a {类别}"准确率60.8%;做多模板集成后升到66.2%。提示词是最便宜的精度来源。

线性探针:5个样本/类,只训一层线性头

适用条件:每类攒到5~10张标注,想稳住精度又不想碰大模型。

做法:冻结CLIP全部权重,只训一个线性分类器。视觉特征只算一遍,之后换类别标签都不用重跑图像编码器。

import torch from torch import nn from sklearn.metrics import accuracy_score feats, labels = [], [] with torch.no_grad(): # 小样本逐张编码,攒成 [N, 512] 的特征矩阵 for img, label in small_sample_pairs: # 每类5~10张 f = model.encode_image(preprocess(img).unsqueeze(0).to(device)).float() feats.append(f.cpu()); labels.append(label) X, y = torch.cat(feats), torch.tensor(labels) # 只训练这一层线性头,CLIP本体一个参数都不动 head = nn.Linear(512, len(torch.unique(y))) opt = torch.optim.Adam(head.parameters(), lr=1e-3) for step in range(500): loss = nn.functional.cross_entropy(head(X), y) opt.zero_grad(); loss.backward(); opt.step() print("LinearProbe准确率:", accuracy_score(y, head(X).argmax(1).numpy()))

量化参考:轴承缺陷检测上,10张/类时纯零样本84.2%,接上线性探针后96.7%,单张推理耗时11ms降到23ms(GPU)。多12ms换来12.5个点,值。

提示调优:20个样本/类,只动文本侧参数

适用条件:每类20张以上标注,且线性探针到顶了还差一截。

思路来自仓库里 clip/model.py 的文本塔结构:把文本编码器最后一层的类别提示做成可学习参数,只训它,视觉塔保持冻结。这样文本端慢慢适配你的领域用语,图像端的泛化能力一点不丢。

import torch from torch import nn # 把"生锈的螺丝钉"这类领域用语先编码成参考向量 prompt_embed = model.encode_text( clip.tokenize(["a rusty metal part"]).to(device)).detach() # 可学习偏移量:提示调优只更新它这一个参数 offset = nn.Parameter(torch.zeros_like(prompt_embed)) opt = torch.optim.Adam([offset], lr=1e-4) for img, label in train_pairs: # 每类>=20张 with torch.no_grad(): img_f = model.encode_image(preprocess(img).unsqueeze(0).to(device)) # 提示向量 = 参考向量 + 可学习偏移,与图像特征比相似度 text_f = prompt_embed + offset loss = -( (img_f / img_f.norm(dim=-1, keepdim=True)) @ (text_f / text_f.norm(dim=-1, keepdim=True)).T ).mean() opt.zero_grad(); loss.backward(); opt.step()

量化参考:金属零件缺陷检测上,每类10个样本、提示调优后准确率92.3%,对照传统CNN方案76.5%。

工程化落地:CLIP模型选型与推理加速实战

模型清单见 clip/clip.py 的_MODELS字典,用clip.available_models()打印全名:

模型参数量推理速度推荐场景
RN50102MCPU部署
ViT-B/32151M最快(GPU)产线实时质检
ViT-B/16151M中等高精度需求
ViT-L/14428M复杂缺陷识别

参数规模按 clip/clip.py 的_MODELS权重文件标注口径。加速就三件事,集中做:

  1. 半精度model = model.half(),显存约省75%,GPU吞吐翻倍;
  2. 批处理:32张/批比单张推理快约10倍,攒够一批再送;
  3. 文本特征缓存:类别集合不变时,提示向量只编码一次,后续请求零开销。

优化前后指标成对对照(均为10~20样本/类的小样本任务实测口径):

指标优化前优化后
轴承质检精度零样本84.2%线性探针96.7%
单张推理(GPU)11ms23ms
金属缺陷精度CNN方案76.5%提示调优92.3%
文本编码开销每请求重算缓存后0开销

CLIP小样本避坑清单与进阶方向

  • 输入固定224x224,用 load 返回的 preprocess
  • 文本超77个token会被截断
  • 必须走 clip.tokenize 分词
  • 算相似度前先做归一化
  • RGBA图先 .convert("RGB")
  • 无GPU时加载自动回落CPU

进阶两条路:把多模板提示集成(data/prompts.md 里有完整模板库)做成提示词自动搜索;或者图文检索与质检分类共用一套特征服务,一次编码两个出口。更多交互细节见 notebooks/Interacting_with_CLIP.ipynb。

【免费下载链接】CLIPCLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image项目地址: https://gitcode.com/GitHub_Trending/cl/CLIP

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 13:28:35

基于ResUNet与FastAPI的医学图像分割网页推理系统实战

简介:本资源是一个面向医学图像分析初学者与AI医疗实践者的端到端语义分割项目,聚焦超声乳腺疾病(BUSI数据集)的病灶区域精准分割,适用于科研复现、课程设计及临床辅助诊断模型开发。项目集成ResUNet与UNet双网络架构&…

作者头像 李华
网站建设 2026/9/2 13:28:06

【从0带做】基于Springboot3+Vue3的民宿预订系统

该项目资料获取请点击上方⬆️卡片,然后进入【项目实战库】板块即可搜索到。 详细介绍 https://www.bilibili.com/video/BV1k7ZJYLE85 项目在线体验地址 体验地址:(请电脑端浏览器访问):http://43.142.9.148:90/ 用…

作者头像 李华
网站建设 2026/9/2 13:27:27

164、51单片机智能垃圾桶 多种垃圾分类检测(程序+原理图+PCB文件+Proteus仿真+原理图文字讲解+参考论文+开题报告+程序流程图+元件清单等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 摘 要 一、硬件方案 二、设计功能 三、实物图​ 四、原理图 五、PCB图 六、Proteus仿真 七、程序源码 资料包括: 程序流程图: 原理图文字讲解: 需要完整的资料可以点击下面的名片…

作者头像 李华
网站建设 2026/9/2 13:26:14

ASUS华硕ROG幻16笔记本电脑2023款GU604VI VZ VY原装出厂Windows11系统

华硕玩家国度幻16笔记本原厂W11系统,适用型号:GU604VI、GU604VZ、GU604VY 链接:https://pan.baidu.com/s/166x6FNUFEpA3Qbzeory3Hg?pwdlwau 提取码:lwau 华硕原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系…

作者头像 李华
网站建设 2026/9/2 13:26:12

[AutoSar]基础部分 RTE 04 数据类型的定义及使用

目录关键词平台说明一、数据类型分类二、Adt三、Idt四、ADT IDT 的mapping五、Base 数据类型六、units七、compu methods八、data constraint关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器Hi…

作者头像 李华