Transformers 文件
SAM
並獲得增強的文件體驗
開始使用
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 億個掩碼。該模型經過設計和訓練,可以被提示(promptable),因此它可以零樣本遷移到新的影像分佈和任務中。我們在眾多工上評估了它的能力,發現其零樣本效能令人印象深刻——通常與甚至優於先前的全監督結果。我們正在 https://segment-anything.com 釋出 Segment Anything Model(SAM)及相應的包含 10 億個掩碼和 1100 萬張影像的資料集(SA-1B),以促進計算機視覺基礎模型的研究。
技巧
- 該模型預測二進位制掩碼,用於說明在給定影像的情況下是否存在感興趣的物件。
- 如果提供了輸入的二維點和/或輸入邊界框,模型預測的結果會好得多。
- 你可以為同一張圖片提示多個點,並預測一個單一的掩碼。
- 目前尚不支援對模型進行微調。
- 根據論文,模型也應該支援文字輸入。然而,在撰寫本文時,根據官方倉庫的說法,這似乎還不被支援。
此模型由 ybelkada 和 ArthurZ 貢獻。原始程式碼可在此處找到。
下面是一個示例,展示瞭如何在給定影像和二維點的情況下執行掩碼生成。
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。
SlimSAM
SlimSAM 是 SAM 的一個剪枝版本,由 Zigeng Chen 等人在 《0.1% Data Makes Segment Anything Slim》 一文中提出。SlimSAM 在保持相同效能的同時,顯著減小了 SAM 模型的大小。
檢查點可以在 Hub 上找到,它們可以作為 SAM 的直接替代品使用。
Grounded SAM
我們可以將 Grounding DINO 與 SAM 結合,用於基於文字的掩碼生成,如 《Grounded SAM: Assembling Open-World Models for Diverse Visual Tasks》 中所介紹。你可以參考這個演示筆記本 🌍 獲取詳細資訊。

