116 lines
4.6 KiB
Python
116 lines
4.6 KiB
Python
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
"""
|
|
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}}
|