File size: 4,820 Bytes
7370e5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# 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}}