一、引言
pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理(NLP)、多模态(Multimodal)等4大类,28小类任务(tasks)。共计覆盖32万个模型
今天介绍CV计算机视觉的第三篇,图像分割(image-segmentation),在huggingface库内有800个图像分类模型。
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。
图像分割(image-segmentation)的默认模型为facebook/detr-resnet-50-panoptic,全称为:DEtection TRansformer(DETR)-resnet-50-全景。其中有3个要素:
DEtection TRansformer(DETR)主体结构:
由三个主要部分组成:用于特征提取的CNN后端(ResNet)、transformer编码器-解码器和用于最终检测预测的前馈网络(FFN)。后端处理输入图像并生成激活图。transformer编码器降低通道维度并应用多头自注意力和前馈网络。transformer解码器使用N个物体嵌入的并行解码,并独立预测箱子坐标和类别标签,使用物体查询。DETR利用成对关系,从整个图像上下文中受益,共同推理所有物体。
DEtection TRansformer(DETR)应用于全景分割:
将图片内的box进行embedding后输入至MHA中提取每个box中的图片信息,采用Resnet生成激活图,采用pixel-wise(像素级别)的损失函数进行学习。pixel-wise损失函数是计算预测图像与目标图像的像素间的损失。属于像素间类型的损失函数,常见的有:MSE(L2损失),MAE(L1损失)和交叉熵等。计算机视觉领域的损失函数有3类:pixel-wise(像素级别),patch-wise(块级别),image-wise(图片级别)。
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
、List[str]
或PIL.Image
)List[PIL.Image]
——管道处理三种类型的图像: 管道可以接受单张图片或一批图片。一批图片中的图片必须全部采用相同的格式:全部为 HTTP(S) 链接、全部为本地路径或全部为 PIL 图片。
str
,可选)— 要执行的分割任务,根据模型功能 选择 [ semantic
,instance
和]。如果未设置,管道将尝试按以下顺序解析: ,,。panopticpanopticinstancesemantic
float
,可选,默认为 0.9)— 用于过滤预测掩码的概率阈值。float
,可选,默认为 0.5)— 将预测掩码转换为二进制值时使用的阈值。float
,可选,默认为 0.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_segmentation = pipeline(task="image-segmentation",model="facebook/detr-resnet-50-panoptic")
output = image_segmentation("http://images.cocodataset.org/val2017/000000039769.jpg")
print(output)
"""
[{'score': 0.994096, 'label': 'cat', 'mask': <PIL.Image.Image image mode=L size=640x480 at 0x7F24E13B4710>}, {'score': 0.998669, 'label': 'remote', 'mask': <PIL.Image.Image image mode=L size=640x480 at 0x7F24E13B4950>}, {'score': 0.999476, 'label': 'remote', 'mask': <PIL.Image.Image image mode=L size=640x480 at 0x7F24A2836250>}, {'score': 0.972207, 'label': 'couch', 'mask': <PIL.Image.Image image mode=L size=640x480 at 0x7F24A2837210>}, {'score': 0.999423, 'label': 'cat', 'mask': <PIL.Image.Image image mode=L size=640x480 at 0x7F24A2836290>}]
"""
output[0]["mask"].save(output[0]["label"]+".png")
执行后,自动下载模型文件:
图像分割后的结果会存入字典list中,将图片Image保存后,打开可见分割出的图片:
在huggingface上,我们将图像分割(image-segmentation)模型按下载量从高到低排序:
本文对transformers之pipeline的图像分割(image-segmentation)从概述、技术原理、pipeline参数、pipeline实战、模型排名等方面进行介绍,读者可以基于pipeline使用文中的2行代码极简的使用计算机视觉中的图像分割(image-segmentation)模型。