diff --git a/.gitignore b/.gitignore index e19cd521..005e4ace 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ ckpt/ vis/ log/ pretrained/ + +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index 7904b734..2e40d2ee 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,19 @@ python3 eval_multipro.py --gpus GPUS --cfg config/ade20k-resnet50dilated-ppm_dee python3 eval_multipro.py --gpus GPUS --cfg config/ade20k-resnet101-upernet.yaml ``` +## Integration with other projects +This library can be installed via `pip` to easily integrate with another codebase +```bash +pip install git+https://github.com/CSAILVision/semantic-segmentation-pytorch.git@master +``` + +Now this library can easily be consumed programmatically. For example +```python +from mit_semseg.config import cfg +from mit_semseg.dataset import TestDataset +from mit_semseg.models import ModelBuilder, SegmentationModule +``` + ## Reference If you find the code or pre-trained models useful, please cite the following papers: diff --git a/eval.py b/eval.py index 8742990c..b4a60ad7 100644 --- a/eval.py +++ b/eval.py @@ -9,12 +9,12 @@ import torch.nn as nn from scipy.io import loadmat # Our libs -from config import cfg -from dataset import ValDataset -from models import ModelBuilder, SegmentationModule -from utils import AverageMeter, colorEncode, accuracy, intersectionAndUnion, setup_logger -from lib.nn import user_scattered_collate, async_copy_to -from lib.utils import as_numpy +from mit_semseg.config import cfg +from mit_semseg.dataset import ValDataset +from mit_semseg.models import ModelBuilder, SegmentationModule +from mit_semseg.utils import AverageMeter, colorEncode, accuracy, intersectionAndUnion, setup_logger +from mit_semseg.lib.nn import user_scattered_collate, async_copy_to +from mit_semseg.lib.utils import as_numpy from PIL import Image from tqdm import tqdm diff --git a/eval_multipro.py b/eval_multipro.py index 258edfa1..db328cd3 100644 --- a/eval_multipro.py +++ b/eval_multipro.py @@ -10,12 +10,12 @@ import torch.nn as nn from scipy.io import loadmat # Our libs -from config import cfg -from dataset import ValDataset -from models import ModelBuilder, SegmentationModule -from utils import AverageMeter, colorEncode, accuracy, intersectionAndUnion, parse_devices, setup_logger -from lib.nn import user_scattered_collate, async_copy_to -from lib.utils import as_numpy +from mit_semseg.config import cfg +from mit_semseg.dataset import ValDataset +from mit_semseg.models import ModelBuilder, SegmentationModule +from mit_semseg.utils import AverageMeter, colorEncode, accuracy, intersectionAndUnion, parse_devices, setup_logger +from mit_semseg.lib.nn import user_scattered_collate, async_copy_to +from mit_semseg.lib.utils import as_numpy from PIL import Image from tqdm import tqdm diff --git a/mit_semseg/__init__.py b/mit_semseg/__init__.py new file mode 100644 index 00000000..d6ccf2d5 --- /dev/null +++ b/mit_semseg/__init__.py @@ -0,0 +1,5 @@ +""" +MIT CSAIL Semantic Segmentation +""" + +__version__ = '1.0.0' diff --git a/config/__init__.py b/mit_semseg/config/__init__.py similarity index 100% rename from config/__init__.py rename to mit_semseg/config/__init__.py diff --git a/config/defaults.py b/mit_semseg/config/defaults.py similarity index 100% rename from config/defaults.py rename to mit_semseg/config/defaults.py diff --git a/dataset.py b/mit_semseg/dataset.py similarity index 100% rename from dataset.py rename to mit_semseg/dataset.py diff --git a/mit_semseg/lib/__init__.py b/mit_semseg/lib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/nn/__init__.py b/mit_semseg/lib/nn/__init__.py similarity index 100% rename from lib/nn/__init__.py rename to mit_semseg/lib/nn/__init__.py diff --git a/lib/nn/modules/__init__.py b/mit_semseg/lib/nn/modules/__init__.py similarity index 100% rename from lib/nn/modules/__init__.py rename to mit_semseg/lib/nn/modules/__init__.py diff --git a/lib/nn/modules/batchnorm.py b/mit_semseg/lib/nn/modules/batchnorm.py similarity index 100% rename from lib/nn/modules/batchnorm.py rename to mit_semseg/lib/nn/modules/batchnorm.py diff --git a/lib/nn/modules/comm.py b/mit_semseg/lib/nn/modules/comm.py similarity index 100% rename from lib/nn/modules/comm.py rename to mit_semseg/lib/nn/modules/comm.py diff --git a/lib/nn/modules/replicate.py b/mit_semseg/lib/nn/modules/replicate.py similarity index 100% rename from lib/nn/modules/replicate.py rename to mit_semseg/lib/nn/modules/replicate.py diff --git a/mit_semseg/lib/nn/modules/tests/__init__.py b/mit_semseg/lib/nn/modules/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/nn/modules/tests/test_numeric_batchnorm.py b/mit_semseg/lib/nn/modules/tests/test_numeric_batchnorm.py similarity index 100% rename from lib/nn/modules/tests/test_numeric_batchnorm.py rename to mit_semseg/lib/nn/modules/tests/test_numeric_batchnorm.py diff --git a/lib/nn/modules/tests/test_sync_batchnorm.py b/mit_semseg/lib/nn/modules/tests/test_sync_batchnorm.py similarity index 100% rename from lib/nn/modules/tests/test_sync_batchnorm.py rename to mit_semseg/lib/nn/modules/tests/test_sync_batchnorm.py diff --git a/lib/nn/modules/unittest.py b/mit_semseg/lib/nn/modules/unittest.py similarity index 100% rename from lib/nn/modules/unittest.py rename to mit_semseg/lib/nn/modules/unittest.py diff --git a/lib/nn/parallel/__init__.py b/mit_semseg/lib/nn/parallel/__init__.py similarity index 100% rename from lib/nn/parallel/__init__.py rename to mit_semseg/lib/nn/parallel/__init__.py diff --git a/lib/nn/parallel/data_parallel.py b/mit_semseg/lib/nn/parallel/data_parallel.py similarity index 100% rename from lib/nn/parallel/data_parallel.py rename to mit_semseg/lib/nn/parallel/data_parallel.py diff --git a/lib/utils/__init__.py b/mit_semseg/lib/utils/__init__.py similarity index 100% rename from lib/utils/__init__.py rename to mit_semseg/lib/utils/__init__.py diff --git a/lib/utils/data/__init__.py b/mit_semseg/lib/utils/data/__init__.py similarity index 100% rename from lib/utils/data/__init__.py rename to mit_semseg/lib/utils/data/__init__.py diff --git a/lib/utils/data/dataloader.py b/mit_semseg/lib/utils/data/dataloader.py similarity index 100% rename from lib/utils/data/dataloader.py rename to mit_semseg/lib/utils/data/dataloader.py diff --git a/lib/utils/data/dataset.py b/mit_semseg/lib/utils/data/dataset.py similarity index 100% rename from lib/utils/data/dataset.py rename to mit_semseg/lib/utils/data/dataset.py diff --git a/lib/utils/data/distributed.py b/mit_semseg/lib/utils/data/distributed.py similarity index 100% rename from lib/utils/data/distributed.py rename to mit_semseg/lib/utils/data/distributed.py diff --git a/lib/utils/data/sampler.py b/mit_semseg/lib/utils/data/sampler.py similarity index 100% rename from lib/utils/data/sampler.py rename to mit_semseg/lib/utils/data/sampler.py diff --git a/lib/utils/th.py b/mit_semseg/lib/utils/th.py similarity index 100% rename from lib/utils/th.py rename to mit_semseg/lib/utils/th.py diff --git a/models/__init__.py b/mit_semseg/models/__init__.py similarity index 100% rename from models/__init__.py rename to mit_semseg/models/__init__.py diff --git a/models/hrnet.py b/mit_semseg/models/hrnet.py similarity index 99% rename from models/hrnet.py rename to mit_semseg/models/hrnet.py index c16ac5e9..79598924 100644 --- a/models/hrnet.py +++ b/mit_semseg/models/hrnet.py @@ -8,7 +8,7 @@ import torch.nn as nn import torch.nn.functional as F from .utils import load_url -from lib.nn import SynchronizedBatchNorm2d +from mit_semseg.lib.nn import SynchronizedBatchNorm2d BatchNorm2d = SynchronizedBatchNorm2d BN_MOMENTUM = 0.1 diff --git a/models/mobilenet.py b/mit_semseg/models/mobilenet.py similarity index 98% rename from models/mobilenet.py rename to mit_semseg/models/mobilenet.py index fe03d84d..d44b5295 100644 --- a/models/mobilenet.py +++ b/mit_semseg/models/mobilenet.py @@ -6,7 +6,7 @@ import torch.nn as nn import math from .utils import load_url -from lib.nn import SynchronizedBatchNorm2d +from mit_semseg.lib.nn import SynchronizedBatchNorm2d BatchNorm2d = SynchronizedBatchNorm2d diff --git a/models/models.py b/mit_semseg/models/models.py similarity index 99% rename from models/models.py rename to mit_semseg/models/models.py index 627a220a..793d2bd7 100644 --- a/models/models.py +++ b/mit_semseg/models/models.py @@ -1,8 +1,7 @@ import torch import torch.nn as nn -import torchvision from . import resnet, resnext, mobilenet, hrnet -from lib.nn import SynchronizedBatchNorm2d +from mit_semseg.lib.nn import SynchronizedBatchNorm2d BatchNorm2d = SynchronizedBatchNorm2d diff --git a/models/resnet.py b/mit_semseg/models/resnet.py similarity index 99% rename from models/resnet.py rename to mit_semseg/models/resnet.py index f09f5b00..19a4ece6 100644 --- a/models/resnet.py +++ b/mit_semseg/models/resnet.py @@ -1,7 +1,7 @@ import torch.nn as nn import math from .utils import load_url -from lib.nn import SynchronizedBatchNorm2d +from mit_semseg.lib.nn import SynchronizedBatchNorm2d BatchNorm2d = SynchronizedBatchNorm2d diff --git a/models/resnext.py b/mit_semseg/models/resnext.py similarity index 98% rename from models/resnext.py rename to mit_semseg/models/resnext.py index ba3e8dcd..b806b673 100644 --- a/models/resnext.py +++ b/mit_semseg/models/resnext.py @@ -1,7 +1,7 @@ import torch.nn as nn import math from .utils import load_url -from lib.nn import SynchronizedBatchNorm2d +from mit_semseg.lib.nn import SynchronizedBatchNorm2d BatchNorm2d = SynchronizedBatchNorm2d diff --git a/models/utils.py b/mit_semseg/models/utils.py similarity index 100% rename from models/utils.py rename to mit_semseg/models/utils.py diff --git a/utils.py b/mit_semseg/utils.py similarity index 100% rename from utils.py rename to mit_semseg/utils.py diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..06c804d7 --- /dev/null +++ b/setup.py @@ -0,0 +1,29 @@ +import setuptools + +with open('README.md', 'r') as fh: + long_description = fh.read() + +setuptools.setup( + name='mit_semseg', + version='1.0.0', + author='MIT CSAIL', + description='Pytorch implementation for Semantic Segmentation/Scene Parsing on MIT ADE20K dataset', + long_description=long_description, + long_description_content_type='text/markdown', + url='https://github.com/CSAILVision/semantic-segmentation-pytorch', + packages=setuptools.find_packages(), + classifiers=( + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: BSD License', + 'Operating System :: OS Independent', + ), + install_requires=[ + 'numpy', + 'torch>=0.4.1', + 'torchvision', + 'opencv-python', + 'yacs', + 'scipy', + 'tqdm' + ] +) diff --git a/test.py b/test.py index 0fe85e11..b84f4cb4 100644 --- a/test.py +++ b/test.py @@ -9,14 +9,14 @@ from scipy.io import loadmat import csv # Our libs -from dataset import TestDataset -from models import ModelBuilder, SegmentationModule -from utils import colorEncode, find_recursive, setup_logger -from lib.nn import user_scattered_collate, async_copy_to -from lib.utils import as_numpy +from mit_semseg.dataset import TestDataset +from mit_semseg.models import ModelBuilder, SegmentationModule +from mit_semseg.utils import colorEncode, find_recursive, setup_logger +from mit_semseg.lib.nn import user_scattered_collate, async_copy_to +from mit_semseg.lib.utils import as_numpy from PIL import Image from tqdm import tqdm -from config import cfg +from mit_semseg.config import cfg colors = loadmat('data/color150.mat')['colors'] names = {} diff --git a/train.py b/train.py index 7f8a7562..cfe3b3ee 100644 --- a/train.py +++ b/train.py @@ -9,11 +9,11 @@ import torch import torch.nn as nn # Our libs -from config import cfg -from dataset import TrainDataset -from models import ModelBuilder, SegmentationModule -from utils import AverageMeter, parse_devices, setup_logger -from lib.nn import UserScatteredDataParallel, user_scattered_collate, patch_replication_callback +from mit_semseg.config import cfg +from mit_semseg.dataset import TrainDataset +from mit_semseg.models import ModelBuilder, SegmentationModule +from mit_semseg.utils import AverageMeter, parse_devices, setup_logger +from mit_semseg.lib.nn import UserScatteredDataParallel, user_scattered_collate, patch_replication_callback # train one epoch