# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. import os from setuptools import find_packages, setup # Package metadata NAME = "SAM-2" VERSION = "1.0" DESCRIPTION = "SAM 2: Segment Anything in Images and Videos" URL = "https://github.com/facebookresearch/sam2" AUTHOR = "Meta AI" AUTHOR_EMAIL = "segment-anything@meta.com" LICENSE = "Apache 2.0" # Read the contents of README file with open("README.md", "r", encoding="utf-8") as f: LONG_DESCRIPTION = f.read() # Required dependencies REQUIRED_PACKAGES = [ "torch>=2.3.1", "torchvision>=0.18.1", "numpy>=1.24.4", "tqdm>=4.66.1", "hydra-core>=1.3.2", "iopath>=0.1.10", "pillow>=9.4.0", ] EXTRA_PACKAGES = { "notebooks": [ "matplotlib>=3.9.1", "jupyter>=1.0.0", "opencv-python>=4.7.0", "eva-decord>=0.6.1", ], "interactive-demo": [ "Flask>=3.0.3", "Flask-Cors>=5.0.0", "av>=13.0.0", "dataclasses-json>=0.6.7", "eva-decord>=0.6.1", "gunicorn>=23.0.0", "imagesize>=1.4.1", "pycocotools>=2.0.8", "strawberry-graphql>=0.239.2", ], "dev": [ "black==24.2.0", "usort==1.0.2", "ufmt==2.0.0b2", "fvcore>=0.1.5.post20221221", "pandas>=2.2.2", "scikit-image>=0.24.0", "tensorboard>=2.17.0", "pycocotools>=2.0.8", "tensordict>=0.5.0", "opencv-python>=4.7.0", "submitit>=1.5.1", ], } # By default, we also build the SAM 2 CUDA extension. # You may turn off CUDA build with `export SAM2_BUILD_CUDA=0`. BUILD_CUDA = os.getenv("SAM2_BUILD_CUDA", "1") == "1" # By default, we allow SAM 2 installation to proceed even with build errors. # You may force stopping on errors with `export SAM2_BUILD_ALLOW_ERRORS=0`. BUILD_ALLOW_ERRORS = os.getenv("SAM2_BUILD_ALLOW_ERRORS", "1") == "1" # Catch and skip errors during extension building and print a warning message # (note that this message only shows up under verbose build mode # "pip install -v -e ." or "python setup.py build_ext -v") CUDA_ERROR_MSG = ( "{}\n\n" "Failed to build the SAM 2 CUDA extension due to the error above. " "You can still use SAM 2 and it's OK to ignore the error above, although some " "post-processing functionality may be limited (which doesn't affect the results in most cases; " "(see https://github.com/facebookresearch/sam2/blob/main/INSTALL.md).\n" ) def get_extensions(): if not BUILD_CUDA: return [] try: from torch.utils.cpp_extension import CUDAExtension srcs = ["sam2/csrc/connected_components.cu"] compile_args = { "cxx": [], "nvcc": [ "-DCUDA_HAS_FP16=1", "-D__CUDA_NO_HALF_OPERATORS__", "-D__CUDA_NO_HALF_CONVERSIONS__", "-D__CUDA_NO_HALF2_OPERATORS__", ], } ext_modules = [CUDAExtension("sam2._C", srcs, extra_compile_args=compile_args)] except Exception as e: if BUILD_ALLOW_ERRORS: print(CUDA_ERROR_MSG.format(e)) ext_modules = [] else: raise e return ext_modules try: from torch.utils.cpp_extension import BuildExtension class BuildExtensionIgnoreErrors(BuildExtension): def finalize_options(self): try: super().finalize_options() except Exception as e: print(CUDA_ERROR_MSG.format(e)) self.extensions = [] def build_extensions(self): try: super().build_extensions() except Exception as e: print(CUDA_ERROR_MSG.format(e)) self.extensions = [] def get_ext_filename(self, ext_name): try: return super().get_ext_filename(ext_name) except Exception as e: print(CUDA_ERROR_MSG.format(e)) self.extensions = [] return "_C.so" cmdclass = { "build_ext": ( BuildExtensionIgnoreErrors.with_options(no_python_abi_suffix=True) if BUILD_ALLOW_ERRORS else BuildExtension.with_options(no_python_abi_suffix=True) ) } except Exception as e: cmdclass = {} if BUILD_ALLOW_ERRORS: print(CUDA_ERROR_MSG.format(e)) else: raise e # Setup configuration setup( name=NAME, version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, long_description_content_type="text/markdown", url=URL, author=AUTHOR, author_email=AUTHOR_EMAIL, license=LICENSE, packages=find_packages(exclude="notebooks"), include_package_data=True, install_requires=REQUIRED_PACKAGES, extras_require=EXTRA_PACKAGES, python_requires=">=3.10.0", # ext_modules=get_extensions(), cmdclass=cmdclass, )