Commit 791c7b45 authored by Yuxin Wu's avatar Yuxin Wu

[MaskRCNN] split train.py & predict.py (#1163)

parent 9b1b5f29
...@@ -63,12 +63,12 @@ Some reasonable configurations are listed in the table below. ...@@ -63,12 +63,12 @@ Some reasonable configurations are listed in the table below.
To predict on an image (needs DISPLAY to show the outputs): To predict on an image (needs DISPLAY to show the outputs):
``` ```
./train.py --predict input1.jpg input2.jpg --load /path/to/Trained-Model-Checkpoint --config SAME-AS-TRAINING ./predict.py --predict input1.jpg input2.jpg --load /path/to/Trained-Model-Checkpoint --config SAME-AS-TRAINING
``` ```
To evaluate the performance of a model on COCO: To evaluate the performance of a model on COCO:
``` ```
./train.py --evaluate output.json --load /path/to/Trained-Model-Checkpoint \ ./predict.py --evaluate output.json --load /path/to/Trained-Model-Checkpoint \
--config SAME-AS-TRAINING --config SAME-AS-TRAINING
``` ```
...@@ -99,7 +99,7 @@ be approximately reproduced. ...@@ -99,7 +99,7 @@ be approximately reproduced.
| R101-FPN | 40.4;36.6 [:arrow_down:][R101FPN2x] | 40.9;36.4 | 37h | <details><summary>standard</summary>`MODE_FPN=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]` </details> | | R101-FPN | 40.4;36.6 [:arrow_down:][R101FPN2x] | 40.9;36.4 | 37h | <details><summary>standard</summary>`MODE_FPN=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]` </details> |
| R101-FPN | 46.5;40.1 [:arrow_down:][R101FPN3xCasAug] <sup>[3](#ft3)</sup> | | 73h | <details><summary>3x+Cascade+TrainAug</summary>`MODE_FPN=True FPN.CASCADE=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]`<br/>`TEST.RESULT_SCORE_THRESH=1e-4`<br/>`PREPROC.TRAIN_SHORT_EDGE_SIZE=[640,800]`<br/>`TRAIN.LR_SCHEDULE=[420000,500000,540000]` </details> | | R101-FPN | 46.5;40.1 [:arrow_down:][R101FPN3xCasAug] <sup>[3](#ft3)</sup> | | 73h | <details><summary>3x+Cascade+TrainAug</summary>`MODE_FPN=True FPN.CASCADE=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]`<br/>`TEST.RESULT_SCORE_THRESH=1e-4`<br/>`PREPROC.TRAIN_SHORT_EDGE_SIZE=[640,800]`<br/>`TRAIN.LR_SCHEDULE=[420000,500000,540000]` </details> |
| R101-FPN<br/>(From Scratch) | 47.5;41.2 [:arrow_down:][R101FPN9xGNCasAugScratch] | 47.4;40.5<sup>[4](#ft4)</sup> | 45h (on 48 V100s) | <details><summary>9x+GN+Cascade+TrainAug</summary>`MODE_FPN=True FPN.CASCADE=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]`<br/>`FPN.NORM=GN BACKBONE.NORM=GN`<br/>`FPN.FRCNN_HEAD_FUNC=fastrcnn_4conv1fc_gn_head`<br/>`FPN.MRCNN_HEAD_FUNC=maskrcnn_up4conv_gn_head`<br/>`PREPROC.TRAIN_SHORT_EDGE_SIZE=[640,800]`<br/>`TRAIN.LR_SCHEDULE=[1500000,1580000,1620000]`<br/>`BACKBONE.FREEZE_AT=0`</details> | | R101-FPN<br/>(From Scratch) | 47.5;41.2 [:arrow_down:][R101FPN9xGNCasAugScratch] | 47.4;40.5<sup>[4](#ft4)</sup> | 45h (on 48 V100s) | <details><summary>9x+GN+Cascade+TrainAug</summary>`MODE_FPN=True FPN.CASCADE=True`<br/>`BACKBONE.RESNET_NUM_BLOCKS=[3,4,23,3]`<br/>`FPN.NORM=GN BACKBONE.NORM=GN`<br/>`FPN.FRCNN_HEAD_FUNC=fastrcnn_4conv1fc_gn_head`<br/>`FPN.MRCNN_HEAD_FUNC=maskrcnn_up4conv_gn_head`<br/>`PREPROC.TRAIN_SHORT_EDGE_SIZE=[640,800]`<br/>`TRAIN.LR_SCHEDULE=[1500000,1580000,1620000]`<br/>`BACKBONE.FREEZE_AT=0`</details> |
[R50C42x]: http://models.tensorpack.com/FasterRCNN/COCO-R50C4-MaskRCNN-Standard.npz [R50C42x]: http://models.tensorpack.com/FasterRCNN/COCO-R50C4-MaskRCNN-Standard.npz
[R50FPN2x]: http://models.tensorpack.com/FasterRCNN/COCO-R50FPN-MaskRCNN-Standard.npz [R50FPN2x]: http://models.tensorpack.com/FasterRCNN/COCO-R50FPN-MaskRCNN-Standard.npz
[R50FPN2xGN]: http://models.tensorpack.com/FasterRCNN/COCO-R50FPN-MaskRCNN-StandardGN.npz [R50FPN2xGN]: http://models.tensorpack.com/FasterRCNN/COCO-R50FPN-MaskRCNN-StandardGN.npz
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
# File: backbone.py # File: backbone.py
import numpy as np import numpy as np
from contextlib import ExitStack, contextmanager
import tensorflow as tf import tensorflow as tf
from contextlib import ExitStack, contextmanager
from tensorpack.models import BatchNorm, Conv2D, MaxPooling, layer_register from tensorpack.models import BatchNorm, Conv2D, MaxPooling, layer_register
from tensorpack.tfutils import argscope from tensorpack.tfutils import argscope
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
import numpy as np import numpy as np
import os import os
import tqdm import tqdm
import json
from tensorpack.utils import logger from tensorpack.utils import logger
from tensorpack.utils.timer import timed_operation from tensorpack.utils.timer import timed_operation
from config import config as cfg from config import config as cfg
from dataset import DatasetSplit, DatasetRegistry from dataset import DatasetRegistry, DatasetSplit
__all__ = ['register_coco'] __all__ = ['register_coco']
...@@ -42,7 +42,7 @@ class COCODetection(DatasetSplit): ...@@ -42,7 +42,7 @@ class COCODetection(DatasetSplit):
self.name = name self.name = name
self._imgdir = os.path.realpath(os.path.join( self._imgdir = os.path.realpath(os.path.join(
basedir, self._INSTANCE_TO_BASEDIR.get(name, name))) basedir, self._INSTANCE_TO_BASEDIR.get(name, name)))
assert os.path.isdir(self._imgdir), self._imgdir assert os.path.isdir(self._imgdir), "{} is not a directory!".format(self._imgdir)
annotation_file = os.path.join( annotation_file = os.path.join(
basedir, 'annotations/instances_{}.json'.format(name)) basedir, 'annotations/instances_{}.json'.format(name))
assert os.path.isfile(annotation_file), annotation_file assert os.path.isfile(annotation_file), annotation_file
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
import numpy as np import numpy as np
import os import os
import six
import pprint import pprint
import six
from tensorpack.utils import logger from tensorpack.utils import logger
from tensorpack.utils.gpu import get_num_gpu from tensorpack.utils.gpu import get_num_gpu
......
...@@ -2,24 +2,26 @@ ...@@ -2,24 +2,26 @@
# File: data.py # File: data.py
import copy import copy
import itertools
import numpy as np import numpy as np
import cv2 import cv2
import itertools
from tabulate import tabulate from tabulate import tabulate
from termcolor import colored from termcolor import colored
from tensorpack.dataflow import ( from tensorpack.dataflow import (
DataFromList, MapDataComponent, MapData, MultiProcessMapDataZMQ, MultiThreadMapData, TestDataSpeed, imgaug) DataFromList, MapData, MapDataComponent, MultiProcessMapDataZMQ, MultiThreadMapData,
TestDataSpeed, imgaug)
from tensorpack.utils import logger from tensorpack.utils import logger
from tensorpack.utils.argtools import log_once, memoized from tensorpack.utils.argtools import log_once, memoized
from common import ( from common import (
CustomResize, DataFromListOfDict, box_to_point8, CustomResize, DataFromListOfDict, box_to_point8, filter_boxes_inside_shape, np_iou,
filter_boxes_inside_shape, point8_to_box, segmentation_to_mask, np_iou) point8_to_box, segmentation_to_mask)
from config import config as cfg from config import config as cfg
from dataset import DatasetRegistry from dataset import DatasetRegistry
from utils.generate_anchors import generate_anchors from utils.generate_anchors import generate_anchors
from utils.np_box_ops import area as np_area, ioa as np_ioa from utils.np_box_ops import area as np_area
from utils.np_box_ops import ioa as np_ioa
# import tensorpack.utils.viz as tpviz # import tensorpack.utils.viz as tpviz
......
...@@ -2,17 +2,17 @@ ...@@ -2,17 +2,17 @@
# File: eval.py # File: eval.py
import itertools import itertools
import sys
import os
import json import json
import numpy as np import numpy as np
import os
import sys
import tensorflow as tf
from collections import namedtuple from collections import namedtuple
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from contextlib import ExitStack from contextlib import ExitStack
import cv2 import cv2
import pycocotools.mask as cocomask import pycocotools.mask as cocomask
import tqdm import tqdm
import tensorflow as tf
from tensorpack.callbacks import Callback from tensorpack.callbacks import Callback
from tensorpack.tfutils.common import get_tf_version_tuple from tensorpack.tfutils.common import get_tf_version_tuple
...@@ -20,9 +20,9 @@ from tensorpack.utils import logger ...@@ -20,9 +20,9 @@ from tensorpack.utils import logger
from tensorpack.utils.utils import get_tqdm from tensorpack.utils.utils import get_tqdm
from common import CustomResize, clip_boxes from common import CustomResize, clip_boxes
from config import config as cfg
from data import get_eval_dataflow from data import get_eval_dataflow
from dataset import DatasetRegistry from dataset import DatasetRegistry
from config import config as cfg
try: try:
import horovod.tensorflow as hvd import horovod.tensorflow as hvd
......
...@@ -4,22 +4,23 @@ ...@@ -4,22 +4,23 @@
import tensorflow as tf import tensorflow as tf
from tensorpack import ModelDesc from tensorpack import ModelDesc
from tensorpack.models import regularize_cost, l2_regularizer, GlobalAvgPooling from tensorpack.models import GlobalAvgPooling, l2_regularizer, regularize_cost
from tensorpack.tfutils.tower import get_current_tower_context
from tensorpack.tfutils.summary import add_moving_summary
from tensorpack.tfutils import optimizer from tensorpack.tfutils import optimizer
from tensorpack.tfutils.summary import add_moving_summary
from tensorpack.tfutils.tower import get_current_tower_context
import model_frcnn import model_frcnn
import model_mrcnn import model_mrcnn
from backbone import image_preprocess, resnet_c4_backbone, resnet_conv5, resnet_fpn_backbone from backbone import image_preprocess, resnet_c4_backbone, resnet_conv5, resnet_fpn_backbone
from config import config as cfg
from data import get_all_anchors, get_all_anchors_fpn
from model_box import RPNAnchors, clip_boxes, crop_and_resize, roi_align from model_box import RPNAnchors, clip_boxes, crop_and_resize, roi_align
from model_cascade import CascadeRCNNHead from model_cascade import CascadeRCNNHead
from model_fpn import fpn_model, generate_fpn_proposals, multilevel_roi_align, multilevel_rpn_losses from model_fpn import fpn_model, generate_fpn_proposals, multilevel_roi_align, multilevel_rpn_losses
from model_frcnn import BoxProposals, FastRCNNHead, fastrcnn_outputs, fastrcnn_predictions, sample_fast_rcnn_targets from model_frcnn import (
BoxProposals, FastRCNNHead, fastrcnn_outputs, fastrcnn_predictions, sample_fast_rcnn_targets)
from model_mrcnn import maskrcnn_loss, maskrcnn_upXconv_head from model_mrcnn import maskrcnn_loss, maskrcnn_upXconv_head
from model_rpn import generate_rpn_proposals, rpn_head, rpn_losses from model_rpn import generate_rpn_proposals, rpn_head, rpn_losses
from data import get_all_anchors, get_all_anchors_fpn
from config import config as cfg
class GeneralizedRCNN(ModelDesc): class GeneralizedRCNN(ModelDesc):
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
# File: model_box.py # File: model_box.py
import numpy as np import numpy as np
from collections import namedtuple
import tensorflow as tf import tensorflow as tf
from collections import namedtuple
from tensorpack.tfutils.scope_utils import under_name_scope from tensorpack.tfutils.scope_utils import under_name_scope
......
This diff is collapsed.
...@@ -8,8 +8,8 @@ from tensorpack.utils import viz ...@@ -8,8 +8,8 @@ from tensorpack.utils import viz
from tensorpack.utils.palette import PALETTE_RGB from tensorpack.utils.palette import PALETTE_RGB
from config import config as cfg from config import config as cfg
from utils.np_box_ops import iou as np_iou
from utils.np_box_ops import area as np_area from utils.np_box_ops import area as np_area
from utils.np_box_ops import iou as np_iou
def draw_annotation(img, boxes, klass, is_crowd=None): def draw_annotation(img, boxes, klass, is_crowd=None):
......
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