|
|
|
|
|
|
|
|
|
|
| import os
|
|
|
| from setuptools import find_packages, setup
|
|
|
|
|
| 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"
|
|
|
|
|
| with open("README.md", "r", encoding="utf-8") as f:
|
| LONG_DESCRIPTION = f.read()
|
|
|
|
|
| REQUIRED_PACKAGES = [
|
| "torch>=2.5.1",
|
| "torchvision>=0.20.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.243.0",
|
| ],
|
| "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.6.0",
|
| "opencv-python>=4.7.0",
|
| "submitit>=1.5.1",
|
| ],
|
| }
|
|
|
|
|
|
|
| BUILD_CUDA = os.getenv("SAM2_BUILD_CUDA", "1") == "1"
|
|
|
|
|
| BUILD_ALLOW_ERRORS = os.getenv("SAM2_BUILD_ALLOW_ERRORS", "1") == "1"
|
|
|
|
|
|
|
|
|
| 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(
|
| 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,
|
| )
|
|
|