| | |
| | """ |
| | SAM model interface. |
| | |
| | This module provides an interface to the Segment Anything Model (SAM) from Ultralytics, designed for real-time image |
| | segmentation tasks. The SAM model allows for promptable segmentation with unparalleled versatility in image analysis, |
| | and has been trained on the SA-1B dataset. It features zero-shot performance capabilities, enabling it to adapt to new |
| | image distributions and tasks without prior knowledge. |
| | |
| | Key Features: |
| | - Promptable segmentation |
| | - Real-time performance |
| | - Zero-shot transfer capabilities |
| | - Trained on SA-1B dataset |
| | """ |
| |
|
| | from pathlib import Path |
| |
|
| | from ultralytics.engine.model import Model |
| | from ultralytics.utils.torch_utils import model_info |
| | from .build import build_sam |
| | from .predict import Predictor |
| |
|
| |
|
| | class SAM(Model): |
| | """ |
| | SAM (Segment Anything Model) interface class. |
| | |
| | SAM is designed for promptable real-time image segmentation. It can be used with a variety of prompts such as |
| | bounding boxes, points, or labels. The model has capabilities for zero-shot performance and is trained on the SA-1B |
| | dataset. |
| | """ |
| |
|
| | def __init__(self, model="sam_b.pt") -> None: |
| | """ |
| | Initializes the SAM model with a pre-trained model file. |
| | |
| | Args: |
| | model (str): Path to the pre-trained SAM model file. File should have a .pt or .pth extension. |
| | |
| | Raises: |
| | NotImplementedError: If the model file extension is not .pt or .pth. |
| | """ |
| | if model and Path(model).suffix not in (".pt", ".pth"): |
| | raise NotImplementedError("SAM prediction requires pre-trained *.pt or *.pth model.") |
| | super().__init__(model=model, task="segment") |
| |
|
| | def _load(self, weights: str, task=None): |
| | """ |
| | Loads the specified weights into the SAM model. |
| | |
| | Args: |
| | weights (str): Path to the weights file. |
| | task (str, optional): Task name. Defaults to None. |
| | """ |
| | self.model = build_sam(weights) |
| |
|
| | def predict(self, source, stream=False, bboxes=None, points=None, labels=None, **kwargs): |
| | """ |
| | Performs segmentation prediction on the given image or video source. |
| | |
| | Args: |
| | source (str): Path to the image or video file, or a PIL.Image object, or a numpy.ndarray object. |
| | stream (bool, optional): If True, enables real-time streaming. Defaults to False. |
| | bboxes (list, optional): List of bounding box coordinates for prompted segmentation. Defaults to None. |
| | points (list, optional): List of points for prompted segmentation. Defaults to None. |
| | labels (list, optional): List of labels for prompted segmentation. Defaults to None. |
| | |
| | Returns: |
| | (list): The model predictions. |
| | """ |
| | overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024) |
| | kwargs.update(overrides) |
| | prompts = dict(bboxes=bboxes, points=points, labels=labels) |
| | return super().predict(source, stream, prompts=prompts, **kwargs) |
| |
|
| | def __call__(self, source=None, stream=False, bboxes=None, points=None, labels=None, **kwargs): |
| | """ |
| | Alias for the 'predict' method. |
| | |
| | Args: |
| | source (str): Path to the image or video file, or a PIL.Image object, or a numpy.ndarray object. |
| | stream (bool, optional): If True, enables real-time streaming. Defaults to False. |
| | bboxes (list, optional): List of bounding box coordinates for prompted segmentation. Defaults to None. |
| | points (list, optional): List of points for prompted segmentation. Defaults to None. |
| | labels (list, optional): List of labels for prompted segmentation. Defaults to None. |
| | |
| | Returns: |
| | (list): The model predictions. |
| | """ |
| | return self.predict(source, stream, bboxes, points, labels, **kwargs) |
| |
|
| | def info(self, detailed=False, verbose=True): |
| | """ |
| | Logs information about the SAM model. |
| | |
| | Args: |
| | detailed (bool, optional): If True, displays detailed information about the model. Defaults to False. |
| | verbose (bool, optional): If True, displays information on the console. Defaults to True. |
| | |
| | Returns: |
| | (tuple): A tuple containing the model's information. |
| | """ |
| | return model_info(self.model, detailed=detailed, verbose=verbose) |
| |
|
| | @property |
| | def task_map(self): |
| | """ |
| | Provides a mapping from the 'segment' task to its corresponding 'Predictor'. |
| | |
| | Returns: |
| | (dict): A dictionary mapping the 'segment' task to its corresponding 'Predictor'. |
| | """ |
| | return {"segment": {"predictor": Predictor}} |
| |
|