Commit e5bb3a8f authored by Ilija Radosavovic's avatar Ilija Radosavovic Committed by Facebook Github Bot

Encapsulate detectron code in a package

Reviewed By: rbgirshick

Differential Revision: D7516523

fbshipit-source-id: 7c67f82c7ce6f79a66b0bdea0770d2d00735e38f
parent 25d9e240
...@@ -7,7 +7,7 @@ __pycache__/ ...@@ -7,7 +7,7 @@ __pycache__/
*.so *.so
# Distribution / packaging # Distribution / packaging
lib/build/ build/
*.egg-info/ *.egg-info/
*.egg *.egg
...@@ -17,8 +17,8 @@ lib/build/ ...@@ -17,8 +17,8 @@ lib/build/
*.swp *.swp
# Dataset symlinks # Dataset symlinks
lib/datasets/data/* detectron/datasets/data/*
!lib/datasets/data/README.md !detectron/datasets/data/README.md
# Generated C files # Generated C files
lib/utils/cython_*.c detectron/utils/cython_*.c
...@@ -26,8 +26,8 @@ include(cmake/Summary.cmake) ...@@ -26,8 +26,8 @@ include(cmake/Summary.cmake)
detectron_print_config_summary() detectron_print_config_summary()
# Collect custom ops sources. # Collect custom ops sources.
file(GLOB CUSTOM_OPS_CPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/ops/*.cc) file(GLOB CUSTOM_OPS_CPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/detectron/ops/*.cc)
file(GLOB CUSTOM_OPS_GPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/ops/*.cu) file(GLOB CUSTOM_OPS_GPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/detectron/ops/*.cu)
# Install custom CPU ops lib. # Install custom CPU ops lib.
add_library( add_library(
......
...@@ -23,7 +23,7 @@ Also potentially relevant: inference with Mask R-CNN on high-resolution images m ...@@ -23,7 +23,7 @@ Also potentially relevant: inference with Mask R-CNN on high-resolution images m
#### Q: How do I implement a custom Caffe2 CPU or GPU operator for use in Detectron? #### Q: How do I implement a custom Caffe2 CPU or GPU operator for use in Detectron?
**A:** Detectron uses a number of specialized Caffe2 operators that are distributed via the [Caffe2 Detectron module](https://github.com/caffe2/caffe2/tree/master/modules/detectron) as part of the core Caffe2 GitHub repository. If you'd like to implement a custom Caffe2 operator for your project, we have written a toy example illustrating how to add an operator under the Detectron source tree; please see [`lib/ops/zero_even_op.*`](lib/ops/) and [`tests/test_zero_even_op.py`](tests/test_zero_even_op.py). For more background on writing Caffe2 operators please consult the [Caffe2 documentation](https://caffe2.ai/docs/custom-operators.html). **A:** Detectron uses a number of specialized Caffe2 operators that are distributed via the [Caffe2 Detectron module](https://github.com/caffe2/caffe2/tree/master/modules/detectron) as part of the core Caffe2 GitHub repository. If you'd like to implement a custom Caffe2 operator for your project, we have written a toy example illustrating how to add an operator under the Detectron source tree; please see [`detectron/ops/zero_even_op.*`](detectron/ops/) and [`detectron/tests/test_zero_even_op.py`](detectron/tests/test_zero_even_op.py). For more background on writing Caffe2 operators please consult the [Caffe2 documentation](https://caffe2.ai/docs/custom-operators.html).
#### Q: How do I use Detectron to train a model on a custom dataset? #### Q: How do I use Detectron to train a model on a custom dataset?
......
...@@ -66,13 +66,13 @@ git clone https://github.com/facebookresearch/detectron $DETECTRON ...@@ -66,13 +66,13 @@ git clone https://github.com/facebookresearch/detectron $DETECTRON
Set up Python modules: Set up Python modules:
``` ```
cd $DETECTRON/lib && make cd $DETECTRON && make
``` ```
Check that Detectron tests pass (e.g. for [`SpatialNarrowAsOp test`](tests/test_spatial_narrow_as_op.py)): Check that Detectron tests pass (e.g. for [`SpatialNarrowAsOp test`](tests/test_spatial_narrow_as_op.py)):
``` ```
python2 $DETECTRON/tests/test_spatial_narrow_as_op.py python2 $DETECTRON/detectron/tests/test_spatial_narrow_as_op.py
``` ```
## That's All You Need for Inference ## That's All You Need for Inference
...@@ -81,7 +81,7 @@ At this point, you can run inference using pretrained Detectron models. Take a l ...@@ -81,7 +81,7 @@ At this point, you can run inference using pretrained Detectron models. Take a l
## Datasets ## Datasets
Detectron finds datasets via symlinks from `lib/datasets/data` to the actual locations where the dataset images and annotations are stored. For instructions on how to create symlinks for COCO and other datasets, please see [`lib/datasets/data/README.md`](lib/datasets/data/README.md). Detectron finds datasets via symlinks from `detectron/datasets/data` to the actual locations where the dataset images and annotations are stored. For instructions on how to create symlinks for COCO and other datasets, please see [`detectron/datasets/data/README.md`](detectron/datasets/data/README.md).
After symlinks have been created, that's all you need to start training models. After symlinks have been created, that's all you need to start training models.
...@@ -90,18 +90,18 @@ After symlinks have been created, that's all you need to start training models. ...@@ -90,18 +90,18 @@ After symlinks have been created, that's all you need to start training models.
Please read the custom operators section of the [`FAQ`](FAQ.md) first. Please read the custom operators section of the [`FAQ`](FAQ.md) first.
For convenience, we provide CMake support for building custom operators. All custom operators are built into a single library that can be loaded dynamically from Python. For convenience, we provide CMake support for building custom operators. All custom operators are built into a single library that can be loaded dynamically from Python.
Place your custom operator implementation under [`lib/ops/`](lib/ops/) and see [`tests/test_zero_even_op.py`](tests/test_zero_even_op.py) for an example of how to load custom operators from Python. Place your custom operator implementation under [`detectron/ops/`](detectron/ops/) and see [`detectron/tests/test_zero_even_op.py`](detectron/tests/test_zero_even_op.py) for an example of how to load custom operators from Python.
Build the custom operators library: Build the custom operators library:
``` ```
cd $DETECTRON/lib && make ops cd $DETECTRON && make ops
``` ```
Check that the custom operator tests pass: Check that the custom operator tests pass:
``` ```
python2 $DETECTRON/tests/test_zero_even_op.py python2 $DETECTRON/detectron/tests/test_zero_even_op.py
``` ```
## Docker Image ## Docker Image
...@@ -118,7 +118,7 @@ docker build -t detectron:c2-cuda9-cudnn7 . ...@@ -118,7 +118,7 @@ docker build -t detectron:c2-cuda9-cudnn7 .
Run the image (e.g. for [`BatchPermutationOp test`](tests/test_batch_permutation_op.py)): Run the image (e.g. for [`BatchPermutationOp test`](tests/test_batch_permutation_op.py)):
``` ```
nvidia-docker run --rm -it detectron:c2-cuda9-cudnn7 python2 tests/test_batch_permutation_op.py nvidia-docker run --rm -it detectron:c2-cuda9-cudnn7 python2 detectron/tests/test_batch_permutation_op.py
``` ```
## Troubleshooting ## Troubleshooting
...@@ -149,7 +149,7 @@ cmake .. \ ...@@ -149,7 +149,7 @@ cmake .. \
Similarly, when building custom Detectron operators you can use: Similarly, when building custom Detectron operators you can use:
``` ```
cd $DETECTRON/lib cd $DETECTRON
mkdir -p build && cd build mkdir -p build && cd build
cmake .. \ cmake .. \
-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda/toolkit/dir \ -DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda/toolkit/dir \
......
...@@ -19,8 +19,8 @@ include(cmake/Summary.cmake) ...@@ -19,8 +19,8 @@ include(cmake/Summary.cmake)
detectron_print_config_summary() detectron_print_config_summary()
# Collect custom ops sources. # Collect custom ops sources.
file(GLOB CUSTOM_OPS_CPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/ops/*.cc) file(GLOB CUSTOM_OPS_CPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/detectron/ops/*.cc)
file(GLOB CUSTOM_OPS_GPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/ops/*.cu) file(GLOB CUSTOM_OPS_GPU_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/detectron/ops/*.cu)
# Install custom CPU ops lib. # Install custom CPU ops lib.
add_library( add_library(
......
...@@ -43,8 +43,8 @@ from __future__ import print_function ...@@ -43,8 +43,8 @@ from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from ast import literal_eval from ast import literal_eval
from future.utils import iteritems
from past.builtins import basestring from past.builtins import basestring
from utils.collections import AttrDict
import copy import copy
import logging import logging
import numpy as np import numpy as np
...@@ -52,13 +52,14 @@ import os ...@@ -52,13 +52,14 @@ import os
import os.path as osp import os.path as osp
import yaml import yaml
from utils.io import cache_url from detectron.utils.collections import AttrDict
from detectron.utils.io import cache_url
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
__C = AttrDict() __C = AttrDict()
# Consumers can get config by: # Consumers can get config by:
# from core.config import cfg # from detectron.core.config import cfg
cfg = __C cfg = __C
...@@ -1000,6 +1001,7 @@ _DEPCRECATED_KEYS = set( ...@@ -1000,6 +1001,7 @@ _DEPCRECATED_KEYS = set(
} }
) )
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
# Renamed options # Renamed options
# If you rename a config option, record the mapping from the old name to the new # If you rename a config option, record the mapping from the old name to the new
...@@ -1044,6 +1046,17 @@ _RENAMED_KEYS = { ...@@ -1044,6 +1046,17 @@ _RENAMED_KEYS = {
} }
# ---------------------------------------------------------------------------- #
# Renamed modules
# If a module containing a data structure used in the config (e.g. AttrDict)
# is renamed/moved and you don't want to break loading of existing yaml configs
# (e.g. from weights files) you can specify the renamed module below.
# ---------------------------------------------------------------------------- #
_RENAMED_MODULES = {
'utils.collections': 'detectron.utils.collections',
}
def assert_and_infer_cfg(cache_urls=True, make_immutable=True): def assert_and_infer_cfg(cache_urls=True, make_immutable=True):
"""Call this function in your script after you have finished setting all cfg """Call this function in your script after you have finished setting all cfg
values that are necessary (e.g., merging a config from a file, merging values that are necessary (e.g., merging a config from a file, merging
...@@ -1090,10 +1103,24 @@ def get_output_dir(datasets, training=True): ...@@ -1090,10 +1103,24 @@ def get_output_dir(datasets, training=True):
return outdir return outdir
def load_cfg(cfg_to_load):
"""Wrapper around yaml.load used for maintaining backward compatibility"""
assert isinstance(cfg_to_load, (file, basestring)), \
'Expected {} or {} got {}'.format(file, basestring, type(cfg_to_load))
if isinstance(cfg_to_load, file):
cfg_to_load = ''.join(cfg_to_load.readlines())
if isinstance(cfg_to_load, basestring):
for old_module, new_module in iteritems(_RENAMED_MODULES):
# yaml object encoding: !!python/object/new:<module>.<object>
old_module, new_module = 'new:' + old_module, 'new:' + new_module
cfg_to_load = cfg_to_load.replace(old_module, new_module)
return yaml.load(cfg_to_load)
def merge_cfg_from_file(cfg_filename): def merge_cfg_from_file(cfg_filename):
"""Load a yaml config file and merge it into the global config.""" """Load a yaml config file and merge it into the global config."""
with open(cfg_filename, 'r') as f: with open(cfg_filename, 'r') as f:
yaml_cfg = AttrDict(yaml.load(f)) yaml_cfg = AttrDict(load_cfg(f))
_merge_a_into_b(yaml_cfg, __C) _merge_a_into_b(yaml_cfg, __C)
...@@ -1130,8 +1157,10 @@ def _merge_a_into_b(a, b, stack=None): ...@@ -1130,8 +1157,10 @@ def _merge_a_into_b(a, b, stack=None):
"""Merge config dictionary a into config dictionary b, clobbering the """Merge config dictionary a into config dictionary b, clobbering the
options in b whenever they are also specified in a. options in b whenever they are also specified in a.
""" """
assert isinstance(a, AttrDict), 'Argument `a` must be an AttrDict' assert isinstance(a, AttrDict), \
assert isinstance(b, AttrDict), 'Argument `b` must be an AttrDict' '`a` (cur type {}) must be an instance of {}'.format(type(a), AttrDict)
assert isinstance(b, AttrDict), \
'`b` (cur type {}) must be an instance of {}'.format(type(b), AttrDict)
for k, v_ in a.items(): for k, v_ in a.items():
full_key = '.'.join(stack) + '.' + k if stack is not None else k full_key = '.'.join(stack) + '.' + k if stack is not None else k
......
...@@ -38,17 +38,17 @@ import yaml ...@@ -38,17 +38,17 @@ import yaml
from caffe2.python import core from caffe2.python import core
from caffe2.python import workspace from caffe2.python import workspace
from core.config import cfg from detectron.core.config import cfg
from datasets import task_evaluation from detectron.datasets import task_evaluation
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
from modeling import model_builder from detectron.modeling import model_builder
from utils.io import save_object from detectron.utils.io import save_object
from utils.timer import Timer from detectron.utils.timer import Timer
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
import utils.env as envu import detectron.utils.env as envu
import utils.net as nu import detectron.utils.net as nu
import utils.subprocess as subprocess_utils import detectron.utils.subprocess as subprocess_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -37,14 +37,14 @@ from caffe2.python import core ...@@ -37,14 +37,14 @@ from caffe2.python import core
from caffe2.python import workspace from caffe2.python import workspace
import pycocotools.mask as mask_util import pycocotools.mask as mask_util
from core.config import cfg from detectron.core.config import cfg
from utils.timer import Timer from detectron.utils.timer import Timer
import core.test_retinanet as test_retinanet import detectron.core.test_retinanet as test_retinanet
import modeling.FPN as fpn import detectron.modeling.FPN as fpn
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
import utils.image as image_utils import detectron.utils.image as image_utils
import utils.keypoints as keypoint_utils import detectron.utils.keypoints as keypoint_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -30,21 +30,21 @@ import yaml ...@@ -30,21 +30,21 @@ import yaml
from caffe2.python import workspace from caffe2.python import workspace
from core.config import cfg from detectron.core.config import cfg
from core.config import get_output_dir from detectron.core.config import get_output_dir
from core.rpn_generator import generate_rpn_on_dataset from detectron.core.rpn_generator import generate_rpn_on_dataset
from core.rpn_generator import generate_rpn_on_range from detectron.core.rpn_generator import generate_rpn_on_range
from core.test import im_detect_all from detectron.core.test import im_detect_all
from datasets import task_evaluation from detectron.datasets import task_evaluation
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
from modeling import model_builder from detectron.modeling import model_builder
from utils.io import save_object from detectron.utils.io import save_object
from utils.timer import Timer from detectron.utils.timer import Timer
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
import utils.env as envu import detectron.utils.env as envu
import utils.net as net_utils import detectron.utils.net as net_utils
import utils.subprocess as subprocess_utils import detectron.utils.subprocess as subprocess_utils
import utils.vis as vis_utils import detectron.utils.vis as vis_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -26,12 +26,11 @@ from collections import defaultdict ...@@ -26,12 +26,11 @@ from collections import defaultdict
from caffe2.python import core, workspace from caffe2.python import core, workspace
from core.config import cfg from detectron.core.config import cfg
from modeling.generate_anchors import generate_anchors from detectron.modeling.generate_anchors import generate_anchors
from utils.timer import Timer from detectron.utils.timer import Timer
import detectron.utils.blob as blob_utils
import utils.blob as blob_utils import detectron.utils.boxes as box_utils
import utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -12,8 +12,8 @@ import sys ...@@ -12,8 +12,8 @@ import sys
import cityscapesscripts.evaluation.instances2dict_with_polygons as cs import cityscapesscripts.evaluation.instances2dict_with_polygons as cs
import utils.segms as segms_util import detectron.utils.segms as segms_util
import utils.boxes as bboxs_util import detectron.utils.boxes as bboxs_util
def parse_args(): def parse_args():
......
...@@ -8,13 +8,13 @@ from __future__ import division ...@@ -8,13 +8,13 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
import cPickle as pickle
import argparse import argparse
import cPickle as pickle
import numpy as np
import os import os
import sys import sys
import numpy as np
import datasets.cityscapes.coco_to_cityscapes_id as cs import detectron.datasets.cityscapes.coco_to_cityscapes_id as cs
NUM_CS_CLS = 9 NUM_CS_CLS = 9
NUM_COCO_CLS = 81 NUM_COCO_CLS = 81
......
...@@ -27,9 +27,9 @@ import uuid ...@@ -27,9 +27,9 @@ import uuid
import pycocotools.mask as mask_util import pycocotools.mask as mask_util
from core.config import cfg from detectron.core.config import cfg
from datasets.dataset_catalog import DATASETS from detectron.datasets.dataset_catalog import DATASETS
from datasets.dataset_catalog import RAW_DIR from detectron.datasets.dataset_catalog import RAW_DIR
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -7,7 +7,7 @@ This directory contains symlinks to data locations. ...@@ -7,7 +7,7 @@ This directory contains symlinks to data locations.
Symlink the COCO dataset: Symlink the COCO dataset:
``` ```
ln -s /path/to/coco $DETECTRON/lib/datasets/data/coco ln -s /path/to/coco $DETECTRON/detectron/datasets/data/coco
``` ```
We assume that your local COCO dataset copy at `/path/to/coco` has the following directory structure: We assume that your local COCO dataset copy at `/path/to/coco` has the following directory structure:
...@@ -28,10 +28,10 @@ coco ...@@ -28,10 +28,10 @@ coco
If that is not the case, you may need to do something similar to: If that is not the case, you may need to do something similar to:
``` ```
mkdir -p $DETECTRON/lib/datasets/data/coco mkdir -p $DETECTRON/detectron/datasets/data/coco
ln -s /path/to/coco_train2014 $DETECTRON/lib/datasets/data/coco/ ln -s /path/to/coco_train2014 $DETECTRON/detectron/datasets/data/coco/
ln -s /path/to/coco_val2014 $DETECTRON/lib/datasets/data/coco/ ln -s /path/to/coco_val2014 $DETECTRON/detectron/datasets/data/coco/
ln -s /path/to/json/annotations $DETECTRON/lib/datasets/data/coco/annotations ln -s /path/to/json/annotations $DETECTRON/detectron/datasets/data/coco/annotations
``` ```
### COCO Minival Annotations ### COCO Minival Annotations
...@@ -42,7 +42,7 @@ Similarly, the union of `valminusminival` and the 2014 `train` is exactly equiva ...@@ -42,7 +42,7 @@ Similarly, the union of `valminusminival` and the 2014 `train` is exactly equiva
## Creating Symlinks for PASCAL VOC ## Creating Symlinks for PASCAL VOC
We assume that your symlinked `lib/datasets/data/VOC<year>` directory has the following structure: We assume that your symlinked `detectron/datasets/data/VOC<year>` directory has the following structure:
``` ```
VOC<year> VOC<year>
...@@ -59,10 +59,10 @@ VOC<year> ...@@ -59,10 +59,10 @@ VOC<year>
Create symlinks for `VOC<year>`: Create symlinks for `VOC<year>`:
``` ```
mkdir -p $DETECTRON/lib/datasets/data/VOC<year> mkdir -p $DETECTRON/detectron/datasets/data/VOC<year>
ln -s /path/to/VOC<year>/JPEGImages $DETECTRON/lib/datasets/data/VOC<year>/JPEGImages ln -s /path/to/VOC<year>/JPEGImages $DETECTRON/detectron/datasets/data/VOC<year>/JPEGImages
ln -s /path/to/VOC<year>/json/annotations $DETECTRON/lib/datasets/data/VOC<year>/annotations ln -s /path/to/VOC<year>/json/annotations $DETECTRON/detectron/datasets/data/VOC<year>/annotations
ln -s /path/to/VOC<year>/devkit $DETECTRON/lib/datasets/data/VOC<year>/VOCdevkit<year> ln -s /path/to/VOC<year>/devkit $DETECTRON/detectron/datasets/data/VOC<year>/VOCdevkit<year>
``` ```
### PASCAL VOC Annotations in COCO Format ### PASCAL VOC Annotations in COCO Format
...@@ -71,7 +71,7 @@ We expect PASCAL VOC annotations converted to COCO json format, which are availa ...@@ -71,7 +71,7 @@ We expect PASCAL VOC annotations converted to COCO json format, which are availa
## Creating Symlinks for Cityscapes: ## Creating Symlinks for Cityscapes:
We assume that your symlinked `lib/datasets/data/cityscapes` directory has the following structure: We assume that your symlinked `detectron/datasets/data/cityscapes` directory has the following structure:
``` ```
cityscapes cityscapes
...@@ -91,10 +91,10 @@ cityscapes ...@@ -91,10 +91,10 @@ cityscapes
Create symlinks for `cityscapes`: Create symlinks for `cityscapes`:
``` ```
mkdir -p $DETECTRON/lib/datasets/data/cityscapes mkdir -p $DETECTRON/detectron/datasets/data/cityscapes
ln -s /path/to/cityscapes/images $DETECTRON/lib/datasets/data/cityscapes/images ln -s /path/to/cityscapes/images $DETECTRON/detectron/datasets/data/cityscapes/images
ln -s /path/to/cityscapes/json/annotations $DETECTRON/lib/datasets/data/cityscapes/annotations ln -s /path/to/cityscapes/json/annotations $DETECTRON/detectron/datasets/data/cityscapes/annotations
ln -s /path/to/cityscapes/root $DETECTRON/lib/datasets/data/cityscapes/raw ln -s /path/to/cityscapes/root $DETECTRON/detectron/datasets/data/cityscapes/raw
``` ```
### Cityscapes Annotations in COCO Format ### Cityscapes Annotations in COCO Format
......
...@@ -22,7 +22,7 @@ from __future__ import division ...@@ -22,7 +22,7 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from utils.collections import AttrDict from detectron.utils.collections import AttrDict
def get_coco_dataset(): def get_coco_dataset():
......
...@@ -33,19 +33,19 @@ import os ...@@ -33,19 +33,19 @@ import os
import scipy.sparse import scipy.sparse
# Must happen before importing COCO API (which imports matplotlib) # Must happen before importing COCO API (which imports matplotlib)
import utils.env as envu import detectron.utils.env as envu
envu.set_up_matplotlib() envu.set_up_matplotlib()
# COCO API # COCO API
from pycocotools import mask as COCOmask from pycocotools import mask as COCOmask
from pycocotools.coco import COCO from pycocotools.coco import COCO
from core.config import cfg from detectron.core.config import cfg
from datasets.dataset_catalog import ANN_FN from detectron.datasets.dataset_catalog import ANN_FN
from datasets.dataset_catalog import DATASETS from detectron.datasets.dataset_catalog import DATASETS
from datasets.dataset_catalog import IM_DIR from detectron.datasets.dataset_catalog import IM_DIR
from datasets.dataset_catalog import IM_PREFIX from detectron.datasets.dataset_catalog import IM_PREFIX
from utils.timer import Timer from detectron.utils.timer import Timer
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -28,9 +28,9 @@ import uuid ...@@ -28,9 +28,9 @@ import uuid
from pycocotools.cocoeval import COCOeval from pycocotools.cocoeval import COCOeval
from core.config import cfg from detectron.core.config import cfg
from utils.io import save_object from detectron.utils.io import save_object
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -24,11 +24,11 @@ from past.builtins import basestring ...@@ -24,11 +24,11 @@ from past.builtins import basestring
import logging import logging
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
import utils.keypoints as keypoint_utils import detectron.utils.keypoints as keypoint_utils
import utils.segms as segm_utils import detectron.utils.segms as segm_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -40,11 +40,12 @@ import logging ...@@ -40,11 +40,12 @@ import logging
import os import os
import pprint import pprint
from core.config import cfg from detectron.core.config import cfg
from utils.logging import send_email from detectron.utils.logging import send_email
import datasets.cityscapes_json_dataset_evaluator as cs_json_dataset_evaluator import detectron.datasets.cityscapes_json_dataset_evaluator \
import datasets.json_dataset_evaluator as json_dataset_evaluator as cs_json_dataset_evaluator
import datasets.voc_dataset_evaluator as voc_dataset_evaluator import detectron.datasets.json_dataset_evaluator as json_dataset_evaluator
import detectron.datasets.voc_dataset_evaluator as voc_dataset_evaluator
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -26,11 +26,11 @@ import os ...@@ -26,11 +26,11 @@ import os
import shutil import shutil
import uuid import uuid
from core.config import cfg from detectron.core.config import cfg
from datasets.dataset_catalog import DATASETS from detectron.datasets.dataset_catalog import DATASETS
from datasets.dataset_catalog import DEVKIT_DIR from detectron.datasets.dataset_catalog import DEVKIT_DIR
from datasets.voc_eval import voc_eval from detectron.datasets.voc_eval import voc_eval
from utils.io import save_object from detectron.utils.io import save_object
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -23,14 +23,14 @@ from __future__ import unicode_literals ...@@ -23,14 +23,14 @@ from __future__ import unicode_literals
import collections import collections
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
from modeling.generate_anchors import generate_anchors from detectron.modeling.generate_anchors import generate_anchors
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
from utils.net import get_group_gn from detectron.utils.net import get_group_gn
import modeling.ResNet as ResNet import detectron.modeling.ResNet as ResNet
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
# Lowest and highest pyramid levels in the backbone network. For FPN, we assume # 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 # that all networks have 5 spatial reductions, each by a factor of 2. Level 1
......
...@@ -23,8 +23,9 @@ from __future__ import division ...@@ -23,8 +23,9 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from utils.net import get_group_gn from detectron.utils.net import get_group_gn
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
# Bits for specific architectures (ResNet50, ResNet101, ...) # Bits for specific architectures (ResNet50, ResNet101, ...)
......
...@@ -20,7 +20,7 @@ from __future__ import division ...@@ -20,7 +20,7 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
def add_VGG16_conv5_body(model): def add_VGG16_conv5_body(model):
......
...@@ -20,7 +20,7 @@ from __future__ import division ...@@ -20,7 +20,7 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
def add_VGG_CNN_M_1024_conv5_body(model): def add_VGG_CNN_M_1024_conv5_body(model):
......
...@@ -29,13 +29,13 @@ from caffe2.python import workspace ...@@ -29,13 +29,13 @@ from caffe2.python import workspace
from caffe2.python.modeling import initializers from caffe2.python.modeling import initializers
from caffe2.python.modeling.parameter_info import ParameterTags from caffe2.python.modeling.parameter_info import ParameterTags
from core.config import cfg from detectron.core.config import cfg
from ops.collect_and_distribute_fpn_rpn_proposals \ from detectron.ops.collect_and_distribute_fpn_rpn_proposals \
import CollectAndDistributeFpnRpnProposalsOp import CollectAndDistributeFpnRpnProposalsOp
from ops.generate_proposal_labels import GenerateProposalLabelsOp from detectron.ops.generate_proposal_labels import GenerateProposalLabelsOp
from ops.generate_proposals import GenerateProposalsOp from detectron.ops.generate_proposals import GenerateProposalsOp
import roi_data.fast_rcnn import detectron.roi_data.fast_rcnn as fast_rcnn_roi_data
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -159,7 +159,7 @@ class DetectionModelHelper(cnn.CNNModelHelper): ...@@ -159,7 +159,7 @@ class DetectionModelHelper(cnn.CNNModelHelper):
# The list of blobs is not known before run-time because it depends on # The list of blobs is not known before run-time because it depends on
# the specific model being trained. Query the data loader to get the # the specific model being trained. Query the data loader to get the
# list of output blob names. # list of output blob names.
blobs_out = roi_data.fast_rcnn.get_fast_rcnn_blob_names( blobs_out = fast_rcnn_roi_data.get_fast_rcnn_blob_names(
is_training=self.train is_training=self.train
) )
blobs_out = [core.ScopedBlobReference(b) for b in blobs_out] blobs_out = [core.ScopedBlobReference(b) for b in blobs_out]
...@@ -214,7 +214,7 @@ class DetectionModelHelper(cnn.CNNModelHelper): ...@@ -214,7 +214,7 @@ class DetectionModelHelper(cnn.CNNModelHelper):
) )
# Prepare output blobs # Prepare output blobs
blobs_out = roi_data.fast_rcnn.get_fast_rcnn_blob_names( blobs_out = fast_rcnn_roi_data.get_fast_rcnn_blob_names(
is_training=self.train is_training=self.train
) )
blobs_out = [core.ScopedBlobReference(b) for b in blobs_out] blobs_out = [core.ScopedBlobReference(b) for b in blobs_out]
......
...@@ -32,11 +32,11 @@ from __future__ import division ...@@ -32,11 +32,11 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
from utils.net import get_group_gn from detectron.utils.net import get_group_gn
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
......
...@@ -32,11 +32,11 @@ from __future__ import division ...@@ -32,11 +32,11 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
import modeling.ResNet as ResNet import detectron.modeling.ResNet as ResNet
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
......
...@@ -32,12 +32,12 @@ from __future__ import division ...@@ -32,12 +32,12 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
from utils.net import get_group_gn from detectron.utils.net import get_group_gn
import modeling.ResNet as ResNet import detectron.modeling.ResNet as ResNet
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
......
...@@ -42,19 +42,19 @@ import logging ...@@ -42,19 +42,19 @@ import logging
from caffe2.python import core from caffe2.python import core
from caffe2.python import workspace from caffe2.python import workspace
from core.config import cfg from detectron.core.config import cfg
from modeling.detector import DetectionModelHelper from detectron.modeling.detector import DetectionModelHelper
from roi_data.loader import RoIDataLoader from detectron.roi_data.loader import RoIDataLoader
import modeling.fast_rcnn_heads as fast_rcnn_heads import detectron.modeling.fast_rcnn_heads as fast_rcnn_heads
import modeling.keypoint_rcnn_heads as keypoint_rcnn_heads import detectron.modeling.keypoint_rcnn_heads as keypoint_rcnn_heads
import modeling.mask_rcnn_heads as mask_rcnn_heads import detectron.modeling.mask_rcnn_heads as mask_rcnn_heads
import modeling.name_compat import detectron.modeling.name_compat as name_compat
import modeling.optimizer as optim import detectron.modeling.optimizer as optim
import modeling.retinanet_heads as retinanet_heads import detectron.modeling.retinanet_heads as retinanet_heads
import modeling.rfcn_heads as rfcn_heads import detectron.modeling.rfcn_heads as rfcn_heads
import modeling.rpn_heads as rpn_heads import detectron.modeling.rpn_heads as rpn_heads
import roi_data.minibatch import detectron.roi_data.minibatch as roi_data_minibatch
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -131,7 +131,7 @@ def get_func(func_name): ...@@ -131,7 +131,7 @@ def get_func(func_name):
""" """
if func_name == '': if func_name == '':
return None return None
new_func_name = modeling.name_compat.get_new_name(func_name) new_func_name = name_compat.get_new_name(func_name)
if new_func_name != func_name: if new_func_name != func_name:
logger.warn( logger.warn(
'Remapping old function name: {} -> {}'. 'Remapping old function name: {} -> {}'.
...@@ -144,7 +144,7 @@ def get_func(func_name): ...@@ -144,7 +144,7 @@ def get_func(func_name):
if len(parts) == 1: if len(parts) == 1:
return globals()[parts[0]] return globals()[parts[0]]
# Otherwise, assume we're referencing a module under modeling # Otherwise, assume we're referencing a module under modeling
module_name = 'modeling.' + '.'.join(parts[:-1]) module_name = 'detectron.modeling.' + '.'.join(parts[:-1])
module = importlib.import_module(module_name) module = importlib.import_module(module_name)
return getattr(module, parts[-1]) return getattr(module, parts[-1])
except Exception: except Exception:
...@@ -388,9 +388,7 @@ def add_training_inputs(model, roidb=None): ...@@ -388,9 +388,7 @@ def add_training_inputs(model, roidb=None):
blobs_queue_capacity=cfg.DATA_LOADER.BLOBS_QUEUE_CAPACITY blobs_queue_capacity=cfg.DATA_LOADER.BLOBS_QUEUE_CAPACITY
) )
orig_num_op = len(model.net._net.op) orig_num_op = len(model.net._net.op)
blob_names = roi_data.minibatch.get_minibatch_blob_names( blob_names = roi_data_minibatch.get_minibatch_blob_names(is_training=True)
is_training=True
)
for gpu_id in range(cfg.NUM_GPUS): for gpu_id in range(cfg.NUM_GPUS):
with c2_utils.NamedCudaScope(gpu_id): with c2_utils.NamedCudaScope(gpu_id):
for blob_name in blob_names: for blob_name in blob_names:
...@@ -433,9 +431,9 @@ def add_inference_inputs(model): ...@@ -433,9 +431,9 @@ def add_inference_inputs(model):
# #
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
import modeling.ResNet as ResNet import detectron.modeling.ResNet as ResNet
import modeling.VGG16 as VGG16 import detectron.modeling.VGG16 as VGG16
import modeling.VGG_CNN_M_1024 as VGG_CNN_M_1024 import detectron.modeling.VGG_CNN_M_1024 as VGG_CNN_M_1024
def fast_rcnn(model): def fast_rcnn(model):
......
...@@ -24,8 +24,8 @@ import logging ...@@ -24,8 +24,8 @@ import logging
from caffe2.python import muji from caffe2.python import muji
from core.config import cfg from detectron.core.config import cfg
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -22,8 +22,8 @@ from __future__ import unicode_literals ...@@ -22,8 +22,8 @@ from __future__ import unicode_literals
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
def get_retinanet_bias_init(model): def get_retinanet_bias_init(model):
......
...@@ -18,9 +18,9 @@ from __future__ import division ...@@ -18,9 +18,9 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
......
...@@ -18,12 +18,12 @@ from __future__ import division ...@@ -18,12 +18,12 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
from core.config import cfg from detectron.core.config import cfg
from modeling.generate_anchors import generate_anchors from detectron.modeling.generate_anchors import generate_anchors
from utils.c2 import const_fill from detectron.utils.c2 import const_fill
from utils.c2 import gauss_fill from detectron.utils.c2 import gauss_fill
import modeling.FPN as FPN import detectron.modeling.FPN as FPN
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
# ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- #
......
...@@ -20,11 +20,11 @@ from __future__ import unicode_literals ...@@ -20,11 +20,11 @@ from __future__ import unicode_literals
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
from datasets import json_dataset from detectron.datasets import json_dataset
import modeling.FPN as fpn import detectron.modeling.FPN as fpn
import roi_data.fast_rcnn import detectron.roi_data.fast_rcnn as fast_rcnn_roi_data
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
class CollectAndDistributeFpnRpnProposalsOp(object): class CollectAndDistributeFpnRpnProposalsOp(object):
...@@ -55,9 +55,9 @@ class CollectAndDistributeFpnRpnProposalsOp(object): ...@@ -55,9 +55,9 @@ class CollectAndDistributeFpnRpnProposalsOp(object):
json_dataset.add_proposals(roidb, rois, im_scales, crowd_thresh=0) json_dataset.add_proposals(roidb, rois, im_scales, crowd_thresh=0)
# Compute training labels for the RPN proposals; also handles # Compute training labels for the RPN proposals; also handles
# distributing the proposals over FPN levels # distributing the proposals over FPN levels
output_blob_names = roi_data.fast_rcnn.get_fast_rcnn_blob_names() output_blob_names = fast_rcnn_roi_data.get_fast_rcnn_blob_names()
blobs = {k: [] for k in output_blob_names} blobs = {k: [] for k in output_blob_names}
roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) fast_rcnn_roi_data.add_fast_rcnn_blobs(blobs, im_scales, roidb)
for i, k in enumerate(output_blob_names): for i, k in enumerate(output_blob_names):
blob_utils.py_op_copy_blob(blobs[k], outputs[i]) blob_utils.py_op_copy_blob(blobs[k], outputs[i])
else: else:
...@@ -88,7 +88,7 @@ def collect(inputs, is_training): ...@@ -88,7 +88,7 @@ def collect(inputs, is_training):
def distribute(rois, label_blobs, outputs, train): def distribute(rois, label_blobs, outputs, train):
"""To understand the output blob order see return value of """To understand the output blob order see return value of
roi_data.fast_rcnn.get_fast_rcnn_blob_names(is_training=False) detectron.roi_data.fast_rcnn.get_fast_rcnn_blob_names(is_training=False)
""" """
lvl_min = cfg.FPN.ROI_MIN_LEVEL lvl_min = cfg.FPN.ROI_MIN_LEVEL
lvl_max = cfg.FPN.ROI_MAX_LEVEL lvl_max = cfg.FPN.ROI_MAX_LEVEL
......
...@@ -20,9 +20,9 @@ from __future__ import unicode_literals ...@@ -20,9 +20,9 @@ from __future__ import unicode_literals
import logging import logging
from datasets import json_dataset from detectron.datasets import json_dataset
from utils import blob as blob_utils from detectron.utils import blob as blob_utils
import roi_data.fast_rcnn import detectron.roi_data.fast_rcnn as fast_rcnn_roi_data
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -40,13 +40,13 @@ class GenerateProposalLabelsOp(object): ...@@ -40,13 +40,13 @@ class GenerateProposalLabelsOp(object):
roidb = blob_utils.deserialize(inputs[1].data) roidb = blob_utils.deserialize(inputs[1].data)
im_info = inputs[2].data im_info = inputs[2].data
im_scales = im_info[:, 2] im_scales = im_info[:, 2]
output_blob_names = roi_data.fast_rcnn.get_fast_rcnn_blob_names() output_blob_names = fast_rcnn_roi_data.get_fast_rcnn_blob_names()
# For historical consistency with the original Faster R-CNN # For historical consistency with the original Faster R-CNN
# implementation we are *not* filtering crowd proposals. # implementation we are *not* filtering crowd proposals.
# This choice should be investigated in the future (it likely does # This choice should be investigated in the future (it likely does
# not matter). # not matter).
json_dataset.add_proposals(roidb, rois, im_scales, crowd_thresh=0) json_dataset.add_proposals(roidb, rois, im_scales, crowd_thresh=0)
blobs = {k: [] for k in output_blob_names} blobs = {k: [] for k in output_blob_names}
roi_data.fast_rcnn.add_fast_rcnn_blobs(blobs, im_scales, roidb) fast_rcnn_roi_data.add_fast_rcnn_blobs(blobs, im_scales, roidb)
for i, k in enumerate(output_blob_names): for i, k in enumerate(output_blob_names):
blob_utils.py_op_copy_blob(blobs[k], outputs[i]) blob_utils.py_op_copy_blob(blobs[k], outputs[i])
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
class GenerateProposalsOp(object): class GenerateProposalsOp(object):
......
...@@ -26,9 +26,9 @@ import logging ...@@ -26,9 +26,9 @@ import logging
import numpy as np import numpy as np
import threading import threading
from core.config import cfg from detectron.core.config import cfg
from modeling.generate_anchors import generate_anchors from detectron.modeling.generate_anchors import generate_anchors
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -27,12 +27,12 @@ import logging ...@@ -27,12 +27,12 @@ import logging
import numpy as np import numpy as np
import numpy.random as npr import numpy.random as npr
from core.config import cfg from detectron.core.config import cfg
import modeling.FPN as fpn import detectron.modeling.FPN as fpn
import roi_data.keypoint_rcnn import detectron.roi_data.keypoint_rcnn as keypoint_rcnn_roi_data
import roi_data.mask_rcnn import detectron.roi_data.mask_rcnn as mask_rcnn_roi_data
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -124,7 +124,7 @@ def add_fast_rcnn_blobs(blobs, im_scales, roidb): ...@@ -124,7 +124,7 @@ def add_fast_rcnn_blobs(blobs, im_scales, roidb):
# all minibatch images # all minibatch images
valid = True valid = True
if cfg.MODEL.KEYPOINTS_ON: if cfg.MODEL.KEYPOINTS_ON:
valid = roi_data.keypoint_rcnn.finalize_keypoint_minibatch(blobs, valid) valid = keypoint_rcnn_roi_data.finalize_keypoint_minibatch(blobs, valid)
return valid return valid
...@@ -203,13 +203,13 @@ def _sample_rois(roidb, im_scale, batch_idx): ...@@ -203,13 +203,13 @@ def _sample_rois(roidb, im_scale, batch_idx):
# Optionally add Mask R-CNN blobs # Optionally add Mask R-CNN blobs
if cfg.MODEL.MASK_ON: if cfg.MODEL.MASK_ON:
roi_data.mask_rcnn.add_mask_rcnn_blobs( mask_rcnn_roi_data.add_mask_rcnn_blobs(
blob_dict, sampled_boxes, roidb, im_scale, batch_idx blob_dict, sampled_boxes, roidb, im_scale, batch_idx
) )
# Optionally add Keypoint R-CNN blobs # Optionally add Keypoint R-CNN blobs
if cfg.MODEL.KEYPOINTS_ON: if cfg.MODEL.KEYPOINTS_ON:
roi_data.keypoint_rcnn.add_keypoint_rcnn_blobs( keypoint_rcnn_roi_data.add_keypoint_rcnn_blobs(
blob_dict, roidb, fg_rois_per_image, fg_inds, im_scale, batch_idx blob_dict, roidb, fg_rois_per_image, fg_inds, im_scale, batch_idx
) )
......
...@@ -27,9 +27,9 @@ from __future__ import unicode_literals ...@@ -27,9 +27,9 @@ from __future__ import unicode_literals
import logging import logging
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.keypoints as keypoint_utils import detectron.utils.keypoints as keypoint_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -52,13 +52,13 @@ import uuid ...@@ -52,13 +52,13 @@ import uuid
from caffe2.python import core, workspace from caffe2.python import core, workspace
from core.config import cfg from detectron.core.config import cfg
from roi_data.minibatch import get_minibatch from detectron.roi_data.minibatch import get_minibatch
from roi_data.minibatch import get_minibatch_blob_names from detectron.roi_data.minibatch import get_minibatch_blob_names
from utils.coordinator import coordinated_get from detectron.utils.coordinator import coordinated_get
from utils.coordinator import coordinated_put from detectron.utils.coordinator import coordinated_put
from utils.coordinator import Coordinator from detectron.utils.coordinator import Coordinator
import utils.c2 as c2_utils import detectron.utils.c2 as c2_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -26,10 +26,10 @@ from __future__ import unicode_literals ...@@ -26,10 +26,10 @@ from __future__ import unicode_literals
import logging import logging
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
import utils.segms as segm_utils import detectron.utils.segms as segm_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -32,11 +32,11 @@ import cv2 ...@@ -32,11 +32,11 @@ import cv2
import logging import logging
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import roi_data.fast_rcnn import detectron.roi_data.fast_rcnn as fast_rcnn_roi_data
import roi_data.retinanet import detectron.roi_data.retinanet as retinanet_roi_data
import roi_data.rpn import detectron.roi_data.rpn as rpn_roi_data
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -48,14 +48,14 @@ def get_minibatch_blob_names(is_training=True): ...@@ -48,14 +48,14 @@ def get_minibatch_blob_names(is_training=True):
blob_names = ['data'] blob_names = ['data']
if cfg.RPN.RPN_ON: if cfg.RPN.RPN_ON:
# RPN-only or end-to-end Faster R-CNN # 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_roi_data.get_rpn_blob_names(is_training=is_training)
elif cfg.RETINANET.RETINANET_ON: elif cfg.RETINANET.RETINANET_ON:
blob_names += roi_data.retinanet.get_retinanet_blob_names( blob_names += retinanet_roi_data.get_retinanet_blob_names(
is_training=is_training is_training=is_training
) )
else: else:
# Fast R-CNN like models trained on precomputed proposals # Fast R-CNN like models trained on precomputed proposals
blob_names += roi_data.fast_rcnn.get_fast_rcnn_blob_names( blob_names += fast_rcnn_roi_data.get_fast_rcnn_blob_names(
is_training=is_training is_training=is_training
) )
return blob_names return blob_names
...@@ -71,18 +71,18 @@ def get_minibatch(roidb): ...@@ -71,18 +71,18 @@ def get_minibatch(roidb):
blobs['data'] = im_blob blobs['data'] = im_blob
if cfg.RPN.RPN_ON: if cfg.RPN.RPN_ON:
# RPN-only or end-to-end Faster/Mask R-CNN # RPN-only or end-to-end Faster/Mask R-CNN
valid = roi_data.rpn.add_rpn_blobs(blobs, im_scales, roidb) valid = rpn_roi_data.add_rpn_blobs(blobs, im_scales, roidb)
elif cfg.RETINANET.RETINANET_ON: elif cfg.RETINANET.RETINANET_ON:
im_width, im_height = im_blob.shape[3], im_blob.shape[2] im_width, im_height = im_blob.shape[3], im_blob.shape[2]
# im_width, im_height corresponds to the network input: padded image # im_width, im_height corresponds to the network input: padded image
# (if needed) width and height. We pass it as input and slice the data # (if needed) width and height. We pass it as input and slice the data
# accordingly so that we don't need to use SampleAsOp # accordingly so that we don't need to use SampleAsOp
valid = roi_data.retinanet.add_retinanet_blobs( valid = retinanet_roi_data.add_retinanet_blobs(
blobs, im_scales, roidb, im_width, im_height blobs, im_scales, roidb, im_width, im_height
) )
else: else:
# Fast R-CNN like models trained on precomputed proposals # 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_roi_data.add_fast_rcnn_blobs(blobs, im_scales, roidb)
return blobs, valid return blobs, valid
......
...@@ -23,9 +23,9 @@ from __future__ import unicode_literals ...@@ -23,9 +23,9 @@ from __future__ import unicode_literals
import numpy as np import numpy as np
import logging import logging
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
import roi_data.data_utils as data_utils import detectron.roi_data.data_utils as data_utils
from core.config import cfg from detectron.core.config import cfg
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -24,10 +24,10 @@ import logging ...@@ -24,10 +24,10 @@ import logging
import numpy as np import numpy as np
import numpy.random as npr import numpy.random as npr
from core.config import cfg from detectron.core.config import cfg
import roi_data.data_utils as data_utils import detectron.roi_data.data_utils as data_utils
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -34,16 +34,18 @@ import pprint ...@@ -34,16 +34,18 @@ import pprint
import sys import sys
import time import time
from caffe2.python import core, workspace, muji from caffe2.python import core
from caffe2.python import muji
from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_list from detectron.core.config import merge_cfg_from_file
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_list
from datasets.roidb import combined_roidb_for_training from detectron.datasets.roidb import combined_roidb_for_training
from roi_data.loader import RoIDataLoader from detectron.roi_data.loader import RoIDataLoader
from utils.timer import Timer from detectron.utils.logging import setup_logging
import utils.logging from detectron.utils.timer import Timer
def parse_args(): def parse_args():
...@@ -148,9 +150,9 @@ def main(opts): ...@@ -148,9 +150,9 @@ def main(opts):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
logger = utils.logging.setup_logging(__name__) logger = setup_logging(__name__)
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
logging.getLogger('roi_data.loader').setLevel(logging.INFO) logging.getLogger('detectron.roi_data.loader').setLevel(logging.INFO)
np.random.seed(cfg.RNG_SEED) np.random.seed(cfg.RNG_SEED)
args = parse_args() args = parse_args()
logger.info('Called with args:') logger.info('Called with args:')
......
...@@ -26,8 +26,8 @@ from caffe2.python import core ...@@ -26,8 +26,8 @@ from caffe2.python import core
from caffe2.python import gradient_checker from caffe2.python import gradient_checker
from caffe2.python import workspace from caffe2.python import workspace
import utils.c2 import detectron.utils.logging as logging_utils
import utils.logging import detectron.utils.c2 as c2_utils
class BatchPermutationOpTest(unittest.TestCase): class BatchPermutationOpTest(unittest.TestCase):
...@@ -105,7 +105,7 @@ class BatchPermutationOpTest(unittest.TestCase): ...@@ -105,7 +105,7 @@ class BatchPermutationOpTest(unittest.TestCase):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
utils.c2.import_detectron_ops() c2_utils.import_detectron_ops()
assert 'BatchPermutation' in workspace.RegisteredOperators() assert 'BatchPermutation' in workspace.RegisteredOperators()
utils.logging.setup_logging(__name__) logging_utils.setup_logging(__name__)
unittest.main() unittest.main()
...@@ -23,7 +23,7 @@ import unittest ...@@ -23,7 +23,7 @@ import unittest
from pycocotools import mask as COCOmask from pycocotools import mask as COCOmask
import utils.boxes as box_utils import detectron.utils.boxes as box_utils
def random_boxes(mean_box, stdev, N): def random_boxes(mean_box, stdev, N):
......
...@@ -23,10 +23,10 @@ import tempfile ...@@ -23,10 +23,10 @@ import tempfile
import unittest import unittest
import yaml import yaml
from core.config import cfg from detectron.core.config import cfg
from utils.collections import AttrDict from detectron.utils.collections import AttrDict
import core.config import detectron.core.config as core_config
import utils.logging import detectron.utils.logging as logging_utils
class TestAttrDict(unittest.TestCase): class TestAttrDict(unittest.TestCase):
...@@ -59,7 +59,7 @@ class TestAttrDict(unittest.TestCase): ...@@ -59,7 +59,7 @@ class TestAttrDict(unittest.TestCase):
# Serialize immutability state # Serialize immutability state
a.immutable(True) a.immutable(True)
a2 = yaml.load(yaml.dump(a)) a2 = core_config.load_cfg(yaml.dump(a))
assert a.is_immutable() assert a.is_immutable()
assert a2.is_immutable() assert a2.is_immutable()
...@@ -76,14 +76,14 @@ class TestCfg(unittest.TestCase): ...@@ -76,14 +76,14 @@ class TestCfg(unittest.TestCase):
s = 'dummy0' s = 'dummy0'
cfg2 = copy.deepcopy(cfg) cfg2 = copy.deepcopy(cfg)
cfg2.MODEL.TYPE = s cfg2.MODEL.TYPE = s
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
assert cfg.MODEL.TYPE == s assert cfg.MODEL.TYPE == s
# Test: merge from yaml # Test: merge from yaml
s = 'dummy1' s = 'dummy1'
cfg2 = yaml.load(yaml.dump(cfg)) cfg2 = core_config.load_cfg(yaml.dump(cfg))
cfg2.MODEL.TYPE = s cfg2.MODEL.TYPE = s
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
assert cfg.MODEL.TYPE == s assert cfg.MODEL.TYPE == s
# Test: merge with a valid key # Test: merge with a valid key
...@@ -91,7 +91,7 @@ class TestCfg(unittest.TestCase): ...@@ -91,7 +91,7 @@ class TestCfg(unittest.TestCase):
cfg2 = AttrDict() cfg2 = AttrDict()
cfg2.MODEL = AttrDict() cfg2.MODEL = AttrDict()
cfg2.MODEL.TYPE = s cfg2.MODEL.TYPE = s
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
assert cfg.MODEL.TYPE == s assert cfg.MODEL.TYPE == s
# Test: merge with an invalid key # Test: merge with an invalid key
...@@ -100,13 +100,13 @@ class TestCfg(unittest.TestCase): ...@@ -100,13 +100,13 @@ class TestCfg(unittest.TestCase):
cfg2.FOO = AttrDict() cfg2.FOO = AttrDict()
cfg2.FOO.BAR = s cfg2.FOO.BAR = s
with self.assertRaises(KeyError): with self.assertRaises(KeyError):
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
# Test: merge with converted type # Test: merge with converted type
cfg2 = AttrDict() cfg2 = AttrDict()
cfg2.TRAIN = AttrDict() cfg2.TRAIN = AttrDict()
cfg2.TRAIN.SCALES = [1] cfg2.TRAIN.SCALES = [1]
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
assert type(cfg.TRAIN.SCALES) is tuple assert type(cfg.TRAIN.SCALES) is tuple
assert cfg.TRAIN.SCALES[0] == 1 assert cfg.TRAIN.SCALES[0] == 1
...@@ -115,7 +115,7 @@ class TestCfg(unittest.TestCase): ...@@ -115,7 +115,7 @@ class TestCfg(unittest.TestCase):
cfg2.TRAIN = AttrDict() cfg2.TRAIN = AttrDict()
cfg2.TRAIN.SCALES = 1 cfg2.TRAIN.SCALES = 1
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
core.config.merge_cfg_from_cfg(cfg2) core_config.merge_cfg_from_cfg(cfg2)
def test_merge_cfg_from_file(self): def test_merge_cfg_from_file(self):
with tempfile.NamedTemporaryFile() as f: with tempfile.NamedTemporaryFile() as f:
...@@ -123,7 +123,7 @@ class TestCfg(unittest.TestCase): ...@@ -123,7 +123,7 @@ class TestCfg(unittest.TestCase):
s = cfg.MODEL.TYPE s = cfg.MODEL.TYPE
cfg.MODEL.TYPE = 'dummy' cfg.MODEL.TYPE = 'dummy'
assert cfg.MODEL.TYPE != s assert cfg.MODEL.TYPE != s
core.config.merge_cfg_from_file(f.name) core_config.merge_cfg_from_file(f.name)
assert cfg.MODEL.TYPE == s assert cfg.MODEL.TYPE == s
def test_merge_cfg_from_list(self): def test_merge_cfg_from_list(self):
...@@ -134,7 +134,7 @@ class TestCfg(unittest.TestCase): ...@@ -134,7 +134,7 @@ class TestCfg(unittest.TestCase):
assert cfg.TRAIN.SCALES[0] != 100 assert cfg.TRAIN.SCALES[0] != 100
assert cfg.MODEL.TYPE != 'foobar' assert cfg.MODEL.TYPE != 'foobar'
assert cfg.NUM_GPUS != 2 assert cfg.NUM_GPUS != 2
core.config.merge_cfg_from_list(opts) core_config.merge_cfg_from_list(opts)
assert type(cfg.TRAIN.SCALES) is tuple assert type(cfg.TRAIN.SCALES) is tuple
assert len(cfg.TRAIN.SCALES) == 1 assert len(cfg.TRAIN.SCALES) == 1
assert cfg.TRAIN.SCALES[0] == 100 assert cfg.TRAIN.SCALES[0] == 100
...@@ -149,7 +149,7 @@ class TestCfg(unittest.TestCase): ...@@ -149,7 +149,7 @@ class TestCfg(unittest.TestCase):
_ = cfg.FINAL_MSG # noqa _ = cfg.FINAL_MSG # noqa
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.MODEL.DILATION # noqa _ = cfg.MODEL.DILATION # noqa
core.config.merge_cfg_from_list(opts) core_config.merge_cfg_from_list(opts)
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.FINAL_MSG # noqa _ = cfg.FINAL_MSG # noqa
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
...@@ -164,7 +164,7 @@ class TestCfg(unittest.TestCase): ...@@ -164,7 +164,7 @@ class TestCfg(unittest.TestCase):
yaml.dump(cfg2, f) yaml.dump(cfg2, f)
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.MODEL.DILATION # noqa _ = cfg.MODEL.DILATION # noqa
core.config.merge_cfg_from_file(f.name) core_config.merge_cfg_from_file(f.name)
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.MODEL.DILATION # noqa _ = cfg.MODEL.DILATION # noqa
...@@ -176,7 +176,7 @@ class TestCfg(unittest.TestCase): ...@@ -176,7 +176,7 @@ class TestCfg(unittest.TestCase):
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.EXAMPLE.RENAMED.KEY # noqa _ = cfg.EXAMPLE.RENAMED.KEY # noqa
with self.assertRaises(KeyError): with self.assertRaises(KeyError):
core.config.merge_cfg_from_list(opts) core_config.merge_cfg_from_list(opts)
def test_renamed_key_from_file(self): def test_renamed_key_from_file(self):
# You should see logger messages like: # You should see logger messages like:
...@@ -191,9 +191,9 @@ class TestCfg(unittest.TestCase): ...@@ -191,9 +191,9 @@ class TestCfg(unittest.TestCase):
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
_ = cfg.EXAMPLE.RENAMED.KEY # noqa _ = cfg.EXAMPLE.RENAMED.KEY # noqa
with self.assertRaises(KeyError): with self.assertRaises(KeyError):
core.config.merge_cfg_from_file(f.name) core_config.merge_cfg_from_file(f.name)
if __name__ == '__main__': if __name__ == '__main__':
utils.logging.setup_logging(__name__) logging_utils.setup_logging(__name__)
unittest.main() unittest.main()
...@@ -24,10 +24,14 @@ import unittest ...@@ -24,10 +24,14 @@ import unittest
import mock import mock
from caffe2.proto import caffe2_pb2 from caffe2.proto import caffe2_pb2
from caffe2.python import core, workspace, muji from caffe2.python import core
from core.config import cfg, assert_and_infer_cfg from caffe2.python import muji
from roi_data.loader import RoIDataLoader from caffe2.python import workspace
import utils.logging
from detectron.core.config import assert_and_infer_cfg
from detectron.core.config import cfg
from detectron.roi_data.loader import RoIDataLoader
import detectron.utils.logging as logging_utils
def get_roidb_blobs(roidb): def get_roidb_blobs(roidb):
...@@ -81,9 +85,14 @@ def run_net(net): ...@@ -81,9 +85,14 @@ def run_net(net):
class TestRoIDataLoader(unittest.TestCase): class TestRoIDataLoader(unittest.TestCase):
@mock.patch('roi_data.loader.get_minibatch_blob_names', @mock.patch(
return_value=[u'data']) 'detectron.roi_data.loader.get_minibatch_blob_names',
@mock.patch('roi_data.loader.get_minibatch', side_effect=get_roidb_blobs) return_value=[u'data']
)
@mock.patch(
'detectron.roi_data.loader.get_minibatch',
side_effect=get_roidb_blobs
)
def test_two_parallel_loaders(self, _1, _2): def test_two_parallel_loaders(self, _1, _2):
train_data = np.random.rand(2, 3, 3).astype(np.float32) train_data = np.random.rand(2, 3, 3).astype(np.float32)
train_loader, train_net = create_loader_and_network(train_data, train_loader, train_net = create_loader_and_network(train_data,
...@@ -102,9 +111,9 @@ class TestRoIDataLoader(unittest.TestCase): ...@@ -102,9 +111,9 @@ class TestRoIDataLoader(unittest.TestCase):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
logger = utils.logging.setup_logging(__name__) logger = logging_utils.setup_logging(__name__)
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
logging.getLogger('roi_data.loader').setLevel(logging.INFO) logging.getLogger('detectron.roi_data.loader').setLevel(logging.INFO)
np.random.seed(cfg.RNG_SEED) np.random.seed(cfg.RNG_SEED)
cfg.TRAIN.ASPECT_GROUPING = False cfg.TRAIN.ASPECT_GROUPING = False
cfg.NUM_GPUS = 2 cfg.NUM_GPUS = 2
......
...@@ -26,16 +26,16 @@ import tempfile ...@@ -26,16 +26,16 @@ import tempfile
from caffe2.python import workspace from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import get_output_dir from detectron.core.config import get_output_dir
from datasets.roidb import combined_roidb_for_training from detectron.datasets.roidb import combined_roidb_for_training
from modeling import model_builder from detectron.modeling import model_builder
import utils.c2 as c2_utils from detectron.utils.logging import setup_logging
import utils.logging import detectron.utils.c2 as c2_utils
import utils.net as nu import detectron.utils.net as nu
utils.c2.import_detectron_ops() c2_utils.import_detectron_ops()
def get_params(model): def get_params(model):
...@@ -107,9 +107,9 @@ def test_restore_checkpoint(): ...@@ -107,9 +107,9 @@ def test_restore_checkpoint():
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
logger = utils.logging.setup_logging(__name__) logger = setup_logging(__name__)
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
logging.getLogger('roi_data.loader').setLevel(logging.INFO) logging.getLogger('detectron.roi_data.loader').setLevel(logging.INFO)
np.random.seed(cfg.RNG_SEED) np.random.seed(cfg.RNG_SEED)
output_dir = tempfile.mkdtemp() output_dir = tempfile.mkdtemp()
# Generate config for test # Generate config for test
......
...@@ -26,8 +26,8 @@ from caffe2.python import core ...@@ -26,8 +26,8 @@ from caffe2.python import core
from caffe2.python import gradient_checker from caffe2.python import gradient_checker
from caffe2.python import workspace from caffe2.python import workspace
import utils.c2 import detectron.utils.c2 as c2_utils
import utils.logging import detectron.utils.logging as logging_utils
class SmoothL1LossTest(unittest.TestCase): class SmoothL1LossTest(unittest.TestCase):
...@@ -74,7 +74,7 @@ class SmoothL1LossTest(unittest.TestCase): ...@@ -74,7 +74,7 @@ class SmoothL1LossTest(unittest.TestCase):
if __name__ == '__main__': if __name__ == '__main__':
utils.c2.import_detectron_ops() c2_utils.import_detectron_ops()
assert 'SmoothL1Loss' in workspace.RegisteredOperators() assert 'SmoothL1Loss' in workspace.RegisteredOperators()
utils.logging.setup_logging(__name__) logging_utils.setup_logging(__name__)
unittest.main() unittest.main()
...@@ -26,8 +26,8 @@ from caffe2.python import core ...@@ -26,8 +26,8 @@ from caffe2.python import core
from caffe2.python import gradient_checker from caffe2.python import gradient_checker
from caffe2.python import workspace from caffe2.python import workspace
import utils.c2 import detectron.utils.c2 as c2_utils
import utils.logging import detectron.utils.logging as logging_utils
class SpatialNarrowAsOpTest(unittest.TestCase): class SpatialNarrowAsOpTest(unittest.TestCase):
...@@ -85,7 +85,7 @@ class SpatialNarrowAsOpTest(unittest.TestCase): ...@@ -85,7 +85,7 @@ class SpatialNarrowAsOpTest(unittest.TestCase):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
utils.c2.import_detectron_ops() c2_utils.import_detectron_ops()
assert 'SpatialNarrowAs' in workspace.RegisteredOperators() assert 'SpatialNarrowAs' in workspace.RegisteredOperators()
utils.logging.setup_logging(__name__) logging_utils.setup_logging(__name__)
unittest.main() unittest.main()
...@@ -10,7 +10,7 @@ from caffe2.proto import caffe2_pb2 ...@@ -10,7 +10,7 @@ from caffe2.proto import caffe2_pb2
from caffe2.python import core from caffe2.python import core
from caffe2.python import workspace from caffe2.python import workspace
import utils.c2 import detectron.utils.c2 as c2_utils
class ZeroEvenOpTest(unittest.TestCase): class ZeroEvenOpTest(unittest.TestCase):
...@@ -107,6 +107,6 @@ class ZeroEvenOpTest(unittest.TestCase): ...@@ -107,6 +107,6 @@ class ZeroEvenOpTest(unittest.TestCase):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
utils.c2.import_custom_ops() c2_utils.import_custom_ops()
assert 'ZeroEven' in workspace.RegisteredOperators() assert 'ZeroEven' in workspace.RegisteredOperators()
unittest.main() unittest.main()
...@@ -34,7 +34,7 @@ import numpy as np ...@@ -34,7 +34,7 @@ import numpy as np
from caffe2.proto import caffe2_pb2 from caffe2.proto import caffe2_pb2
from core.config import cfg from detectron.core.config import cfg
def get_image_blob(im, target_scale, target_max_size): def get_image_blob(im, target_scale, target_max_size):
......
...@@ -47,9 +47,9 @@ from __future__ import unicode_literals ...@@ -47,9 +47,9 @@ from __future__ import unicode_literals
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.cython_bbox as cython_bbox import detectron.utils.cython_bbox as cython_bbox
import utils.cython_nms as cython_nms import detectron.utils.cython_nms as cython_nms
bbox_overlaps = cython_bbox.bbox_overlaps bbox_overlaps = cython_bbox.bbox_overlaps
......
...@@ -28,7 +28,7 @@ from caffe2.python import core ...@@ -28,7 +28,7 @@ from caffe2.python import core
from caffe2.python import dyndep from caffe2.python import dyndep
from caffe2.python import scope from caffe2.python import scope
import utils.env as envu import detectron.utils.env as envu
def import_contrib_ops(): def import_contrib_ops():
......
...@@ -75,9 +75,10 @@ def get_detectron_ops_lib(): ...@@ -75,9 +75,10 @@ def get_detectron_ops_lib():
def get_custom_ops_lib(): def get_custom_ops_lib():
"""Retrieve custom ops library.""" """Retrieve custom ops library."""
lib_dir, _utils = os.path.split(os.path.dirname(__file__)) det_dir, _ = os.path.split(os.path.dirname(__file__))
root_dir, _ = os.path.split(det_dir)
custom_ops_lib = os.path.join( custom_ops_lib = os.path.join(
lib_dir, 'build/libcaffe2_detectron_custom_ops_gpu.so') root_dir, 'build/libcaffe2_detectron_custom_ops_gpu.so')
assert os.path.exists(custom_ops_lib), \ assert os.path.exists(custom_ops_lib), \
'Custom ops lib not found at \'{}\''.format(custom_ops_lib) 'Custom ops lib not found at \'{}\''.format(custom_ops_lib)
return custom_ops_lib return custom_ops_lib
...@@ -23,8 +23,8 @@ from __future__ import unicode_literals ...@@ -23,8 +23,8 @@ from __future__ import unicode_literals
import cv2 import cv2
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
import utils.blob as blob_utils import detectron.utils.blob as blob_utils
def get_keypoints(): def get_keypoints():
......
...@@ -22,7 +22,7 @@ from __future__ import unicode_literals ...@@ -22,7 +22,7 @@ from __future__ import unicode_literals
import numpy as np import numpy as np
from core.config import cfg from detectron.core.config import cfg
def get_lr_at_iter(it): def get_lr_at_iter(it):
......
...@@ -30,9 +30,11 @@ import yaml ...@@ -30,9 +30,11 @@ import yaml
from caffe2.python import core from caffe2.python import core
from caffe2.python import workspace from caffe2.python import workspace
from core.config import cfg
from utils.io import save_object from detectron.core.config import cfg
import utils.c2 as c2_utils from detectron.core.config import load_cfg
from detectron.utils.io import save_object
import detectron.utils.c2 as c2_utils
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -59,7 +61,7 @@ def initialize_gpu_from_weights_file(model, weights_file, gpu_id=0): ...@@ -59,7 +61,7 @@ def initialize_gpu_from_weights_file(model, weights_file, gpu_id=0):
with open(weights_file, 'r') as f: with open(weights_file, 'r') as f:
src_blobs = pickle.load(f) src_blobs = pickle.load(f)
if 'cfg' in src_blobs: if 'cfg' in src_blobs:
saved_cfg = yaml.load(src_blobs['cfg']) saved_cfg = load_cfg(src_blobs['cfg'])
configure_bbox_reg_weights(model, saved_cfg) configure_bbox_reg_weights(model, saved_cfg)
if 'blobs' in src_blobs: if 'blobs' in src_blobs:
# Backwards compat--dictionary used to be only blobs, now they are # Backwards compat--dictionary used to be only blobs, now they are
......
...@@ -30,7 +30,7 @@ import subprocess ...@@ -30,7 +30,7 @@ import subprocess
import cPickle as pickle import cPickle as pickle
from six.moves import shlex_quote from six.moves import shlex_quote
from core.config import cfg from detectron.core.config import cfg
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -37,14 +37,14 @@ import re ...@@ -37,14 +37,14 @@ import re
from caffe2.python import memonger from caffe2.python import memonger
from caffe2.python import workspace from caffe2.python import workspace
from core.config import cfg from detectron.core.config import cfg
from core.config import get_output_dir from detectron.core.config import get_output_dir
from datasets.roidb import combined_roidb_for_training from detectron.datasets.roidb import combined_roidb_for_training
from modeling import model_builder from detectron.modeling import model_builder
from utils import lr_policy from detectron.utils import lr_policy
from utils.training_stats import TrainingStats from detectron.utils.training_stats import TrainingStats
import utils.env as envu import detectron.utils.env as envu
import utils.net as nu import detectron.utils.net as nu
def train_model(): def train_model():
......
...@@ -26,11 +26,12 @@ import datetime ...@@ -26,11 +26,12 @@ import datetime
import numpy as np import numpy as np
from caffe2.python import utils as c2_py_utils from caffe2.python import utils as c2_py_utils
from core.config import cfg
from utils.logging import log_json_stats from detectron.core.config import cfg
from utils.logging import SmoothedValue from detectron.utils.logging import log_json_stats
from utils.timer import Timer from detectron.utils.logging import SmoothedValue
import utils.net as nu from detectron.utils.timer import Timer
import detectron.utils.net as nu
class TrainingStats(object): class TrainingStats(object):
......
...@@ -26,9 +26,9 @@ import os ...@@ -26,9 +26,9 @@ import os
import pycocotools.mask as mask_util import pycocotools.mask as mask_util
from utils.colormap import colormap from detectron.utils.colormap import colormap
import utils.env as envu import detectron.utils.env as envu
import utils.keypoints as keypoint_utils import detectron.utils.keypoints as keypoint_utils
# Matplotlib requires certain adjustments in some environments # Matplotlib requires certain adjustments in some environments
# Must happen before importing matplotlib # Must happen before importing matplotlib
......
...@@ -18,12 +18,11 @@ RUN make install ...@@ -18,12 +18,11 @@ RUN make install
# Clone the Detectron repository # Clone the Detectron repository
RUN git clone https://github.com/facebookresearch/detectron /detectron RUN git clone https://github.com/facebookresearch/detectron /detectron
# Go to Detectron root
WORKDIR /detectron
# Set up Python modules # Set up Python modules
WORKDIR /detectron/lib
RUN make RUN make
# Build custom ops # [Optional] Build custom ops
RUN make ops RUN make ops
# Go to Detectron root
WORKDIR /detectron
...@@ -29,9 +29,9 @@ _NP_INCLUDE_DIRS = np.get_include() ...@@ -29,9 +29,9 @@ _NP_INCLUDE_DIRS = np.get_include()
# Extension modules # Extension modules
ext_modules = [ ext_modules = [
Extension( Extension(
name='utils.cython_bbox', name='detectron.utils.cython_bbox',
sources=[ sources=[
'utils/cython_bbox.pyx' 'detectron/utils/cython_bbox.pyx'
], ],
extra_compile_args=[ extra_compile_args=[
'-Wno-cpp' '-Wno-cpp'
...@@ -41,9 +41,9 @@ ext_modules = [ ...@@ -41,9 +41,9 @@ ext_modules = [
] ]
), ),
Extension( Extension(
name='utils.cython_nms', name='detectron.utils.cython_nms',
sources=[ sources=[
'utils/cython_nms.pyx' 'detectron/utils/cython_nms.pyx'
], ],
extra_compile_args=[ extra_compile_args=[
'-Wno-cpp' '-Wno-cpp'
...@@ -56,5 +56,6 @@ ext_modules = [ ...@@ -56,5 +56,6 @@ ext_modules = [
setup( setup(
name='Detectron', name='Detectron',
packages=['detectron'],
ext_modules=cythonize(ext_modules) ext_modules=cythonize(ext_modules)
) )
...@@ -29,35 +29,40 @@ from __future__ import absolute_import ...@@ -29,35 +29,40 @@ from __future__ import absolute_import
from __future__ import division from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
import cv2 # NOQA (Must import before importing caffe2 due to bug in cv2)
import argparse import argparse
import copy import copy
import pprint import cv2 # NOQA (Must import before importing caffe2 due to bug in cv2)
import numpy as np import numpy as np
import os import os
import pprint
import sys import sys
import caffe2.python.utils as putils import caffe2.python.utils as putils
from caffe2.python import core, workspace from caffe2.python import core, workspace
from caffe2.proto import caffe2_pb2 from caffe2.proto import caffe2_pb2
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_file
from core.config import merge_cfg_from_list from detectron.core.config import merge_cfg_from_list
from modeling import generate_anchors from detectron.modeling import generate_anchors
import core.test_engine as test_engine from detectron.utils.logging import setup_logging
import utils.c2 as c2_utils from detectron.utils.model_convert_utils import convert_op_in_proto
import utils.vis as vis_utils from detectron.utils.model_convert_utils import op_filter
import utils.logging import detectron.core.test_engine as test_engine
import utils.model_convert_utils as mutils import detectron.utils.c2 as c2_utils
from utils.model_convert_utils import op_filter, convert_op_in_proto import detectron.utils.model_convert_utils as mutils
import detectron.utils.vis as vis_utils
c2_utils.import_contrib_ops() c2_utils.import_contrib_ops()
c2_utils.import_detectron_ops() c2_utils.import_detectron_ops()
logger = utils.logging.setup_logging(__name__) # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations.
cv2.ocl.setUseOpenCL(False)
logger = setup_logging(__name__)
def parse_args(): def parse_args():
......
...@@ -29,7 +29,7 @@ import numpy as np ...@@ -29,7 +29,7 @@ import numpy as np
import scipy.io as sio import scipy.io as sio
import sys import sys
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
if __name__ == '__main__': if __name__ == '__main__':
dataset_name = sys.argv[1] dataset_name = sys.argv[1]
......
...@@ -31,9 +31,9 @@ import json ...@@ -31,9 +31,9 @@ import json
import os import os
import sys import sys
from datasets.dataset_catalog import ANN_FN from detectron.datasets.dataset_catalog import ANN_FN
from datasets.dataset_catalog import DATASETS from detectron.datasets.dataset_catalog import DATASETS
from utils.timer import Timer from detectron.utils.timer import Timer
def parse_args(): def parse_args():
......
...@@ -36,19 +36,21 @@ import yaml ...@@ -36,19 +36,21 @@ import yaml
from caffe2.python import workspace from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_cfg from detectron.core.config import load_cfg
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_cfg
from utils.io import cache_url from detectron.core.config import merge_cfg_from_file
import core.rpn_generator as rpn_engine from detectron.utils.io import cache_url
import core.test_engine as model_engine from detectron.utils.logging import setup_logging
import datasets.dummy_datasets as dummy_datasets import detectron.core.rpn_generator as rpn_engine
import utils.c2 as c2_utils import detectron.core.test_engine as model_engine
import utils.logging import detectron.datasets.dummy_datasets as dummy_datasets
import utils.vis as vis_utils import detectron.utils.c2 as c2_utils
import detectron.utils.vis as vis_utils
c2_utils.import_detectron_ops() c2_utils.import_detectron_ops()
# OpenCL may be enabled by default in OpenCV3; disable it because it's not # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations. # thread safe and causes unwanted GPU memory allocations.
cv2.ocl.setUseOpenCL(False) cv2.ocl.setUseOpenCL(False)
...@@ -116,7 +118,7 @@ def get_rpn_box_proposals(im, args): ...@@ -116,7 +118,7 @@ def get_rpn_box_proposals(im, args):
def main(args): def main(args):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
dummy_coco_dataset = dummy_datasets.get_coco_dataset() dummy_coco_dataset = dummy_datasets.get_coco_dataset()
cfg_orig = yaml.load(yaml.dump(cfg)) cfg_orig = load_cfg(yaml.dump(cfg))
im = cv2.imread(args.im_file) im = cv2.imread(args.im_file)
if args.rpn_pkl is not None: if args.rpn_pkl is not None:
...@@ -189,7 +191,7 @@ def check_args(args): ...@@ -189,7 +191,7 @@ def check_args(args):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
utils.logging.setup_logging(__name__) setup_logging(__name__)
args = parse_args() args = parse_args()
check_args(args) check_args(args)
main(args) main(args)
...@@ -35,18 +35,19 @@ import time ...@@ -35,18 +35,19 @@ import time
from caffe2.python import workspace from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_file
from utils.io import cache_url from detectron.utils.io import cache_url
from utils.timer import Timer from detectron.utils.logging import setup_logging
import core.test_engine as infer_engine from detectron.utils.timer import Timer
import datasets.dummy_datasets as dummy_datasets import detectron.core.test_engine as infer_engine
import utils.c2 as c2_utils import detectron.datasets.dummy_datasets as dummy_datasets
import utils.logging import detectron.utils.c2 as c2_utils
import utils.vis as vis_utils import detectron.utils.vis as vis_utils
c2_utils.import_detectron_ops() c2_utils.import_detectron_ops()
# OpenCL may be enabled by default in OpenCV3; disable it because it's not # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations. # thread safe and causes unwanted GPU memory allocations.
cv2.ocl.setUseOpenCL(False) cv2.ocl.setUseOpenCL(False)
...@@ -143,6 +144,6 @@ def main(args): ...@@ -143,6 +144,6 @@ def main(args):
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
utils.logging.setup_logging(__name__) setup_logging(__name__)
args = parse_args() args = parse_args()
main(args) main(args)
...@@ -36,11 +36,11 @@ import os ...@@ -36,11 +36,11 @@ import os
import sys import sys
import yaml import yaml
from core.config import cfg from detectron.core.config import cfg
from datasets import task_evaluation from detectron.datasets import task_evaluation
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
import core.config from detectron.utils.logging import setup_logging
import utils.logging import detectron.core.config as core_config
def parse_args(): def parse_args():
...@@ -89,9 +89,9 @@ def do_reval(dataset_name, output_dir, args): ...@@ -89,9 +89,9 @@ def do_reval(dataset_name, output_dir, args):
dets = pickle.load(f) dets = pickle.load(f)
# Override config with the one saved in the detections file # Override config with the one saved in the detections file
if args.cfg_file is not None: if args.cfg_file is not None:
core.config.merge_cfg_from_cfg(yaml.load(dets['cfg'])) core_config.merge_cfg_from_cfg(core_config.load_cfg(dets['cfg']))
else: else:
core.config._merge_a_into_b(yaml.load(dets['cfg']), cfg) core_config._merge_a_into_b(core_config.load_cfg(dets['cfg']), cfg)
results = task_evaluation.evaluate_all( results = task_evaluation.evaluate_all(
dataset, dataset,
dets['all_boxes'], dets['all_boxes'],
...@@ -104,7 +104,7 @@ def do_reval(dataset_name, output_dir, args): ...@@ -104,7 +104,7 @@ def do_reval(dataset_name, output_dir, args):
if __name__ == '__main__': if __name__ == '__main__':
utils.logging.setup_logging(__name__) setup_logging(__name__)
args = parse_args() args = parse_args()
if args.comp_mode: if args.comp_mode:
cfg.TEST.COMPETITION_MODE = True cfg.TEST.COMPETITION_MODE = True
......
...@@ -31,15 +31,16 @@ import time ...@@ -31,15 +31,16 @@ import time
from caffe2.python import workspace from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_file
from core.config import merge_cfg_from_list from detectron.core.config import merge_cfg_from_list
from core.test_engine import run_inference from detectron.core.test_engine import run_inference
import utils.c2 from detectron.utils.logging import setup_logging
import utils.logging import detectron.utils.c2 as c2_utils
c2_utils.import_detectron_ops()
utils.c2.import_detectron_ops()
# OpenCL may be enabled by default in OpenCV3; disable it because it's not # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations. # thread safe and causes unwanted GPU memory allocations.
cv2.ocl.setUseOpenCL(False) cv2.ocl.setUseOpenCL(False)
...@@ -92,7 +93,7 @@ def parse_args(): ...@@ -92,7 +93,7 @@ def parse_args():
if __name__ == '__main__': if __name__ == '__main__':
workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])
logger = utils.logging.setup_logging(__name__) logger = setup_logging(__name__)
args = parse_args() args = parse_args()
logger.info('Called with args:') logger.info('Called with args:')
logger.info(args) logger.info(args)
......
...@@ -31,17 +31,17 @@ import sys ...@@ -31,17 +31,17 @@ import sys
from caffe2.python import workspace from caffe2.python import workspace
from core.config import assert_and_infer_cfg from detectron.core.config import assert_and_infer_cfg
from core.config import cfg from detectron.core.config import cfg
from core.config import merge_cfg_from_file from detectron.core.config import merge_cfg_from_file
from core.config import merge_cfg_from_list from detectron.core.config import merge_cfg_from_list
from core.test_engine import run_inference from detectron.core.test_engine import run_inference
from utils.logging import setup_logging from detectron.utils.logging import setup_logging
import utils.c2 import detectron.utils.c2 as c2_utils
import utils.train import detectron.utils.train
utils.c2.import_contrib_ops() c2_utils.import_contrib_ops()
utils.c2.import_detectron_ops() c2_utils.import_detectron_ops()
# OpenCL may be enabled by default in OpenCV3; disable it because it's not # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations. # thread safe and causes unwanted GPU memory allocations.
...@@ -90,7 +90,7 @@ def main(): ...@@ -90,7 +90,7 @@ def main():
) )
# Set up logging and load config options # Set up logging and load config options
logger = setup_logging(__name__) logger = setup_logging(__name__)
logging.getLogger('roi_data.loader').setLevel(logging.INFO) logging.getLogger('detectron.roi_data.loader').setLevel(logging.INFO)
args = parse_args() args = parse_args()
logger.info('Called with args:') logger.info('Called with args:')
logger.info(args) logger.info(args)
...@@ -107,7 +107,7 @@ def main(): ...@@ -107,7 +107,7 @@ def main():
# non-deterministic cudnn functions). # non-deterministic cudnn functions).
np.random.seed(cfg.RNG_SEED) np.random.seed(cfg.RNG_SEED)
# Execute the training run # Execute the training run
checkpoints = utils.train.train_model() checkpoints = detectron.utils.train.train_model()
# Test the trained model # Test the trained model
if not args.skip_test: if not args.skip_test:
test_model(checkpoints['final'], args.multi_gpu_testing, args.opts) test_model(checkpoints['final'], args.multi_gpu_testing, args.opts)
......
...@@ -28,8 +28,8 @@ import cv2 ...@@ -28,8 +28,8 @@ import cv2
import os import os
import sys import sys
from datasets.json_dataset import JsonDataset from detectron.datasets.json_dataset import JsonDataset
import utils.vis as vis_utils import detectron.utils.vis as vis_utils
# OpenCL may be enabled by default in OpenCV3; disable it because it's not # OpenCL may be enabled by default in OpenCV3; disable it because it's not
# thread safe and causes unwanted GPU memory allocations. # thread safe and causes unwanted GPU memory allocations.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment