From 2610aeb764667c3bad3a4b3c988be50005640456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 18:07:50 -0500 Subject: [PATCH 01/26] Add general setup.py + package distribution file tree --- MANIFEST.in | 6 ++++ setup.cfg | 2 ++ setup.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ setupbase.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+) create mode 100644 MANIFEST.in create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 setupbase.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..3e06744e --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,6 @@ +include CHANGELOG.md +include CONTRIBUTORS.md +include LICENSE.txt +include README.rst +include setupbase.py +recursive-include detectron_pytorch/ *.cu *.c *.so *.a *.yml *.yaml diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..9553c5f3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[aliases] +install = build_static install diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..09894f6b --- /dev/null +++ b/setup.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# ----------------------------------------------------------------------------- +# Copyright (c) Edgar Andrés Margffoy-Tuay +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) +# ----------------------------------------------------------------------------- +"""Setup script for detectron_pytorch.""" + +# Standard library imports +import ast +import os +import os.path as osp +import sys + +# Third party imports +from setuptools import find_packages, setup + +from setupbase import (BuildStatic, CleanComponents, COMPONENTS, HERE, + SdistWithBuildStatic) + + +def get_version(module='detectron_pytorch'): + """Get version.""" + with open(os.path.join(HERE, module, '__init__.py'), 'r') as f: + data = f.read() + lines = data.split('\n') + for line in lines: + if line.startswith('VERSION_INFO'): + version_tuple = ast.literal_eval(line.split('=')[-1].strip()) + version = '.'.join(map(str, version_tuple)) + break + return version + + +def get_description(): + """Get long description.""" + with open(os.path.join(HERE, 'README.rst'), 'r') as f: + data = f.read() + return data + + +REQUIREMENTS = ['pytorch', 'torchvision', 'cython', + 'matplotlib', 'numpy', 'scipy', 'opencv-python', + 'pyyaml', 'packaging', 'pycocotools'] + +cmdclass = { + 'build_static': BuildStatic, + 'sdist': SdistWithBuildStatic, + 'clean_components': CleanComponents +} + + +setup( + name='Detectron-pytorch', + version=get_version(), + cmdclass=cmdclass, + keywords=['Detectron', 'PyTorch'], + url='https://github.com/roytseng-tw/Detectron.pytorch', + license='MIT', + author='Roy Tseng', + # author_email='admin@spyder-ide.org', + description='A pytorch implementation of Detectron. Both training from ' + 'scratch and inferring directly from pretrained Detectron ' + 'weights are available. ', + long_description=get_description(), + packages=find_packages(exclude=['contrib', 'docs', 'tests*']), + install_requires=REQUIREMENTS, + include_package_data=True, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: MIT License', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6' + ]) diff --git a/setupbase.py b/setupbase.py new file mode 100644 index 00000000..56703239 --- /dev/null +++ b/setupbase.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# ----------------------------------------------------------------------------- +# Copyright (c) Spyder Project Contributors +# Copyright (c) 2015-, Jupyter Development Team. +# Copyright (c) 2008-2015, IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# ----------------------------------------------------------------------------- + +""" +General setup rules to build CUDA wrappers. +Some functions were taken from the Jupyter Notebook +setupbase definition +See: https://github.com/jupyter/notebook/blob/master/setupbase.py +""" + +import os +import os.path as osp +import pipes +import shutil +import sys + +from distutils import log +from distutils.core import Command +from setuptools.command.develop import develop +from setuptools.command.sdist import sdist +from subprocess import check_call + +if sys.platform == 'win32': + from subprocess import list2cmdline +else: + def list2cmdline(cmd_list): + return ' '.join(map(pipes.quote, cmd_list)) + + +HERE = os.path.abspath(os.path.dirname(__file__)) + +repo_root = os.path.dirname(os.path.abspath(__file__)) + + +def run(cmd, *args, **kwargs): + """Echo a command before running it""" + log.info('> ' + list2cmdline(cmd)) + kwargs['shell'] = (sys.platform == 'win32') + return check_call(cmd, *args, **kwargs) + + +class BuildStatic(Command): + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + log.info("running [bash lib/make.sh]") + run(['bash', 'lib/make.sh'], cwd=repo_root) + + +class DevelopWithBuildStatic(develop): + def install_for_development(self): + self.run_command('build_static') + return develop.install_for_development(self) + + +class SdistWithBuildStatic(sdist): + def run(self): + self.run_command('build_static') + sdist.run(self) + + def make_distribution(self): + return sdist.make_distribution(self) From d0f70b9b1ead120127bdaf5e11fc89c23f3574e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 18:54:20 -0500 Subject: [PATCH 02/26] Update import names --- .pylintrc | 1 - MANIFEST.in | 2 +- detectron_pytorch/__init__.py | 13 +++++++ .../configs}/__init__.py | 0 .../e2e_faster_rcnn_R-101-FPN_1x.yaml | 0 .../e2e_faster_rcnn_R-101-FPN_2x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-C4_1x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-C4_2x.yaml | 0 .../e2e_faster_rcnn_R-50-FPN_1x.yaml | 0 .../e2e_faster_rcnn_R-50-FPN_2x.yaml | 0 .../e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml | 0 .../e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml | 0 .../e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml | 0 .../e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml | 0 .../e2e_keypoint_rcnn_R-101-FPN_1x.yaml | 0 .../e2e_keypoint_rcnn_R-101-FPN_s1x.yaml | 0 .../e2e_keypoint_rcnn_R-50-FPN_1x.yaml | 0 .../e2e_keypoint_rcnn_R-50-FPN_s1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml | 0 ...e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml | 0 ...e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-C4_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-C4_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-C4_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml | 0 .../e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml | 0 .../e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml | 0 .../e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml | 0 .../e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml | 0 ..._mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml | 0 ...utorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 ...utorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 ...utorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 ...utorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 .../e2e_mask_rcnn_R-101-FPN_2x_gn.yaml | 0 .../e2e_mask_rcnn_R-101-FPN_3x_gn.yaml | 0 .../e2e_mask_rcnn_R-50-FPN_2x_gn.yaml | 0 .../e2e_mask_rcnn_R-50-FPN_3x_gn.yaml | 0 ...scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml | 0 .../scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml | 0 .../core}/__init__.py | 0 {lib => detectron_pytorch}/core/config.py | 4 +-- {lib => detectron_pytorch}/core/test.py | 0 .../core/test_engine.py | 32 +++++++++--------- .../VOCdevkit-matlab-wrapper/get_voc_opts.m | 0 .../VOCdevkit-matlab-wrapper/voc_eval.m | 0 .../VOCdevkit-matlab-wrapper/xVOCap.m | 0 .../datasets}/__init__.py | 0 .../datasets/cityscapes}/__init__.py | 0 .../cityscapes/coco_to_cityscapes_id.py | 0 .../tools/convert_cityscapes_to_coco.py | 4 +-- .../tools/convert_coco_model_to_cityscapes.py | 2 +- .../cityscapes_json_dataset_evaluator.py | 6 ++-- .../datasets/dataset_catalog.py | 2 +- .../datasets/dummy_datasets.py | 2 +- .../datasets/json_dataset.py | 6 ++-- .../datasets/json_dataset_evaluator.py | 6 ++-- {lib => detectron_pytorch}/datasets/roidb.py | 10 +++--- .../datasets/task_evaluation.py | 10 +++--- .../datasets/voc_dataset_evaluator.py | 10 +++--- .../datasets/voc_eval.py | 0 {lib => detectron_pytorch}/make.sh | 0 .../model}/__init__.py | 0 .../model/nms/.gitignore | 0 .../model/nms}/__init__.py | 0 .../model/nms/_ext}/__init__.py | 0 .../model/nms/_ext/nms/__init__.py | 0 {lib => detectron_pytorch}/model/nms/build.py | 0 {lib => detectron_pytorch}/model/nms/make.sh | 0 .../model/nms/nms_gpu.py | 0 .../model/nms/nms_kernel.cu | 0 .../model/nms/nms_wrapper.py | 4 +-- .../model/nms/src/nms_cuda.h | 0 .../model/nms/src/nms_cuda_kernel.cu | 0 .../model/nms/src/nms_cuda_kernel.h | 0 .../model/roi_align}/__init__.py | 0 .../model/roi_align/_ext}/__init__.py | 0 .../roi_align/_ext/roi_align/__init__.py | 0 .../model/roi_align/build.py | 0 .../model/roi_align/functions}/__init__.py | 0 .../model/roi_align/functions/roi_align.py | 0 .../model/roi_align/make.sh | 2 +- .../model/roi_align/modules}/__init__.py | 0 .../model/roi_align/modules/roi_align.py | 0 .../model/roi_align/src/roi_align_cuda.c | 0 .../model/roi_align/src/roi_align_cuda.h | 0 .../model/roi_align/src/roi_align_kernel.cu | 0 .../model/roi_align/src/roi_align_kernel.h | 0 .../model/roi_crop}/__init__.py | 0 .../model/roi_crop/_ext}/__init__.py | 0 .../roi_crop/_ext/crop_resize/__init__.py | 0 .../model/roi_crop/_ext/roi_crop/__init__.py | 0 .../model/roi_crop/build.py | 0 .../model/roi_crop/functions}/__init__.py | 0 .../model/roi_crop/functions/crop_resize.py | 0 .../model/roi_crop/functions/gridgen.py | 0 .../model/roi_crop/functions/roi_crop.py | 0 .../model/roi_crop/make.sh | 0 .../model/roi_crop/modules}/__init__.py | 0 .../model/roi_crop/modules/gridgen.py | 0 .../model/roi_crop/modules/roi_crop.py | 0 .../model/roi_crop/src/roi_crop.c | 0 .../model/roi_crop/src/roi_crop.h | 0 .../model/roi_crop/src/roi_crop_cuda.c | 0 .../model/roi_crop/src/roi_crop_cuda.h | 0 .../roi_crop/src/roi_crop_cuda_kernel.cu | 0 .../model/roi_crop/src/roi_crop_cuda_kernel.h | 0 .../model/roi_pooling}/__init__.py | 0 .../model/roi_pooling/_ext}/__init__.py | 0 .../roi_pooling/_ext/roi_pooling/__init__.py | 0 .../model/roi_pooling/build.py | 0 .../model/roi_pooling/functions}/__init__.py | 0 .../model/roi_pooling/functions/roi_pool.py | 0 .../model/roi_pooling/modules}/__init__.py | 0 .../model/roi_pooling/modules/roi_pool.py | 0 .../model/roi_pooling/src/roi_pooling.c | 0 .../model/roi_pooling/src/roi_pooling.h | 0 .../model/roi_pooling/src/roi_pooling_cuda.c | 0 .../model/roi_pooling/src/roi_pooling_cuda.h | 0 .../roi_pooling/src/roi_pooling_kernel.cu | 0 .../roi_pooling/src/roi_pooling_kernel.h | 0 .../model/utils/.gitignore | 0 .../model/utils}/__init__.py | 0 .../model/utils/net_utils.py | 12 +++---- {lib => detectron_pytorch}/modeling/FPN.py | 14 ++++---- {lib => detectron_pytorch}/modeling/ResNet.py | 8 ++--- .../modeling}/__init__.py | 0 ...ollect_and_distribute_fpn_rpn_proposals.py | 10 +++--- .../modeling/fast_rcnn_heads.py | 6 ++-- .../modeling/generate_anchors.py | 0 .../modeling/generate_proposal_labels.py | 8 ++--- .../modeling/generate_proposals.py | 6 ++-- .../modeling/keypoint_rcnn_heads.py | 4 +-- .../modeling/mask_rcnn_heads.py | 8 ++--- .../modeling/model_builder.py | 22 ++++++------ .../modeling/roi_xfrom}/__init__.py | 0 .../modeling/roi_xfrom/roi_align}/__init__.py | 0 .../roi_xfrom/roi_align/_ext}/__init__.py | 0 .../roi_align/_ext/roi_align/__init__.py | 0 .../modeling/roi_xfrom/roi_align/build.py | 0 .../roi_align/functions}/__init__.py | 0 .../roi_align/functions/roi_align.py | 0 .../modeling/roi_xfrom/roi_align/make.sh | 2 +- .../roi_xfrom/roi_align/modules}/__init__.py | 0 .../roi_xfrom/roi_align/modules/roi_align.py | 0 .../roi_xfrom/roi_align/src/roi_align_cuda.c | 0 .../roi_xfrom/roi_align/src/roi_align_cuda.h | 0 .../roi_align/src/roi_align_kernel.cu | 0 .../roi_align/src/roi_align_kernel.h | 0 .../modeling/rpn_heads.py | 12 +++---- {lib => detectron_pytorch}/nn/__init__.py | 0 {lib => detectron_pytorch}/nn/functional.py | 0 {lib => detectron_pytorch}/nn/init.py | 0 .../nn/modules/__init__.py | 0 .../nn/modules/affine.py | 0 .../nn/modules/normalization.py | 0 .../nn/modules/upsample.py | 0 .../nn/parallel/__init__.py | 0 .../nn/parallel/_functions.py | 0 .../nn/parallel/data_parallel.py | 0 .../nn/parallel/parallel_apply.py | 0 .../nn/parallel/replicate.py | 0 .../nn/parallel/scatter_gather.py | 0 .../roi_data}/__init__.py | 0 .../roi_data/data_utils.py | 6 ++-- .../roi_data/fast_rcnn.py | 12 +++---- .../roi_data/keypoint_rcnn.py | 6 ++-- {lib => detectron_pytorch}/roi_data/loader.py | 8 ++--- .../roi_data/mask_rcnn.py | 8 ++--- .../roi_data/minibatch.py | 6 ++-- {lib => detectron_pytorch}/roi_data/rpn.py | 8 ++--- {lib => detectron_pytorch}/setup.py | 0 detectron_pytorch/tools/__init__.py | 0 .../tools}/download_imagenet_weights.py | 4 +-- .../tools}/infer_simple.py | 22 ++++++------ .../tools}/test_net.py | 6 ++-- .../tools}/train_net.py | 25 +++++++------- .../tools}/train_net_step.py | 26 +++++++------- detectron_pytorch/utils/__init__.py | 0 {lib => detectron_pytorch}/utils/blob.py | 2 +- {lib => detectron_pytorch}/utils/boxes.py | 8 +++-- .../utils/collections.py | 0 {lib => detectron_pytorch}/utils/colormap.py | 0 .../utils/cython_bbox.c | 0 .../utils/cython_bbox.pyx | 0 {lib => detectron_pytorch}/utils/cython_nms.c | 0 .../utils/cython_nms.pyx | 0 .../utils/detectron_weight_helper.py | 0 {lib => detectron_pytorch}/utils/env.py | 0 {lib => detectron_pytorch}/utils/fpn.py | 5 +-- {lib => detectron_pytorch}/utils/image.py | 0 {lib => detectron_pytorch}/utils/io.py | 0 {lib => detectron_pytorch}/utils/keypoints.py | 5 +-- {lib => detectron_pytorch}/utils/logging.py | 0 {lib => detectron_pytorch}/utils/misc.py | 2 +- {lib => detectron_pytorch}/utils/net.py | 4 +-- .../utils/resnet_weights_helper.py | 7 ++-- {lib => detectron_pytorch}/utils/segms.py | 0 .../utils/subprocess.py | 2 +- {lib => detectron_pytorch}/utils/timer.py | 0 .../utils/training_stats.py | 10 +++--- {lib => detectron_pytorch}/utils/vis.py | 4 +-- lib/model/nms/src/nms_cuda.c | 19 ----------- .../roi_crop/_ext/crop_resize/_crop_resize.so | Bin 159103 -> 0 bytes setupbase.py | 4 +-- tools/_init_paths.py | 22 ------------ 210 files changed, 219 insertions(+), 240 deletions(-) create mode 100644 detectron_pytorch/__init__.py rename {lib/core => detectron_pytorch/configs}/__init__.py (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml (100%) rename {configs => detectron_pytorch/configs}/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml (100%) rename {configs => detectron_pytorch/configs}/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {configs => detectron_pytorch/configs}/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {configs => detectron_pytorch/configs}/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {configs => detectron_pytorch/configs}/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml (100%) rename {configs => detectron_pytorch/configs}/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml (100%) rename {lib/datasets => detectron_pytorch/core}/__init__.py (100%) rename {lib => detectron_pytorch}/core/config.py (99%) rename {lib => detectron_pytorch}/core/test.py (100%) rename {lib => detectron_pytorch}/core/test_engine.py (93%) rename {lib => detectron_pytorch}/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m (100%) rename {lib => detectron_pytorch}/datasets/VOCdevkit-matlab-wrapper/voc_eval.m (100%) rename {lib => detectron_pytorch}/datasets/VOCdevkit-matlab-wrapper/xVOCap.m (100%) rename {lib/datasets/cityscapes => detectron_pytorch/datasets}/__init__.py (100%) rename {lib/model => detectron_pytorch/datasets/cityscapes}/__init__.py (100%) rename {lib => detectron_pytorch}/datasets/cityscapes/coco_to_cityscapes_id.py (100%) rename {lib => detectron_pytorch}/datasets/cityscapes/tools/convert_cityscapes_to_coco.py (98%) rename {lib => detectron_pytorch}/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py (98%) rename {lib => detectron_pytorch}/datasets/cityscapes_json_dataset_evaluator.py (94%) rename {lib => detectron_pytorch}/datasets/dataset_catalog.py (99%) rename {lib => detectron_pytorch}/datasets/dummy_datasets.py (97%) rename {lib => detectron_pytorch}/datasets/json_dataset.py (99%) rename {lib => detectron_pytorch}/datasets/json_dataset_evaluator.py (99%) rename {lib => detectron_pytorch}/datasets/roidb.py (97%) rename {lib => detectron_pytorch}/datasets/task_evaluation.py (97%) rename {lib => detectron_pytorch}/datasets/voc_dataset_evaluator.py (96%) rename {lib => detectron_pytorch}/datasets/voc_eval.py (100%) rename {lib => detectron_pytorch}/make.sh (100%) rename {lib/model/nms => detectron_pytorch/model}/__init__.py (100%) rename {lib => detectron_pytorch}/model/nms/.gitignore (100%) rename {lib/model/nms/_ext => detectron_pytorch/model/nms}/__init__.py (100%) rename {lib/model/roi_align => detectron_pytorch/model/nms/_ext}/__init__.py (100%) rename {lib => detectron_pytorch}/model/nms/_ext/nms/__init__.py (100%) rename {lib => detectron_pytorch}/model/nms/build.py (100%) rename {lib => detectron_pytorch}/model/nms/make.sh (100%) rename {lib => detectron_pytorch}/model/nms/nms_gpu.py (100%) rename {lib => detectron_pytorch}/model/nms/nms_kernel.cu (100%) rename {lib => detectron_pytorch}/model/nms/nms_wrapper.py (84%) rename {lib => detectron_pytorch}/model/nms/src/nms_cuda.h (100%) rename {lib => detectron_pytorch}/model/nms/src/nms_cuda_kernel.cu (100%) rename {lib => detectron_pytorch}/model/nms/src/nms_cuda_kernel.h (100%) rename {lib/model/roi_align/_ext => detectron_pytorch/model/roi_align}/__init__.py (100%) rename {lib/model/roi_align/functions => detectron_pytorch/model/roi_align/_ext}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_align/_ext/roi_align/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_align/build.py (100%) rename {lib/model/roi_align/modules => detectron_pytorch/model/roi_align/functions}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_align/functions/roi_align.py (100%) rename {lib => detectron_pytorch}/model/roi_align/make.sh (86%) rename {lib/model/roi_crop => detectron_pytorch/model/roi_align/modules}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_align/modules/roi_align.py (100%) rename {lib => detectron_pytorch}/model/roi_align/src/roi_align_cuda.c (100%) rename {lib => detectron_pytorch}/model/roi_align/src/roi_align_cuda.h (100%) rename {lib => detectron_pytorch}/model/roi_align/src/roi_align_kernel.cu (100%) rename {lib => detectron_pytorch}/model/roi_align/src/roi_align_kernel.h (100%) rename {lib/model/roi_crop/_ext => detectron_pytorch/model/roi_crop}/__init__.py (100%) rename {lib/model/roi_crop/functions => detectron_pytorch/model/roi_crop/_ext}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/_ext/crop_resize/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/_ext/roi_crop/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/build.py (100%) rename {lib/model/roi_crop/modules => detectron_pytorch/model/roi_crop/functions}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/functions/crop_resize.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/functions/gridgen.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/functions/roi_crop.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/make.sh (100%) rename {lib/model/roi_pooling => detectron_pytorch/model/roi_crop/modules}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/modules/gridgen.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/modules/roi_crop.py (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop.c (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop.h (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop_cuda.c (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop_cuda.h (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop_cuda_kernel.cu (100%) rename {lib => detectron_pytorch}/model/roi_crop/src/roi_crop_cuda_kernel.h (100%) rename {lib/model/roi_pooling/_ext => detectron_pytorch/model/roi_pooling}/__init__.py (100%) rename {lib/model/roi_pooling/functions => detectron_pytorch/model/roi_pooling/_ext}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_pooling/_ext/roi_pooling/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_pooling/build.py (100%) rename {lib/model/roi_pooling/modules => detectron_pytorch/model/roi_pooling/functions}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_pooling/functions/roi_pool.py (100%) rename {lib/model/utils => detectron_pytorch/model/roi_pooling/modules}/__init__.py (100%) rename {lib => detectron_pytorch}/model/roi_pooling/modules/roi_pool.py (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling.c (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling.h (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling_cuda.c (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling_cuda.h (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling_kernel.cu (100%) rename {lib => detectron_pytorch}/model/roi_pooling/src/roi_pooling_kernel.h (100%) rename {lib => detectron_pytorch}/model/utils/.gitignore (100%) rename {lib/modeling => detectron_pytorch/model/utils}/__init__.py (100%) rename {lib => detectron_pytorch}/model/utils/net_utils.py (96%) rename {lib => detectron_pytorch}/modeling/FPN.py (97%) rename {lib => detectron_pytorch}/modeling/ResNet.py (98%) rename {lib/modeling/roi_xfrom => detectron_pytorch/modeling}/__init__.py (100%) rename {lib => detectron_pytorch}/modeling/collect_and_distribute_fpn_rpn_proposals.py (95%) rename {lib => detectron_pytorch}/modeling/fast_rcnn_heads.py (98%) rename {lib => detectron_pytorch}/modeling/generate_anchors.py (100%) rename {lib => detectron_pytorch}/modeling/generate_proposal_labels.py (85%) rename {lib => detectron_pytorch}/modeling/generate_proposals.py (98%) rename {lib => detectron_pytorch}/modeling/keypoint_rcnn_heads.py (98%) rename {lib => detectron_pytorch}/modeling/mask_rcnn_heads.py (98%) rename {lib => detectron_pytorch}/modeling/model_builder.py (95%) rename {lib/modeling/roi_xfrom/roi_align => detectron_pytorch/modeling/roi_xfrom}/__init__.py (100%) rename {lib/modeling/roi_xfrom/roi_align/_ext => detectron_pytorch/modeling/roi_xfrom/roi_align}/__init__.py (100%) rename {lib/modeling/roi_xfrom/roi_align/functions => detectron_pytorch/modeling/roi_xfrom/roi_align/_ext}/__init__.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/_ext/roi_align/__init__.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/build.py (100%) rename {lib/modeling/roi_xfrom/roi_align/modules => detectron_pytorch/modeling/roi_xfrom/roi_align/functions}/__init__.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/functions/roi_align.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/make.sh (86%) rename {lib/roi_data => detectron_pytorch/modeling/roi_xfrom/roi_align/modules}/__init__.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/modules/roi_align.py (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/src/roi_align_cuda.c (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/src/roi_align_cuda.h (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/src/roi_align_kernel.cu (100%) rename {lib => detectron_pytorch}/modeling/roi_xfrom/roi_align/src/roi_align_kernel.h (100%) rename {lib => detectron_pytorch}/modeling/rpn_heads.py (94%) rename {lib => detectron_pytorch}/nn/__init__.py (100%) rename {lib => detectron_pytorch}/nn/functional.py (100%) rename {lib => detectron_pytorch}/nn/init.py (100%) rename {lib => detectron_pytorch}/nn/modules/__init__.py (100%) rename {lib => detectron_pytorch}/nn/modules/affine.py (100%) rename {lib => detectron_pytorch}/nn/modules/normalization.py (100%) rename {lib => detectron_pytorch}/nn/modules/upsample.py (100%) rename {lib => detectron_pytorch}/nn/parallel/__init__.py (100%) rename {lib => detectron_pytorch}/nn/parallel/_functions.py (100%) rename {lib => detectron_pytorch}/nn/parallel/data_parallel.py (100%) rename {lib => detectron_pytorch}/nn/parallel/parallel_apply.py (100%) rename {lib => detectron_pytorch}/nn/parallel/replicate.py (100%) rename {lib => detectron_pytorch}/nn/parallel/scatter_gather.py (100%) rename {lib/utils => detectron_pytorch/roi_data}/__init__.py (100%) rename {lib => detectron_pytorch}/roi_data/data_utils.py (96%) rename {lib => detectron_pytorch}/roi_data/fast_rcnn.py (97%) rename {lib => detectron_pytorch}/roi_data/keypoint_rcnn.py (96%) rename {lib => detectron_pytorch}/roi_data/loader.py (98%) rename {lib => detectron_pytorch}/roi_data/mask_rcnn.py (96%) rename {lib => detectron_pytorch}/roi_data/minibatch.py (95%) rename {lib => detectron_pytorch}/roi_data/rpn.py (98%) rename {lib => detectron_pytorch}/setup.py (100%) create mode 100644 detectron_pytorch/tools/__init__.py rename {tools => detectron_pytorch/tools}/download_imagenet_weights.py (96%) rename {tools => detectron_pytorch/tools}/infer_simple.py (89%) rename {tools => detectron_pytorch/tools}/test_net.py (94%) rename {tools => detectron_pytorch/tools}/train_net.py (94%) rename {tools => detectron_pytorch/tools}/train_net_step.py (95%) create mode 100644 detectron_pytorch/utils/__init__.py rename {lib => detectron_pytorch}/utils/blob.py (99%) rename {lib => detectron_pytorch}/utils/boxes.py (98%) rename {lib => detectron_pytorch}/utils/collections.py (100%) rename {lib => detectron_pytorch}/utils/colormap.py (100%) rename {lib => detectron_pytorch}/utils/cython_bbox.c (100%) rename {lib => detectron_pytorch}/utils/cython_bbox.pyx (100%) rename {lib => detectron_pytorch}/utils/cython_nms.c (100%) rename {lib => detectron_pytorch}/utils/cython_nms.pyx (100%) rename {lib => detectron_pytorch}/utils/detectron_weight_helper.py (100%) rename {lib => detectron_pytorch}/utils/env.py (100%) rename {lib => detectron_pytorch}/utils/fpn.py (96%) rename {lib => detectron_pytorch}/utils/image.py (100%) rename {lib => detectron_pytorch}/utils/io.py (100%) rename {lib => detectron_pytorch}/utils/keypoints.py (98%) rename {lib => detectron_pytorch}/utils/logging.py (100%) rename {lib => detectron_pytorch}/utils/misc.py (99%) rename {lib => detectron_pytorch}/utils/net.py (98%) rename {lib => detectron_pytorch}/utils/resnet_weights_helper.py (94%) rename {lib => detectron_pytorch}/utils/segms.py (100%) rename {lib => detectron_pytorch}/utils/subprocess.py (99%) rename {lib => detectron_pytorch}/utils/timer.py (100%) rename {lib => detectron_pytorch}/utils/training_stats.py (97%) rename {lib => detectron_pytorch}/utils/vis.py (98%) delete mode 100644 lib/model/nms/src/nms_cuda.c delete mode 100755 lib/model/roi_crop/_ext/crop_resize/_crop_resize.so delete mode 100644 tools/_init_paths.py diff --git a/.pylintrc b/.pylintrc index 50c7898e..14c035b8 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,6 +1,5 @@ [MASTER] extension-pkg-whitelist=numpy,torch,cv2 -init-hook="sys.path.insert(0, './tools'); import _init_paths" [MESSAGES CONTROL] disable=wrong-import-position diff --git a/MANIFEST.in b/MANIFEST.in index 3e06744e..8e436af4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,4 +3,4 @@ include CONTRIBUTORS.md include LICENSE.txt include README.rst include setupbase.py -recursive-include detectron_pytorch/ *.cu *.c *.so *.a *.yml *.yaml +recursive-include detectron_pytorch/ *.cu *.c *.cpp *.h *.o *.so *.a *.yml *.yaml *.pyx diff --git a/detectron_pytorch/__init__.py b/detectron_pytorch/__init__.py new file mode 100644 index 00000000..8f419d4a --- /dev/null +++ b/detectron_pytorch/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# ----------------------------------------------------------------------------- +# Copyright (c) Roy Tseng +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) +# ----------------------------------------------------------------------------- +"""Detectron PyTorch""" + +from .lib import * + +VERSION_INFO = (0, 1, 0, 'dev0') +__version__ = '.'.join(map(str, VERSION_INFO)) diff --git a/lib/core/__init__.py b/detectron_pytorch/configs/__init__.py similarity index 100% rename from lib/core/__init__.py rename to detectron_pytorch/configs/__init__.py diff --git a/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml b/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml similarity index 100% rename from configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml rename to detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml diff --git a/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml b/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml similarity index 100% rename from configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml rename to detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml diff --git a/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml b/detectron_pytorch/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to detectron_pytorch/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml b/detectron_pytorch/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to detectron_pytorch/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml b/detectron_pytorch/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to detectron_pytorch/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml b/detectron_pytorch/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to detectron_pytorch/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml b/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml similarity index 100% rename from configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml diff --git a/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml b/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml similarity index 100% rename from configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml diff --git a/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml b/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml similarity index 100% rename from configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml diff --git a/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml b/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml similarity index 100% rename from configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml diff --git a/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml b/detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml similarity index 100% rename from configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml diff --git a/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml b/detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml similarity index 100% rename from configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml rename to detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml diff --git a/lib/datasets/__init__.py b/detectron_pytorch/core/__init__.py similarity index 100% rename from lib/datasets/__init__.py rename to detectron_pytorch/core/__init__.py diff --git a/lib/core/config.py b/detectron_pytorch/core/config.py similarity index 99% rename from lib/core/config.py rename to detectron_pytorch/core/config.py index 3375ae22..4774e394 100644 --- a/lib/core/config.py +++ b/detectron_pytorch/core/config.py @@ -16,8 +16,8 @@ from torch.nn import init import yaml -import nn as mynn -from utils.collections import AttrDict +import detectron_pytorch.nn as mynn +from detectron_pytorch.utils.collections import AttrDict __C = AttrDict() # Consumers can get config by: diff --git a/lib/core/test.py b/detectron_pytorch/core/test.py similarity index 100% rename from lib/core/test.py rename to detectron_pytorch/core/test.py diff --git a/lib/core/test_engine.py b/detectron_pytorch/core/test_engine.py similarity index 93% rename from lib/core/test_engine.py rename to detectron_pytorch/core/test_engine.py index 02dedf6f..b90aa6be 100644 --- a/lib/core/test_engine.py +++ b/detectron_pytorch/core/test_engine.py @@ -20,7 +20,7 @@ from __future__ import print_function from __future__ import unicode_literals -from collections import defaultdict +from detectron_pytorch.collections import defaultdict import cv2 import datetime import logging @@ -30,21 +30,21 @@ import torch -from core.config import cfg -# from core.rpn_generator import generate_rpn_on_dataset #TODO: for rpn only case -# from core.rpn_generator import generate_rpn_on_range -from core.test import im_detect_all -from datasets import task_evaluation -from datasets.json_dataset import JsonDataset -from modeling import model_builder -import nn as mynn -from utils.detectron_weight_helper import load_detectron_weight -import utils.env as envu -import utils.net as net_utils -import utils.subprocess as subprocess_utils -import utils.vis as vis_utils -from utils.io import save_object -from utils.timer import Timer +from detectron_pytorch.core.config import cfg +# from detectron_pytorch.core.rpn_generator import generate_rpn_on_dataset #TODO: for rpn only case +# from detectron_pytorch.core.rpn_generator import generate_rpn_on_range +from detectron_pytorch.core.test import im_detect_all +from detectron_pytorch.datasets import task_evaluation +from detectron_pytorch.datasets.json_dataset import JsonDataset +from detectron_pytorch.modeling import model_builder +import detectron_pytorch.nn as mynn +from detectron_pytorch.utils.detectron_weight_helper import load_detectron_weight +import detectron_pytorch.utils.env as envu +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.utils.subprocess as subprocess_utils +import detectron_pytorch.utils.vis as vis_utils +from detectron_pytorch.utils.io import save_object +from detectron_pytorch.utils.timer import Timer logger = logging.getLogger(__name__) diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m b/detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m rename to detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m b/detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/voc_eval.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m rename to detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/voc_eval.m diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m b/detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/xVOCap.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m rename to detectron_pytorch/datasets/VOCdevkit-matlab-wrapper/xVOCap.m diff --git a/lib/datasets/cityscapes/__init__.py b/detectron_pytorch/datasets/__init__.py similarity index 100% rename from lib/datasets/cityscapes/__init__.py rename to detectron_pytorch/datasets/__init__.py diff --git a/lib/model/__init__.py b/detectron_pytorch/datasets/cityscapes/__init__.py similarity index 100% rename from lib/model/__init__.py rename to detectron_pytorch/datasets/cityscapes/__init__.py diff --git a/lib/datasets/cityscapes/coco_to_cityscapes_id.py b/detectron_pytorch/datasets/cityscapes/coco_to_cityscapes_id.py similarity index 100% rename from lib/datasets/cityscapes/coco_to_cityscapes_id.py rename to detectron_pytorch/datasets/cityscapes/coco_to_cityscapes_id.py diff --git a/lib/datasets/cityscapes/tools/convert_cityscapes_to_coco.py b/detectron_pytorch/datasets/cityscapes/tools/convert_cityscapes_to_coco.py similarity index 98% rename from lib/datasets/cityscapes/tools/convert_cityscapes_to_coco.py rename to detectron_pytorch/datasets/cityscapes/tools/convert_cityscapes_to_coco.py index 1a3d6bf2..50bff0e7 100644 --- a/lib/datasets/cityscapes/tools/convert_cityscapes_to_coco.py +++ b/detectron_pytorch/datasets/cityscapes/tools/convert_cityscapes_to_coco.py @@ -12,8 +12,8 @@ import cityscapesscripts.evaluation.instances2dict_with_polygons as cs -import utils.segms as segms_util -import utils.boxes as bboxs_util +import detectron_pytorch.utils.segms as segms_util +import detectron_pytorch.utils.boxes as bboxs_util def parse_args(): diff --git a/lib/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py b/detectron_pytorch/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py similarity index 98% rename from lib/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py rename to detectron_pytorch/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py index 1bdc9a42..730fb604 100644 --- a/lib/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py +++ b/detectron_pytorch/datasets/cityscapes/tools/convert_coco_model_to_cityscapes.py @@ -14,7 +14,7 @@ import sys import numpy as np -import datasets.cityscapes.coco_to_cityscapes_id as cs +import detectron_pytorch.datasets.cityscapes.coco_to_cityscapes_id as cs NUM_CS_CLS = 9 NUM_COCO_CLS = 81 diff --git a/lib/datasets/cityscapes_json_dataset_evaluator.py b/detectron_pytorch/datasets/cityscapes_json_dataset_evaluator.py similarity index 94% rename from lib/datasets/cityscapes_json_dataset_evaluator.py rename to detectron_pytorch/datasets/cityscapes_json_dataset_evaluator.py index 33188331..3f3959c3 100644 --- a/lib/datasets/cityscapes_json_dataset_evaluator.py +++ b/detectron_pytorch/datasets/cityscapes_json_dataset_evaluator.py @@ -27,9 +27,9 @@ import pycocotools.mask as mask_util -from core.config import cfg -from datasets.dataset_catalog import DATASETS -from datasets.dataset_catalog import RAW_DIR +from detectron_pytorch.core.config import cfg +from detectron_pytorch.datasets.dataset_catalog import DATASETS +from detectron_pytorch.datasets.dataset_catalog import RAW_DIR logger = logging.getLogger(__name__) diff --git a/lib/datasets/dataset_catalog.py b/detectron_pytorch/datasets/dataset_catalog.py similarity index 99% rename from lib/datasets/dataset_catalog.py rename to detectron_pytorch/datasets/dataset_catalog.py index 18cef3ec..9e146603 100644 --- a/lib/datasets/dataset_catalog.py +++ b/detectron_pytorch/datasets/dataset_catalog.py @@ -22,7 +22,7 @@ import os -from core.config import cfg +from detectron_pytorch.core.config import cfg # Path to data dir _DATA_DIR = cfg.DATA_DIR diff --git a/lib/datasets/dummy_datasets.py b/detectron_pytorch/datasets/dummy_datasets.py similarity index 97% rename from lib/datasets/dummy_datasets.py rename to detectron_pytorch/datasets/dummy_datasets.py index 5d7e6cfa..bc1956bd 100644 --- a/lib/datasets/dummy_datasets.py +++ b/detectron_pytorch/datasets/dummy_datasets.py @@ -22,7 +22,7 @@ from __future__ import print_function from __future__ import unicode_literals -from utils.collections import AttrDict +from detectron_pytorch.utils.collections import AttrDict def get_coco_dataset(): diff --git a/lib/datasets/json_dataset.py b/detectron_pytorch/datasets/json_dataset.py similarity index 99% rename from lib/datasets/json_dataset.py rename to detectron_pytorch/datasets/json_dataset.py index b721d445..7e501200 100644 --- a/lib/datasets/json_dataset.py +++ b/detectron_pytorch/datasets/json_dataset.py @@ -39,9 +39,9 @@ from pycocotools import mask as COCOmask from pycocotools.coco import COCO -import utils.boxes as box_utils -from core.config import cfg -from utils.timer import Timer +import detectron_pytorch.utils.boxes as box_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.utils.timer import Timer from .dataset_catalog import ANN_FN from .dataset_catalog import DATASETS from .dataset_catalog import IM_DIR diff --git a/lib/datasets/json_dataset_evaluator.py b/detectron_pytorch/datasets/json_dataset_evaluator.py similarity index 99% rename from lib/datasets/json_dataset_evaluator.py rename to detectron_pytorch/datasets/json_dataset_evaluator.py index ba67517b..8f2cf830 100644 --- a/lib/datasets/json_dataset_evaluator.py +++ b/detectron_pytorch/datasets/json_dataset_evaluator.py @@ -28,9 +28,9 @@ from pycocotools.cocoeval import COCOeval -from core.config import cfg -from utils.io import save_object -import utils.boxes as box_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.utils.io import save_object +import detectron_pytorch.utils.boxes as box_utils logger = logging.getLogger(__name__) diff --git a/lib/datasets/roidb.py b/detectron_pytorch/datasets/roidb.py similarity index 97% rename from lib/datasets/roidb.py rename to detectron_pytorch/datasets/roidb.py index e1950f8a..d90e3e19 100644 --- a/lib/datasets/roidb.py +++ b/detectron_pytorch/datasets/roidb.py @@ -24,11 +24,11 @@ import logging import numpy as np -import utils.boxes as box_utils -import utils.keypoints as keypoint_utils -import utils.segms as segm_utils -import utils.blob as blob_utils -from core.config import cfg +import detectron_pytorch.utils.boxes as box_utils +import detectron_pytorch.utils.keypoints as keypoint_utils +import detectron_pytorch.utils.segms as segm_utils +import detectron_pytorch.utils.blob as blob_utils +from detectron_pytorch.core.config import cfg from .json_dataset import JsonDataset logger = logging.getLogger(__name__) diff --git a/lib/datasets/task_evaluation.py b/detectron_pytorch/datasets/task_evaluation.py similarity index 97% rename from lib/datasets/task_evaluation.py rename to detectron_pytorch/datasets/task_evaluation.py index 0d8f4496..866a8f0c 100644 --- a/lib/datasets/task_evaluation.py +++ b/detectron_pytorch/datasets/task_evaluation.py @@ -40,11 +40,11 @@ import os import pprint -from core.config import cfg -from utils.logging import send_email -import datasets.cityscapes_json_dataset_evaluator as cs_json_dataset_evaluator -import datasets.json_dataset_evaluator as json_dataset_evaluator -import datasets.voc_dataset_evaluator as voc_dataset_evaluator +from detectron_pytorch.core.config import cfg +from detectron_pytorch.utils.logging import send_email +import detectron_pytorch.datasets.cityscapes_json_dataset_evaluator as cs_json_dataset_evaluator +import detectron_pytorch.datasets.json_dataset_evaluator as json_dataset_evaluator +import detectron_pytorch.datasets.voc_dataset_evaluator as voc_dataset_evaluator logger = logging.getLogger(__name__) diff --git a/lib/datasets/voc_dataset_evaluator.py b/detectron_pytorch/datasets/voc_dataset_evaluator.py similarity index 96% rename from lib/datasets/voc_dataset_evaluator.py rename to detectron_pytorch/datasets/voc_dataset_evaluator.py index 2eae2a1f..ba851f15 100644 --- a/lib/datasets/voc_dataset_evaluator.py +++ b/detectron_pytorch/datasets/voc_dataset_evaluator.py @@ -26,11 +26,11 @@ import shutil import uuid -from core.config import cfg -from datasets.dataset_catalog import DATASETS -from datasets.dataset_catalog import DEVKIT_DIR -from datasets.voc_eval import voc_eval -from utils.io import save_object +from detectron_pytorch.core.config import cfg +from detectron_pytorch.datasets.dataset_catalog import DATASETS +from detectron_pytorch.datasets.dataset_catalog import DEVKIT_DIR +from detectron_pytorch.datasets.voc_eval import voc_eval +from detectron_pytorch.utils.io import save_object logger = logging.getLogger(__name__) diff --git a/lib/datasets/voc_eval.py b/detectron_pytorch/datasets/voc_eval.py similarity index 100% rename from lib/datasets/voc_eval.py rename to detectron_pytorch/datasets/voc_eval.py diff --git a/lib/make.sh b/detectron_pytorch/make.sh similarity index 100% rename from lib/make.sh rename to detectron_pytorch/make.sh diff --git a/lib/model/nms/__init__.py b/detectron_pytorch/model/__init__.py similarity index 100% rename from lib/model/nms/__init__.py rename to detectron_pytorch/model/__init__.py diff --git a/lib/model/nms/.gitignore b/detectron_pytorch/model/nms/.gitignore similarity index 100% rename from lib/model/nms/.gitignore rename to detectron_pytorch/model/nms/.gitignore diff --git a/lib/model/nms/_ext/__init__.py b/detectron_pytorch/model/nms/__init__.py similarity index 100% rename from lib/model/nms/_ext/__init__.py rename to detectron_pytorch/model/nms/__init__.py diff --git a/lib/model/roi_align/__init__.py b/detectron_pytorch/model/nms/_ext/__init__.py similarity index 100% rename from lib/model/roi_align/__init__.py rename to detectron_pytorch/model/nms/_ext/__init__.py diff --git a/lib/model/nms/_ext/nms/__init__.py b/detectron_pytorch/model/nms/_ext/nms/__init__.py similarity index 100% rename from lib/model/nms/_ext/nms/__init__.py rename to detectron_pytorch/model/nms/_ext/nms/__init__.py diff --git a/lib/model/nms/build.py b/detectron_pytorch/model/nms/build.py similarity index 100% rename from lib/model/nms/build.py rename to detectron_pytorch/model/nms/build.py diff --git a/lib/model/nms/make.sh b/detectron_pytorch/model/nms/make.sh similarity index 100% rename from lib/model/nms/make.sh rename to detectron_pytorch/model/nms/make.sh diff --git a/lib/model/nms/nms_gpu.py b/detectron_pytorch/model/nms/nms_gpu.py similarity index 100% rename from lib/model/nms/nms_gpu.py rename to detectron_pytorch/model/nms/nms_gpu.py diff --git a/lib/model/nms/nms_kernel.cu b/detectron_pytorch/model/nms/nms_kernel.cu similarity index 100% rename from lib/model/nms/nms_kernel.cu rename to detectron_pytorch/model/nms/nms_kernel.cu diff --git a/lib/model/nms/nms_wrapper.py b/detectron_pytorch/model/nms/nms_wrapper.py similarity index 84% rename from lib/model/nms/nms_wrapper.py rename to detectron_pytorch/model/nms/nms_wrapper.py index c9a39565..d7b8201c 100644 --- a/lib/model/nms/nms_wrapper.py +++ b/detectron_pytorch/model/nms/nms_wrapper.py @@ -5,8 +5,8 @@ # Written by Ross Girshick # -------------------------------------------------------- import torch -from core.config import cfg -from model.nms.nms_gpu import nms_gpu +from detectron_pytorch.core.config import cfg +from detectron_pytorch.model.nms.nms_gpu import nms_gpu def nms(dets, thresh, force_cpu=False): """Dispatch to either CPU or GPU NMS implementations.""" diff --git a/lib/model/nms/src/nms_cuda.h b/detectron_pytorch/model/nms/src/nms_cuda.h similarity index 100% rename from lib/model/nms/src/nms_cuda.h rename to detectron_pytorch/model/nms/src/nms_cuda.h diff --git a/lib/model/nms/src/nms_cuda_kernel.cu b/detectron_pytorch/model/nms/src/nms_cuda_kernel.cu similarity index 100% rename from lib/model/nms/src/nms_cuda_kernel.cu rename to detectron_pytorch/model/nms/src/nms_cuda_kernel.cu diff --git a/lib/model/nms/src/nms_cuda_kernel.h b/detectron_pytorch/model/nms/src/nms_cuda_kernel.h similarity index 100% rename from lib/model/nms/src/nms_cuda_kernel.h rename to detectron_pytorch/model/nms/src/nms_cuda_kernel.h diff --git a/lib/model/roi_align/_ext/__init__.py b/detectron_pytorch/model/roi_align/__init__.py similarity index 100% rename from lib/model/roi_align/_ext/__init__.py rename to detectron_pytorch/model/roi_align/__init__.py diff --git a/lib/model/roi_align/functions/__init__.py b/detectron_pytorch/model/roi_align/_ext/__init__.py similarity index 100% rename from lib/model/roi_align/functions/__init__.py rename to detectron_pytorch/model/roi_align/_ext/__init__.py diff --git a/lib/model/roi_align/_ext/roi_align/__init__.py b/detectron_pytorch/model/roi_align/_ext/roi_align/__init__.py similarity index 100% rename from lib/model/roi_align/_ext/roi_align/__init__.py rename to detectron_pytorch/model/roi_align/_ext/roi_align/__init__.py diff --git a/lib/model/roi_align/build.py b/detectron_pytorch/model/roi_align/build.py similarity index 100% rename from lib/model/roi_align/build.py rename to detectron_pytorch/model/roi_align/build.py diff --git a/lib/model/roi_align/modules/__init__.py b/detectron_pytorch/model/roi_align/functions/__init__.py similarity index 100% rename from lib/model/roi_align/modules/__init__.py rename to detectron_pytorch/model/roi_align/functions/__init__.py diff --git a/lib/model/roi_align/functions/roi_align.py b/detectron_pytorch/model/roi_align/functions/roi_align.py similarity index 100% rename from lib/model/roi_align/functions/roi_align.py rename to detectron_pytorch/model/roi_align/functions/roi_align.py diff --git a/lib/model/roi_align/make.sh b/detectron_pytorch/model/roi_align/make.sh similarity index 86% rename from lib/model/roi_align/make.sh rename to detectron_pytorch/model/roi_align/make.sh index 49b80b7a..3b9aa3cd 100755 --- a/lib/model/roi_align/make.sh +++ b/detectron_pytorch/model/roi_align/make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -CUDA_PATH=/usr/local/cuda/ +# CUDA_PATH=/usr/local/cuda/ cd src echo "Compiling my_lib kernels by nvcc..." diff --git a/lib/model/roi_crop/__init__.py b/detectron_pytorch/model/roi_align/modules/__init__.py similarity index 100% rename from lib/model/roi_crop/__init__.py rename to detectron_pytorch/model/roi_align/modules/__init__.py diff --git a/lib/model/roi_align/modules/roi_align.py b/detectron_pytorch/model/roi_align/modules/roi_align.py similarity index 100% rename from lib/model/roi_align/modules/roi_align.py rename to detectron_pytorch/model/roi_align/modules/roi_align.py diff --git a/lib/model/roi_align/src/roi_align_cuda.c b/detectron_pytorch/model/roi_align/src/roi_align_cuda.c similarity index 100% rename from lib/model/roi_align/src/roi_align_cuda.c rename to detectron_pytorch/model/roi_align/src/roi_align_cuda.c diff --git a/lib/model/roi_align/src/roi_align_cuda.h b/detectron_pytorch/model/roi_align/src/roi_align_cuda.h similarity index 100% rename from lib/model/roi_align/src/roi_align_cuda.h rename to detectron_pytorch/model/roi_align/src/roi_align_cuda.h diff --git a/lib/model/roi_align/src/roi_align_kernel.cu b/detectron_pytorch/model/roi_align/src/roi_align_kernel.cu similarity index 100% rename from lib/model/roi_align/src/roi_align_kernel.cu rename to detectron_pytorch/model/roi_align/src/roi_align_kernel.cu diff --git a/lib/model/roi_align/src/roi_align_kernel.h b/detectron_pytorch/model/roi_align/src/roi_align_kernel.h similarity index 100% rename from lib/model/roi_align/src/roi_align_kernel.h rename to detectron_pytorch/model/roi_align/src/roi_align_kernel.h diff --git a/lib/model/roi_crop/_ext/__init__.py b/detectron_pytorch/model/roi_crop/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/__init__.py rename to detectron_pytorch/model/roi_crop/__init__.py diff --git a/lib/model/roi_crop/functions/__init__.py b/detectron_pytorch/model/roi_crop/_ext/__init__.py similarity index 100% rename from lib/model/roi_crop/functions/__init__.py rename to detectron_pytorch/model/roi_crop/_ext/__init__.py diff --git a/lib/model/roi_crop/_ext/crop_resize/__init__.py b/detectron_pytorch/model/roi_crop/_ext/crop_resize/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/crop_resize/__init__.py rename to detectron_pytorch/model/roi_crop/_ext/crop_resize/__init__.py diff --git a/lib/model/roi_crop/_ext/roi_crop/__init__.py b/detectron_pytorch/model/roi_crop/_ext/roi_crop/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/roi_crop/__init__.py rename to detectron_pytorch/model/roi_crop/_ext/roi_crop/__init__.py diff --git a/lib/model/roi_crop/build.py b/detectron_pytorch/model/roi_crop/build.py similarity index 100% rename from lib/model/roi_crop/build.py rename to detectron_pytorch/model/roi_crop/build.py diff --git a/lib/model/roi_crop/modules/__init__.py b/detectron_pytorch/model/roi_crop/functions/__init__.py similarity index 100% rename from lib/model/roi_crop/modules/__init__.py rename to detectron_pytorch/model/roi_crop/functions/__init__.py diff --git a/lib/model/roi_crop/functions/crop_resize.py b/detectron_pytorch/model/roi_crop/functions/crop_resize.py similarity index 100% rename from lib/model/roi_crop/functions/crop_resize.py rename to detectron_pytorch/model/roi_crop/functions/crop_resize.py diff --git a/lib/model/roi_crop/functions/gridgen.py b/detectron_pytorch/model/roi_crop/functions/gridgen.py similarity index 100% rename from lib/model/roi_crop/functions/gridgen.py rename to detectron_pytorch/model/roi_crop/functions/gridgen.py diff --git a/lib/model/roi_crop/functions/roi_crop.py b/detectron_pytorch/model/roi_crop/functions/roi_crop.py similarity index 100% rename from lib/model/roi_crop/functions/roi_crop.py rename to detectron_pytorch/model/roi_crop/functions/roi_crop.py diff --git a/lib/model/roi_crop/make.sh b/detectron_pytorch/model/roi_crop/make.sh similarity index 100% rename from lib/model/roi_crop/make.sh rename to detectron_pytorch/model/roi_crop/make.sh diff --git a/lib/model/roi_pooling/__init__.py b/detectron_pytorch/model/roi_crop/modules/__init__.py similarity index 100% rename from lib/model/roi_pooling/__init__.py rename to detectron_pytorch/model/roi_crop/modules/__init__.py diff --git a/lib/model/roi_crop/modules/gridgen.py b/detectron_pytorch/model/roi_crop/modules/gridgen.py similarity index 100% rename from lib/model/roi_crop/modules/gridgen.py rename to detectron_pytorch/model/roi_crop/modules/gridgen.py diff --git a/lib/model/roi_crop/modules/roi_crop.py b/detectron_pytorch/model/roi_crop/modules/roi_crop.py similarity index 100% rename from lib/model/roi_crop/modules/roi_crop.py rename to detectron_pytorch/model/roi_crop/modules/roi_crop.py diff --git a/lib/model/roi_crop/src/roi_crop.c b/detectron_pytorch/model/roi_crop/src/roi_crop.c similarity index 100% rename from lib/model/roi_crop/src/roi_crop.c rename to detectron_pytorch/model/roi_crop/src/roi_crop.c diff --git a/lib/model/roi_crop/src/roi_crop.h b/detectron_pytorch/model/roi_crop/src/roi_crop.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop.h rename to detectron_pytorch/model/roi_crop/src/roi_crop.h diff --git a/lib/model/roi_crop/src/roi_crop_cuda.c b/detectron_pytorch/model/roi_crop/src/roi_crop_cuda.c similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda.c rename to detectron_pytorch/model/roi_crop/src/roi_crop_cuda.c diff --git a/lib/model/roi_crop/src/roi_crop_cuda.h b/detectron_pytorch/model/roi_crop/src/roi_crop_cuda.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda.h rename to detectron_pytorch/model/roi_crop/src/roi_crop_cuda.h diff --git a/lib/model/roi_crop/src/roi_crop_cuda_kernel.cu b/detectron_pytorch/model/roi_crop/src/roi_crop_cuda_kernel.cu similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda_kernel.cu rename to detectron_pytorch/model/roi_crop/src/roi_crop_cuda_kernel.cu diff --git a/lib/model/roi_crop/src/roi_crop_cuda_kernel.h b/detectron_pytorch/model/roi_crop/src/roi_crop_cuda_kernel.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda_kernel.h rename to detectron_pytorch/model/roi_crop/src/roi_crop_cuda_kernel.h diff --git a/lib/model/roi_pooling/_ext/__init__.py b/detectron_pytorch/model/roi_pooling/__init__.py similarity index 100% rename from lib/model/roi_pooling/_ext/__init__.py rename to detectron_pytorch/model/roi_pooling/__init__.py diff --git a/lib/model/roi_pooling/functions/__init__.py b/detectron_pytorch/model/roi_pooling/_ext/__init__.py similarity index 100% rename from lib/model/roi_pooling/functions/__init__.py rename to detectron_pytorch/model/roi_pooling/_ext/__init__.py diff --git a/lib/model/roi_pooling/_ext/roi_pooling/__init__.py b/detectron_pytorch/model/roi_pooling/_ext/roi_pooling/__init__.py similarity index 100% rename from lib/model/roi_pooling/_ext/roi_pooling/__init__.py rename to detectron_pytorch/model/roi_pooling/_ext/roi_pooling/__init__.py diff --git a/lib/model/roi_pooling/build.py b/detectron_pytorch/model/roi_pooling/build.py similarity index 100% rename from lib/model/roi_pooling/build.py rename to detectron_pytorch/model/roi_pooling/build.py diff --git a/lib/model/roi_pooling/modules/__init__.py b/detectron_pytorch/model/roi_pooling/functions/__init__.py similarity index 100% rename from lib/model/roi_pooling/modules/__init__.py rename to detectron_pytorch/model/roi_pooling/functions/__init__.py diff --git a/lib/model/roi_pooling/functions/roi_pool.py b/detectron_pytorch/model/roi_pooling/functions/roi_pool.py similarity index 100% rename from lib/model/roi_pooling/functions/roi_pool.py rename to detectron_pytorch/model/roi_pooling/functions/roi_pool.py diff --git a/lib/model/utils/__init__.py b/detectron_pytorch/model/roi_pooling/modules/__init__.py similarity index 100% rename from lib/model/utils/__init__.py rename to detectron_pytorch/model/roi_pooling/modules/__init__.py diff --git a/lib/model/roi_pooling/modules/roi_pool.py b/detectron_pytorch/model/roi_pooling/modules/roi_pool.py similarity index 100% rename from lib/model/roi_pooling/modules/roi_pool.py rename to detectron_pytorch/model/roi_pooling/modules/roi_pool.py diff --git a/lib/model/roi_pooling/src/roi_pooling.c b/detectron_pytorch/model/roi_pooling/src/roi_pooling.c similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling.c rename to detectron_pytorch/model/roi_pooling/src/roi_pooling.c diff --git a/lib/model/roi_pooling/src/roi_pooling.h b/detectron_pytorch/model/roi_pooling/src/roi_pooling.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling.h rename to detectron_pytorch/model/roi_pooling/src/roi_pooling.h diff --git a/lib/model/roi_pooling/src/roi_pooling_cuda.c b/detectron_pytorch/model/roi_pooling/src/roi_pooling_cuda.c similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_cuda.c rename to detectron_pytorch/model/roi_pooling/src/roi_pooling_cuda.c diff --git a/lib/model/roi_pooling/src/roi_pooling_cuda.h b/detectron_pytorch/model/roi_pooling/src/roi_pooling_cuda.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_cuda.h rename to detectron_pytorch/model/roi_pooling/src/roi_pooling_cuda.h diff --git a/lib/model/roi_pooling/src/roi_pooling_kernel.cu b/detectron_pytorch/model/roi_pooling/src/roi_pooling_kernel.cu similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_kernel.cu rename to detectron_pytorch/model/roi_pooling/src/roi_pooling_kernel.cu diff --git a/lib/model/roi_pooling/src/roi_pooling_kernel.h b/detectron_pytorch/model/roi_pooling/src/roi_pooling_kernel.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_kernel.h rename to detectron_pytorch/model/roi_pooling/src/roi_pooling_kernel.h diff --git a/lib/model/utils/.gitignore b/detectron_pytorch/model/utils/.gitignore similarity index 100% rename from lib/model/utils/.gitignore rename to detectron_pytorch/model/utils/.gitignore diff --git a/lib/modeling/__init__.py b/detectron_pytorch/model/utils/__init__.py similarity index 100% rename from lib/modeling/__init__.py rename to detectron_pytorch/model/utils/__init__.py diff --git a/lib/model/utils/net_utils.py b/detectron_pytorch/model/utils/net_utils.py similarity index 96% rename from lib/model/utils/net_utils.py rename to detectron_pytorch/model/utils/net_utils.py index 4bbac9c8..3cf918e5 100644 --- a/lib/model/utils/net_utils.py +++ b/detectron_pytorch/model/utils/net_utils.py @@ -4,8 +4,8 @@ from torch.autograd import Variable import numpy as np import torchvision.models as models -from core.config import cfg -from model.roi_crop.functions.roi_crop import RoICropFunction +from detectron_pytorch.core.config import cfg +from detectron_pytorch.model.roi_crop.functions.roi_crop import RoICropFunction import cv2 import pdb import random @@ -36,7 +36,7 @@ def weights_normal_init(model, dev=0.01): def _crop_pool_layer(bottom, rois, max_pool=True): - # code modified from + # code modified from # https://github.com/ruotianluo/pytorch-faster-rcnn # implement it using stn # box to affine @@ -86,7 +86,7 @@ def _crop_pool_layer(bottom, rois, max_pool=True): bottom = bottom.view(1, batch_size, D, H, W).contiguous().expand(roi_per_batch, batch_size, D, H, W)\ .contiguous().view(-1, D, H, W) crops = F.grid_sample(bottom, grid) - + return crops, grid def _affine_grid_gen(rois, input_size, grid_size): @@ -152,11 +152,11 @@ def compare_grid_sample(): W = 4 # random.randint(1, 8) input = Variable(torch.randn(N, C, H, W).cuda(), requires_grad=True) input_p = input.clone().data.contiguous() - + grid = Variable(torch.randn(N, H, W, 2).cuda(), requires_grad=True) grid_clone = grid.clone().contiguous() - out_offcial = F.grid_sample(input, grid) + out_offcial = F.grid_sample(input, grid) grad_outputs = Variable(torch.rand(out_offcial.size()).cuda()) grad_outputs_clone = grad_outputs.clone().contiguous() grad_inputs = torch.autograd.grad(out_offcial, (input, grid), grad_outputs.contiguous()) diff --git a/lib/modeling/FPN.py b/detectron_pytorch/modeling/FPN.py similarity index 97% rename from lib/modeling/FPN.py rename to detectron_pytorch/modeling/FPN.py index 03cd60bc..4670f5bb 100644 --- a/lib/modeling/FPN.py +++ b/detectron_pytorch/modeling/FPN.py @@ -6,13 +6,13 @@ import torch.nn.functional as F from torch.nn import init -from core.config import cfg -import utils.net as net_utils -import modeling.ResNet as ResNet -from modeling.generate_anchors import generate_anchors -from modeling.generate_proposals import GenerateProposalsOp -from modeling.collect_and_distribute_fpn_rpn_proposals import CollectAndDistributeFpnRpnProposalsOp -import nn as mynn +from detectron_pytorch.core.config import cfg +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.modeling.ResNet as ResNet +from detectron_pytorch.modeling.generate_anchors import generate_anchors +from detectron_pytorch.modeling.generate_proposals import GenerateProposalsOp +from detectron_pytorch.modeling.collect_and_distribute_fpn_rpn_proposals import CollectAndDistributeFpnRpnProposalsOp +import detectron_pytorch.nn as mynn # Lowest and highest pyramid levels in the backbone network. For FPN, we assume # that all networks have 5 spatial reductions, each by a factor of 2. Level 1 diff --git a/lib/modeling/ResNet.py b/detectron_pytorch/modeling/ResNet.py similarity index 98% rename from lib/modeling/ResNet.py rename to detectron_pytorch/modeling/ResNet.py index 41f31a8e..ef3db1d9 100644 --- a/lib/modeling/ResNet.py +++ b/detectron_pytorch/modeling/ResNet.py @@ -5,10 +5,10 @@ import torch.nn as nn import torch.nn.functional as F -from core.config import cfg -import nn as mynn -import utils.net as net_utils -from utils.resnet_weights_helper import convert_state_dict +from detectron_pytorch.core.config import cfg +import detectron_pytorch.nn as mynn +import detectron_pytorch.utils.net as net_utils +from detectron_pytorch.utils.resnet_weights_helper import convert_state_dict # ---------------------------------------------------------------------------- # # Bits for specific architectures (ResNet50, ResNet101, ...) diff --git a/lib/modeling/roi_xfrom/__init__.py b/detectron_pytorch/modeling/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/__init__.py rename to detectron_pytorch/modeling/__init__.py diff --git a/lib/modeling/collect_and_distribute_fpn_rpn_proposals.py b/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py similarity index 95% rename from lib/modeling/collect_and_distribute_fpn_rpn_proposals.py rename to detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py index dd28a539..e70a66ab 100644 --- a/lib/modeling/collect_and_distribute_fpn_rpn_proposals.py +++ b/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py @@ -1,11 +1,11 @@ import numpy as np from torch import nn -from core.config import cfg -from datasets import json_dataset -import roi_data.fast_rcnn -import utils.blob as blob_utils -import utils.fpn as fpn_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.datasets import json_dataset +import detectron_pytorch.roi_data.fast_rcnn +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.fpn as fpn_utils class CollectAndDistributeFpnRpnProposalsOp(nn.Module): diff --git a/lib/modeling/fast_rcnn_heads.py b/detectron_pytorch/modeling/fast_rcnn_heads.py similarity index 98% rename from lib/modeling/fast_rcnn_heads.py rename to detectron_pytorch/modeling/fast_rcnn_heads.py index 3b386ed3..61769f0c 100644 --- a/lib/modeling/fast_rcnn_heads.py +++ b/detectron_pytorch/modeling/fast_rcnn_heads.py @@ -4,9 +4,9 @@ import torch.nn.init as init from torch.autograd import Variable -from core.config import cfg -import nn as mynn -import utils.net as net_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.nn as mynn +import detectron_pytorch.utils.net as net_utils class fast_rcnn_outputs(nn.Module): diff --git a/lib/modeling/generate_anchors.py b/detectron_pytorch/modeling/generate_anchors.py similarity index 100% rename from lib/modeling/generate_anchors.py rename to detectron_pytorch/modeling/generate_anchors.py diff --git a/lib/modeling/generate_proposal_labels.py b/detectron_pytorch/modeling/generate_proposal_labels.py similarity index 85% rename from lib/modeling/generate_proposal_labels.py rename to detectron_pytorch/modeling/generate_proposal_labels.py index 0c2b93e6..ed0661fa 100644 --- a/lib/modeling/generate_proposal_labels.py +++ b/detectron_pytorch/modeling/generate_proposal_labels.py @@ -1,8 +1,8 @@ from torch import nn -from core.config import cfg -from datasets import json_dataset -import roi_data.fast_rcnn +from detectron_pytorch.core.config import cfg +from detectron_pytorch.datasets import json_dataset +import detectron_pytorch.roi_data.fast_rcnn class GenerateProposalLabelsOp(nn.Module): @@ -34,6 +34,6 @@ def forward(self, rpn_rois, roidb, im_info): # Note: crowd_thresh=0 will ignore _filter_crowd_proposals json_dataset.add_proposals(roidb, rpn_rois, im_scales, crowd_thresh=0) blobs = {k: [] for k in output_blob_names} - roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) + detectron_pytorch.roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) return blobs diff --git a/lib/modeling/generate_proposals.py b/detectron_pytorch/modeling/generate_proposals.py similarity index 98% rename from lib/modeling/generate_proposals.py rename to detectron_pytorch/modeling/generate_proposals.py index 1ab6472d..99532a4f 100644 --- a/lib/modeling/generate_proposals.py +++ b/detectron_pytorch/modeling/generate_proposals.py @@ -3,8 +3,8 @@ from torch import nn -from core.config import cfg -import utils.boxes as box_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.utils.boxes as box_utils logger = logging.getLogger(__name__) @@ -52,7 +52,7 @@ def forward(self, rpn_cls_prob, rpn_bbox_pred, im_info): # 6. apply NMS with a loose threshold (0.7) to the remaining proposals # 7. take after_nms_topN proposals after NMS # 8. return the top proposals - + """Type conversion""" # predicted probability of fg object for each RPN anchor scores = rpn_cls_prob.data.cpu().numpy() diff --git a/lib/modeling/keypoint_rcnn_heads.py b/detectron_pytorch/modeling/keypoint_rcnn_heads.py similarity index 98% rename from lib/modeling/keypoint_rcnn_heads.py rename to detectron_pytorch/modeling/keypoint_rcnn_heads.py index 4b73d2a7..842bc405 100644 --- a/lib/modeling/keypoint_rcnn_heads.py +++ b/detectron_pytorch/modeling/keypoint_rcnn_heads.py @@ -6,8 +6,8 @@ import torch.nn.init as init from torch.autograd import Variable -from core.config import cfg -import nn as mynn +from detectron_pytorch.core.config import cfg +import detectron_pytorch.nn as mynn # ---------------------------------------------------------------------------- # diff --git a/lib/modeling/mask_rcnn_heads.py b/detectron_pytorch/modeling/mask_rcnn_heads.py similarity index 98% rename from lib/modeling/mask_rcnn_heads.py rename to detectron_pytorch/modeling/mask_rcnn_heads.py index e71be164..50130e9c 100644 --- a/lib/modeling/mask_rcnn_heads.py +++ b/detectron_pytorch/modeling/mask_rcnn_heads.py @@ -7,10 +7,10 @@ import torch.nn.init as init from torch.autograd import Variable -from core.config import cfg -from modeling import ResNet -import nn as mynn -import utils.net as net_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.modeling import ResNet +import detectron_pytorch.nn as mynn +import detectron_pytorch.utils.net as net_utils # ---------------------------------------------------------------------------- # diff --git a/lib/modeling/model_builder.py b/detectron_pytorch/modeling/model_builder.py similarity index 95% rename from lib/modeling/model_builder.py rename to detectron_pytorch/modeling/model_builder.py index 0c7f1f49..550eb720 100644 --- a/lib/modeling/model_builder.py +++ b/detectron_pytorch/modeling/model_builder.py @@ -7,17 +7,17 @@ import torch.nn.functional as F from torch.autograd import Variable -from core.config import cfg -from model.roi_pooling.functions.roi_pool import RoIPoolFunction -from model.roi_crop.functions.roi_crop import RoICropFunction -from modeling.roi_xfrom.roi_align.functions.roi_align import RoIAlignFunction -import modeling.rpn_heads as rpn_heads -import modeling.fast_rcnn_heads as fast_rcnn_heads -import modeling.mask_rcnn_heads as mask_rcnn_heads -import modeling.keypoint_rcnn_heads as keypoint_rcnn_heads -import utils.blob as blob_utils -import utils.net as net_utils -import utils.resnet_weights_helper as resnet_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.model.roi_pooling.functions.roi_pool import RoIPoolFunction +from detectron_pytorch.model.roi_crop.functions.roi_crop import RoICropFunction +from detectron_pytorch.modeling.roi_xfrom.roi_align.functions.roi_align import RoIAlignFunction +import detectron_pytorch.modeling.rpn_heads as rpn_heads +import detectron_pytorch.modeling.fast_rcnn_heads as fast_rcnn_heads +import detectron_pytorch.modeling.mask_rcnn_heads as mask_rcnn_heads +import detectron_pytorch.modeling.keypoint_rcnn_heads as keypoint_rcnn_heads +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.utils.resnet_weights_helper as resnet_utils logger = logging.getLogger(__name__) diff --git a/lib/modeling/roi_xfrom/roi_align/__init__.py b/detectron_pytorch/modeling/roi_xfrom/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/_ext/__init__.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/_ext/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/functions/__init__.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/_ext/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/functions/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/_ext/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/_ext/roi_align/__init__.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/_ext/roi_align/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/_ext/roi_align/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/_ext/roi_align/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/build.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/build.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/build.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/build.py diff --git a/lib/modeling/roi_xfrom/roi_align/modules/__init__.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/functions/__init__.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/modules/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/functions/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/functions/roi_align.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/functions/roi_align.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/functions/roi_align.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/functions/roi_align.py diff --git a/lib/modeling/roi_xfrom/roi_align/make.sh b/detectron_pytorch/modeling/roi_xfrom/roi_align/make.sh similarity index 86% rename from lib/modeling/roi_xfrom/roi_align/make.sh rename to detectron_pytorch/modeling/roi_xfrom/roi_align/make.sh index 8428ce49..0e6c4c9f 100644 --- a/lib/modeling/roi_xfrom/roi_align/make.sh +++ b/detectron_pytorch/modeling/roi_xfrom/roi_align/make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -CUDA_PATH=/usr/local/cuda/ +# CUDA_PATH=/usr/local/cuda/ cd src echo "Compiling my_lib kernels by nvcc..." diff --git a/lib/roi_data/__init__.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/modules/__init__.py similarity index 100% rename from lib/roi_data/__init__.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/modules/__init__.py diff --git a/lib/modeling/roi_xfrom/roi_align/modules/roi_align.py b/detectron_pytorch/modeling/roi_xfrom/roi_align/modules/roi_align.py similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/modules/roi_align.py rename to detectron_pytorch/modeling/roi_xfrom/roi_align/modules/roi_align.py diff --git a/lib/modeling/roi_xfrom/roi_align/src/roi_align_cuda.c b/detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_cuda.c similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/src/roi_align_cuda.c rename to detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_cuda.c diff --git a/lib/modeling/roi_xfrom/roi_align/src/roi_align_cuda.h b/detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_cuda.h similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/src/roi_align_cuda.h rename to detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_cuda.h diff --git a/lib/modeling/roi_xfrom/roi_align/src/roi_align_kernel.cu b/detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_kernel.cu similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/src/roi_align_kernel.cu rename to detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_kernel.cu diff --git a/lib/modeling/roi_xfrom/roi_align/src/roi_align_kernel.h b/detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_kernel.h similarity index 100% rename from lib/modeling/roi_xfrom/roi_align/src/roi_align_kernel.h rename to detectron_pytorch/modeling/roi_xfrom/roi_align/src/roi_align_kernel.h diff --git a/lib/modeling/rpn_heads.py b/detectron_pytorch/modeling/rpn_heads.py similarity index 94% rename from lib/modeling/rpn_heads.py rename to detectron_pytorch/modeling/rpn_heads.py index 5edcf3a7..c3dfcf29 100644 --- a/lib/modeling/rpn_heads.py +++ b/detectron_pytorch/modeling/rpn_heads.py @@ -2,12 +2,12 @@ from torch.nn import init import torch.nn.functional as F -from core.config import cfg -from modeling.generate_anchors import generate_anchors -from modeling.generate_proposals import GenerateProposalsOp -from modeling.generate_proposal_labels import GenerateProposalLabelsOp -import modeling.FPN as FPN -import utils.net as net_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.modeling.generate_anchors import generate_anchors +from detectron_pytorch.modeling.generate_proposals import GenerateProposalsOp +from detectron_pytorch.modeling.generate_proposal_labels import GenerateProposalLabelsOp +import detectron_pytorch.modeling.FPN as FPN +import detectron_pytorch.utils.net as net_utils # ---------------------------------------------------------------------------- # diff --git a/lib/nn/__init__.py b/detectron_pytorch/nn/__init__.py similarity index 100% rename from lib/nn/__init__.py rename to detectron_pytorch/nn/__init__.py diff --git a/lib/nn/functional.py b/detectron_pytorch/nn/functional.py similarity index 100% rename from lib/nn/functional.py rename to detectron_pytorch/nn/functional.py diff --git a/lib/nn/init.py b/detectron_pytorch/nn/init.py similarity index 100% rename from lib/nn/init.py rename to detectron_pytorch/nn/init.py diff --git a/lib/nn/modules/__init__.py b/detectron_pytorch/nn/modules/__init__.py similarity index 100% rename from lib/nn/modules/__init__.py rename to detectron_pytorch/nn/modules/__init__.py diff --git a/lib/nn/modules/affine.py b/detectron_pytorch/nn/modules/affine.py similarity index 100% rename from lib/nn/modules/affine.py rename to detectron_pytorch/nn/modules/affine.py diff --git a/lib/nn/modules/normalization.py b/detectron_pytorch/nn/modules/normalization.py similarity index 100% rename from lib/nn/modules/normalization.py rename to detectron_pytorch/nn/modules/normalization.py diff --git a/lib/nn/modules/upsample.py b/detectron_pytorch/nn/modules/upsample.py similarity index 100% rename from lib/nn/modules/upsample.py rename to detectron_pytorch/nn/modules/upsample.py diff --git a/lib/nn/parallel/__init__.py b/detectron_pytorch/nn/parallel/__init__.py similarity index 100% rename from lib/nn/parallel/__init__.py rename to detectron_pytorch/nn/parallel/__init__.py diff --git a/lib/nn/parallel/_functions.py b/detectron_pytorch/nn/parallel/_functions.py similarity index 100% rename from lib/nn/parallel/_functions.py rename to detectron_pytorch/nn/parallel/_functions.py diff --git a/lib/nn/parallel/data_parallel.py b/detectron_pytorch/nn/parallel/data_parallel.py similarity index 100% rename from lib/nn/parallel/data_parallel.py rename to detectron_pytorch/nn/parallel/data_parallel.py diff --git a/lib/nn/parallel/parallel_apply.py b/detectron_pytorch/nn/parallel/parallel_apply.py similarity index 100% rename from lib/nn/parallel/parallel_apply.py rename to detectron_pytorch/nn/parallel/parallel_apply.py diff --git a/lib/nn/parallel/replicate.py b/detectron_pytorch/nn/parallel/replicate.py similarity index 100% rename from lib/nn/parallel/replicate.py rename to detectron_pytorch/nn/parallel/replicate.py diff --git a/lib/nn/parallel/scatter_gather.py b/detectron_pytorch/nn/parallel/scatter_gather.py similarity index 100% rename from lib/nn/parallel/scatter_gather.py rename to detectron_pytorch/nn/parallel/scatter_gather.py diff --git a/lib/utils/__init__.py b/detectron_pytorch/roi_data/__init__.py similarity index 100% rename from lib/utils/__init__.py rename to detectron_pytorch/roi_data/__init__.py diff --git a/lib/roi_data/data_utils.py b/detectron_pytorch/roi_data/data_utils.py similarity index 96% rename from lib/roi_data/data_utils.py rename to detectron_pytorch/roi_data/data_utils.py index 076f963d..7ee4135c 100644 --- a/lib/roi_data/data_utils.py +++ b/detectron_pytorch/roi_data/data_utils.py @@ -26,9 +26,9 @@ import numpy as np import threading -from core.config import cfg -from modeling.generate_anchors import generate_anchors -import utils.boxes as box_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.modeling.generate_anchors import generate_anchors +import detectron_pytorch.utils.boxes as box_utils logger = logging.getLogger(__name__) diff --git a/lib/roi_data/fast_rcnn.py b/detectron_pytorch/roi_data/fast_rcnn.py similarity index 97% rename from lib/roi_data/fast_rcnn.py rename to detectron_pytorch/roi_data/fast_rcnn.py index 8cb500b3..f986196c 100644 --- a/lib/roi_data/fast_rcnn.py +++ b/detectron_pytorch/roi_data/fast_rcnn.py @@ -25,12 +25,12 @@ import numpy as np import numpy.random as npr -from core.config import cfg -import roi_data.keypoint_rcnn -import roi_data.mask_rcnn -import utils.boxes as box_utils -import utils.blob as blob_utils -import utils.fpn as fpn_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.roi_data.keypoint_rcnn +import detectron_pytorch.roi_data.mask_rcnn +import detectron_pytorch.utils.boxes as box_utils +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.fpn as fpn_utils def get_fast_rcnn_blob_names(is_training=True): diff --git a/lib/roi_data/keypoint_rcnn.py b/detectron_pytorch/roi_data/keypoint_rcnn.py similarity index 96% rename from lib/roi_data/keypoint_rcnn.py rename to detectron_pytorch/roi_data/keypoint_rcnn.py index fed45907..d6575a15 100644 --- a/lib/roi_data/keypoint_rcnn.py +++ b/detectron_pytorch/roi_data/keypoint_rcnn.py @@ -25,9 +25,9 @@ import numpy as np -from core.config import cfg -import utils.blob as blob_utils -import utils.keypoints as keypoint_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.keypoints as keypoint_utils def add_keypoint_rcnn_blobs(blobs, roidb, fg_rois_per_image, fg_inds, im_scale, diff --git a/lib/roi_data/loader.py b/detectron_pytorch/roi_data/loader.py similarity index 98% rename from lib/roi_data/loader.py rename to detectron_pytorch/roi_data/loader.py index 70aeb6fc..1d4195cb 100644 --- a/lib/roi_data/loader.py +++ b/detectron_pytorch/roi_data/loader.py @@ -8,9 +8,9 @@ from torch.utils.data.dataloader import default_collate from torch._six import int_classes as _int_classes -from core.config import cfg -from roi_data.minibatch import get_minibatch -import utils.blob as blob_utils +from detectron_pytorch.core.config import cfg +from detectron_pytorch.roi_data.minibatch import get_minibatch +import detectron_pytorch.utils.blob as blob_utils # from model.rpn.bbox_transform import bbox_transform_inv, clip_boxes @@ -118,7 +118,7 @@ def __len__(self): def cal_minibatch_ratio(ratio_list): """Given the ratio_list, we want to make the RATIO same for each minibatch on each GPU. - Note: this only work for 1) cfg.TRAIN.MAX_SIZE is ignored during `prep_im_for_blob` + Note: this only work for 1) cfg.TRAIN.MAX_SIZE is ignored during `prep_im_for_blob` and 2) cfg.TRAIN.SCALES containing SINGLE scale. Since all prepared images will have same min side length of cfg.TRAIN.SCALES[0], we can pad and batch images base on that. diff --git a/lib/roi_data/mask_rcnn.py b/detectron_pytorch/roi_data/mask_rcnn.py similarity index 96% rename from lib/roi_data/mask_rcnn.py rename to detectron_pytorch/roi_data/mask_rcnn.py index e5fc69aa..8563e533 100644 --- a/lib/roi_data/mask_rcnn.py +++ b/detectron_pytorch/roi_data/mask_rcnn.py @@ -25,10 +25,10 @@ import logging import numpy as np -from core.config import cfg -import utils.blob as blob_utils -import utils.boxes as box_utils -import utils.segms as segm_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.boxes as box_utils +import detectron_pytorch.utils.segms as segm_utils def add_mask_rcnn_blobs(blobs, sampled_boxes, roidb, im_scale, batch_idx): diff --git a/lib/roi_data/minibatch.py b/detectron_pytorch/roi_data/minibatch.py similarity index 95% rename from lib/roi_data/minibatch.py rename to detectron_pytorch/roi_data/minibatch.py index 65ef9e66..041f49a4 100644 --- a/lib/roi_data/minibatch.py +++ b/detectron_pytorch/roi_data/minibatch.py @@ -1,9 +1,9 @@ import numpy as np import cv2 -from core.config import cfg -import utils.blob as blob_utils -import roi_data.rpn +from detectron_pytorch.core.config import cfg +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.roi_data.rpn def get_minibatch_blob_names(is_training=True): diff --git a/lib/roi_data/rpn.py b/detectron_pytorch/roi_data/rpn.py similarity index 98% rename from lib/roi_data/rpn.py rename to detectron_pytorch/roi_data/rpn.py index 8a63b953..7c89cd90 100644 --- a/lib/roi_data/rpn.py +++ b/detectron_pytorch/roi_data/rpn.py @@ -2,10 +2,10 @@ import numpy as np import numpy.random as npr -from core.config import cfg -import roi_data.data_utils as data_utils -import utils.blob as blob_utils -import utils.boxes as box_utils +from detectron_pytorch.core.config import cfg +import detectron_pytorch.roi_data.data_utils as data_utils +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.boxes as box_utils logger = logging.getLogger(__name__) diff --git a/lib/setup.py b/detectron_pytorch/setup.py similarity index 100% rename from lib/setup.py rename to detectron_pytorch/setup.py diff --git a/detectron_pytorch/tools/__init__.py b/detectron_pytorch/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tools/download_imagenet_weights.py b/detectron_pytorch/tools/download_imagenet_weights.py similarity index 96% rename from tools/download_imagenet_weights.py rename to detectron_pytorch/tools/download_imagenet_weights.py index f01d0a62..0b4740dc 100644 --- a/tools/download_imagenet_weights.py +++ b/detectron_pytorch/tools/download_imagenet_weights.py @@ -10,8 +10,8 @@ from argparse_color_formatter import ColorHelpFormatter from colorama import init, Fore -import _init_paths # pylint: disable=unused-import -from core.config import cfg +# import _init_paths # pylint: disable=unused-import +from detectron_pytorch.core.config import cfg def parse_args(): diff --git a/tools/infer_simple.py b/detectron_pytorch/tools/infer_simple.py similarity index 89% rename from tools/infer_simple.py rename to detectron_pytorch/tools/infer_simple.py index c9e2597a..4ee8d13a 100644 --- a/tools/infer_simple.py +++ b/detectron_pytorch/tools/infer_simple.py @@ -22,17 +22,17 @@ import torch.nn as nn from torch.autograd import Variable -import _init_paths -import nn as mynn -from core.config import cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg -from core.test import im_detect_all -from modeling.model_builder import Generalized_RCNN -import datasets.dummy_datasets as datasets -import utils.misc as misc_utils -import utils.net as net_utils -import utils.vis as vis_utils -from utils.detectron_weight_helper import load_detectron_weight -from utils.timer import Timer +import detectron_pytorch.nn as mynn +from detectron_pytorch.core.config import ( + cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg) +from detectron_pytorch.core.test import im_detect_all +from detectron_pytorch.modeling.model_builder import Generalized_RCNN +import detectron_pytorch.datasets.dummy_datasets as datasets +import detectron_pytorch.utils.misc as misc_utils +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.utils.vis as vis_utils +from detectron_pytorch.utils.detectron_weight_helper import load_detectron_weight +from detectron_pytorch.utils.timer import Timer # OpenCL may be enabled by default in OpenCV3; disable it because it's not # thread safe and causes unwanted GPU memory allocations. diff --git a/tools/test_net.py b/detectron_pytorch/tools/test_net.py similarity index 94% rename from tools/test_net.py rename to detectron_pytorch/tools/test_net.py index 23ca0fbd..66c9b320 100644 --- a/tools/test_net.py +++ b/detectron_pytorch/tools/test_net.py @@ -9,9 +9,9 @@ import torch -import _init_paths # pylint: disable=unused-import -from core.config import cfg, merge_cfg_from_file, merge_cfg_from_list, assert_and_infer_cfg -from core.test_engine import run_inference +from detectron_pytorch.core.config import ( + cfg, merge_cfg_from_file, merge_cfg_from_list, assert_and_infer_cfg) +from detectron_pytorch.core.test_engine import run_inference import utils.logging # OpenCL may be enabled by default in OpenCV3; disable it because it's not diff --git a/tools/train_net.py b/detectron_pytorch/tools/train_net.py similarity index 94% rename from tools/train_net.py rename to detectron_pytorch/tools/train_net.py index 499ba39f..3109a92f 100644 --- a/tools/train_net.py +++ b/detectron_pytorch/tools/train_net.py @@ -18,18 +18,19 @@ import cv2 cv2.setNumThreads(0) # pytorch issue 1355: possible deadlock in dataloader -import _init_paths # pylint: disable=unused-import -import nn as mynn -import utils.net as net_utils -import utils.misc as misc_utils -from core.config import cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg -from datasets.roidb import combined_roidb_for_training -from modeling.model_builder import Generalized_RCNN -from roi_data.loader import RoiDataLoader, MinibatchSampler, collate_minibatch -from utils.detectron_weight_helper import load_detectron_weight -from utils.logging import log_stats -from utils.timer import Timer -from utils.training_stats import TrainingStats +import detectron_pytorch.nn as mynn +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.utils.misc as misc_utils +from detectron_pytorch.core.config import ( + cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg) +from detectron_pytorch.datasets.roidb import combined_roidb_for_training +from detectron_pytorch.modeling.model_builder import Generalized_RCNN +from detectron_pytorch.roi_data.loader import ( + RoiDataLoader, MinibatchSampler, collate_minibatch) +from detectron_pytorch.utils.detectron_weight_helper import load_detectron_weight +from detectron_pytorch.utils.logging import log_stats +from detectron_pytorch.utils.timer import Timer +from detectron_pytorch.utils.training_stats import TrainingStats # OpenCL may be enabled by default in OpenCV3; disable it because it's not # thread safe and causes unwanted GPU memory allocations. diff --git a/tools/train_net_step.py b/detectron_pytorch/tools/train_net_step.py similarity index 95% rename from tools/train_net_step.py rename to detectron_pytorch/tools/train_net_step.py index 679076bc..7124ea2b 100644 --- a/tools/train_net_step.py +++ b/detectron_pytorch/tools/train_net_step.py @@ -17,18 +17,20 @@ import cv2 cv2.setNumThreads(0) # pytorch issue 1355: possible deadlock in dataloader -import _init_paths # pylint: disable=unused-import -import nn as mynn -import utils.net as net_utils -import utils.misc as misc_utils -from core.config import cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg -from datasets.roidb import combined_roidb_for_training -from roi_data.loader import RoiDataLoader, MinibatchSampler, BatchSampler, collate_minibatch -from modeling.model_builder import Generalized_RCNN -from utils.detectron_weight_helper import load_detectron_weight -from utils.logging import setup_logging -from utils.timer import Timer -from utils.training_stats import TrainingStats +import detectron_pytorch.nn as mynn +import detectron_pytorch.utils.net as net_utils +import detectron_pytorch.utils.misc as misc_utils +from detectron_pytorch.core.config import ( + cfg, cfg_from_file, cfg_from_list, assert_and_infer_cfg) +from detectron_pytorch.datasets.roidb import combined_roidb_for_training +from detectron_pytorch.roi_data.loader import ( + RoiDataLoader, MinibatchSampler, BatchSampler, collate_minibatch) +from detectron_pytorch.modeling.model_builder import Generalized_RCNN +from detectron_pytorch.utils.detectron_weight_helper import ( + load_detectron_weight) +from detectron_pytorch.utils.logging import setup_logging +from detectron_pytorch.utils.timer import Timer +from detectron_pytorch.utils.training_stats import TrainingStats # Set up logging and load config options logger = setup_logging(__name__) diff --git a/detectron_pytorch/utils/__init__.py b/detectron_pytorch/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/utils/blob.py b/detectron_pytorch/utils/blob.py similarity index 99% rename from lib/utils/blob.py rename to detectron_pytorch/utils/blob.py index 523a3e34..fbbd9da5 100644 --- a/lib/utils/blob.py +++ b/detectron_pytorch/utils/blob.py @@ -31,7 +31,7 @@ import numpy as np import cv2 -from core.config import cfg +from detectron_pytorch.core.config import cfg def get_image_blob(im, target_scale, target_max_size): diff --git a/lib/utils/boxes.py b/detectron_pytorch/utils/boxes.py similarity index 98% rename from lib/utils/boxes.py rename to detectron_pytorch/utils/boxes.py index 1b776a7f..09ba36d9 100644 --- a/lib/utils/boxes.py +++ b/detectron_pytorch/utils/boxes.py @@ -48,9 +48,11 @@ import warnings import numpy as np -from core.config import cfg -import utils.cython_bbox as cython_bbox -import utils.cython_nms as cython_nms +from detectron_pytorch.core.config import cfg +from . import cython_bbox +from . import cython_nms +# import detectron_pytorch.utils.cython_bbox as cython_bbox +# import detectron_pytorch.utils.cython_nms as cython_nms bbox_overlaps = cython_bbox.bbox_overlaps diff --git a/lib/utils/collections.py b/detectron_pytorch/utils/collections.py similarity index 100% rename from lib/utils/collections.py rename to detectron_pytorch/utils/collections.py diff --git a/lib/utils/colormap.py b/detectron_pytorch/utils/colormap.py similarity index 100% rename from lib/utils/colormap.py rename to detectron_pytorch/utils/colormap.py diff --git a/lib/utils/cython_bbox.c b/detectron_pytorch/utils/cython_bbox.c similarity index 100% rename from lib/utils/cython_bbox.c rename to detectron_pytorch/utils/cython_bbox.c diff --git a/lib/utils/cython_bbox.pyx b/detectron_pytorch/utils/cython_bbox.pyx similarity index 100% rename from lib/utils/cython_bbox.pyx rename to detectron_pytorch/utils/cython_bbox.pyx diff --git a/lib/utils/cython_nms.c b/detectron_pytorch/utils/cython_nms.c similarity index 100% rename from lib/utils/cython_nms.c rename to detectron_pytorch/utils/cython_nms.c diff --git a/lib/utils/cython_nms.pyx b/detectron_pytorch/utils/cython_nms.pyx similarity index 100% rename from lib/utils/cython_nms.pyx rename to detectron_pytorch/utils/cython_nms.pyx diff --git a/lib/utils/detectron_weight_helper.py b/detectron_pytorch/utils/detectron_weight_helper.py similarity index 100% rename from lib/utils/detectron_weight_helper.py rename to detectron_pytorch/utils/detectron_weight_helper.py diff --git a/lib/utils/env.py b/detectron_pytorch/utils/env.py similarity index 100% rename from lib/utils/env.py rename to detectron_pytorch/utils/env.py diff --git a/lib/utils/fpn.py b/detectron_pytorch/utils/fpn.py similarity index 96% rename from lib/utils/fpn.py rename to detectron_pytorch/utils/fpn.py index fcfca1ca..b15e601a 100644 --- a/lib/utils/fpn.py +++ b/detectron_pytorch/utils/fpn.py @@ -1,7 +1,8 @@ import numpy as np -import utils.boxes as box_utils -from core.config import cfg +from . import boxes as box_utils +# import utils.boxes as box_utils +from detectron_pytorch.core.config import cfg # ---------------------------------------------------------------------------- # diff --git a/lib/utils/image.py b/detectron_pytorch/utils/image.py similarity index 100% rename from lib/utils/image.py rename to detectron_pytorch/utils/image.py diff --git a/lib/utils/io.py b/detectron_pytorch/utils/io.py similarity index 100% rename from lib/utils/io.py rename to detectron_pytorch/utils/io.py diff --git a/lib/utils/keypoints.py b/detectron_pytorch/utils/keypoints.py similarity index 98% rename from lib/utils/keypoints.py rename to detectron_pytorch/utils/keypoints.py index c7caa1c0..10a20249 100644 --- a/lib/utils/keypoints.py +++ b/detectron_pytorch/utils/keypoints.py @@ -23,8 +23,9 @@ import cv2 import numpy as np -from core.config import cfg -import utils.blob as blob_utils +from detectron_pytorch.core.config import cfg +from . import blob as blob_utils +# import utils.blob as blob_utils def get_keypoints(): diff --git a/lib/utils/logging.py b/detectron_pytorch/utils/logging.py similarity index 100% rename from lib/utils/logging.py rename to detectron_pytorch/utils/logging.py diff --git a/lib/utils/misc.py b/detectron_pytorch/utils/misc.py similarity index 99% rename from lib/utils/misc.py rename to detectron_pytorch/utils/misc.py index 97714b79..dd58821a 100644 --- a/lib/utils/misc.py +++ b/detectron_pytorch/utils/misc.py @@ -7,7 +7,7 @@ import torch -from core.config import cfg +from detectron_pytorch.core.config import cfg def get_run_name(): diff --git a/lib/utils/net.py b/detectron_pytorch/utils/net.py similarity index 98% rename from lib/utils/net.py rename to detectron_pytorch/utils/net.py index 32c5d705..f4cad908 100644 --- a/lib/utils/net.py +++ b/detectron_pytorch/utils/net.py @@ -6,8 +6,8 @@ import torch.nn.functional as F from torch.autograd import Variable -from core.config import cfg -import nn as mynn +from detectron_pytorch.core.config import cfg +import detectron_pytorch.nn as mynn logger = logging.getLogger(__name__) diff --git a/lib/utils/resnet_weights_helper.py b/detectron_pytorch/utils/resnet_weights_helper.py similarity index 94% rename from lib/utils/resnet_weights_helper.py rename to detectron_pytorch/utils/resnet_weights_helper.py index 3336128c..bd18a507 100644 --- a/lib/utils/resnet_weights_helper.py +++ b/detectron_pytorch/utils/resnet_weights_helper.py @@ -6,9 +6,10 @@ import torch -import nn as mynn -import utils.detectron_weight_helper as dwh -from core.config import cfg +import detectron_pytorch.nn as mynn +from . import detectron_weight_helper as dwh +# import utils.detectron_weight_helper as dwh +from detectron_pytorch.core.config import cfg def load_pretrained_imagenet_weights(model): diff --git a/lib/utils/segms.py b/detectron_pytorch/utils/segms.py similarity index 100% rename from lib/utils/segms.py rename to detectron_pytorch/utils/segms.py diff --git a/lib/utils/subprocess.py b/detectron_pytorch/utils/subprocess.py similarity index 99% rename from lib/utils/subprocess.py rename to detectron_pytorch/utils/subprocess.py index 42b3f177..40da55c5 100644 --- a/lib/utils/subprocess.py +++ b/detectron_pytorch/utils/subprocess.py @@ -33,7 +33,7 @@ import numpy as np import torch -from core.config import cfg +from detectron_pytorch.core.config import cfg logger = logging.getLogger(__name__) diff --git a/lib/utils/timer.py b/detectron_pytorch/utils/timer.py similarity index 100% rename from lib/utils/timer.py rename to detectron_pytorch/utils/timer.py diff --git a/lib/utils/training_stats.py b/detectron_pytorch/utils/training_stats.py similarity index 97% rename from lib/utils/training_stats.py rename to detectron_pytorch/utils/training_stats.py index 8cae8a18..6a552cf7 100644 --- a/lib/utils/training_stats.py +++ b/detectron_pytorch/utils/training_stats.py @@ -26,11 +26,11 @@ import datetime import numpy as np -from core.config import cfg -from utils.logging import log_stats -from utils.logging import SmoothedValue -from utils.timer import Timer -import utils.net as nu +from detectron_pytorch.core.config import cfg +from detectron_pytorch.utils.logging import log_stats +from detectron_pytorch.utils.logging import SmoothedValue +from detectron_pytorch.utils.timer import Timer +import detectron_pytorch.utils.net as nu class TrainingStats(object): diff --git a/lib/utils/vis.py b/detectron_pytorch/utils/vis.py similarity index 98% rename from lib/utils/vis.py rename to detectron_pytorch/utils/vis.py index db8676e6..bbe650de 100644 --- a/lib/utils/vis.py +++ b/detectron_pytorch/utils/vis.py @@ -28,8 +28,8 @@ import os import pycocotools.mask as mask_util -from utils.colormap import colormap -import utils.keypoints as keypoint_utils +from detectron_pytorch.utils.colormap import colormap +import detectron_pytorch.utils.keypoints as keypoint_utils # Use a non-interactive backend import matplotlib diff --git a/lib/model/nms/src/nms_cuda.c b/lib/model/nms/src/nms_cuda.c deleted file mode 100644 index 9bb84075..00000000 --- a/lib/model/nms/src/nms_cuda.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include "nms_cuda_kernel.h" - -// this symbol will be resolved automatically from PyTorch libs -extern THCState *state; - -int nms_cuda(THCudaIntTensor *keep_out, THCudaTensor *boxes_host, - THCudaIntTensor *num_out, float nms_overlap_thresh) { - - nms_cuda_compute(THCudaIntTensor_data(state, keep_out), - THCudaIntTensor_data(state, num_out), - THCudaTensor_data(state, boxes_host), - boxes_host->size[0], - boxes_host->size[1], - nms_overlap_thresh); - - return 1; -} diff --git a/lib/model/roi_crop/_ext/crop_resize/_crop_resize.so b/lib/model/roi_crop/_ext/crop_resize/_crop_resize.so deleted file mode 100755 index 9baf6615c37b3a600f3315c0297d00b55c143846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159103 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 E5Ac0#_y7O^ diff --git a/setupbase.py b/setupbase.py index 56703239..28e3476d 100644 --- a/setupbase.py +++ b/setupbase.py @@ -56,8 +56,8 @@ def finalize_options(self): pass def run(self): - log.info("running [bash lib/make.sh]") - run(['bash', 'lib/make.sh'], cwd=repo_root) + log.info("running [bash detectron_pytorch/lib/make.sh]") + run(['bash', 'detectron_pytorch/lib/make.sh'], cwd=repo_root) class DevelopWithBuildStatic(develop): diff --git a/tools/_init_paths.py b/tools/_init_paths.py deleted file mode 100644 index e60754f9..00000000 --- a/tools/_init_paths.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Add {PROJECT_ROOT}/lib. to PYTHONPATH - -Usage: -import this module before import any modules under lib/ -e.g - import _init_paths - from core.config import cfg -""" - -import os.path as osp -import sys - - -def add_path(path): - if path not in sys.path: - sys.path.insert(0, path) - -this_dir = osp.abspath(osp.dirname(osp.dirname(__file__))) - -# Add lib to PYTHONPATH -lib_path = osp.join(this_dir, 'lib') -add_path(lib_path) From e90c1c7a4c6e408f26eb16721e039b01f9cd657d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 18:59:17 -0500 Subject: [PATCH 03/26] Set CUDA_PATH externally --- detectron_pytorch/make.sh | 2 -- setup.py | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/detectron_pytorch/make.sh b/detectron_pytorch/make.sh index 8470621a..841934bc 100755 --- a/detectron_pytorch/make.sh +++ b/detectron_pytorch/make.sh @@ -1,7 +1,5 @@ #!/usr/bin/env bash -CUDA_PATH=/usr/local/cuda/ - python setup.py build_ext --inplace rm -rf build diff --git a/setup.py b/setup.py index 09894f6b..03025a1a 100644 --- a/setup.py +++ b/setup.py @@ -19,6 +19,7 @@ from setupbase import (BuildStatic, CleanComponents, COMPONENTS, HERE, SdistWithBuildStatic) +os.environ['CUDA_PATH'] = os.environ.get('CUDA_PATH', '/usr/local/cuda/') def get_version(module='detectron_pytorch'): """Get version.""" From f96ff617a3e0de5166c657c900327276e812967f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:01:08 -0500 Subject: [PATCH 04/26] Remove clean_components action --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 03025a1a..e6357666 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,7 @@ def get_description(): cmdclass = { 'build_static': BuildStatic, 'sdist': SdistWithBuildStatic, - 'clean_components': CleanComponents + # 'clean_components': CleanComponents } From dc242508987e69fc505f9f664dfeded007b4db0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:02:18 -0500 Subject: [PATCH 05/26] Remove clean_components action --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e6357666..8b9d1506 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ # Third party imports from setuptools import find_packages, setup -from setupbase import (BuildStatic, CleanComponents, COMPONENTS, HERE, +from setupbase import (BuildStatic, HERE, SdistWithBuildStatic) os.environ['CUDA_PATH'] = os.environ.get('CUDA_PATH', '/usr/local/cuda/') From a911c5686c578b27e379657bbebc18b54fccf74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:03:07 -0500 Subject: [PATCH 06/26] Minor error correction --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8b9d1506..0e401e1b 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ def get_version(module='detectron_pytorch'): def get_description(): """Get long description.""" - with open(os.path.join(HERE, 'README.rst'), 'r') as f: + with open(os.path.join(HERE, 'README.md'), 'r') as f: data = f.read() return data From 8ae7aca4134fde8d9c2807ce806c1b2aa288a49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:04:16 -0500 Subject: [PATCH 07/26] Execute build_static action from make.sh --- setupbase.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setupbase.py b/setupbase.py index 28e3476d..9b3ea4ca 100644 --- a/setupbase.py +++ b/setupbase.py @@ -56,8 +56,8 @@ def finalize_options(self): pass def run(self): - log.info("running [bash detectron_pytorch/lib/make.sh]") - run(['bash', 'detectron_pytorch/lib/make.sh'], cwd=repo_root) + log.info("running [bash detectron_pytorch/make.sh]") + run(['bash', 'detectron_pytorch/make.sh'], cwd=repo_root) class DevelopWithBuildStatic(develop): From f7555ac898e17d80ef2a17b29d16b2e26a559978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:06:51 -0500 Subject: [PATCH 08/26] cd into detectron_pytorch --- detectron_pytorch/make.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/detectron_pytorch/make.sh b/detectron_pytorch/make.sh index 841934bc..a6be0326 100755 --- a/detectron_pytorch/make.sh +++ b/detectron_pytorch/make.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash +cd detectron_pytorch python setup.py build_ext --inplace rm -rf build From 346008f1cdeec0acad3c5b5aeec7b5609e8dfae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:13:00 -0500 Subject: [PATCH 09/26] Update gitignore --- detectron_pytorch/model/nms/.gitignore | 2 -- detectron_pytorch/model/nms/src/nms_cuda.c | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 detectron_pytorch/model/nms/src/nms_cuda.c diff --git a/detectron_pytorch/model/nms/.gitignore b/detectron_pytorch/model/nms/.gitignore index 15a165d4..140f8cf8 100644 --- a/detectron_pytorch/model/nms/.gitignore +++ b/detectron_pytorch/model/nms/.gitignore @@ -1,3 +1 @@ -*.c -*.cpp *.so diff --git a/detectron_pytorch/model/nms/src/nms_cuda.c b/detectron_pytorch/model/nms/src/nms_cuda.c new file mode 100644 index 00000000..9bb84075 --- /dev/null +++ b/detectron_pytorch/model/nms/src/nms_cuda.c @@ -0,0 +1,19 @@ +#include +#include +#include "nms_cuda_kernel.h" + +// this symbol will be resolved automatically from PyTorch libs +extern THCState *state; + +int nms_cuda(THCudaIntTensor *keep_out, THCudaTensor *boxes_host, + THCudaIntTensor *num_out, float nms_overlap_thresh) { + + nms_cuda_compute(THCudaIntTensor_data(state, keep_out), + THCudaIntTensor_data(state, num_out), + THCudaTensor_data(state, boxes_host), + boxes_host->size[0], + boxes_host->size[1], + nms_overlap_thresh); + + return 1; +} From 685bcde5d5c1a2dfee3c003b2e8ff189d0bbb901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:15:49 -0500 Subject: [PATCH 10/26] Remove import from __init__ --- detectron_pytorch/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/detectron_pytorch/__init__.py b/detectron_pytorch/__init__.py index 8f419d4a..043fa398 100644 --- a/detectron_pytorch/__init__.py +++ b/detectron_pytorch/__init__.py @@ -7,7 +7,5 @@ # ----------------------------------------------------------------------------- """Detectron PyTorch""" -from .lib import * - VERSION_INFO = (0, 1, 0, 'dev0') __version__ = '.'.join(map(str, VERSION_INFO)) From 239af90dd3dc18acc06eff7c38395223d53b31fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:17:19 -0500 Subject: [PATCH 11/26] Import debugging --- detectron_pytorch/nn/modules/normalization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/nn/modules/normalization.py b/detectron_pytorch/nn/modules/normalization.py index ae6df882..5e9eaf4a 100644 --- a/detectron_pytorch/nn/modules/normalization.py +++ b/detectron_pytorch/nn/modules/normalization.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -import nn.functional as myF +import detectron_pytorch.nn.functional as myF class GroupNorm(nn.Module): From fe2808377563b597ddff3f768ac2a3e98ec6fe5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:20:06 -0500 Subject: [PATCH 12/26] Import debugging --- detectron_pytorch/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/detectron_pytorch/__init__.py b/detectron_pytorch/__init__.py index 043fa398..027839ab 100644 --- a/detectron_pytorch/__init__.py +++ b/detectron_pytorch/__init__.py @@ -7,5 +7,7 @@ # ----------------------------------------------------------------------------- """Detectron PyTorch""" +from .nn import * + VERSION_INFO = (0, 1, 0, 'dev0') __version__ = '.'.join(map(str, VERSION_INFO)) From 577876a2d50e0a0c91302c5a3ea0d3e3ce987067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:20:56 -0500 Subject: [PATCH 13/26] Import debugging --- detectron_pytorch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/__init__.py b/detectron_pytorch/__init__.py index 027839ab..acda0fec 100644 --- a/detectron_pytorch/__init__.py +++ b/detectron_pytorch/__init__.py @@ -7,7 +7,7 @@ # ----------------------------------------------------------------------------- """Detectron PyTorch""" -from .nn import * +from . import nn VERSION_INFO = (0, 1, 0, 'dev0') __version__ = '.'.join(map(str, VERSION_INFO)) From df93e528cc98069822d53bb1b8bcac6c5222afbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:25:47 -0500 Subject: [PATCH 14/26] Import debugging --- detectron_pytorch/__init__.py | 2 -- detectron_pytorch/nn/modules/normalization.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/detectron_pytorch/__init__.py b/detectron_pytorch/__init__.py index acda0fec..043fa398 100644 --- a/detectron_pytorch/__init__.py +++ b/detectron_pytorch/__init__.py @@ -7,7 +7,5 @@ # ----------------------------------------------------------------------------- """Detectron PyTorch""" -from . import nn - VERSION_INFO = (0, 1, 0, 'dev0') __version__ = '.'.join(map(str, VERSION_INFO)) diff --git a/detectron_pytorch/nn/modules/normalization.py b/detectron_pytorch/nn/modules/normalization.py index 5e9eaf4a..d03bd396 100644 --- a/detectron_pytorch/nn/modules/normalization.py +++ b/detectron_pytorch/nn/modules/normalization.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -import detectron_pytorch.nn.functional as myF +import ..functional as myF class GroupNorm(nn.Module): From 36f304033b19472edc4d8be2573e1c52c57d55fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:26:29 -0500 Subject: [PATCH 15/26] Import debugging --- detectron_pytorch/nn/modules/normalization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/nn/modules/normalization.py b/detectron_pytorch/nn/modules/normalization.py index d03bd396..6e4ad6a7 100644 --- a/detectron_pytorch/nn/modules/normalization.py +++ b/detectron_pytorch/nn/modules/normalization.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -import ..functional as myF +from .. import functional as myF class GroupNorm(nn.Module): From 54d0dde10c491cc09ce04f5f3f4e545d8e947deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:27:34 -0500 Subject: [PATCH 16/26] Correct missing import --- detectron_pytorch/datasets/json_dataset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/datasets/json_dataset.py b/detectron_pytorch/datasets/json_dataset.py index 7e501200..b53c04cd 100644 --- a/detectron_pytorch/datasets/json_dataset.py +++ b/detectron_pytorch/datasets/json_dataset.py @@ -33,7 +33,7 @@ import scipy.sparse # Must happen before importing COCO API (which imports matplotlib) -import utils.env as envu +import detectron_pytorch.utils.env as envu envu.set_up_matplotlib() # COCO API from pycocotools import mask as COCOmask From 024313e5e9d784ad0b2861b0aca3c2a0bbd555b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:39:50 -0500 Subject: [PATCH 17/26] Add missing imports --- .../baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml | 0 .../baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-C4_1x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-C4_2x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml | 0 .../baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml | 0 .../baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml | 0 .../baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml | 0 .../baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml | 0 .../baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml | 0 .../baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml | 0 .../baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml | 0 .../baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml | 0 .../baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml | 0 .../e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-C4_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-C4_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-C4_2x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml | 0 .../baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml | 0 .../baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml | 0 .../baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml | 0 .../e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml | 0 .../tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 .../tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 .../tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 .../tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml | 0 .../gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml | 0 .../gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml | 0 .../gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml | 0 .../gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml | 0 .../scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml | 0 .../scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml | 0 detectron_pytorch/configs/__init__.py | 0 detectron_pytorch/core/test.py | 10 +++++----- detectron_pytorch/core/test_engine.py | 2 +- 43 files changed, 6 insertions(+), 6 deletions(-) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml (100%) rename {detectron_pytorch/configs => configs}/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml (100%) rename {detectron_pytorch/configs => configs}/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {detectron_pytorch/configs => configs}/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {detectron_pytorch/configs => configs}/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {detectron_pytorch/configs => configs}/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml (100%) rename {detectron_pytorch/configs => configs}/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml (100%) delete mode 100644 detectron_pytorch/configs/__init__.py diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml b/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml rename to configs/baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml b/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml rename to configs/baselines/e2e_faster_rcnn_R-101-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml b/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml rename to configs/baselines/e2e_faster_rcnn_R-50-C4_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml b/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml rename to configs/baselines/e2e_faster_rcnn_R-50-C4_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml b/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml rename to configs/baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml b/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml rename to configs/baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml b/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml rename to configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml b/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml rename to configs/baselines/e2e_faster_rcnn_X-101-32x8d-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml b/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml rename to configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml b/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml rename to configs/baselines/e2e_faster_rcnn_X-101-64x4d-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml b/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_R-101-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml b/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml b/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml b/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_R-50-FPN_s1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml b/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml b/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_X-101-32x8d-FPN_s1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml b/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml b/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml rename to configs/baselines/e2e_keypoint_rcnn_X-101-64x4d-FPN_s1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml b/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml rename to configs/baselines/e2e_mask_rcnn_R-101-C4_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml b/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml rename to configs/baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml b/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml rename to configs/baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml b/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml rename to configs/baselines/e2e_mask_rcnn_R-50-C4_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml b/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml rename to configs/baselines/e2e_mask_rcnn_R-50-C4_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml b/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml rename to configs/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml b/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml rename to configs/baselines/e2e_mask_rcnn_R-50-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml b/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml rename to configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml b/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml rename to configs/baselines/e2e_mask_rcnn_X-101-32x8d-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml b/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml rename to configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_1x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml b/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml rename to configs/baselines/e2e_mask_rcnn_X-101-64x4d-FPN_2x.yaml diff --git a/detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml b/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml similarity index 100% rename from detectron_pytorch/configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml rename to configs/baselines/e2e_mask_rcnn_X-152-32x8d-FPN-IN5k_1.44x.yaml diff --git a/detectron_pytorch/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml b/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from detectron_pytorch/configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/detectron_pytorch/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml b/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from detectron_pytorch/configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/detectron_pytorch/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml b/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from detectron_pytorch/configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to configs/getting_started/tutorial_4gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/detectron_pytorch/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml b/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml similarity index 100% rename from detectron_pytorch/configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml rename to configs/getting_started/tutorial_8gpu_e2e_faster_rcnn_R-50-FPN.yaml diff --git a/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml b/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml rename to configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_2x_gn.yaml diff --git a/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml b/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml rename to configs/gn_baselines/e2e_mask_rcnn_R-101-FPN_3x_gn.yaml diff --git a/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml b/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml rename to configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn.yaml diff --git a/detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml b/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml rename to configs/gn_baselines/e2e_mask_rcnn_R-50-FPN_3x_gn.yaml diff --git a/detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml b/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml rename to configs/gn_baselines/scratch_e2e_mask_rcnn_R-101-FPN_3x_gn.yaml diff --git a/detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml b/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml similarity index 100% rename from detectron_pytorch/configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml rename to configs/gn_baselines/scratch_e2e_mask_rcnn_R-50-FPN_3x_gn.yaml diff --git a/detectron_pytorch/configs/__init__.py b/detectron_pytorch/configs/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/detectron_pytorch/core/test.py b/detectron_pytorch/core/test.py index eac67355..34cb15fb 100644 --- a/detectron_pytorch/core/test.py +++ b/detectron_pytorch/core/test.py @@ -40,11 +40,11 @@ from core.config import cfg from utils.timer import Timer -import utils.boxes as box_utils -import utils.blob as blob_utils -import utils.fpn as fpn_utils -import utils.image as image_utils -import utils.keypoints as keypoint_utils +import detectron_pytorch.utils.boxes as box_utils +import detectron_pytorch.utils.blob as blob_utils +import detectron_pytorch.utils.fpn as fpn_utils +import detectron_pytorch.utils.image as image_utils +import detectron_pytorch.utils.keypoints as keypoint_utils def im_detect_all(model, im, box_proposals=None, timers=None): diff --git a/detectron_pytorch/core/test_engine.py b/detectron_pytorch/core/test_engine.py index b90aa6be..a3e2cfd4 100644 --- a/detectron_pytorch/core/test_engine.py +++ b/detectron_pytorch/core/test_engine.py @@ -20,7 +20,7 @@ from __future__ import print_function from __future__ import unicode_literals -from detectron_pytorch.collections import defaultdict +from collections import defaultdict import cv2 import datetime import logging From 82706ad88d03abce57e1f43b376a2b9020397345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:43:04 -0500 Subject: [PATCH 18/26] More import corrections --- detectron_pytorch/core/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detectron_pytorch/core/test.py b/detectron_pytorch/core/test.py index 34cb15fb..3c73a722 100644 --- a/detectron_pytorch/core/test.py +++ b/detectron_pytorch/core/test.py @@ -38,8 +38,8 @@ from torch.autograd import Variable import torch -from core.config import cfg -from utils.timer import Timer +from detectron_pytorch.core.config import cfg +from detectron_pytorch.utils.timer import Timer import detectron_pytorch.utils.boxes as box_utils import detectron_pytorch.utils.blob as blob_utils import detectron_pytorch.utils.fpn as fpn_utils From 091fa52e5a82d41abd3506ad2a8faae990507fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:48:18 -0500 Subject: [PATCH 19/26] More import corrections --- detectron_pytorch/utils/logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/utils/logging.py b/detectron_pytorch/utils/logging.py index 518426c2..9e0959b8 100644 --- a/detectron_pytorch/utils/logging.py +++ b/detectron_pytorch/utils/logging.py @@ -28,7 +28,7 @@ import smtplib import sys -from core.config import cfg +from detectron_pytorch.core.config import cfg # Print lower precision floating point values than default FLOAT_REPR # Note! Has no use for json encode with C speedups From 8dd01f4a09a762c7d3de655f4cfcc999fe90d32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:49:06 -0500 Subject: [PATCH 20/26] More import corrections --- detectron_pytorch/tools/test_net.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/tools/test_net.py b/detectron_pytorch/tools/test_net.py index 66c9b320..ba035a04 100644 --- a/detectron_pytorch/tools/test_net.py +++ b/detectron_pytorch/tools/test_net.py @@ -12,7 +12,7 @@ from detectron_pytorch.core.config import ( cfg, merge_cfg_from_file, merge_cfg_from_list, assert_and_infer_cfg) from detectron_pytorch.core.test_engine import run_inference -import utils.logging +import detectron_pytorch.utils.logging # OpenCL may be enabled by default in OpenCV3; disable it because it's not # thread safe and causes unwanted GPU memory allocations. From e2d9ec9de6d618d8f1278e4265ead21578e8f8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 19:50:38 -0500 Subject: [PATCH 21/26] More import corrections --- detectron_pytorch/tools/test_net.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/tools/test_net.py b/detectron_pytorch/tools/test_net.py index ba035a04..d38005a2 100644 --- a/detectron_pytorch/tools/test_net.py +++ b/detectron_pytorch/tools/test_net.py @@ -63,7 +63,7 @@ def parse_args(): if not torch.cuda.is_available(): sys.exit("Need a CUDA device to run the code.") - logger = utils.logging.setup_logging(__name__) + logger = detectron_pytorch.utils.logging.setup_logging(__name__) args = parse_args() logger.info('Called with args:') logger.info(args) From a7101693f04f5e2858d03b982e9ef50f6036b18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 20:06:06 -0500 Subject: [PATCH 22/26] Update README --- README.md | 30 +++++++++++++++--------------- setup.py | 3 ++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a2b4a5e4..27c9354f 100644 --- a/README.md +++ b/README.md @@ -78,11 +78,11 @@ Tested under python3. Compile the CUDA code: ``` -cd lib # please change to this directory -sh make.sh +export CUDA_PATH=/usr/local/cuda # Or any other custom location +python setup.py build_static ``` -If your are using Volta GPUs, uncomment this [line](https://github.com/roytseng-tw/mask-rcnn.pytorch/tree/master/lib/make.sh#L15) in `lib/mask.sh` and remember to postpend a backslash at the line above. `CUDA_PATH` defaults to `/usr/loca/cuda`. If you want to use a CUDA library on different path, change this [line](https://github.com/roytseng-tw/mask-rcnn.pytorch/tree/master/lib/make.sh#L3) accordingly. +If your are using Volta GPUs, uncomment this [line](https://github.com/roytseng-tw/mask-rcnn.pytorch/tree/master/lib/make.sh#L15) in `lib/mask.sh` and remember to postpend a backslash at the line above. `CUDA_PATH` defaults to `/usr/loca/cuda`. It will compile all the modules you need, including NMS, ROI_Pooing, ROI_Crop and ROI_Align. (Actually gpu nms is never used ...) @@ -144,7 +144,7 @@ You can the following command to download them all: - extra required packages: `argparse_color_formater`, `colorama`, `requests` ``` -python tools/download_imagenet_weights.py +python -m detectron_pytorch.tools.download_imagenet_weights ``` **NOTE**: Caffe pretrained weights have slightly better performance than Pytorch pretrained. Suggest to use Caffe pretrained models from the above link to reproduce the results. By the way, Detectron also use pretrained weights from Caffe. @@ -193,7 +193,7 @@ Following config options will be adjusted **automatically** according to actual ### Train from scratch Take mask-rcnn with res50 backbone for example. ``` -python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers} +python -m detectron_pytorch.tools.train_net_step --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers} ``` Use `--bs` to overwrite the default batch size to a proper value that fits into your GPUs. Simliar for `--nw`, number of data loader threads defaults to 4 in config.py. @@ -206,17 +206,17 @@ Specify `—-use_tfboard` to log the losses on Tensorboard. As in Caffe, update network once (`optimizer.step()`) every `iter_size` iterations (forward + backward). This way to have a larger effective batch size for training. Notice that, step count is only increased after network update. ``` -python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --bs 4 --iter_size 4 +python -m detectron_pytorch.tools.train_net_step --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --bs 4 --iter_size 4 ``` `iter_size` defaults to 1. ### Finetune from a pretrained checkpoint ``` -python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint} +python -m detectron_pytorch.tools.train_net_step ... --load_ckpt {path/to/the/checkpoint} ``` or using Detectron's checkpoint file ``` -python tools/train_net_step.py ... --load_detectron {path/to/the/checkpoint} +python -m detectron_pytorch.tools.train_net_step ... --load_detectron {path/to/the/checkpoint} ``` ### Resume training with the same dataset and batch size @@ -229,24 +229,24 @@ When resume the training, **step count** and **optimizer state** will also be re ### Set config options in command line ``` - python tools/train_net_step.py ... --no_save --set {config.name1} {value1} {config.name2} {value2} ... + python -m detectron_pytorch.tools.train_net_step ... --no_save --set {config.name1} {value1} {config.name2} {value2} ... ``` - For Example, run for debugging. ``` - python tools/train_net_step.py ... --no_save --set DEBUG True + python -m detectron_pytorch.tools.train_net_step ... --no_save --set DEBUG True ``` Load less annotations to accelarate training progress. Add `--no_save` to avoid saving any checkpoint or logging. ### Show command line help messages ``` -python train_net_step.py --help +python -m detectron_pytorch.tools.train_net_step --help ``` ### Two Training Scripts -In short, use `train_net_step.py`. +In short, use `detectron_pytorch.tools.train_net_step`. -In `train_net_step.py`: +In `detectron_pytorch.tools.train_net_step`: - `SOLVER.LR_POLICY: steps_with_decay` is supported. - Training warm up in [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677) is supported. @@ -268,7 +268,7 @@ In `train_net_step.py`: ### Evaluate the training results For example, test mask-rcnn on coco2017 val set ``` -python tools/test_net.py --dataset coco2017 --cfg config/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint} +python -m detectron_pytorch.tools.test_net --dataset coco2017 --cfg config/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint} ``` Use `--load_detectron` to load Detectron's checkpoint. If multiple gpus are available, add `--multi-gpu-testing`. @@ -276,7 +276,7 @@ Specify a different output directry, use `--output_dir {...}`. Defaults to `{the ### Visualize the training results on images ``` -python tools/infer_simple.py --dataset coco --cfg cfgs/baselines/e2e_mask_rcnn_R-50-C4.yml --load_ckpt {path/to/your/checkpoint} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations} +python -m detectron_pytorch.tools.infer_simple --dataset coco --cfg cfgs/baselines/e2e_mask_rcnn_R-50-C4.yml --load_ckpt {path/to/your/checkpoint} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations} ``` `--output_dir` defaults to `infer_outputs`. diff --git a/setup.py b/setup.py index 0e401e1b..d4b024b3 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,8 @@ def get_description(): REQUIREMENTS = ['pytorch', 'torchvision', 'cython', 'matplotlib', 'numpy', 'scipy', 'opencv-python', - 'pyyaml', 'packaging', 'pycocotools'] + 'pyyaml', 'packaging', 'pycocotools' + 'argparse_color_formatter'] cmdclass = { 'build_static': BuildStatic, From 6cb1dbe0029ce2b24bc9e941e5fd3208a7e2b6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 20:14:05 -0500 Subject: [PATCH 23/26] More import corrections --- .../collect_and_distribute_fpn_rpn_proposals.py | 10 +++++----- .../modeling/generate_proposal_labels.py | 6 +++--- detectron_pytorch/roi_data/fast_rcnn.py | 10 +++++----- detectron_pytorch/roi_data/minibatch.py | 11 ++++++----- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py b/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py index e70a66ab..3718edd5 100644 --- a/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py +++ b/detectron_pytorch/modeling/collect_and_distribute_fpn_rpn_proposals.py @@ -3,7 +3,7 @@ from detectron_pytorch.core.config import cfg from detectron_pytorch.datasets import json_dataset -import detectron_pytorch.roi_data.fast_rcnn +import detectron_pytorch.roi_data.fast_rcnn as fast_rcnn import detectron_pytorch.utils.blob as blob_utils import detectron_pytorch.utils.fpn as fpn_utils @@ -58,9 +58,9 @@ def forward(self, inputs, roidb, im_info): json_dataset.add_proposals(roidb, rois, im_scales, crowd_thresh=0) # Compute training labels for the RPN proposals; also handles # distributing the proposals over FPN levels - output_blob_names = roi_data.fast_rcnn.get_fast_rcnn_blob_names() + output_blob_names = fast_rcnn.get_fast_rcnn_blob_names() blobs = {k: [] for k in output_blob_names} - roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) + fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) else: # For inference we have a special code path that avoids some data # loader overhead @@ -89,7 +89,7 @@ def collect(inputs, is_training): def distribute(rois, label_blobs): """To understand the output blob order see return value of - roi_data.fast_rcnn.get_fast_rcnn_blob_names(is_training=False) + fast_rcnn.get_fast_rcnn_blob_names(is_training=False) """ lvl_min = cfg.FPN.ROI_MIN_LEVEL lvl_max = cfg.FPN.ROI_MAX_LEVEL @@ -100,7 +100,7 @@ def distribute(rois, label_blobs): # rois = np.delete(rois, idx_neg, axis=0) # lvls = np.delete(lvls, idx_neg, axis=0) - output_blob_names = roi_data.fast_rcnn.get_fast_rcnn_blob_names(is_training=False) + output_blob_names = fast_rcnn.get_fast_rcnn_blob_names(is_training=False) outputs = [None] * len(output_blob_names) outputs[0] = rois diff --git a/detectron_pytorch/modeling/generate_proposal_labels.py b/detectron_pytorch/modeling/generate_proposal_labels.py index ed0661fa..7b4b483d 100644 --- a/detectron_pytorch/modeling/generate_proposal_labels.py +++ b/detectron_pytorch/modeling/generate_proposal_labels.py @@ -2,7 +2,7 @@ from detectron_pytorch.core.config import cfg from detectron_pytorch.datasets import json_dataset -import detectron_pytorch.roi_data.fast_rcnn +import detectron_pytorch.roi_data.fast_rcnn as fast_rcnn class GenerateProposalLabelsOp(nn.Module): @@ -26,7 +26,7 @@ def forward(self, rpn_rois, roidb, im_info): """ im_scales = im_info.data.numpy()[:, 2] - output_blob_names = roi_data.fast_rcnn.get_fast_rcnn_blob_names() + output_blob_names = fast_rcnn.get_fast_rcnn_blob_names() # For historical consistency with the original Faster R-CNN # implementation we are *not* filtering crowd proposals. # This choice should be investigated in the future (it likely does @@ -34,6 +34,6 @@ def forward(self, rpn_rois, roidb, im_info): # Note: crowd_thresh=0 will ignore _filter_crowd_proposals json_dataset.add_proposals(roidb, rpn_rois, im_scales, crowd_thresh=0) blobs = {k: [] for k in output_blob_names} - detectron_pytorch.roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) + fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) return blobs diff --git a/detectron_pytorch/roi_data/fast_rcnn.py b/detectron_pytorch/roi_data/fast_rcnn.py index f986196c..9f321da6 100644 --- a/detectron_pytorch/roi_data/fast_rcnn.py +++ b/detectron_pytorch/roi_data/fast_rcnn.py @@ -26,8 +26,8 @@ import numpy.random as npr from detectron_pytorch.core.config import cfg -import detectron_pytorch.roi_data.keypoint_rcnn -import detectron_pytorch.roi_data.mask_rcnn +import detectron_pytorch.roi_data.keypoint_rcnn as keypoint_rcnn +import detectron_pytorch.roi_data.mask_rcnn as mask_rcnn import detectron_pytorch.utils.boxes as box_utils import detectron_pytorch.utils.blob as blob_utils import detectron_pytorch.utils.fpn as fpn_utils @@ -192,12 +192,12 @@ def _sample_rois(roidb, im_scale, batch_idx): # Optionally add Mask R-CNN blobs if cfg.MODEL.MASK_ON: - roi_data.mask_rcnn.add_mask_rcnn_blobs(blob_dict, sampled_boxes, roidb, - im_scale, batch_idx) + mask_rcnn.add_mask_rcnn_blobs(blob_dict, sampled_boxes, roidb, + im_scale, batch_idx) # Optionally add Keypoint R-CNN blobs if cfg.MODEL.KEYPOINTS_ON: - roi_data.keypoint_rcnn.add_keypoint_rcnn_blobs( + keypoint_rcnn.add_keypoint_rcnn_blobs( blob_dict, roidb, fg_rois_per_image, fg_inds, im_scale, batch_idx) return blob_dict diff --git a/detectron_pytorch/roi_data/minibatch.py b/detectron_pytorch/roi_data/minibatch.py index 041f49a4..0f52e7f2 100644 --- a/detectron_pytorch/roi_data/minibatch.py +++ b/detectron_pytorch/roi_data/minibatch.py @@ -3,7 +3,8 @@ from detectron_pytorch.core.config import cfg import detectron_pytorch.utils.blob as blob_utils -import detectron_pytorch.roi_data.rpn +import detectron_pytorch.roi_data.rpn as rpn +import detectron_pytorch.roi_data.fast_rcnn as fast_rcnn def get_minibatch_blob_names(is_training=True): @@ -13,12 +14,12 @@ def get_minibatch_blob_names(is_training=True): blob_names = ['data'] if cfg.RPN.RPN_ON: # RPN-only or end-to-end Faster R-CNN - blob_names += roi_data.rpn.get_rpn_blob_names(is_training=is_training) + blob_names += rpn.get_rpn_blob_names(is_training=is_training) elif cfg.RETINANET.RETINANET_ON: raise NotImplementedError else: # Fast R-CNN like models trained on precomputed proposals - blob_names += roi_data.fast_rcnn.get_fast_rcnn_blob_names( + blob_names += fast_rcnn.get_fast_rcnn_blob_names( is_training=is_training ) return blob_names @@ -35,12 +36,12 @@ def get_minibatch(roidb): blobs['data'] = im_blob if cfg.RPN.RPN_ON: # RPN-only or end-to-end Faster/Mask R-CNN - valid = roi_data.rpn.add_rpn_blobs(blobs, im_scales, roidb) + valid = rpn.add_rpn_blobs(blobs, im_scales, roidb) elif cfg.RETINANET.RETINANET_ON: raise NotImplementedError else: # Fast R-CNN like models trained on precomputed proposals - valid = roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) + valid = fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) return blobs, valid From 0358431890fd86badd88d20e06bd3298cd15de17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 12 Jun 2018 20:33:36 -0500 Subject: [PATCH 24/26] More import corrections --- detectron_pytorch/roi_data/fast_rcnn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/roi_data/fast_rcnn.py b/detectron_pytorch/roi_data/fast_rcnn.py index 9f321da6..9f8e21e5 100644 --- a/detectron_pytorch/roi_data/fast_rcnn.py +++ b/detectron_pytorch/roi_data/fast_rcnn.py @@ -121,7 +121,7 @@ def add_fast_rcnn_blobs(blobs, im_scales, roidb): # all minibatch images valid = True if cfg.MODEL.KEYPOINTS_ON: - valid = roi_data.keypoint_rcnn.finalize_keypoint_minibatch(blobs, valid) + valid = keypoint_rcnn.finalize_keypoint_minibatch(blobs, valid) return valid From 1b11c26e312984c0b32b88f4d1b7cf93297e3437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Wed, 13 Jun 2018 00:06:45 -0500 Subject: [PATCH 25/26] Update model_builder --- detectron_pytorch/modeling/model_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detectron_pytorch/modeling/model_builder.py b/detectron_pytorch/modeling/model_builder.py index 550eb720..d510020b 100644 --- a/detectron_pytorch/modeling/model_builder.py +++ b/detectron_pytorch/modeling/model_builder.py @@ -35,7 +35,7 @@ def get_func(func_name): if len(parts) == 1: return globals()[parts[0]] # Otherwise, assume we're referencing a module under modeling - module_name = 'modeling.' + '.'.join(parts[:-1]) + module_name = 'detectron_pytorch.modeling.' + '.'.join(parts[:-1]) module = importlib.import_module(module_name) return getattr(module, parts[-1]) except Exception: From 929314fdc2dec94c58bb61a15c89ca8738604240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Tue, 19 Jun 2018 15:28:58 -0500 Subject: [PATCH 26/26] Minor typo correction --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d4b024b3..2083356b 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ def get_description(): REQUIREMENTS = ['pytorch', 'torchvision', 'cython', 'matplotlib', 'numpy', 'scipy', 'opencv-python', - 'pyyaml', 'packaging', 'pycocotools' + 'pyyaml', 'packaging', 'pycocotools', 'argparse_color_formatter'] cmdclass = {