open_clip零样本分类:从安装到出第一个结果只要3个动作
【免费下载链接】open_clipAn open source implementation of CLIP.项目地址: https://gitcode.com/GitHub_Trending/op/open_clip
想在本地跑通零样本图像分类,却不想自己攒数据、从零训模型?open_clip 就是干这个的 CLIP 开源实现:给它一张图和几句自然语言,它直接告诉你图更像哪一句。
下面按一条线讲:先把它跑起来,再讲它到底能干什么,然后是选型,最后替你记下 3 个高频坑。
🚀 先把它跑起来
装好后第一件该做的事是把模型拉起来,一条命令就够:
pip install open_clip_torch装完包会带一份模型注册表,首次加载时自动把对应的预训练权重拉到本地缓存,具体有哪些名字和权重,可以翻 预训练模型列表。接下来这段是 README 里的最小例子:一张图、两句文字喂进去,各自得到一组特征。
import torch, open_clip from PIL import Image model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k') tokenizer = open_clip.get_tokenizer('ViT-B-32') image = preprocess(Image.open('cat.jpg')).unsqueeze(0) text = tokenizer(['a photo of a cat', 'a photo of a dog']) with torch.no_grad(): img_f, txt_f = model.encode_image(image), model.encode_text(text)跑完后最后一步其实在你脑子里:把 img_f 和 txt_f 相乘再做个 softmax,概率大的那句就是答案——图是猫的话,"a photo of a cat" 应该明显高于 "a photo of a dog"。图片尺寸别手动调,缩放和归一化由返回的 preprocess 函数兜底,照用它最稳。想多把玩的话,仓库里有份交互 notebook:docs/Interacting_with_open_clip.ipynb,浏览器里直接跑,不用装环境。
它到底能帮你做什么
场景一:用一句话搜商品图库。商品库想支持以文搜图,传统做法得有人给每张图打标签、再维护一套标签体系。用 open_clip,只需离线算好图片特征和语句特征,按相似度检索,语义相关的说法也能命中。和纯关键词检索比,"阳光下打盹的黑猫"这种描述也能找到对的那张图,具体提升多少要看你自己的数据评测。
场景二:海量图库自动打标签。想给图库自动分类、辅助审核时,传统做法是每新增一个类别就得收集样本、单独训一个分类器。open_clip 零样本分类只需要把类别换成一句描述文本,新增类别的成本约等于零。审核场景同理:把违规内容写成文本模板,用相似度分数筛出嫌疑图,省下人工初筛的活。
上图对应前文结论:(1) 对比学习预训练、(2) 用标签文本搭分类器、(3) 零样本预测——你拿到的"匹配哪句话"就是第 (3) 步,前提靠第 (1) 步对齐好的双塔特征。
🧭 选型与调参:动手前先看清这个
按显存挑open_clip零样本分类模型
模型名不等于档次:同一个 ViT-B-16 就有 laion、datacomp、openai 好几套权重,准确率差别不小,所以先定权重 tag 再谈大小。只是推理、显存小于 8G 时,从 ViT-B-32 起步(约 1.5 亿参数、14.8 GFLOPs,详见 模型参数表);要追更高精度就升到 ViT-L-14、ViT-H-14 乃至 bigG,每升一档,显存和算力开销都翻好几倍。别上来就选最大的:38 个数据集的零样本结果表 里各模型的差距和参数量不成正比,先拿小模型跑评测,不达标再升。
另一个容易被忽略的调参点是文本侧的措辞。仓库在 src/open_clip/zero_shot_metadata.py 里备了一套模板池,做零样本分类时套 "a photo of a {类别}" 这类句式比单句更稳。
上图对应"先定权重 tag 再谈大小":零样本精度随训练样本量上升——选型时先看这组权重吃过多少数据,别只盯参数量,具体数值以 README 表格为准。
⚠️ 踩过的坑,替你记好了
这里几乎没人能一次跑通,给你记下三个高频问题。
报 'Unknown model' 或找不到预训练 tag
原因:模型名和 pretrained tag 不配套——每个名字对应一套或多套权重,填错即挂;另一种是用了 timm 系图像编码器(如 convnext)但 timm 版本太旧。解法:用open_clip.list_pretrained()核对配套关系,timm 模型先pip install -U timm。
open_clip零样本分类准确率比预期低
原因:先怀疑模型还在 train 模式——BatchNorm 这些层在推理时行为不一样,README 示例代码里那行model.eval()的注释说的就是它;其次是权重用的激活是 QuickGELU,你却用了默认 GELU 的模型定义。解法:加载后调model.eval();加载 OpenAI 或早期 OpenCLIP 权重时换-quickgelu后缀的模型定义。
自己训模型时loss不降或变NaN
原因:main 分支默认精度已改为 amp_bf16,照着老配置写的 amp 就得显式传,别以为默认一样;批次开太大也更容易溢出。解法:显式传精度模式,把--batch-size调小,用--accum-freq做梯度累积。
这条 loss 曲线来自仓库训练日志:先快速下降、再缓慢贴近 0——你训的时候如果一直平或一上来就 NaN,先和它对比形态。
这是 ImageNet 零样本验证准确率随训练步数的变化,训完模型该盯的是这条曲线,而不是 loss。
open_clip 最擅长"用一句话描述类别"的图像-文本任务,想要文本生成得另找项目。下一步去读 docs/PRETRAINED.md,按你的显存挑一套权重。
【免费下载链接】open_clipAn open source implementation of CLIP.项目地址: https://gitcode.com/GitHub_Trending/op/open_clip
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考