SamConfig
class 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
< 原始檔 >( 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) — 用於初始化所有權重矩陣的截斷正態初始化器的標準差。 - 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 的文件。
示例
>>> from transformers import (
... SamVisionConfig,
... SamVisionModel,
... )
>>> # Initializing a SamVisionConfig with `"facebook/sam-vit-huge"` style configuration
>>> configuration = SamVisionConfig()
>>> # Initializing a SamVisionModel (with random weights) from the `"facebook/sam-vit-huge"` style configuration
>>> model = SamVisionModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
SamMaskDecoderConfig
類 transformers.SamMaskDecoderConfig
< 原始碼 >( 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
類 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 )
引數
這是用於儲存 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: typing.Optional[dict[str, int]] = None mask_size: typing.Optional[dict[str, int]] = None resample: Resampling = <Resampling.BILINEAR: 2> do_rescale: bool = True rescale_factor: typing.Union[int, float] = 0.00392156862745098 do_normalize: bool = True image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None do_pad: bool = True pad_size: typing.Optional[int] = None mask_pad_size: typing.Optional[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 影像處理器。
filter_masks
< 原始碼 >( 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
< 原始碼 >( image target_size crop_n_layers: int = 0 overlap_ratio: float = 0.3413333333333333 points_per_crop: typing.Optional[int] = 32 crop_n_points_downscale_factor: typing.Optional[list[int]] = 1 device: typing.Optional[ForwardRef('torch.device')] = None input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None return_tensors: str = 'pt' )
引數
- image (
np.array
) — 輸入的原始影像 - target_size (
int
) — 調整大小後圖像的目標尺寸 - crop_n_layers (
int
, 可選, 預設為 0) — 如果 >0,掩碼預測將在影像的裁剪塊上再次執行。設定要執行的層數,其中每一層有 2**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 層有 (2**i)**2 個框。
pad_image
< 原始碼 >( image: ndarray pad_size: dict data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None **kwargs )
將影像用零填充到 (pad_size["height"], pad_size["width"])
,填充在右側和底部。
post_process_for_mask_generation
< 原始碼 >( 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
< 原始碼 >( 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 給出。
移除填充並將掩碼上取樣至原始影像尺寸。
preprocess
< 原始碼 >( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] segmentation_maps: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor'], NoneType] = None do_resize: typing.Optional[bool] = None size: typing.Optional[dict[str, int]] = None mask_size: typing.Optional[dict[str, int]] = None resample: typing.Optional[ForwardRef('PILImageResampling')] = None do_rescale: typing.Optional[bool] = None rescale_factor: typing.Union[int, float, NoneType] = None do_normalize: typing.Optional[bool] = None image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None do_pad: typing.Optional[bool] = None pad_size: typing.Optional[dict[str, int]] = None mask_pad_size: typing.Optional[dict[str, int]] = None do_convert_rgb: typing.Optional[bool] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None data_format: ChannelDimension = <ChannelDimension.FIRST: 'channels_first'> input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = 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)。
預處理一張或一批影像。
resize
< 原始碼 >( image: ndarray size: dict resample: Resampling = <Resampling.BICUBIC: 3> data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = 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"])
。
SamVisionModel
class transformers.SamVisionModel
< 原始碼 >( config: SamVisionConfig )
引數
- config (SamVisionConfig) — 模型配置類,包含模型的所有引數。使用配置檔案初始化不會載入與模型相關的權重,只會載入配置。請查閱 from_pretrained() 方法來載入模型權重。
來自 Sam 的視覺模型,沒有任何頭或頂層投影。
該模型繼承自 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.modeling_sam.SamVisionEncoderOutput
或 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.modeling_sam.SamVisionEncoderOutput
或 tuple(torch.FloatTensor)
一個 transformers.models.sam.modeling_sam.SamVisionEncoderOutput
或一個 torch.FloatTensor
的元組(如果傳遞了 return_dict=False
或當 config.return_dict=False
時),包含各種元素,具體取決於配置(SamConfig)和輸入。
-
image_embeds (
torch.FloatTensor
,形狀為(batch_size, output_dim)
,可選,當模型以with_projection=True
初始化時返回) — 透過將投影層應用於 pooler_output 獲得的影像嵌入。 -
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
時返回) — 形狀為(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,+ 一個用於每層的輸出)。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple[torch.FloatTensor, ...]
, 可選, 當傳遞output_attentions=True
或config.output_attentions=True
時返回) — 形狀為(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元組(每層一個)。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
SamVisionModel 的前向方法,覆蓋了 __call__
特殊方法。
雖然前向傳遞的配方需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會靜默地忽略它們。
SamModel
class transformers.SamModel
< source >( config )
引數
- config (SamModel) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,僅載入配置。請檢視 from_pretrained() 方法來載入模型權重。
Segment Anything Model (SAM),用於在給定輸入影像的情況下生成分割掩碼。
該模型繼承自 PreTrainedModel。請查閱超類文件,瞭解庫為所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
該模型也是 PyTorch torch.nn.Module 的子類。可以像常規的 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與常規用法和行為相關的事項。
forward
< source >( 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 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 **kwargs ) → transformers.models.sam.modeling_sam.SamImageSegmentationOutput
或 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}
處理影像)。 - input_points (
torch.FloatTensor
,形狀為(batch_size, num_points, 2)
) — 輸入的二維空間點,用於提示編碼器對提示進行編碼。通常能產生更好的結果。可以透過向處理器傳遞一個列表的列表的列表來獲得這些點,處理器將建立相應的維度為 4 的torch
張量。第一個維度是影像批次大小,第二個維度是點批次大小(即我們希望模型為每個輸入點預測多少個分割掩碼),第三個維度是每個分割掩碼的點數(可以為單個掩碼傳遞多個點),最後一個維度是點的 x(垂直)和 y(水平)座標。如果為每個影像或每個掩碼傳遞了不同數量的點,處理器將建立對應於 (0, 0) 座標的“PAD”點,並且將使用標籤跳過這些點的嵌入計算。 - 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 模型也接受分割掩碼作為輸入。掩碼將被提示編碼器嵌入以生成相應的嵌入,然後將其饋送到掩碼解碼器。這些掩碼需要由使用者手動提供,並且形狀必須為 (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
,可以只輸出一個掩碼,該掩碼對應於“最佳”掩碼。 - attention_similarity (
torch.FloatTensor
,可選) — 注意力相似性張量,在模型用於個性化時提供給掩碼解碼器以進行目標導向的注意力,如 PerSAM 中所述。 - target_embedding (
torch.FloatTensor
,可選) — 目標概念的嵌入,在模型用於個性化時提供給掩碼解碼器以進行目標語義提示,如 PerSAM 中所述。 - output_attentions (
bool
,可選) — 是否返回所有注意力層的注意力張量。有關更多詳細資訊,請參閱返回張量下的attentions
。 - output_hidden_states (
bool
,可選) — 是否返回所有層的隱藏狀態。有關更多詳細資訊,請參閱返回張量下的hidden_states
。
返回
transformers.models.sam.modeling_sam.SamImageSegmentationOutput
或 tuple(torch.FloatTensor)
一個 transformers.models.sam.modeling_sam.SamImageSegmentationOutput
或一個 torch.FloatTensor
的元組(如果傳遞了 return_dict=False
或當 config.return_dict=False
時),根據配置(SamConfig)和輸入,包含各種元素。
-
iou_scores (
torch.FloatTensor
,形狀為(batch_size, num_masks)
) — 預測掩碼的 iou 分數。 -
pred_masks (
torch.FloatTensor
,形狀為(batch_size, num_masks, height, width)
) — 預測的低解析度掩碼。需要由處理器進行後處理。 -
vision_hidden_states (
tuple(torch.FloatTensor)
,可選,在傳遞output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
的元組(一個用於嵌入層的輸出,如果模型有嵌入層,+ 一個用於每層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。視覺模型在每層輸出處的隱藏狀態,以及可選的初始嵌入輸出。
-
vision_attentions (
tuple(torch.FloatTensor)
,可選,在傳遞output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
的元組(每層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
-
mask_decoder_attentions (
tuple(torch.FloatTensor)
,可選,在傳遞output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
的元組(每層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
SamModel 的 forward 方法,重寫了 __call__
特殊方法。
雖然前向傳遞的配方需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會靜默地忽略它們。
示例
>>> from PIL import Image
>>> import requests
>>> from transformers import AutoModel, AutoProcessor
>>> model = AutoModel.from_pretrained("facebook/sam-vit-base")
>>> processor = AutoProcessor.from_pretrained("facebook/sam-vit-base")
>>> 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 segmentation mask
>>> outputs = model(**inputs)
>>> # Postprocess masks
>>> masks = processor.post_process_masks(
... outputs.pred_masks, inputs["original_sizes"], inputs["reshaped_input_sizes"]
... )
TFSamVisionModel
class transformers.TFSamVisionModel
< source >( config: SamVisionConfig **kwargs )
引數
- config (SamConfig) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,僅載入配置。請檢視 from_pretrained() 方法來載入模型權重。
Sam 的視覺模型,沒有任何頭或投影。該模型繼承自 TFPreTrainedModel。請查閱超類文件以瞭解庫為所有模型實現的通用方法(如下載或儲存、調整輸入嵌入的大小、修剪頭等)。
該模型也是 TensorFlow keras.Model 的子類。請像常規 TensorFlow 模型一樣使用它,並參考 TensorFlow 文件瞭解所有與一般用法和行為相關的事項。
呼叫
< source >( pixel_values: TFModelInputType | None = None output_attentions: bool | None = None output_hidden_states: bool | None = None return_dict: bool | None = None training: bool = False **kwargs ) → transformers.models.sam.modeling_tf_sam.TFSamVisionEncoderOutput
或 tuple(tf.Tensor)
引數
- pixel_values (
tf.Tensor
,形狀為(batch_size, num_channels, height, width)
) — 畫素值。畫素值可以使用 SamProcessor 獲取。有關詳細資訊,請參閱SamProcessor.__call__()
。 - output_attentions (
bool
,可選) — 是否返回所有注意力層的注意力張量。有關更多詳細資訊,請參閱返回張量下的attentions
。 - output_hidden_states (
bool
,可選) — 是否返回所有層的隱藏狀態。有關更多詳細資訊,請參閱返回張量下的hidden_states
。 - return_dict (
bool
,可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
返回
transformers.models.sam.modeling_tf_sam.TFSamVisionEncoderOutput
或 tuple(tf.Tensor)
一個 transformers.models.sam.modeling_tf_sam.TFSamVisionEncoderOutput
或一個 tf.Tensor
的元組(如果傳遞了 return_dict=False
或當 config.return_dict=False
時),根據配置(<class 'transformers.models.sam.configuration_sam.SamVisionConfig'>
)和輸入,包含各種元素。
-
image_embeds (
tf.Tensor
,形狀為(batch_size, output_dim)
,可選,當模型以with_projection=True
初始化時返回) — 透過將投影層應用於 pooler_output 獲得的影像嵌入。 -
last_hidden_state (
tf.Tensor
of shape(batch_size, sequence_length, hidden_size)
) — 模型最後一層輸出的隱藏狀態序列。 -
hidden_states (
tuple(tf.Tensor)
,可選,在傳遞output_hidden_states=True
或config.output_hidden_states=True
時返回) —tf.Tensor
的元組(一個用於嵌入層的輸出,如果模型有嵌入層,+ 一個用於每層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(tf.Tensor)
,可選,在傳遞output_attentions=True
或config.output_attentions=True
時返回) —tf.Tensor
的元組(每層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
TFSamVisionModel 的 forward 方法,重寫了 __call__
特殊方法。
雖然前向傳遞的配方需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會靜默地忽略它們。
TFSamModel
class transformers.TFSamModel
< source >( config **kwargs )
引數
- config (SamConfig) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,僅載入配置。請檢視 from_pretrained() 方法來載入模型權重。
Segment Anything Model (SAM),用於在給定輸入影像以及可選的二維位置和邊界框的情況下生成分割掩碼。該模型繼承自 TFPreTrainedModel。請查閱超類文件以瞭解庫為所有模型實現的通用方法(如下載或儲存、調整輸入嵌入的大小、修剪頭等)。
該模型也是 TensorFlow keras.Model 的子類。請像常規 TensorFlow 模型一樣使用它,並參考 TensorFlow 文件瞭解所有與一般用法和行為相關的事項。
呼叫
< 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 (
tf.Tensor
,形狀為(batch_size, num_channels, height, width)
) — 畫素值。畫素值可以使用 SamProcessor 獲取。有關詳細資訊,請參閱SamProcessor.__call__()
。 - input_points (
tf.Tensor
,形狀為(batch_size, num_points, 2)
) — 輸入的二維空間點,用於提示編碼器對提示進行編碼。通常能產生更好的結果。可以透過向處理器傳遞一個列表的列表的列表來獲得這些點,處理器將建立相應的維度為 4 的tf
張量。第一個維度是影像批次大小,第二個維度是點批次大小(即我們希望模型為每個輸入點預測多少個分割掩碼),第三個維度是每個分割掩碼的點數(可以為單個掩碼傳遞多個點),最後一個維度是點的 x(垂直)和 y(水平)座標。如果為每個影像或每個掩碼傳遞了不同數量的點,處理器將建立對應於 (0, 0) 座標的“PAD”點,並且將使用標籤跳過這些點的嵌入計算。 - input_labels (
tf.Tensor
,形狀為(batch_size, point_batch_size, num_points)
) — 點的輸入標籤,用於提示編碼器對提示進行編碼。根據官方實現,有 3 種類型的標籤1
:該點是包含感興趣物件的點0
:該點是不包含感興趣物件的點-1
:該點對應於背景
我們添加了標籤:
-10
:該點是填充點,因此應被提示編碼器忽略
填充標籤應由處理器自動完成。
- input_boxes (
tf.Tensor
,形狀為(batch_size, num_boxes, 4)
) — 點的輸入框,用於提示編碼器對提示進行編碼。通常能生成更好的掩碼。可以透過向處理器傳遞一個列表的列表的列表來獲得這些框,處理器將生成一個tf
張量,每個維度分別對應於影像批次大小、每張影像的框數以及框的左上角和右下角點的座標。順序為 (x1
,y1
,x2
,y2
):x1
:輸入框左上角的 x 座標y1
:輸入框左上角的 y 座標x2
:輸入框右下角的 x 座標y2
:輸入框右下角的 y 座標
- input_masks (
tf.Tensor
,形狀為(batch_size, image_size, image_size)
) — SAM 模型也接受分割掩碼作為輸入。掩碼將被提示編碼器嵌入以生成相應的嵌入,然後將其饋送到掩碼解碼器。這些掩碼需要由使用者手動提供,並且形狀必須為 (batch_size
,image_size
,image_size
)。 - image_embeddings (
tf.Tensor
,形狀為(batch_size, output_channels, window_size, window_size)
) — 影像嵌入,用於掩碼解碼器生成掩碼和 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
例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會靜默地忽略它們。