一、引言
pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理(NLP)、多模态(Multimodal)等4大类,28小类任务(tasks)。共计覆盖32万个模型
今天介绍CV计算机视觉的第二篇,图像分类(image-classification),在huggingface库内有1.3万个图像分类模型。
图像分类,顾名思义就是将图片分类的模型,给定图片,返回对应的类别概率值,在计算机视觉CV领域模型最多,应用也最广泛,主要应用场景比如人脸识别、色情图片检测、自动驾驶、医疗影像分析等。
以google在2021年6月3日发布的Vision Transformer (ViT)为例,传统的图片识别通过CNN卷机神经网络提取图片信息,ViT将Transformer技术应用到图片分类上,开启了Transformer应用于计算机视觉的先河。该模型也是image-classification任务的默认模型:google/vit-base-patch16-224
ViT(视觉transformer)主要原理:首先将图片切分成大小相等的块序列(分辨率为16*16),对每个图片块进行线性嵌入添加位置信息,通过喂入一个标准的transfromer encoder结构进行特征交叉后,送入到MLP层,通过增加额外的分类标记构建分类任务,完成网络构造。详细论文
str
或ModelCard
,可选)— 属于此管道模型的模型卡。str
,可选)— 要使用的框架,"pt"
适用于 PyTorch 或"tf"
TensorFlow。必须安装指定的框架。
如果未指定框架,则默认为当前安装的框架。如果未指定框架且安装了两个框架,则默认为model的框架,如果未提供模型,则默认为 PyTorch。
str
,默认为""
)— 管道的任务标识符。int
,可选,默认为 8)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的工作者数量。int
,可选,默认为 1)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的批次的大小,对于推理来说,这并不总是有益的,请阅读使用管道进行批处理。int
,可选,默认为 -1)— CPU/GPU 支持的设备序号。将其设置为 -1 将利用 CPU,设置为正数将在关联的 CUDA 设备 ID 上运行模型。您可以传递本机torch.device
或str
太str
或torch.dtype
,可选) - 直接发送model_kwargs
(只是一种更简单的快捷方式)以使用此模型的可用精度(torch.float16
,,torch.bfloat16
...或"auto"
)bool
,可选,默认为False
)——标志指示管道的输出是否应以序列化格式(即 pickle)或原始输出数据(例如文本)进行。str
,可选,默认为"default"
)— 用于检索分数的模型输出函数。接受四个不同的值: "default"
:如果模型只有一个标签,则在输出上应用 sigmoid 函数。如果模型有多个标签,则在输出上应用 softmax 函数。"sigmoid"
:在输出上应用 S 型函数。"softmax"
:在输出上应用 softmax 函数。"none"
:不对输出应用任何功能。str
、List[str]
或PIL.Image
)List[PIL.Image]
——管道处理三种类型的图像: 管道可以接受单张图片或一批图片,然后必须以字符串形式传递。一批图片必须全部采用相同的格式:全部为 http 链接、全部为本地路径或全部为 PIL 图片。
str
,可选,默认为"default"
)— 用于检索分数的模型输出函数。接受四个不同的值: 如果不指定此参数,那么它将根据标签数量应用以下函数:
可能的值包括:
"sigmoid"
:在输出上应用 S 型函数。"softmax"
:在输出上应用 softmax 函数。"none"
:不对输出应用任何功能。int
,可选,默认为 5)— 管道将返回的顶部标签数。如果提供的数字高于模型配置中可用的标签数,则将默认为标签数。float
,默认为 None)— 等待从网络获取图像的最长时间(以秒为单位)。如果为 None,则不设置超时,并且调用可能会永远阻塞。识别http链接中的物品
采用pipeline代码如下
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
from transformers import pipeline
image_classification = pipeline(task="image-classification",model="google/vit-base-patch16-224")
output = image_classification("http://images.cocodataset.org/val2017/000000039769.jpg")
print(output)
"""
[{'label': 'Egyptian cat', 'score': 0.9374418258666992}, {'label': 'tabby, tabby cat', 'score': 0.03844244033098221}, {'label': 'tiger cat', 'score': 0.01441137958317995}, {'label': 'lynx, catamount', 'score': 0.0032743141055107117}, {'label': 'Siamese cat, Siamese', 'score': 0.0006795910303480923}]
"""
执行后,自动下载模型文件:
识别结果为:埃及猫
[{'label': 'Egyptian cat', 'score': 0.9374418258666992}, {'label': 'tabby, tabby cat', 'score': 0.03844244033098221}, {'label': 'tiger cat', 'score': 0.01441137958317995}, {'label': 'lynx, catamount', 'score': 0.0032743141055107117}, {'label': 'Siamese cat, Siamese', 'score': 0.0006795910303480923}]
在huggingface上,我们将图像分类(image-classification)模型按下载量从高到低排序:
本文对transformers之pipeline的图像分类(image-classification)从概述、技术原理、pipeline参数、pipeline实战、模型排名等方面进行介绍,读者可以基于pipeline使用文中的2行代码极简的使用计算机视觉中的图像分类(image-classification)模型。