Hugging Face Transformers 零样本图像分类快速教程:不训练模型,3 步给图片打标签
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
你是否遇到过这样的需求:运营团队丢来一张新产品的实拍图,希望今晚就能自动归类到"食品 / 电子 / 服饰"?或者想给一批图片按自定义规则打标,却发现手头根本没有标注数据、也等不起一次模型训练?
用 Hugging Face Transformers 的零样本图像分类(zero-shot image classification),这件事可以绕开训练:你把一张图和一组"候选标签"交给它,模型直接告诉你图里是什么。无需 GPU、无需标注数据、无需改模型结构,核心代码不到 10 行。
原理速览:一张图讲清"零样本"是怎么做到的
三个要点就够了:
- 双塔同空间:图片被 CLIP 类的双塔模型编码成向量,你写的每个标签(如
"一只苹果")也编码成向量,两者落在同一个语义空间里。 - 分类 = 相似度:对每个标签算"图向量 vs 文向量"的相似度,分数最高的标签胜出。所谓"分类",本质是文本检索。
- 标签随你改:明天业务要多一个"家电"类目,改代码里的标签列表即可,模型一个参数都不用动——这正是"零样本"的含义。
项目里的测试样例图,就用来做后文的演示:
三步跑起来:环境、代码、调参
第 1 步:一键安装环境
# 克隆代码仓库(本文所有示例均基于本仓库代码) git clone https://gitcode.com/GitHub_Trending/tra/transformers cd transformers # 安装核心库(约 1 分钟,CPU 环境即可运行) pip install transformers没有 PyTorch 也能跑,pipeline 会自动选择合适的推理后端;首次运行会自动下载模型权重,之后走本地缓存。
第 2 步:最小可运行代码
把下面的demo.py放到仓库根目录(直接复用仓库自带的苹果样例图):
from transformers import pipeline # 任务名 + 模型名,一步加载零样本图像分类器 classifier = pipeline("zero-shot-image-classification", model="google/siglip-so400m-patch14-384") # 传入图片路径和候选标签,立即拿到带分数的排序结果 result = classifier( "tests/fixtures/tests_samples/COCO/apple.jpg", candidate_labels=["一只苹果", "一个足球", "一碗面条"], ) print(result) # 预期:[{'score': 0.9x, 'label': '一只苹果'}, ...]运行一次,输出是一个按相似度从高到低排序的列表,每个候选标签对应一个score。
第 3 步:调参让结果更"听话"
真正用起来时,你多半要调这两处:
| 调什么 | 怎么写 | 什么时候用 |
|---|---|---|
| 返回数量 | top_k=2(默认返回全部候选) | 候选标签很多时,只看前几名 |
| 推理设备 | device=1(加载时传入) | 有 GPU 时加速,批处理尤其明显 |
classifier = pipeline("zero-shot-image-classification", model="google/siglip-so400m-patch14-384", device=1) # 有 GPU 才加这一行 result = classifier("xxx.jpg", candidate_labels=["苹果", "足球", "面条", "风景"], top_k=2) # 只返回最可能的 2 个换个场景看效果,同一张图、不同标签集,结论完全不同(分数为示意值,以实际运行为准):
| 候选标签 | 最可能的预测 | 分数(示意) |
|---|---|---|
| 苹果 / 足球 / 面条 | 苹果 | 约 0.95 |
| 水果 / 蔬菜 / 玩具 | 水果 | 约 0.8 |
| 红 / 绿 / 黄 | 红 | 约 0.6 |
可以看出:模型不是"认出苹果",而是在你给的选项里挑语义最接近的。标签写得好不好,直接决定结果好不好。
进阶玩法:批量打标与文本零样本
批量处理:classifier直接接受路径列表,内部一次前向算完,比逐张调用快得多:
# 列表批量推理:一次传多张图,返回按图片分组的结果 paths = [ "tests/fixtures/tests_samples/COCO/apple.jpg", "tests/fixtures/tests_samples/COCO/000000039769.png", ] results = classifier(paths, candidate_labels=["食物", "动物", "人物", "厨房"], top_k=1)同类能力顺手可用:同一套"文本 vs 文本"的零样本思路也支持纯文本任务,比如按自定义标签给文章分类,任务名换成zero-shot-classification即可,思路完全一致,这里不再展开。
避坑指南:新手最常问的 4 个问题
Q:分数 0.9 是不是"90% 确定"?不是。分数是"在本次候选标签之间"的相对占比,所有候选的分数之和恒等于 1。候选只有 2 个时分数容易偏高,候选多了分数会被摊薄——比较同一批候选内的相对大小才有意义。
Q:候选里根本没有正确答案怎么办?模型仍会返回最接近的那个,且可能分数不高。建议保留一个"其他/无法判断"兜底标签,低置信度结果走人工复核。
Q:第一次运行特别慢?首次会自动下载模型权重(CPU 上下载本身不慢,解码图 + 前向约需 1~2 秒/张,视硬件而定);第二次起读缓存,速度正常。
Q:标签该写中文还是英文?写模型训练时更"熟悉"的语言。多数 CLIP 系模型对英文短描述更稳,中文短标签(2~6 个字的名词)通常也可用,避免长句。
上线前 checklist:
- 候选标签控制在 10 个以内,命名与业务类目一一对应
- 加一个兜底标签,并定好低分阈值
- 用一批真实业务图做冒烟测试,别只用官方样例图
文档入口与社区
- 官方文档(pipeline 总览):docs/source/en/main_classes/pipelines.md
- 零样本图像分类源码:src/transformers/pipelines/zero_shot_image_classification.py
- 更多可用模型与任务:浏览 src/transformers/pipelines/ 下的各任务实现
零样本图像分类的价值不在"省一次训练",而在让分类口径跟着业务走:类目表变了,改一行标签列表就行。建议收藏本文,下次接到"新图打标"需求时直接翻出来照着做。也欢迎克隆仓库动手改标签集,把结果贴到社区讨论。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考