一、引言
pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理(NLP)、多模态(Multimodal)等4大类,28小类任务(tasks)。共计覆盖32万个模型
今天介绍CV计算机视觉的第三篇,图像分割(image-segmentation),在huggingface库内有800个图像分类模型。
二、图像分割(image-segmentation)
2.1 概述
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。
2.2 技术原理
图像分割(image-segmentation)的默认模型为facebook/detr-resnet-50-panoptic,全称为:DEtection TRansformer(DETR)-resnet-50-全景。其中有3个要素:
- DEtection TRansformer (DETR):于2020年5月由Facebook AI发布于《End-to-End Object Detection with Transformers》,提出了一种基于transformer的端到端目标检测方法,相比于YOLO具有更高的准确性,但速度不及YOLO,可以应用于医疗影像等不追求实时性的目标检测场景,对于追求实时性的目标检测场景,还是得YOLO,关于YOLOv10,可以看我之前的文章。
- ResNet-50:ResNet-50是一种深度残差网络(Residual Network),是ResNet系列中的一种经典模型。它由微软研究院的Kaiming He等人于2015年提出,被广泛应用于计算机视觉任务,如图像分类、目标检测和图像分割等。ResNet-50是一种迁移学习模型,迁移学习的核心思想是将源领域的知识迁移到目标领域中,可以采用样本迁移、特征迁移、模型迁移、关系迁移等手段。
- 全景分割panoptic: DETR在COCO2017全景图(118k 带注释图像)上进行端到端训练,全景分割即可以将图片全景分割成多个区域,每个区域使用同一编号。
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(图片级别)。
2.3 应用场景
- 医学影像分析:在医疗领域,图像分割用于识别和分割肿瘤、器官等,帮助医生进行诊断和手术规划。
- 自动驾驶:车辆需要识别道路、行人、其他车辆等,图像分割技术可以辅助车辆理解周围环境,提高安全性和导航准确性。
- 遥感与地图制作:通过分割卫星或无人机图像,可以自动识别水体、森林、建筑物等,用于城市规划、环境监测和自然资源管理。
- 增强现实:在AR应用中,分割技术用于区分前景和背景,使得虚拟物体能够自然地融入真实世界场景中。
- 时尚与零售:用于服装分割,帮助自动识别和分类衣物,用于在线购物的虚拟试穿或商品推荐。
- 自然资源管理:如森林火灾监测,通过分割图像识别火源区域。
- 体育分析:分析运动员动作,通过分割跟踪特定运动员或球的运动轨迹。
2.4 pipeline参数
2.4.1 pipeline对象实例化参数
- model(PreTrainedModel或TFPreTrainedModel)— 管道将使用其进行预测的模型。 对于 PyTorch,这需要从PreTrainedModel继承;对于 TensorFlow,这需要从TFPreTrainedModel继承。
- image_processor ( BaseImageProcessor ) — 管道将使用的图像处理器来为模型编码数据。此对象继承自 BaseImageProcessor。
- modelcard(
str
或ModelCard
,可选)— 属于此管道模型的模型卡。 - framework(
str
,可选)— 要使用的框架,"pt"
适用于 PyTorch 或"tf"
TensorFlow。必须安装指定的框架。 如果未指定框架,则默认为当前安装的框架。如果未指定框架且安装了两个框架,则默认为model的框架,如果未提供模型,则默认为 PyTorch。 - task(
str
,默认为""
)— 管道的任务标识符。 - num_workers(
int
,可选,默认为 8)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的工作者数量。 - batch_size(
int
,可选,默认为 1)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的批次的大小,对于推理来说,这并不总是有益的,请阅读使用管道进行批处理。 - args_parser(ArgumentHandler,可选) - 引用负责解析提供的管道参数的对象。
- device(
int
,可选,默认为 -1)— CPU/GPU 支持的设备序号。将其设置为 -1 将利用 CPU,设置为正数将在关联的 CUDA 设备 ID 上运行模型。您可以传递本机torch.device
或str
太 - torch_dtype(
str
或torch.dtype
,可选) - 直接发送model_kwargs
(只是一种更简单的快捷方式)以使用此模型的可用精度(torch.float16
,,torch.bfloat16
...或"auto"
) - binary_output(
bool
,可选,默认为False
)——标志指示管道的输出是否应以序列化格式(即 pickle)或原始输出数据(例如文本)进行。
2.4.2 pipeline对象使用参数
- images(
str
、List[str]
或PIL.Image
)List[PIL.Image]
——管道处理三种类型的图像:- 包含指向图像的 HTTP(S) 链接的字符串
- 包含图像本地路径的字符串
- 直接在 PIL 中加载的图像
管道可以接受单张图片或一批图片。一批图片中的图片必须全部采用相同的格式:全部为 HTTP(S) 链接、全部为本地路径或全部为 PIL 图片。
- subtask(
str
,可选)— 要执行的分割任务,根据模型功能 选择 [semantic
,instance
和]。如果未设置,管道将尝试按以下顺序解析: ,,。panopticpanopticinstancesemantic
- threshold(
float
,可选,默认为 0.9)— 用于过滤预测掩码的概率阈值。 - mask_threshold(
float
,可选,默认为 0.5)— 将预测掩码转换为二进制值时使用的阈值。 - overlap_mask_area_threshold(
float
,可选,默认为 0.5)— 掩膜重叠阈值,用于消除小的、不连续的段。 - timeout(可选
float
,默认为 None)— 等待从网络获取图像的最长时间(以秒为单位)。如果为 None,则不设置超时,并且调用可能会永远阻塞。
2.4 pipeline实战
识别http链接中的物品
采用pipeline代码如下
代码语言:javascript复制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保存后,打开可见分割出的图片:
2.5 模型排名
在huggingface上,我们将图像分割(image-segmentation)模型按下载量从高到低排序:
三、总结
本文对transformers之pipeline的图像分割(image-segmentation)从概述、技术原理、pipeline参数、pipeline实战、模型排名等方面进行介绍,读者可以基于pipeline使用文中的2行代码极简的使用计算机视觉中的图像分割(image-segmentation)模型。