| | |
| | |
| |
|
| | import glob |
| | import os |
| | import shutil |
| | from os import path |
| | from setuptools import find_packages, setup |
| | from typing import List |
| | import torch |
| | from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension |
| |
|
| | torch_ver = [int(x) for x in torch.__version__.split(".")[:2]] |
| | assert torch_ver >= [1, 8], "Requires PyTorch >= 1.8" |
| |
|
| |
|
| | def get_version(): |
| | init_py_path = path.join(path.abspath(path.dirname(__file__)), "detectron2", "__init__.py") |
| | init_py = open(init_py_path, "r").readlines() |
| | version_line = [l.strip() for l in init_py if l.startswith("__version__")][0] |
| | version = version_line.split("=")[-1].strip().strip("'\"") |
| |
|
| | |
| | |
| | suffix = os.getenv("D2_VERSION_SUFFIX", "") |
| | version = version + suffix |
| | if os.getenv("BUILD_NIGHTLY", "0") == "1": |
| | from datetime import datetime |
| |
|
| | date_str = datetime.today().strftime("%y%m%d") |
| | version = version + ".dev" + date_str |
| |
|
| | new_init_py = [l for l in init_py if not l.startswith("__version__")] |
| | new_init_py.append('__version__ = "{}"\n'.format(version)) |
| | with open(init_py_path, "w") as f: |
| | f.write("".join(new_init_py)) |
| | return version |
| |
|
| |
|
| | def get_extensions(): |
| | this_dir = path.dirname(path.abspath(__file__)) |
| | extensions_dir = path.join(this_dir, "detectron2", "layers", "csrc") |
| |
|
| | main_source = path.join(extensions_dir, "vision.cpp") |
| | sources = glob.glob(path.join(extensions_dir, "**", "*.cpp")) |
| |
|
| | from torch.utils.cpp_extension import ROCM_HOME |
| |
|
| | is_rocm_pytorch = ( |
| | True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False |
| | ) |
| | if is_rocm_pytorch: |
| | assert torch_ver >= [1, 8], "ROCM support requires PyTorch >= 1.8!" |
| |
|
| | |
| | source_cuda = glob.glob(path.join(extensions_dir, "**", "*.cu")) + glob.glob( |
| | path.join(extensions_dir, "*.cu") |
| | ) |
| | sources = [main_source] + sources |
| |
|
| | extension = CppExtension |
| |
|
| | extra_compile_args = {"cxx": []} |
| | define_macros = [] |
| |
|
| | if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv( |
| | "FORCE_CUDA", "0" |
| | ) == "1": |
| | extension = CUDAExtension |
| | sources += source_cuda |
| |
|
| | if not is_rocm_pytorch: |
| | define_macros += [("WITH_CUDA", None)] |
| | extra_compile_args["nvcc"] = [ |
| | "-O3", |
| | "-DCUDA_HAS_FP16=1", |
| | "-D__CUDA_NO_HALF_OPERATORS__", |
| | "-D__CUDA_NO_HALF_CONVERSIONS__", |
| | "-D__CUDA_NO_HALF2_OPERATORS__", |
| | ] |
| | else: |
| | define_macros += [("WITH_HIP", None)] |
| | extra_compile_args["nvcc"] = [] |
| |
|
| | if torch_ver < [1, 7]: |
| | |
| | CC = os.environ.get("CC", None) |
| | if CC is not None: |
| | extra_compile_args["nvcc"].append("-ccbin={}".format(CC)) |
| |
|
| | include_dirs = [extensions_dir] |
| |
|
| | ext_modules = [ |
| | extension( |
| | "detectron2._C", |
| | sources, |
| | include_dirs=include_dirs, |
| | define_macros=define_macros, |
| | extra_compile_args=extra_compile_args, |
| | ) |
| | ] |
| |
|
| | return ext_modules |
| |
|
| |
|
| | def get_model_zoo_configs() -> List[str]: |
| | """ |
| | Return a list of configs to include in package for model zoo. Copy over these configs inside |
| | detectron2/model_zoo. |
| | """ |
| |
|
| | |
| | source_configs_dir = path.join(path.dirname(path.realpath(__file__)), "configs") |
| | destination = path.join( |
| | path.dirname(path.realpath(__file__)), "detectron2", "model_zoo", "configs" |
| | ) |
| | |
| |
|
| | |
| | if path.exists(source_configs_dir): |
| | if path.islink(destination): |
| | os.unlink(destination) |
| | elif path.isdir(destination): |
| | shutil.rmtree(destination) |
| |
|
| | if not path.exists(destination): |
| | try: |
| | os.symlink(source_configs_dir, destination) |
| | except OSError: |
| | |
| | shutil.copytree(source_configs_dir, destination) |
| |
|
| | config_paths = glob.glob("configs/**/*.yaml", recursive=True) + glob.glob( |
| | "configs/**/*.py", recursive=True |
| | ) |
| | return config_paths |
| |
|
| |
|
| | |
| | |
| | PROJECTS = { |
| | "detectron2.projects.point_rend": "projects/PointRend/point_rend", |
| | "detectron2.projects.deeplab": "projects/DeepLab/deeplab", |
| | "detectron2.projects.panoptic_deeplab": "projects/Panoptic-DeepLab/panoptic_deeplab", |
| | } |
| |
|
| | setup( |
| | name="detectron2", |
| | version=get_version(), |
| | author="FAIR", |
| | url="https://github.com/facebookresearch/detectron2", |
| | description="Detectron2 is FAIR's next-generation research " |
| | "platform for object detection and segmentation.", |
| | packages=find_packages(exclude=("configs", "tests*")) + list(PROJECTS.keys()), |
| | package_dir=PROJECTS, |
| | package_data={"detectron2.model_zoo": get_model_zoo_configs()}, |
| | python_requires=">=3.7", |
| | install_requires=[ |
| | |
| | |
| | |
| | "Pillow>=7.1", |
| | "matplotlib", |
| | "pycocotools>=2.0.2", |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | "termcolor>=1.1", |
| | "yacs>=0.1.8", |
| | "tabulate", |
| | "cloudpickle", |
| | "tqdm>4.29.0", |
| | "tensorboard", |
| | |
| | |
| | |
| | "fvcore>=0.1.5,<0.1.6", |
| | "iopath>=0.1.7,<0.1.10", |
| | "dataclasses; python_version<'3.7'", |
| | "omegaconf>=2.1", |
| | "hydra-core>=1.1", |
| | "black", |
| | "packaging", |
| | |
| | |
| | |
| | ], |
| | extras_require={ |
| | |
| | "all": [ |
| | "fairscale", |
| | "timm", |
| | "scipy>1.5.1", |
| | "shapely", |
| | "pygments>=2.2", |
| | "psutil", |
| | "panopticapi @ https://github.com/cocodataset/panopticapi/archive/master.zip", |
| | ], |
| | |
| | "dev": [ |
| | "flake8==3.8.1", |
| | "isort==4.3.21", |
| | "flake8-bugbear", |
| | "flake8-comprehensions", |
| | "black==22.3.0", |
| | ], |
| | }, |
| | ext_modules=get_extensions(), |
| | cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, |
| | ) |
| |
|