Transformers 文档

SAM-HQ

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

SAM-HQ

概述

SAM-HQ (High-Quality Segment Anything Model) 是 Lei Ke、Mingqiao Ye、Martin Danelljan、Yifan Liu、Yu-Wing Tai、Chi-Keung Tang 和 Fisher Yu 在 高质量分割一切 中提出的。

该模型是对原始 SAM 模型的增强,可生成更高质量的分割掩码,同时保持 SAM 原始的可提示设计、效率和零样本泛化能力。

example image

SAM-HQ 在原始 SAM 模型的基础上引入了多项关键改进:

  1. 高质量输出标记:注入到 SAM 掩码解码器中的可学习标记,用于更高质量的掩码预测
  2. 全局-局部特征融合:结合模型不同阶段的特征,以改进掩码细节
  3. 训练数据:使用精心策划的 44K 高质量掩码数据集,而非 SA-1B
  4. 效率:仅增加 0.5% 的额外参数,同时显著提高掩码质量
  5. 零样本能力:保持 SAM 强大的零样本性能,同时提高准确性

论文摘要如下:

最近的 Segment Anything Model (SAM) 代表着分割模型规模化的一大飞跃,它允许强大的零样本能力和灵活的提示。尽管用 11 亿个掩码进行训练,SAM 的掩码预测质量在许多情况下仍显不足,特别是在处理具有复杂结构的对象时。我们提出了 HQ-SAM,它赋予 SAM 精确分割任何对象的能力,同时保持 SAM 原始的可提示设计、效率和零样本泛化能力。我们精心设计,重用并保留了 SAM 的预训练模型权重,同时只引入了最少的额外参数和计算。我们设计了一个可学习的高质量输出标记,它被注入到 SAM 的掩码解码器中,负责预测高质量掩码。我们不只将其应用于掩码解码器特征,而是首先将它们与早期和最终的 ViT 特征融合,以改进掩码细节。为了训练我们引入的可学习参数,我们从多个来源组成了 44K 细粒度掩码数据集。HQ-SAM 仅在引入的 44k 掩码数据集上进行训练,这在 8 个 GPU 上仅需 4 小时。

技巧

  • SAM-HQ 生成的掩码质量高于原始 SAM 模型,特别是对于具有复杂结构和精细细节的对象
  • 该模型预测的二值掩码具有更准确的边界,并能更好地处理细微结构
  • 与 SAM 类似,该模型在输入 2D 点和/或输入边界框时表现更好
  • 您可以为同一图像提示多个点,并预测单个高质量掩码
  • 该模型保持了 SAM 的零样本泛化能力
  • 与 SAM 相比,SAM-HQ 仅增加了约 0.5% 的额外参数
  • 模型微调暂不支持

此模型由 sushmanth 贡献。原始代码可在 此处 找到。

以下是给定图像和 2D 点运行掩码生成的一个示例

import torch
from PIL import Image
import requests
from transformers import SamHQModel, SamHQProcessor

device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-base").to(device)
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-base")

img_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
input_points = [[[450, 600]]]  # 2D location of a window in the image

inputs = processor(raw_image, input_points=input_points, return_tensors="pt").to(device)
with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu()
)
scores = outputs.iou_scores

您还可以将自己的掩码与输入图像一起在处理器中处理,然后传递给模型

import torch
from PIL import Image
import requests
from transformers import SamHQModel, SamHQProcessor

device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-base").to(device)
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-base")

img_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
mask_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
segmentation_map = Image.open(requests.get(mask_url, stream=True).raw).convert("1")
input_points = [[[450, 600]]]  # 2D location of a window in the image

inputs = processor(raw_image, input_points=input_points, segmentation_maps=segmentation_map, return_tensors="pt").to(device)
with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu()
)
scores = outputs.iou_scores

资源

Hugging Face 官方和社区(由 🌎 表示)资源列表,可帮助您开始使用 SAM-HQ

SamHQConfig

transformers.SamHQConfig

< >

( vision_config = None prompt_encoder_config = None mask_decoder_config = None initializer_range = 0.02 **kwargs )

