Transformers 文档
SAM-HQ
并获得增强的文档体验
开始使用
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 原始的可提示设计、效率和零样本泛化能力。
SAM-HQ 在原始 SAM 模型的基础上引入了多项关键改进:
- 高质量输出标记:注入到 SAM 掩码解码器中的可学习标记,用于更高质量的掩码预测
- 全局-局部特征融合:结合模型不同阶段的特征,以改进掩码细节
- 训练数据:使用精心策划的 44K 高质量掩码数据集,而非 SA-1B
- 效率:仅增加 0.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
- 使用模型的演示笔记本(即将推出)
- 论文实现和代码:SAM-HQ GitHub 存储库
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.SamHQVisionEncoderOutput
或 tuple(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.SamHQVisionEncoderOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.sam_hq.modeling_sam_hq.SamHQVisionEncoderOutput
或 torch.FloatTensor
的元组(如果传递了 return_dict=False
或 config.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=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(如果模型有嵌入层,则一个用于嵌入输出,加上每个层的输出)形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple[torch.FloatTensor, ...]
, 可选, 当传递output_attentions=True
或config.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"]
... )