SAM
概述
SAM(Segment Anything Model,分割一切模型)是由 Alexander Kirillov、Eric Mintun、Nikhila Ravi、Hanzi Mao、Chloe Rolland、Laura Gustafson、Tete Xiao、Spencer Whitehead、Alex Berg、Wan-Yen Lo、Piotr Dollar 和 Ross Girshick 在Segment Anything一文中提出的。
该模型可用于在给定输入图像的情况下预测任何感兴趣对象的分割掩码。
该论文的摘要是这样的
我们介绍了 Segment Anything (SA) 项目:一项用于图像分割的新任务、模型和数据集。通过在数据收集循环中使用我们高效的模型,我们构建了迄今为止最大的分割数据集(到目前为止),在 1100 万张获得许可和尊重隐私的图像上拥有超过 10 亿个掩码。该模型的设计和训练是可以提示的,因此它可以零样本迁移到新的图像分布和任务。我们在众多任务上评估了它的能力,发现它的零样本性能令人印象深刻——通常与先前的完全监督结果相当,甚至优于后者。我们将在https://segment-anything.com上发布 Segment Anything 模型 (SAM) 和相应的数据集 (SA-1B)(包含 10 亿个掩码和 1100 万张图像),以促进计算机视觉基础模型的研究。
提示
- 该模型预测二进制掩码,该掩码表示给定图像中是否存在感兴趣的对象。
- 如果提供输入 2D 点和/或输入边界框,则该模型可以预测出更好的结果
- 您可以为同一张图像提示多个点,并预测单个掩码。
- 尚不支持微调模型
- 根据该论文,还应该支持文本输入。但是,在撰写本文时,根据官方存储库,这似乎尚不支持。
该模型由ybelkada和ArthurZ贡献。原始代码可以在此处找到。
以下是如何在给定图像和 2D 点的情况下运行掩码生成的示例
import torch
from PIL import Image
import requests
from transformers import SamModel, SamProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamModel.from_pretrained("facebook/sam-vit-huge").to(device)
processor = SamProcessor.from_pretrained("facebook/sam-vit-huge")
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 SamModel, SamProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamModel.from_pretrained("facebook/sam-vit-huge").to(device)
processor = SamProcessor.from_pretrained("facebook/sam-vit-huge")
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。
- 演示笔记本,用于使用该模型。
- 演示笔记本,用于使用自动掩码生成流水线。
- 演示笔记本,用于使用 MedSAM 进行推理,MedSAM 是 SAM 在医学领域微调的版本。🌎
- 演示笔记本,用于在自定义数据上微调模型。🌎
SlimSAM
SlimSAM 是 SAM 的精简版,由 Zigeng Chen 等人在0.1% Data Makes Segment Anything Slim一文中提出。SlimSAM 在保持相同性能的同时,大大减少了 SAM 模型的大小。
您可以在 hub 上找到检查点,它们可以作为 SAM 的直接替代品。
基于基础的 SAM
如 Grounded SAM: Assembling Open-World Models for Diverse Visual Tasks 中所述,可以将 基础 DINO 与 SAM 结合用于基于文本的掩码生成。您可以参考此 演示笔记本 🌍 了解更多详细信息。
基于基础的 SAM 概述。取自 原始存储库。SamConfig
类 transformers.SamConfig
< 源代码 >( vision_config = None prompt_encoder_config = None mask_decoder_config = None initializer_range = 0.02 **kwargs )
参数
- vision_config (Union[
dict
,SamVisionConfig
], 可选) — 用于初始化 SamVisionConfig 的配置选项字典。 - prompt_encoder_config (Union[
dict
,SamPromptEncoderConfig
], 可选) — 用于初始化 SamPromptEncoderConfig 的配置选项字典。 - mask_decoder_config (Union[
dict
,SamMaskDecoderConfig
], 可选) — 用于初始化 SamMaskDecoderConfig 的配置选项字典。 - kwargs (可选) — 关键词参数字典。
SamConfig 是用于存储 SamModel 配置的配置类。它用于根据指定的参数实例化 SAM 模型,定义视觉模型、提示编码器模型和掩码解码器配置。使用默认值实例化配置将产生与 SAM-ViT-H facebook/sam-vit-huge 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import (
... SamVisionConfig,
... SamPromptEncoderConfig,
... SamMaskDecoderConfig,
... SamModel,
... )
>>> # Initializing a SamConfig with `"facebook/sam-vit-huge"` style configuration
>>> configuration = SamConfig()
>>> # Initializing a SamModel (with random weights) from the `"facebook/sam-vit-huge"` style configuration
>>> model = SamModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
>>> # We can also initialize a SamConfig from a SamVisionConfig, SamPromptEncoderConfig, and SamMaskDecoderConfig
>>> # Initializing SAM vision, SAM Q-Former and language model configurations
>>> vision_config = SamVisionConfig()
>>> prompt_encoder_config = SamPromptEncoderConfig()
>>> mask_decoder_config = SamMaskDecoderConfig()
>>> config = SamConfig(vision_config, prompt_encoder_config, mask_decoder_config)
SamVisionConfig
class transformers.SamVisionConfig
< source >( 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 编码器中 MLP 层的维度。如果为None
,则默认为mlp_ratio * hidden_size
。
这是用于存储 SamVisionModel
配置的配置类。它用于根据指定的参数实例化 SAM 视觉编码器,定义模型架构。实例化默认配置将产生与 SAM ViT-h facebook/sam-vit-huge 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
SamMaskDecoderConfig
class transformers.SamMaskDecoderConfig
< source >( 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 **kwargs )
参数
- hidden_size (
int
,可选,默认为 256) — 隐藏状态的维度。 - hidden_act (
str
,可选,默认为"relu"
) —SamMaskDecoder
模块内部使用的非线性激活函数。 - 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) —SamMaskDecoder
模块的输出数量。在 Segment Anything 论文中,此参数设置为 3。 - iou_head_depth (
int
, 可选, 默认为 3) — IoU 头模块中的层数。 - iou_head_hidden_dim (
int
, 可选, 默认为 256) — IoU 头模块中隐藏状态的维度。 - layer_norm_eps (
float
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon 值。
这是用于存储 SamMaskDecoder
配置的配置类。它用于实例化具有指定参数的 SAM 遮罩解码器,从而定义模型架构。实例化默认配置将产生与 SAM-vit-h facebook/sam-vit-huge 架构相似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
SamPromptEncoderConfig
class transformers.SamPromptEncoderConfig
< 源代码 >( 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"
) — 编码器和池化器中的非线性激活函数。
这是用于存储 SamPromptEncoder
配置的配置类。SamPromptEncoder
模块用于对输入的二维点和边界框进行编码。实例化一个默认配置将产生与 SAM-vit-h facebook/sam-vit-huge 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
SamProcessor
类 transformers.SamProcessor
< 源代码 >( image_processor )
参数
- image_processor (
SamImageProcessor
) — SamImageProcessor 的一个实例。图像处理器是必需的输入。
构造一个 SAM 处理器,它将 SAM 图像处理器和二维点和边界框处理器包装到单个处理器中。
SamProcessor 提供了 SamImageProcessor 的所有功能。有关更多信息,请参阅 call() 的文档字符串。
SamImageProcessor
类 transformers.SamImageProcessor
< 源代码 >( do_resize: bool = True size: Dict = None mask_size: Dict = None resample: Resampling = <Resampling.BILINEAR: 2> do_rescale: bool = True rescale_factor: Union = 0.00392156862745098 do_normalize: bool = True image_mean: Union = None image_std: Union = None do_pad: bool = True pad_size: int = None mask_pad_size: int = None do_convert_rgb: bool = True **kwargs )
参数
- do_resize (
bool
,可选,默认为True
) — 是否将图像的(高度、宽度)维度调整为指定的size
。可以在preprocess
方法中使用do_resize
参数覆盖。 - size (
dict
,可选,默认为{"longest_edge" -- 1024}
): 调整大小后输出图像的尺寸。将图像的最长边调整为size["longest_edge"]
,同时保持纵横比。可以在preprocess
方法中使用size
参数覆盖。 - mask_size (
dict
,可选,默认为{"longest_edge" -- 256}
): 调整大小后输出分割图的尺寸。将图像的最长边调整为size["longest_edge"]
,同时保持纵横比。可以在preprocess
方法中使用mask_size
参数覆盖。 - resample (
PILImageResampling
,可选,默认为Resampling.BILINEAR
) — 调整图像大小所使用的重采样滤波器。可以在preprocess
方法中使用resample
参数覆盖。 - do_rescale (
bool
,可选,默认为True
) — 是否按指定的比例rescale_factor
重新缩放图像。可以在preprocess
方法中使用do_rescale
参数覆盖。 - rescale_factor (
int
或float
,*可选*,默认为1/255
) — 如果缩放图像,则使用缩放因子。仅在do_rescale
设置为True
时有效。可以通过preprocess
方法中的rescale_factor
参数覆盖。 - do_normalize (
bool
,*可选*,默认为True
) — 是否对图像进行归一化。可以通过preprocess
方法中的do_normalize
参数覆盖。 - image_mean (
float
或List[float]
,*可选*,默认为IMAGENET_DEFAULT_MEAN
) — 如果对图像进行归一化,则使用的均值。这是一个浮点数或浮点数列表,其长度等于图像中的通道数。可以通过preprocess
方法中的image_mean
参数覆盖。 - image_std (
float
或List[float]
,*可选*,默认为IMAGENET_DEFAULT_STD
) — 如果对图像进行归一化,则使用的标准差。这是一个浮点数或浮点数列表,其长度等于图像中的通道数。可以通过preprocess
方法中的image_std
参数覆盖。 - do_pad (
bool
,*可选*,默认为True
) — 是否将图像填充到指定的pad_size
。可以通过preprocess
方法中的do_pad
参数覆盖。 - pad_size (
dict
,*可选*,默认为{"height" -- 1024, "width": 1024}
): 填充后输出图像的尺寸。可以通过preprocess
方法中的pad_size
参数覆盖。 - **mask_pad_size** (``dict``, *可选*, 默认为 ``{"height" -- 256, "width": 256}``): 填充后输出分割图的大小。可以通过 ``preprocess`` 方法中的 ``mask_pad_size`` 参数覆盖。
- **do_convert_rgb** (``bool``, *可选*, 默认为 ``True``) — 是否将图像转换为 RGB。
构造一个 SAM 图像处理器。
过滤器掩码
< source >( masks iou_scores original_size cropped_box_image pred_iou_thresh = 0.88 stability_score_thresh = 0.95 mask_threshold = 0 stability_score_offset = 1 return_tensors = 'pt' )
参数
- **masks** (``Union[torch.Tensor, tf.Tensor]``) — 输入掩码。
- **iou_scores** (``Union[torch.Tensor, tf.Tensor]``) — IoU 分数列表。
- **original_size** (``Tuple[int,int]``) — 原始图像的大小。
- **cropped_box_image** (``np.array``) — 裁剪后的图像。
- pred_iou_thresh (
float
,可选,默认为 0.88) — iou 分数的阈值。 - stability_score_thresh (
float
,可选,默认为 0.95) — 稳定性分数的阈值。 - mask_threshold (
float
,可选,默认为 0) — 预测掩码的阈值。 - stability_score_offset (
float
,可选,默认为 1) — 在_compute_stability_score
方法中使用的稳定性分数的偏移量。 - return_tensors (
str
,可选,默认为pt
) — 如果是pt
,则返回torch.Tensor
。如果是tf
,则返回tf.Tensor
。
通过仅选择满足多个条件的预测掩码来过滤预测掩码。第一个条件是 iou 分数需要大于 pred_iou_thresh
。第二个条件是稳定性分数需要大于 stability_score_thresh
。该方法还将预测掩码转换为边界框,并在必要时填充预测掩码。
generate_crop_boxes
< source >( image target_size crop_n_layers: int = 0 overlap_ratio: float = 0.3413333333333333 points_per_crop: Optional = 32 crop_n_points_downscale_factor: Optional = 1 device: Optional = None input_data_format: Union = None return_tensors: str = 'pt' )
参数
- image (
np.array
) — 输入的原始图像 - target_size (
int
) — 调整大小后的图像的目标大小 - crop_n_layers (
int
, 可选, 默认值 0) — 如果 >0,则会在图像裁剪上再次运行掩码预测。设置要运行的层数,其中每一层都有 2**i_layer 个图像裁剪(i_layer 为层数)。 - overlap_ratio (
float
, 可选, 默认值 512/1500) — 设置裁剪重叠的程度。在第一层裁剪中,裁剪将按图像长度的此比例重叠。具有更多裁剪的后续层会按比例缩小此重叠。 - points_per_crop (
int
, 可选, 默认值 32) — 从每个裁剪中采样的点数。 - crop_n_points_downscale_factor (
List[int]
, 可选, 默认值 1) — 第 n 层采样的每边点数将按 crop_n_points_downscale_factor**n 比例缩小。 - device (
torch.device
, 可选, 默认值 None) — 用于计算的设备。如果为 None,则使用 CPU。 - input_data_format (
str
或ChannelDimension
, 可选) — 输入图像的通道维度格式。如果未提供,将自动推断。 - return_tensors (
str
, 可选, 默认为pt
) — 如果为pt
,则返回torch.Tensor
。如果为tf
,则返回tf.Tensor
。
生成不同大小的裁剪框列表。 对于第 i 层,每一层有 (2i)2 个框。
pad_image
< source >( image: ndarray pad_size: Dict data_format: Union = None input_data_format: Union = None **kwargs )
将图像填充至 (pad_size["height"], pad_size["width"])
,并在右侧和底部填充零。
post_process_for_mask_generation
< source >( all_masks all_scores all_boxes crops_nms_thresh return_tensors = 'pt' )
参数
- **all_masks** (``Union[List[torch.Tensor], List[tf.Tensor]]``) — 所有预测的分割掩码列表
- **all_scores** (``Union[List[torch.Tensor], List[tf.Tensor]]``) — 所有预测的 iou 分数列表
- **all_boxes** (``Union[List[torch.Tensor], List[tf.Tensor]]``) — 预测掩码的所有边界框列表
- **crops_nms_thresh** (``float``) — NMS(非极大值抑制)算法的阈值。
- **return_tensors** (``str``, *可选*, 默认值为 ``pt``) — 如果为 ``pt``,则返回 ``torch.Tensor``。如果为 ``tf``,则返回 ``tf.Tensor``。
对通过在预测掩码上调用非极大值抑制算法生成的掩码进行后处理。
post_process_masks
< source >( masks original_sizes reshaped_input_sizes mask_threshold = 0.0 binarize = True pad_size = None return_tensors = 'pt' ) → (``Union[torch.Tensor, tf.Tensor]``)
参数
- masks (
Union[List[torch.Tensor], List[np.ndarray], List[tf.Tensor]]
) — 来自 mask_decoder 的批处理掩码,格式为 (batch_size, num_channels, height, width)。 - original_sizes (
Union[torch.Tensor, tf.Tensor, List[Tuple[int,int]]]
) — 调整大小到模型预期输入形状之前每张图片的原始大小,格式为 (height, width)。 - reshaped_input_sizes (
Union[torch.Tensor, tf.Tensor, List[Tuple[int,int]]]
) — 每张图片输入模型时的大小,格式为 (height, width)。用于移除填充。 - mask_threshold (
float
, 可选, 默认值 0.0) — 用于对掩码进行二值化的阈值。 - binarize (
bool
, 可选, 默认值True
) — 是否对掩码进行二值化。 - pad_size (
int
, 可选, 默认值self.pad_size
) — 在传递给模型之前图片被填充到的目标大小。如果为 None,则目标大小假定为处理器的pad_size
。 - return_tensors (
str
, 可选, 默认值"pt"
) — 如果为"pt"
,则返回 PyTorch 张量。如果为"tf"
,则返回 TensorFlow 张量。
返回值
(Union[torch.Tensor, tf.Tensor]
)
批处理掩码,格式为 batch_size, num_channels, height, width),其中 (height, width) 由 original_size 指定。
移除填充并将掩码放大到原始图像大小。
预处理
< source >( images: Union segmentation_maps: Union = None do_resize: Optional = None size: Optional = None mask_size: Optional = None resample: Optional = None do_rescale: Optional = None rescale_factor: Union = None do_normalize: Optional = None image_mean: Union = None image_std: Union = None do_pad: Optional = None pad_size: Optional = None mask_pad_size: Optional = None do_convert_rgb: Optional = None return_tensors: Union = None data_format: ChannelDimension = <ChannelDimension.FIRST: 'channels_first'> input_data_format: Union = None )
参数
- images (
ImageInput
) — 要预处理的图像。期望单个或批量的图像,像素值范围为 0 到 255。如果传入的图像像素值介于 0 和 1 之间,请设置do_rescale=False
。 - segmentation_maps (
ImageInput
, 可选) — 要预处理的分割图。 - do_resize (
bool
, 可选, 默认值self.do_resize
) — 是否调整图像大小。 - size (
Dict[str, int]
, 可选, 默认值self.size
) — 控制resize
后图像的大小。图像的最长边将调整为size["longest_edge"]
,同时保持纵横比。 - mask_size (
Dict[str, int]
,可选,默认为self.mask_size
) — 控制resize
后分割图的大小。图像的最长边被调整为size["longest_edge"]
,同时保持纵横比。 - resample (
PILImageResampling
,可选,默认为self.resample
) — 调整图像大小使用的PILImageResampling
过滤器,例如PILImageResampling.BILINEAR
。 - do_rescale (
bool
,可选,默认为self.do_rescale
) — 是否通过缩放因子重新缩放图像像素值。 - rescale_factor (
int
或float
,可选,默认为self.rescale_factor
) — 应用于图像像素值的缩放因子。 - do_normalize (
bool
,可选,默认为self.do_normalize
) — 是否对图像进行归一化。 - image_mean (
float
或List[float]
,可选,默认为self.image_mean
) — 如果do_normalize
设置为True
,则使用图像均值对图像进行归一化。 - image_std (
float
或List[float]
,可选,默认为self.image_std
) — 如果do_normalize
设置为True
,则使用图像标准差对图像进行归一化。 - do_pad (
bool
, 可选, 默认值:self.do_pad
) — 是否对图像进行填充。 - pad_size (
Dict[str, int]
, 可选, 默认值:self.pad_size
) — 控制应用于图像的填充大小。如果do_pad
设置为True
,则图像将被填充到pad_size["height"]
和pad_size["width"]
。 - mask_pad_size (
Dict[str, int]
, 可选, 默认值:self.mask_pad_size
) — 控制应用于分割图的填充大小。如果do_pad
设置为True
,则图像将被填充到mask_pad_size["height"]
和mask_pad_size["width"]
。 - do_convert_rgb (
bool
, 可选, 默认值:self.do_convert_rgb
) — 是否将图像转换为 RGB 格式。 - return_tensors (
str
或TensorType
, 可选) — 要返回的张量类型。可以是以下之一:- 未设置:返回
np.ndarray
列表。 TensorType.TENSORFLOW
或'tf'
:返回tf.Tensor
类型的批次。TensorType.PYTORCH
或'pt'
:返回torch.Tensor
类型的批次。TensorType.NUMPY
或'np'
:返回np.ndarray
类型的批次。TensorType.JAX
或'jax'
:返回jax.numpy.ndarray
类型的批次。
- 未设置:返回
- data_format (
ChannelDimension
或str
, 可选, 默认值:ChannelDimension.FIRST
) — 输出图像的通道维度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
:图像格式为 (num_channels, height, width)。"channels_last"
或ChannelDimension.LAST
:图像格式为 (height, width, num_channels)。- 未设置:使用输入图像的通道维度格式。
- input_data_format (
ChannelDimension
或str
, 可选) — 输入图像的通道维度格式。如果未设置,则从输入图像推断通道维度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
:图像格式为 (num_channels, height, width)。"channels_last"
或ChannelDimension.LAST
:图像格式为 (height, width, num_channels)。"none"
或ChannelDimension.NONE
:图像格式为 (height, width)。
预处理一个图像或一批图像。
调整大小
< source >( image: ndarray size: Dict resample: Resampling = <Resampling.BICUBIC: 3> data_format: Union = None input_data_format: Union = None **kwargs ) → np.ndarray
参数
- image (
np.ndarray
) — 需要调整大小的图像。 - size (
Dict[str, int]
) — 格式为{"longest_edge": int}
的字典,指定输出图像的大小。图像的最长边将调整为指定大小,而另一边将调整大小以保持纵横比。 resample —PILImageResampling
调整图像大小时使用的过滤器,例如PILImageResampling.BILINEAR
。 - data_format (
ChannelDimension
或str
, 可选) — 输出图像的通道维度格式。如果未设置,则使用输入图像的通道维度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
: (num_channels, height, width) 格式的图像。"channels_last"
或ChannelDimension.LAST
: (height, width, num_channels) 格式的图像。
- input_data_format (
ChannelDimension
或str
, 可选) — 输入图像的通道维度格式。如果未设置,则从输入图像推断通道维度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
: (num_channels, height, width) 格式的图像。"channels_last"
或ChannelDimension.LAST
: (height, width, num_channels) 格式的图像。
返回值
np.ndarray
调整大小后的图像。
将图像调整为 (size["height"], size["width"])
。
SamModel
类 transformers.SamModel
< 源代码 >( config )
参数
- config (SamConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法来加载模型权重。
Segment Anything Model (SAM) 用于生成分割掩码,给定输入图像和可选的二维位置和边界框。此模型继承自 PreTrainedModel。有关库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等),请参阅超类文档。
此模型也是一个 PyTorch torch.nn.Module 子类。将其用作常规的 PyTorch 模块,并参考 PyTorch 文档以了解有关一般使用和行为的所有事项。
forward
< 源代码 >( pixel_values: Optional = None input_points: Optional = None input_labels: Optional = None input_boxes: Optional = None input_masks: Optional = None image_embeddings: Optional = None multimask_output: bool = True attention_similarity: Optional = None target_embedding: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None **kwargs )
参数
- pixel_values (
torch.FloatTensor
,形状为(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 SamProcessor 获取。有关详细信息,请参阅SamProcessor.__call__()
。 - input_points (形状为
(batch_size, num_points, 2)
的torch.FloatTensor
)— 输入的二维空间点,提示编码器使用它来编码提示。通常会产生更好的结果。可以通过将列表的列表的列表传递给处理器来获得这些点,该处理器将创建维度为 4 的对应torch
张量。第一个维度是图像批次大小,第二个维度是点批次大小(即我们希望模型为每个输入点预测多少个分割掩码),第三个维度是每个分割掩码的点数(可以为单个掩码传递多个点),最后一个维度是点的 x(垂直)和 y(水平)坐标。如果为每个图像或每个掩码传递了不同数量的点,则处理器将创建对应于坐标 (0, 0) 的“PAD”点,并且将使用标签跳过这些点的嵌入计算。 - input_labels (形状为
(batch_size, point_batch_size, num_points)
的torch.LongTensor
)— 点的输入标签,提示编码器使用它来编码提示。根据官方实现,有 3 种类型的标签1
:该点是包含目标对象的点0
:该点是不包含目标对象的点-1
:该点对应于背景
我们添加了以下标签:
-10
:该点是填充点,因此提示编码器应忽略该点
填充标签应由处理器自动完成。
- input_boxes (形状为
(batch_size, num_boxes, 4)
的torch.FloatTensor
)— 点的输入框,提示编码器使用它来编码提示。通常会产生更好的生成掩码。可以通过将列表的列表的列表传递给处理器来获得这些框,该处理器将生成一个torch
张量,其中每个维度分别对应于图像批次大小、每个图像的框数以及框的左上角和右下角点的坐标。顺序为 (x1
,y1
,x2
,y2
):x1
:输入框左上角点的 x 坐标y1
:输入框左上角点的 y 坐标x2
:输入框右下角点的 x 坐标y2
:输入框右下角点的 y 坐标
- input_masks (形状为
(batch_size, image_size, image_size)
的torch.FloatTensor
)— SAM 模型也接受分割掩码作为输入。提示编码器将嵌入掩码以生成相应的嵌入,稍后将其馈送到掩码解码器。这些掩码需要用户手动提供,并且它们的形状需要为 (batch_size
,image_size
,image_size
)。 - image_embeddings (形状为
(batch_size, output_channels, window_size, window_size)
的torch.FloatTensor
)— 图像嵌入,掩码解码器使用它来生成掩码和 iou 分数。为了提高内存效率,用户可以使用get_image_embeddings
方法首先检索图像嵌入,然后将它们馈送到forward
方法,而不是馈送pixel_values
。 - **multimask_output** (``bool``, *可选*) — 在原始实现和论文中,模型始终为每个图像输出 3 个掩码(如果相关,则为每个点/每个边界框)。但是,可以通过指定 ``multimask_output=False`` 来仅输出一个对应于“最佳”掩码的掩码。
- **attention_similarity** (``torch.FloatTensor``, *可选*) — 注意力相似度张量,在模型用于 PerSAM 中引入的个性化时,将提供给掩码解码器以进行目标引导的注意力。
- **target_embedding** (``torch.FloatTensor``, *可选*) — 目标概念的嵌入,在模型用于 PerSAM 中引入的个性化时,将提供给掩码解码器以进行目标语义提示。
- **output_attentions** (``bool``, *可选*) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 ``attentions``。
- **output_hidden_states** (``bool``, *可选*) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 ``hidden_states``。
- **return_dict** (``bool``, *可选*) — 是否返回 ModelOutput 而不是普通的元组。
示例 —
SamModel 的 forward 方法,覆盖了 ``__call__`` 特殊方法。
虽然前向传递的方案需要在此函数中定义,但之后应该调用 ``Module`` 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。
TFSamModel
类 transformers.TFSamModel
< source >( config **kwargs )
参数
- config (SamConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法来加载模型权重。
Segment Anything Model (SAM),用于在给定输入图像和可选的二维位置和边界框的情况下生成分割掩码。该模型继承自 TFPreTrainedModel。查看超类文档,了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪头部等)。
该模型也是一个 TensorFlow keras.Model 子类。将其用作常规的 TensorFlow 模型,并参考 TensorFlow 文档了解与一般用法和行为相关的所有内容。
call
< source >( pixel_values: TFModelInputType | None = None input_points: tf.Tensor | None = None input_labels: tf.Tensor | None = None input_boxes: tf.Tensor | None = None input_masks: tf.Tensor | None = None image_embeddings: tf.Tensor | None = None multimask_output: bool = True output_attentions: bool | None = None output_hidden_states: bool | None = None return_dict: bool | None = None training: bool = False **kwargs )
参数
- pixel_values (形状为
(batch_size, num_channels, height, width)
的tf.Tensor
) — 像素值。可以使用 SamProcessor 获取像素值。有关详细信息,请参阅SamProcessor.__call__()
。 - input_points (形状为
(batch_size, num_points, 2)
的tf.Tensor
) — 输入的二维空间点,提示编码器使用它来编码提示。通常会产生更好的结果。这些点可以通过将列表的列表的列表传递给处理器来获得,处理器将创建维度为 4 的对应tf
张量。第一个维度是图像批次大小,第二个维度是点批次大小(即我们希望模型为每个输入点预测多少个分割掩码),第三个维度是每个分割掩码的点数(可以为一个掩码传递多个点),最后一个维度是点的 x(垂直)和 y(水平)坐标。如果为每张图像或每个掩码传递了不同数量的点,处理器将创建对应于 (0, 0) 坐标的“PAD”点,并且将使用标签跳过这些点的嵌入计算。 - input_labels (形状为
(batch_size, point_batch_size, num_points)
的tf.Tensor
) — 点的输入标签,提示编码器使用它来编码提示。根据官方实现,标签有 3 种类型1
:该点是包含目标对象的点0
:该点是不包含目标对象的点-1
:该点对应于背景
我们添加了以下标签:
-10
:该点是填充点,因此提示编码器应忽略它
填充标签应由处理器自动完成。
- input_boxes (形状为
(batch_size, num_boxes, 4)
的tf.Tensor
) — 点的输入框,提示编码器使用它来编码提示。通常会产生更好的生成掩码。这些框可以通过将列表的列表的列表传递给处理器来获得,这将生成一个tf
张量,每个维度分别对应于图像批次大小、每张图像的框数以及框的左上角和右下角点的坐标。顺序为 (x1
,y1
,x2
,y2
):x1
:输入框左上角点的 x 坐标y1
:输入框左上角点的 y 坐标x2
:输入框右下角点的 x 坐标y2
:输入框右下角点的 y 坐标
- input_masks (形状为
(batch_size, image_size, image_size)
的tf.Tensor
) — SAM 模型也接受分割掩码作为输入。提示编码器将嵌入掩码以生成对应的嵌入,稍后将其馈送到掩码解码器。这些掩码需要用户手动提供,并且其形状需要为 (batch_size
,image_size
,image_size
)。 - image_embeddings (形状为
(batch_size, output_channels, window_size, window_size)
的tf.Tensor
) — 图像嵌入,掩码解码器使用它来生成掩码和 iou 分数。为了提高内存效率,用户可以使用get_image_embeddings
方法首先检索图像嵌入,然后将它们馈送到call
方法,而不是馈送pixel_values
。 - multimask_output (
bool
, 可选) — 在原始实现和论文中,模型总是为每个图像输出 3 个掩码(如果相关,则为每个点/每个边界框)。但是,可以通过指定multimask_output=False
来仅输出一个与“最佳”掩码相对应的掩码。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。
TFSamModel forward 方法,覆盖了 __call__
特殊方法。
虽然前向传递的方案需要在此函数中定义,但之后应该调用 ``Module`` 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。