参数

  • vision_config (Union[dict, SamHQVisionConfig], 可选) — 用于初始化 SamHQVisionConfig 的配置选项字典。
  • prompt_encoder_config (Union[dict, SamHQPromptEncoderConfig], 可选) — 用于初始化 SamHQPromptEncoderConfig 的配置选项字典。
  • mask_decoder_config (Union[dict, SamHQMaskDecoderConfig], 可选) — 用于初始化 SamHQMaskDecoderConfig 的配置选项字典。
  • kwargs (可选) — 关键字参数字典。

SamHQConfig 是用于存储 SamHQModel 配置的配置类。它用于根据指定参数实例化 SAM-HQ 模型,定义视觉模型、提示编码器模型和掩码解码器配置。使用默认值实例化配置将生成与 SAM-HQ-ViT-H sushmanth/sam_hq_vit_h 架构类似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。

SamHQVisionConfig

transformers.SamHQVisionConfig

< >

( hidden_size = 768 output_channels = 256 num_hidden_layers = 12 num_attention_heads = 12 num_channels = 3 image_size = 1024 patch_size = 16 hidden_act = 'gelu' layer_norm_eps = 1e-06 attention_dropout = 0.0 initializer_range = 1e-10 qkv_bias = True mlp_ratio = 4.0 use_abs_pos = True use_rel_pos = True window_size = 14 global_attn_indexes = [2, 5, 8, 11] num_pos_feats = 128 mlp_dim = None **kwargs )

