🚀 Segment Anything Model (SAM) - ViT Huge (ViT-H) バージョン
Segment Anything Model (SAM) は、点やボックスなどの入力プロンプトから高品質なオブジェクトマスクを生成し、画像内のすべてのオブジェクトのマスクを生成するために使用できます。1100万枚の画像と11億個のマスクのデータセットで学習されており、さまざまなセグメンテーションタスクで強力なゼロショット性能を発揮します。
Segment Anything Model (SAM)の詳細なアーキテクチャ。
🚀 クイックスタート
このセクションでは、SAMモデルの概要、使い方、引用方法について説明します。
概要
SAMモデルは、画像セグメンテーションのための新しいタスク、モデル、データセットを提供するプロジェクトです。このモデルは、1100万枚の画像と11億個のマスクのデータセットで学習されており、ゼロショットで新しい画像分布やタスクに適応できるように設計されています。
リンク
元のリポジトリへのリンク
論文の要約
画像セグメンテーションのための新しいタスク、モデル、データセットであるSegment Anything (SA) プロジェクトを紹介します。効率的なモデルをデータ収集ループで使用して、これまでで最大のセグメンテーションデータセットを構築しました。このデータセットには、1100万枚のライセンス付きでプライバシーを尊重した画像に対して10億個以上のマスクが含まれています。モデルはプロンプト可能なように設計および学習されているため、新しい画像分布やタスクにゼロショットで適応できます。多数のタスクでその能力を評価した結果、ゼロショット性能が印象的であり、多くの場合、従来の完全教師付きの結果と競合するか、それ以上の性能を発揮します。コンピュータビジョンの基礎モデルの研究を促進するために、Segment Anything Model (SAM) と対応する10億個のマスクと1100万枚の画像のデータセット (SA-1B) を https://segment-anything.com で公開しています。
免責事項
このモデルカードの内容はHugging Faceチームによって作成されており、一部は元の SAMモデルカード からコピー&ペーストされています。
✨ 主な機能
SAMモデルは、3つのモジュールで構成されています。
VisionEncoder
:VITベースの画像エンコーダ。画像のパッチに対してアテンションを使用して画像埋め込みを計算します。相対位置埋め込みが使用されます。
PromptEncoder
:点やバウンディングボックスの埋め込みを生成します。
MaskDecoder
:画像埋め込みと点埋め込みの間、および点埋め込みと画像埋め込みの間でクロスアテンションを実行する双方向トランスフォーマー。出力はNeck
に供給されます。
Neck
:MaskDecoder
によって生成されたコンテキスト化されたマスクに基づいて出力マスクを予測します。
💻 使用例
基本的な使用法
プロンプト付きマスク生成
from PIL import Image
import requests
from transformers import SamModel, SamProcessor
model = SamModel.from_pretrained("facebook/sam-vit-huge")
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]]]
inputs = processor(raw_image, input_points=input_points, return_tensors="pt").to("cuda")
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
マスクを生成するための他の引数の中で、関心のあるオブジェクトのおおよその位置の2D座標、関心のあるオブジェクトを囲むバウンディングボックス(形式はバウンディングボックスの右上と左下の点のx, y座標)、セグメンテーションマスクを渡すことができます。執筆時点では、公式のリポジトリによると、テキストを入力として渡すことは公式モデルではサポートされていません。詳細については、このノートブックを参照してください。このノートブックでは、モデルの使い方を視覚的な例とともに説明しています。
自動マスク生成
モデルは、入力画像を与えることで、「ゼロショット」方式でセグメンテーションマスクを生成するために使用できます。モデルには自動的に 1024
個の点のグリッドがプロンプトとして与えられ、それらがすべてモデルに供給されます。
自動マスク生成のパイプラインは以下のようになります。以下のコードスニペットは、(任意のデバイスで!適切な points_per_batch
引数を渡すだけで)実行がいかに簡単であるかを示しています。
from transformers import pipeline
generator = pipeline("mask-generation", device = 0, points_per_batch = 256)
image_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
outputs = generator(image_url, points_per_batch = 256)
画像を表示するには、以下のコードを使用します。
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def show_mask(mask, ax, random_color=False):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
h, w = mask.shape[-2:]
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_image)
plt.imshow(np.array(raw_image))
ax = plt.gca()
for mask in outputs["masks"]:
show_mask(mask, ax=ax, random_color=True)
plt.axis("off")
plt.show()
これにより、以下の
のような結果が得られます。
📄 ライセンス
このモデルは Apache-2.0 ライセンスの下で提供されています。
📚 引用
このモデルを使用する場合は、以下のBibTeXエントリを使用してください。
@article{kirillov2023segany,
title={Segment Anything},
author={Kirillov, Alexander and Mintun, Eric and Ravi, Nikhila and Mao, Hanzi and Rolland, Chloe and Gustafson, Laura and Xiao, Tete and Whitehead, Spencer and Berg, Alexander C. and Lo, Wan-Yen and Doll{\'a}r, Piotr and Girshick, Ross},
journal={arXiv:2304.02643},
year={2023}
}