> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/models/ja/supported-models/sam3.md).

# SAM3

Meta の [Segment Anything Model 3](https://github.com/facebookresearch/sam3) による推論を [Serverless Hosted API](https://docs.roboflow.com/deployment/roboflow-cloud/serverless-api)。2つの異なる SAM3 エンドポイントを提供しています：

{% hint style="info" %}
Roboflow で SAM3 モデルを学習するには、有料の [プラン](https://docs.roboflow.com/platform/billing-and-plans/plans) に含まれる [従量課金](https://docs.roboflow.com/platform/billing-and-plans/credits)。そこから、SAM3 アーキテクチャの「Request Feature」ボタンでアクセスをリクエストして、この機能を使用できます [学習フロー](/models/ja/readme.md).
{% endhint %}

* [プロンプト可能な概念セグメンテーション](#concept-segmentation-pcs) (**PCS**）、画像内の概念の各インスタンスをセグメントします。概念はテキストプロンプト、例示ボックス、またはその両方で表現されます。
* [プロンプト可能な視覚セグメンテーション](#visual-segmentation-pvs) (**PVS**）、SAM2 風に、ポイントまたはボックスから 1 回のリクエストにつき 1 つのオブジェクトを対話的にセグメントします。

この表を使ってエンドポイントを選択してください：

<table data-search="false"><thead><tr><th>あるのは</th><th>欲しいのは</th><th>使用する</th></tr></thead><tbody><tr><td>テキストによる説明（例: 「person」）</td><td>一致する各インスタンスのマスク</td><td><code>/sam3/concept_segment</code></td></tr><tr><td>1 つの例示オブジェクトを囲むボックス</td><td>類似する各インスタンスのマスク</td><td><code>/sam3/concept_segment</code></td></tr><tr><td>オブジェクトを含めたり除外したりするためのテキストと例示ボックス</td><td>一致する各インスタンスのマスク</td><td><code>/sam3/concept_segment</code></td></tr><tr><td>特定の 1 つのオブジェクト上のクリックまたはボックス</td><td>そのオブジェクトのみのマスク</td><td><code>/sam3/visual_segment</code></td></tr></tbody></table>

あなたの [API キー](https://app.roboflow.com/settings/api) として `api_key` を、すべてのリクエストでクエリパラメータとして渡してください。

## 概念セグメンテーション（PCS）

`POST https://serverless.roboflow.com/sam3/concept_segment`

の各エントリは `prompts` で 1 つの概念を表します。レスポンスには 1 つの `prompt_results` がプロンプトごとに 1 件含まれ、それぞれに検出されたすべてのインスタンスが入ります。リクエストで受け付けるプロンプトは最大 16 個です。

### テキストプロンプト

```python
import os
import requests

payload = {
    "image": {"type": "url", "value": "https://media.roboflow.com/inference/people-walking.jpg"},
    "prompts": [
        {"type": "text", "text": "person"},
        {"type": "text", "text": "backpack"},
    ],
    "output_prob_thresh": 0.5,
    "format": "polygon",  # or "rle"
}

response = requests.post(
    "https://serverless.roboflow.com/sam3/concept_segment",
    params={"api_key": os.environ["ROBOFLOW_API_KEY"]},
    json=payload,
)
for prompt_result in response.json()["prompt_results"]:
    print(prompt_result["echo"], len(prompt_result["predictions"]), "instances")
```

画像はインラインでも次の形式で送信できます： `{"type": "base64", "value": "<BASE64_IMAGE>"}`.

### 例示ボックスのプロンプト

テキストの代わりに、例として 1 つの例示オブジェクトを囲むボックスでプロンプトできます。モデルは、ボックス内のオブジェクトだけでなく、その例に一致するすべてのインスタンスを見つけます。

```python
payload = {
    "image": {"type": "url", "value": "https://media.roboflow.com/inference/people-walking.jpg"},
    "prompts": [
        {
            "type": "visual",
            "boxes": [{"x": 1409, "y": 705, "width": 112, "height": 183}],
            "box_labels": [1],
        }
    ],
    "output_prob_thresh": 0.5,
    "format": "polygon",
}
```

ボックスは絶対ピクセル座標を使用します。次の 2 つの形式が受け付けられます：

* `{"x": ..., "y": ..., "width": ..., "height": ...}` ここで `x`, `y` は左上隅です
* `{"x0": ..., "y0": ..., "x1": ..., "y1": ...}` 明示的な角指定用

`box_labels` は次のときに必要です `boxes` が設定されている場合で、ボックスごとに 1 つのエントリが必要です： `1` は正の例示（このようなオブジェクトを見つける）を示し、 `0` は負の例示（このようなオブジェクトを除外する）を示します。

### テキストと例示を組み合わせたプロンプト

1 つのプロンプトに、テキストと例示ボックスの両方を含めることができます。これは、視覚的な例でテキスト概念を絞り込んだり、負の例示で似たものを除外したりするのに便利です：

```python
payload = {
    "image": {"type": "url", "value": "https://media.roboflow.com/inference/people-walking.jpg"},
    "prompts": [
        {
            "type": "visual",
            "text": "person",
            "boxes": [
                {"x": 1409, "y": 705, "width": 112, "height": 183},
                {"x": 1216, "y": 496, "width": 124, "height": 184},
            ],
            "box_labels": [1, 0],
        }
    ],
    "output_prob_thresh": 0.5,
    "format": "polygon",
}
```

ここでは、モデルは 1 つ目の（正の）例示に一致する人をセグメントし、2 つ目の（負の）例示に似たインスタンスを抑制します。

## 視覚セグメンテーション（PVS）

`POST https://serverless.roboflow.com/sam3/visual_segment`

PVS は、クリックまたはボックスで示された特定の 1 つのオブジェクトをセグメントします。インタラクティブな人間参加型のマスク調整に使用し、概念のすべてのインスタンスが欲しい場合は PCS を使用してください。

```python
import os
import requests

payload = {
    "image": {"type": "url", "value": "https://media.roboflow.com/inference/people-walking.jpg"},
    "prompts": {
        "prompts": [
            {
                "points": [{"x": 1465, "y": 796, "positive": True}],
                "box": {"x": 1465, "y": 796, "width": 112, "height": 183},
            }
        ]
    },
    "multimask_output": False,
    "format": "json",
}

response = requests.post(
    "https://serverless.roboflow.com/sam3/visual_segment",
    params={"api_key": os.environ["ROBOFLOW_API_KEY"]},
    json=payload,
)
prediction = response.json()["predictions"][0]
print(prediction["confidence"], len(prediction["masks"]), "polygons")
```

1 つのプロンプトには `points`、 `ボックス`、またはその両方を含めることができます：

* `points` は絶対ピクセル座標です。 `"positive": true` クリックした領域を含めます。 `false` それを除外します。マスクを絞り込むには、さらにポイントを追加してください。
* `ボックス` は中心基準の座標を使用します： `x`, `y` はボックスの中心です。PCS のボックスが左上基準であるのとは異なります。

レスポンスには、そのプロンプトに対する最も信頼度の高い単一のマスクが含まれます。 `multimask_output` は、モデルが内部で生成するマスク候補の数を制御します（true のときは 3 つ）が、レスポンスには常に最良の候補が選ばれます。

{% hint style="warning" %}
1 回のリクエストにつき 1 つのプロンプトを送信してください。現在、1 つの PVS リクエストに複数のプロンプトを含めても、返される予測は 1 つだけです。
{% endhint %}

OpenCV を使った対話型デモについては、こちらの [GitHub Gist](https://gist.github.com/Erol444/4cbc33c6ac52d83c63f6f9d86ca8a7a4)をご覧ください。この動画で使用されたものです：

{% embed url="<https://www.youtube.com/watch?v=01xrBzqHZ6c>" %}

## 推論速度

レイテンシの測定条件： [Roboflow Inference](https://docs.roboflow.com/deployment/self-hosted/self-hosted) 1 台の NVIDIA L4、バッチサイズ 1、ウォームアップ後の平均。

<table data-search="false"><thead><tr><th>モデル</th><th>レイテンシ（ms）</th></tr></thead><tbody><tr><td><code>sam3</code></td><td>251.4</td></tr></tbody></table>

単一のテキストプロンプトによる概念セグメンテーションで測定。

## エンドポイント

## SAM3 PCS (promptable concept segmentation)

> \*\*Concept Segmentation (Text Prompts)\*\*\
> \
> Allows you to segment objects using text prompts.\
> \
> \*\*Image Input\*\*: The \`image\` field accepts either:\
> \- \`{"type": "url", "value": "\<IMAGE\_URL>"}\` - A publicly accessible image URL\
> \- \`{"type": "base64", "value": "\<BASE64\_DATA>"}\` - Base64 encoded image data\
> \
> &#x20;\*\*Prompts\*\*: Each prompt in the \`prompts\` array should have \`type: "text"\` and a \`text\` field with the object description.

```json
{"openapi":"3.1.0","info":{"title":"Roboflow SAM3 API","version":"0.64.4"},"servers":[{"url":"https://serverless.roboflow.com"}],"paths":{"/sam3/concept_segment":{"post":{"summary":"SAM3 PCS (promptable concept segmentation)","description":"**Concept Segmentation (Text Prompts)**\n\nAllows you to segment objects using text prompts.\n\n**Image Input**: The `image` field accepts either:\n- `{\"type\": \"url\", \"value\": \"<IMAGE_URL>\"}` - A publicly accessible image URL\n- `{\"type\": \"base64\", \"value\": \"<BASE64_DATA>\"}` - Base64 encoded image data\n\n **Prompts**: Each prompt in the `prompts` array should have `type: \"text\"` and a `text` field with the object description.","operationId":"sam3_segment_image_sam3_concept_segment_post","parameters":[{"name":"api_key","in":"query","required":true,"schema":{"type":"string","title":"API Key"},"description":"Your Roboflow API Key. Get one at https://app.roboflow.com/settings/api"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sam3SegmentationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sam3SegmentationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Sam3SegmentationRequest":{"properties":{"image":{"$ref":"#/components/schemas/InferenceRequestImage","description":"The image to be segmented."},"prompts":{"items":{"$ref":"#/components/schemas/Sam3Prompt"},"type":"array","minItems":1,"title":"Prompts","description":"List of prompts (text and/or visual)"},"format":{"type":"string","title":"Format","description":"One of 'polygon', 'rle'","default":"polygon"},"image_id":{"type":"string","title":"Image Id","description":"Optional ID for caching embeddings."},"output_prob_thresh":{"type":"number","title":"Output Prob Thresh","description":"Score threshold for outputs.","default":0.5},"model_id":{"type":"string","title":"Model Id","description":"The model ID of SAM3. Use 'sam3/sam3_final' to target the generic base model.","default":"sam3/sam3_final"},"nms_iou_threshold":{"type":"number","title":"Nms Iou Threshold","description":"IoU threshold for cross-prompt NMS. If not set, NMS is disabled. Must be in [0.0, 1.0] when set."}},"type":"object","required":["image","prompts"],"title":"Sam3SegmentationRequest"},"InferenceRequestImage":{"properties":{"type":{"type":"string","title":"Type","description":"The type of image data provided, one of `url`, `base64`"},"value":{"type":"string","title":"Value","description":"Image data corresponding to the image type, if type = 'url' then value is a string containing the url of an image, else if type = 'base64' then value is a string containing base64 encoded image data."}},"type":"object","required":["type"],"title":"InferenceRequestImage","description":"Image data for inference request.\n\nAttributes:\n    type (str): The type of image data provided, one of 'url', 'base64', or 'numpy'.\n    value (Optional[Any]): Image data corresponding to the image type."},"Sam3Prompt":{"properties":{"type":{"type":"string","title":"Type","description":"Hint: `text` or `visual`"},"text":{"type":"string","title":"Text","description":"Text prompt describing the object to segment"},"output_prob_thresh":{"type":"number","title":"Output Prob Thresh","description":"Score threshold for this prompt's outputs. Overrides request-level threshold if set."},"boxes":{"items":{"anyOf":[{"$ref":"#/components/schemas/Box"},{"$ref":"#/components/schemas/BoxXYXY"}]},"type":"array","title":"Boxes","description":"Absolute pixel boxes as either XYWH or XYXY entries"},"box_labels":{"items":{"anyOf":[{"type":"integer"},{"type":"boolean"}]},"type":"array","title":"Box Labels","description":"List of 0/1 or booleans for boxes"}},"type":"object","required":["type"],"title":"Sam3Prompt","description":"Unified prompt that can contain text and/or geometry. Absolute pixel coordinates are used for boxes."},"Sam3SegmentationResponse":{"properties":{"prompt_results":{"items":{"$ref":"#/components/schemas/Sam3PromptResult"},"type":"array","title":"Prompt Results","description":"Results for each prompt in the request"},"time":{"type":"number","title":"Time","description":"The time in seconds it took to produce the segmentation including preprocessing"}},"type":"object","required":["prompt_results","time"],"title":"Sam3SegmentationResponse"},"Sam3PromptResult":{"properties":{"prompt_index":{"type":"integer","title":"Prompt Index","description":"Index of the prompt this result corresponds to"},"echo":{"$ref":"#/components/schemas/Sam3PromptEcho","description":"Echo of the original prompt for reference"},"predictions":{"items":{"$ref":"#/components/schemas/Sam3SegmentationPrediction"},"type":"array","title":"Predictions","description":"Segmentation predictions for this prompt"}},"type":"object","required":["prompt_index","predictions"],"title":"Sam3PromptResult"},"Sam3PromptEcho":{"properties":{"prompt_index":{"type":"integer","title":"Prompt Index"},"type":{"type":"string","title":"Type","description":"The prompt type (`text` or `visual`)"},"text":{"type":"string","title":"Text","description":"The text prompt if type is `text`"},"num_boxes":{"type":"integer","title":"Num Boxes","description":"Number of bounding boxes in the prompt"}},"type":"object","title":"Sam3PromptEcho"},"Sam3SegmentationPrediction":{"properties":{"format":{"type":"string","title":"Format","description":"The format of the mask data, either `polygon` or `rle`"},"confidence":{"type":"number","title":"Confidence","description":"Confidence score for this prediction"},"masks":{"items":{"items":{"items":{"type":"number"},"type":"array","minItems":2,"maxItems":2},"type":"array"},"type":"array","title":"Masks","description":"Array of polygons, each polygon is an array of [x, y] coordinate points"}},"type":"object","required":["format","confidence","masks"],"title":"Sam3SegmentationPrediction"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## SAM3 PVS (promptable visual segmentation)

> \*\*Interactive Segmentation (SAM 2 Style)\*\*\
> \
> SAM 3 also supports interactive segmentation using points and boxes.\
> \
> \*\*Image Input\*\*: The \`image\` field accepts either:\
> \- \`{"type": "url", "value": "\<IMAGE\_URL>"}\` - A publicly accessible image URL\
> \- \`{"type": "base64", "value": "\<BASE64\_DATA>"}\` - Base64 encoded image data\
> \
> \> \*\*Note\*\*: NumPy arrays are NOT supported on the serverless API. Use URL or base64 encoding only.\
> \
> \*\*Prompts\*\*: Support point-based prompts with positive/negative clicks for interactive segmentation.

```json
{"openapi":"3.1.0","info":{"title":"Roboflow SAM3 API","version":"0.64.4"},"servers":[{"url":"https://serverless.roboflow.com"}],"paths":{"/sam3/visual_segment":{"post":{"summary":"SAM3 PVS (promptable visual segmentation)","description":"**Interactive Segmentation (SAM 2 Style)**\n\nSAM 3 also supports interactive segmentation using points and boxes.\n\n**Image Input**: The `image` field accepts either:\n- `{\"type\": \"url\", \"value\": \"<IMAGE_URL>\"}` - A publicly accessible image URL\n- `{\"type\": \"base64\", \"value\": \"<BASE64_DATA>\"}` - Base64 encoded image data\n\n> **Note**: NumPy arrays are NOT supported on the serverless API. Use URL or base64 encoding only.\n\n**Prompts**: Support point-based prompts with positive/negative clicks for interactive segmentation.","operationId":"sam3_visual_segment_sam3_visual_segment_post","parameters":[{"name":"api_key","in":"query","required":true,"schema":{"type":"string","title":"API Key"},"description":"Your Roboflow API Key. Get one at https://app.roboflow.com/settings/api"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sam2SegmentationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sam2SegmentationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Sam2SegmentationRequest":{"properties":{"image":{"$ref":"#/components/schemas/InferenceRequestImage","description":"The image to be segmented."},"image_id":{"type":"string","title":"Image Id","description":"The ID of the image to be segmented used to retrieve cached embeddings. If an embedding is cached, it will be used instead of generating a new embedding. If no embedding is cached, a new embedding will be generated and cached."},"prompts":{"$ref":"#/components/schemas/Sam2PromptSet","description":"A list of prompts for masks to predict. Each prompt can include a bounding box and / or a set of postive or negative points."},"format":{"type":"string","title":"Format","description":"The format of the response. Must be one of 'json', 'rle', or 'binary'. If binary, masks are returned as binary numpy arrays. If json, masks are converted to polygons. If rle, masks are converted to RLE format.","default":"json"},"sam2_version_id":{"type":"string","title":"Sam2 Version Id","description":"The version ID of SAM to be used for this request. Must be one of hiera_tiny, hiera_small, hiera_large, hiera_b_plus","default":"hiera_large"},"multimask_output":{"type":"boolean","title":"Multimask Output","description":"If true, the model will return three masks. For ambiguous input prompts (such as a single click), this will often produce better masks than a single prediction.","default":true},"save_logits_to_cache":{"type":"boolean","title":"Save Logits To Cache","description":"If True, saves the low-resolution logits to the cache for potential future use.","default":false},"load_logits_from_cache":{"type":"boolean","title":"Load Logits From Cache","description":"If True, attempts to load previously cached low-resolution logits for the given image and prompt set.","default":false}},"type":"object","required":["image"],"title":"Sam2SegmentationRequest","description":"SAM2 visual segmentation request."},"InferenceRequestImage":{"properties":{"type":{"type":"string","title":"Type","description":"The type of image data provided, one of `url`, `base64`"},"value":{"type":"string","title":"Value","description":"Image data corresponding to the image type, if type = 'url' then value is a string containing the url of an image, else if type = 'base64' then value is a string containing base64 encoded image data."}},"type":"object","required":["type"],"title":"InferenceRequestImage","description":"Image data for inference request.\n\nAttributes:\n    type (str): The type of image data provided, one of 'url', 'base64', or 'numpy'.\n    value (Optional[Any]): Image data corresponding to the image type."},"Sam2SegmentationResponse":{"properties":{"prompt_results":{"items":{"$ref":"#/components/schemas/Sam2PromptResult"},"type":"array","title":"Prompt Results","description":"Results for each prompt in the request"},"time":{"type":"number","title":"Time","description":"The time in seconds it took to produce the segmentation including preprocessing"}},"type":"object","required":["prompt_results","time"],"title":"Sam2SegmentationResponse"},"Sam2PromptResult":{"properties":{"prompt_index":{"type":"integer","title":"Prompt Index","description":"Index of the prompt this result corresponds to"},"predictions":{"items":{"$ref":"#/components/schemas/Sam2SegmentationPrediction"},"type":"array","title":"Predictions","description":"Segmentation predictions for this prompt"}},"type":"object","required":["prompt_index","predictions"],"title":"Sam2PromptResult"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Inference（セルフホスト）で使用

SAM3 は、独自のハードウェア上でも実行でき、 [`inference`](https://docs.roboflow.com/deployment/self-hosted/self-hosted) パッケージでプロセス内に読み込むか、GPU コンテナから提供できます。

### Docker で実行

```bash
docker run -it --rm -p 9001:9001 --gpus=all roboflow/inference-server:latest
```

サーバーは同じ `/sam3/concept_segment` と `/sam3/visual_segment` 上記で説明したエンドポイントを次で公開します： `http://localhost:9001`.

### Python でモデルを読み込む

```bash
pip install "inference-gpu[sam3]"
```

```python
import os

os.environ["API_KEY"] = "YOUR_API_KEY"

from inference.core.entities.requests.sam3 import Sam3Prompt
from inference.models.sam3 import SegmentAnything3

model = SegmentAnything3(model_id="sam3/sam3_final")

prompts = [
    # 概念の各インスタンスをセグメントする
    Sam3Prompt(type="text", text="person"),
    # 1 つの例示オブジェクトをボックスで囲み、類似するすべてのインスタンスをセグメントする。
    # box_labels: 1 = 正の例示、0 = 負の例示。
    Sam3Prompt(
        type="visual",
        boxes=[Sam3Prompt.Box(x=1409, y=705, width=112, height=183)],
        box_labels=[1],
    ),
]

response = model.segment_image(
    image="path/to/your/image.jpg",
    prompts=prompts,
    output_prob_thresh=0.5,
    format="polygon",  # or "rle", "json"
)

for prompt_result in response.prompt_results:
    print(prompt_result.echo.text, len(prompt_result.predictions), "instances")
```

重みは初回使用時に自動でダウンロードされます。

### Python での対話型セグメンテーション

`Sam3ForInteractiveImageSegmentation` は、SAM2 風のポイントおよびボックスインターフェースを実装しており、人間参加型のマスク調整に使用できます：

```python
from inference.models.sam3 import Sam3ForInteractiveImageSegmentation

model = Sam3ForInteractiveImageSegmentation(model_id="sam3/sam3_final")

embedding, img_shape, image_id = model.embed_image(image="path/to/image.jpg")

masks, scores, logits = model.segment_image(
    image_id=image_id,
    prompts={"points": [{"x": 500, "y": 400, "positive": True}]},
)
```

## Workflows で使用

SAM3 の画像ブロックは、 [Workflows](https://docs.roboflow.com/workflows):

* **SAM 3** で概念セグメンテーションを実行します。 `class_names` （例えば `["person", "vehicle"]`）に入力すると、このブロックは他のステップが利用できるインスタンスセグメンテーション予測を出力します。
* **SAM 3 Interactive** プロンプト可能な視覚セグメンテーションを実行します。ラベル付きポイント（種類 `labeled_points`）を指定します。例えば `[{"x": 320, "y": 240, "positive": true}]`、必要に応じて別のモデルからの検出結果を `boxes` フィールドに接続できます。各ボックスは個別のプロンプトとなり、そのクラス名が予測マスクに引き継がれます。

### ビデオトラッキング

この **SAM3 Video Tracker** ブロック（`roboflow_core/sam3_video@v1`）は、SAM3 のストリーミング概念トラッカーをフレームごとに実行します。概念はテキストとして `class_names`に指定すると、モデルは各フレームで検出と追跡を統合して実行します。概念に一致するオブジェクトは安定した `tracker_id`を維持し、検出器起点のトラッキングとは異なり、ストリーム途中でシーンに入ってきたオブジェクトも再プロンプトや上流の検出モデルなしで自動的に拾われます。各マスクには、一致した概念がクラス名として、モデルの検出スコアが信頼度として付与されます（次でフィルタリング： `threshold`、デフォルト `0.5`).

* **ステートフルで、ローカル実行のみです。** 追跡セッションは各 `video_metadata.video_identifier`ごとに 1 つ保持されます。このブロックには `WORKFLOWS_STEP_EXECUTION_MODE=local`、GPU、そして永続的な WebRTC セッションが必要です。
* **プロンプトのスケジューリングはありません。** 概念プロンプトはセッションごとに 1 回だけ登録され、セッションが再シードされるのは、ストリームが再開したとき、または `class_names` が変更されたときだけです。検出器駆動（ボックスプロンプト）のビデオトラッキングには、 [SAM2 ページ](/models/ja/supported-models/sam2.md)の SAM2 Video Tracker ブロックを使用してください。そこでは `sam3trackervideo` も `model_id`.
* **として受け付けられます。** `model_id` のデフォルトは `sam3video`です。これは SAM3 video の HuggingFace transformers 版で、フレームごとのストリーミングインターフェースを公開します。ネイティブの `sam3` パッケージの動画予測器は、動画全体を事前に必要とし、ライブストリームには使用できません。

```python
from inference_sdk import InferenceHTTPClient
from inference_sdk.webrtc import StreamConfig, VideoFileSource

WORKFLOW = {
    "version": "1.0",
    "inputs": [{"type": "InferenceImage", "name": "image"}],
    "steps": [
        {
            "type": "roboflow_core/sam3_video@v1",
            "name": "tracker",
            "images": "$inputs.image",
            "class_names": ["person", "forklift"],
            "threshold": 0.5,
        },
    ],
    "outputs": [
        {
            "type": "JsonField",
            "name": "predictions",
            "selector": "$steps.tracker.predictions",
        }
    ],
}

client = InferenceHTTPClient(
    api_url="http://localhost:9001",
    api_key="YOUR_API_KEY",
)

session = client.webrtc.stream(
    source=VideoFileSource("path/to/video.mp4"),
    workflow=WORKFLOW,
    config=StreamConfig(data_output=["predictions"]),
)

@session.on_data("predictions")
def handle_predictions(predictions, metadata):
    print(predictions)

session.run()
```

## SAM3-3D（ベータ）

SAM3-3D は、2D 画像とマスクを 3D アセット、つまりメッシュと Gaussian splat に変換します。

{% hint style="warning" %}
SAM3-3D はベータ版です。次の `SAM3_3D_OBJECTS_ENABLED` フラグが設定されている場合にのみ利用でき、32 GB 以上の VRAM を持つ GPU が必要で、 `inference` パッケージまたはローカルの Inference サーバーで実行されます（Serverless Hosted API ではありません）。
{% endhint %}

依存関係をインストールしてください（Python 3.10 推奨）：

```bash
pip install --no-cache-dir --no-build-isolation -r requirements/requirements.sam3_3d.txt
```

または、3D 対応 GPU コンテナをビルドして実行します：

```bash
docker build -t roboflow/roboflow-inference-server-gpu:dev -f docker/dockerfiles/Dockerfile.onnx.gpu.3d .
docker run --gpus all -p 9001:9001 roboflow/roboflow-inference-server-gpu:dev
```

**入力。** RGB 画像と `mask_input`で、オブジェクト領域を定義します。マスクはバイナリ配列（`(H, W)` または `(N, H, W)`）、COCO のフラットポリゴン、点対ポリゴン、RLE 辞書、または `sv.Detections` SAM2 もしくは別のセグメンテーションモデルの object で受け付けられます。

**出力。** `mesh_glb` （統合シーンメッシュ、GLB）、 `gaussian_ply` （統合 Gaussian splat、PLY）、 `objects` （オブジェクトごとの `mesh_glb`, `gaussian_ply`、および `metadata` （回転、平行移動、スケールを含む）、そして `time`.

```python
import os

os.environ["SAM3_3D_OBJECTS_ENABLED"] = "true"
os.environ["SPARSE_ATTN_BACKEND"] = "flash_attn"
os.environ["ATTN_BACKEND"] = "flash_attn"

from inference import get_model
from inference.core.entities.requests.sam3_3d import Sam3_3D_Objects_InferenceRequest

model = get_model("sam3-3d-objects", api_key="YOUR_API_KEY")

request = Sam3_3D_Objects_InferenceRequest(
    image={"type": "file", "value": "image.jpg"},
    mask_input=mask_polygons,  # ポリゴン、バイナリマスク、または RLE
)

response = model.infer_from_request(request)

if response.mesh_glb is not None:
    with open("out_mesh.glb", "wb") as f:
        f.write(response.mesh_glb)

for index, obj in enumerate(response.objects):
    if obj.gaussian_ply is not None:
        with open(f"out_object_{index}.ply", "wb") as f:
            f.write(obj.gaussian_ply)
```

設定 `SPARSE_ATTN_BACKEND` と `ATTN_BACKEND` を `flash_attn` にすると、パイプラインが高速化します。Workflows では、SAM3-3D はローカル実行と次を介したリモート実行をサポートします： `sam3_3d_infer()` クライアントメソッド、または `/sam3_3d/infer` エンドポイント。

## 関連項目

* [SAM2](/models/ja/supported-models/sam2.md) - ポイントおよびボックスによるプロンプト付きセグメンテーション、さらに検出器を起点にした動画トラッキング。
* [Segment Anything（SAM）](/models/ja/supported-models/sam.md) - 元の単一オブジェクトモデル。