参数

  • hidden_size (int, 可选, 默认为 768) — 编码器层和池化层的维度。
  • output_channels (int, 可选, 默认为 256) — 补丁编码器中输出通道的维度。
  • num_hidden_layers (int, 可选, 默认为 12) — Transformer 编码器中的隐藏层数量。
  • num_attention_heads (int, 可选, 默认为 12) — Transformer 编码器中每个注意力层的注意力头数量。
  • num_channels (int, 可选, 默认为 3) — 输入图像中的通道数量。
  • image_size (int, 可选, 默认为 1024) — 预期分辨率。调整大小后的输入图像的目标尺寸。
  • patch_size (int, 可选, 默认为 16) — 从输入图像中提取的补丁大小。
  • hidden_act (str, 可选, 默认为 "gelu") — 非线性激活函数(函数或字符串)。
  • layer_norm_eps (float, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。
  • attention_dropout (float, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。
  • initializer_range (float, 可选, 默认为 1e-10) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。
  • qkv_bias (bool, 可选, 默认为 True) — 是否在查询、键、值投影中添加偏置。
  • mlp_ratio (float, 可选, 默认为 4.0) — mlp 隐藏维度与嵌入维度的比率。
  • use_abs_pos (bool, 可选, 默认为 True) — 是否使用绝对位置嵌入。
  • use_rel_pos (bool, 可选, 默认为 True) — 是否使用相对位置嵌入。
  • window_size (int, 可选, 默认为 14) — 相对位置的窗口大小。
  • global_attn_indexes (list[int], 可选, 默认为 [2, 5, 8, 11]) — 全局注意力层的索引。
  • num_pos_feats (int, 可选, 默认为 128) — 位置嵌入的维度。
  • mlp_dim (int, 可选) — Transformer 编码器中“中间”(即前馈)层的维度。如果为 None,则默认为 mlp_ratio * hidden_size

这是用于存储 SamHQVisionModel 配置的配置类。它用于根据指定参数实例化 SAM_HQ 视觉编码器,定义模型架构。实例化默认配置将生成与 SAM_HQ ViT-h facebook/sam_hq-vit-huge 架构类似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。

示例

>>> from transformers import (
...     SamHQVisionConfig,
...     SamHQVisionModel,
... )

>>> # Initializing a SamHQVisionConfig with `"facebook/sam_hq-vit-huge"` style configuration
>>> configuration = SamHQVisionConfig()

>>> # Initializing a SamHQVisionModel (with random weights) from the `"facebook/sam_hq-vit-huge"` style configuration
>>> model = SamHQVisionModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

SamHQMaskDecoderConfig

transformers.SamHQMaskDecoderConfig

< >

( hidden_size = 256 hidden_act = 'relu' mlp_dim = 2048 num_hidden_layers = 2 num_attention_heads = 8 attention_downsample_rate = 2 num_multimask_outputs = 3 iou_head_depth = 3 iou_head_hidden_dim = 256 layer_norm_eps = 1e-06 vit_dim = 768 **kwargs )

参数

  • hidden_size (int, 可选, 默认为 256) — 隐藏状态的维度。
  • hidden_act (str, 可选, 默认为 "relu") — SamHQMaskDecoder 模块中使用的非线性激活函数。
  • mlp_dim (int, 可选, 默认为 2048) — Transformer 编码器中“中间”(即前馈)层的维度。
  • num_hidden_layers (int, 可选, 默认为 2) — Transformer 编码器中的隐藏层数量。
  • num_attention_heads (int, 可选, 默认为 8) — Transformer 编码器中每个注意力层的注意力头数量。
  • attention_downsample_rate (int, 可选, 默认为 2) — 注意力层的下采样率。
  • num_multimask_outputs (int, 可选, 默认为 3) — SamHQMaskDecoder 模块的输出数量。在 Segment Anything 论文中,此值设置为 3。
  • iou_head_depth (int, 可选, 默认为 3) — IoU 头模块中的层数。
  • iou_head_hidden_dim (int, 可选, 默认为 256) — IoU 头部模块中隐藏状态的维度。
  • layer_norm_eps (float, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。

这是用于存储 SamHQMaskDecoder 配置的配置类。它用于根据指定参数实例化 SAM_HQ 掩码解码器,定义模型架构。实例化默认配置将生成与 SAM_HQ-vit-h facebook/sam_hq-vit-huge 架构类似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。

SamHQPromptEncoderConfig

class transformers.SamHQPromptEncoderConfig

< >

( hidden_size = 256 image_size = 1024 patch_size = 16 mask_input_channels = 16 num_point_embeddings = 4 hidden_act = 'gelu' layer_norm_eps = 1e-06 **kwargs )

参数

  • hidden_size (int, 可选, 默认为 256) — 隐藏状态的维度。
  • image_size (int, 可选, 默认为 1024) — 图像的预期输出分辨率。
  • patch_size (int, 可选, 默认为 16) — 每个补丁的大小(分辨率)。
  • mask_input_channels (int, 可选, 默认为 16) — 要馈送到 MaskDecoder 模块的通道数。
  • num_point_embeddings (int, 可选, 默认为 4) — 要使用的点嵌入的数量。
  • hidden_act (str, 可选, 默认为 "gelu") — 编码器和池化器中的非线性激活函数。

这是用于存储 SamHQPromptEncoderModel 配置的配置类。SamHQPromptEncoderModel 模块用于编码输入的 2D 点和边界框。实例化默认配置将生成与 SAM_HQ 模型类似的配置。该配置用于存储模型的配置。Uminosachi/sam-hq 架构。

配置对象继承自 PretrainedConfig,可用于控制模型的输出。有关更多信息,请阅读 PretrainedConfig 的文档。

SamHQProcessor

class transformers.SamHQProcessor

< >

( image_processor )

参数

  • image_processor (SamImageProcessor) — SamImageProcessor 的实例。图像处理器是必需输入。

构建一个 SAM HQ 处理器,它将 SAM 图像处理器和 2D 点与边界框处理器封装到一个处理器中。

SamHQProcessor 提供 SamImageProcessor 的所有功能。有关更多信息,请参阅 call() 的文档字符串。

SamHQVisionModel

class transformers.SamHQVisionModel

< >

( config: SamHQVisionConfig )

参数

  • config (SamHQVisionConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法以加载模型权重。

SamHQ 的视觉模型,没有任何头部或顶部投影。

此模型继承自 PreTrainedModel。有关库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等),请查看超类文档。

此模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与通用用法和行为相关的所有事项。

forward

< >

( pixel_values: typing.Optional[torch.FloatTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) transformers.models.sam_hq.modeling_sam_hq.SamHQVisionEncoderOutputtuple(torch.FloatTensor)

参数

  • pixel_values (torch.FloatTensor,形状为 (batch_size, num_channels, image_size, image_size)可选) — 对应输入图像的张量。像素值可以使用 {image_processor_class} 获取。有关详细信息,请参阅 {image_processor_class}.__call__{processor_class} 使用 {image_processor_class} 处理图像)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 hidden_states
  • return_dict (bool, 可选) — 是否返回 ModelOutput 而不是普通元组。

返回

transformers.models.sam_hq.modeling_sam_hq.SamHQVisionEncoderOutputtuple(torch.FloatTensor)

一个 transformers.models.sam_hq.modeling_sam_hq.SamHQVisionEncoderOutputtorch.FloatTensor 的元组(如果传递了 return_dict=Falseconfig.return_dict=False),根据配置 (SamHQConfig) 和输入包含各种元素。

  • image_embeds (torch.FloatTensor,形状为 (batch_size, output_dim)可选,当模型用 with_projection=True 初始化时返回) — 通过将投影层应用于池化器输出获得的图像嵌入。

  • last_hidden_state (形状为 (batch_size, sequence_length, hidden_size)torch.FloatTensor, 可选,默认为 None) — 模型最后一层输出的隐藏状态序列。

  • hidden_states (tuple[torch.FloatTensor, ...], 可选, 当传递 output_hidden_states=Trueconfig.output_hidden_states=True 时返回) — torch.FloatTensor 的元组(如果模型有嵌入层,则一个用于嵌入输出,加上每个层的输出)形状为 (batch_size, sequence_length, hidden_size)

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple[torch.FloatTensor, ...], 可选, 当传递 output_attentions=Trueconfig.output_attentions=True 时返回) — torch.FloatTensor 的元组(每个层一个)形状为 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

  • intermediate_embeddings (list(torch.FloatTensor), 可选) — 从模型中某些块(通常是没有窗口注意力)收集的中间嵌入列表。列表中每个元素的形状均为 (batch_size, sequence_length, hidden_size)。这是 SAM-HQ 特有的,在基础 SAM 中不存在。

SamHQVisionModel forward 方法,覆盖了 __call__ 特殊方法。

尽管正向传播的配方需要在此函数中定义,但之后应调用 Module 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则静默忽略它们。

SamHQModel

class transformers.SamHQModel

< >

( config )

参数

  • config (SamHQModel) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法以加载模型权重。

分段万物模型 HQ (SAM-HQ),用于根据输入图像和可选的 2D 位置及边界框生成掩码。

此模型继承自 PreTrainedModel。有关库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等),请查看超类文档。

此模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与通用用法和行为相关的所有事项。

forward

< >

( pixel_values: typing.Optional[torch.FloatTensor] = None input_points: typing.Optional[torch.FloatTensor] = None input_labels: typing.Optional[torch.LongTensor] = None input_boxes: typing.Optional[torch.FloatTensor] = None input_masks: typing.Optional[torch.LongTensor] = None image_embeddings: typing.Optional[torch.FloatTensor] = None multimask_output: bool = True hq_token_only: bool = False attention_similarity: typing.Optional[torch.FloatTensor] = None target_embedding: typing.Optional[torch.FloatTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None intermediate_embeddings: typing.Optional[list[torch.FloatTensor]] = None **kwargs )

参数

  • pixel_values (torch.FloatTensor,形状为 (batch_size, num_channels, image_size, image_size)可选) — 对应输入图像的张量。像素值可以使用 {image_processor_class} 获取。有关详细信息,请参阅 {image_processor_class}.__call__{processor_class} 使用 {image_processor_class} 处理图像)。
  • input_points (torch.FloatTensor,形状为 (batch_size, num_points, 2)) — 输入的 2D 空间点,提示编码器使用它来编码提示。通常会产生更好的结果。点可以通过将列表的列表传递给处理器来获取,该处理器将创建相应的 4 维 torch 张量。第一个维度是图像批次大小,第二个维度是点批次大小(即我们希望模型每个输入点预测多少个分割掩码),第三个维度是每个分割掩码的点数(可以为单个掩码传递多个点),最后一个维度是点的 x(垂直)和 y(水平)坐标。如果为每个图像或每个掩码传递的点数不同,处理器将创建“PAD”点,它们将对应 (0, 0) 坐标,并且将使用标签跳过这些点的嵌入计算。
  • input_labels (torch.LongTensor,形状为 (batch_size, point_batch_size, num_points)) — 输入点的标签,提示编码器使用它来编码提示。根据官方实现,有 3 种类型的标签:

    • 1: 该点包含感兴趣的对象
    • 0: 该点不包含感兴趣的对象
    • -1: 该点对应背景

    我们添加了标签:

    • -10: 该点是填充点,因此应被提示编码器忽略

    填充标签应由处理器自动完成。

  • input_boxes (torch.FloatTensor,形状为 (batch_size, num_boxes, 4)) — 输入框,提示编码器使用它来编码提示。通常会产生更好的生成掩码。框可以通过将列表的列表传递给处理器来获取,该处理器将生成一个 torch 张量,每个维度分别对应图像批次大小、每张图像的框数以及框的左上角和右下角的坐标。顺序为 (x1, y1, x2, y2):

    • x1: 输入框左上角的 x 坐标
    • y1: 输入框左上角的 y 坐标
    • x2: 输入框右下角的 x 坐标
    • y2: 输入框右下角的 y 坐标
  • input_masks (torch.FloatTensor,形状为 (batch_size, image_size, image_size)) — SAM_HQ 模型还接受分割掩码作为输入。掩码将由提示编码器嵌入以生成相应的嵌入,该嵌入稍后将馈送到掩码解码器。这些掩码需要用户手动馈送,并且它们需要是 (batch_size, image_size, image_size) 的形状。
  • image_embeddings (torch.FloatTensor,形状为 (batch_size, output_channels, window_size, window_size)) — 图像嵌入,掩码解码器使用它来生成掩码和 IoU 分数。为了提高内存效率,用户可以首先使用 get_image_embeddings 方法检索图像嵌入,然后将其馈送到 forward 方法,而不是馈送 pixel_values
  • multimask_output (bool, 可选) — 在原始实现和论文中,模型始终为每张图像(或每个点/每个边界框,如果相关)输出 3 个掩码。但是,可以通过指定 multimask_output=False 只输出一个掩码,该掩码对应于“最佳”掩码。
  • hq_token_only (bool, 可选, 默认为 False) — 是否仅使用 HQ 令牌路径生成掩码。当为 False 时,结合标准路径和 HQ 路径。这是 SAM-HQ 架构特有的。
  • attention_similarity (torch.FloatTensor, 可选) — 注意力相似度张量,用于在模型用于个性化时提供给掩码解码器以进行目标引导注意力,如 PerSAM 中介绍的那样。
  • target_embedding (torch.FloatTensor, 可选) — 目标概念的嵌入,用于在模型用于个性化时提供给掩码解码器以进行目标语义提示,如 PerSAM 中介绍的那样。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 hidden_states
  • return_dict (bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
  • intermediate_embeddings (List[torch.FloatTensor], 可选) — 视觉编码器无窗口块的中间嵌入,由 SAM-HQ 用于增强掩码质量。当提供预计算的 image_embeddings 而不是 pixel_values 时,此参数为必需。

SamHQModel 的 forward 方法,覆盖了 __call__ 特殊方法。

尽管正向传播的配方需要在此函数中定义,但之后应调用 Module 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则静默忽略它们。

示例

>>> from PIL import Image
>>> import requests
>>> from transformers import AutoModel, AutoProcessor

>>> model = AutoModel.from_pretrained("sushmanth/sam_hq_vit_b")
>>> processor = AutoProcessor.from_pretrained("sushmanth/sam_hq_vit_b")

>>> img_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/model_doc/sam-car.png"
>>> raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
>>> input_points = [[[400, 650]]]  # 2D location of a window on the car
>>> inputs = processor(images=raw_image, input_points=input_points, return_tensors="pt")

>>> # Get high-quality segmentation mask
>>> outputs = model(**inputs)

>>> # For high-quality mask only
>>> outputs = model(**inputs, hq_token_only=True)

>>> # Postprocess masks
>>> masks = processor.post_process_masks(
...     outputs.pred_masks, inputs["original_sizes"], inputs["reshaped_input_sizes"]
... )
< > 在 GitHub 上更新