Commit 99397168 authored by zhangwenwei's avatar zhangwenwei
Browse files

Merge branch 'fix-train-runtime' into 'master'

Fix training runtime

See merge request open-mmlab/mmdet.3d!16
parents 343267ed 84317d37
...@@ -194,7 +194,7 @@ log_config = dict( ...@@ -194,7 +194,7 @@ log_config = dict(
# yapf:enable # yapf:enable
# runtime settings # runtime settings
total_epochs = 80 total_epochs = 80
dist_params = dict(backend='nccl', port=29511) dist_params = dict(backend='nccl')
log_level = 'INFO' log_level = 'INFO'
work_dir = './work_dirs/sec_secfpn_80e' work_dir = './work_dirs/sec_secfpn_80e'
load_from = None load_from = None
......
...@@ -130,7 +130,7 @@ input_modality = dict( ...@@ -130,7 +130,7 @@ input_modality = dict(
use_lidar=True, use_lidar=True,
use_depth=False, use_depth=False,
use_lidar_intensity=True, use_lidar_intensity=True,
use_camera=True, use_camera=False,
) )
db_sampler = dict( db_sampler = dict(
root_path=data_root, root_path=data_root,
...@@ -156,23 +156,12 @@ train_pipeline = [ ...@@ -156,23 +156,12 @@ train_pipeline = [
dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range), dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range), dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
dict(type='PointShuffle'), dict(type='PointShuffle'),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle3D', class_names=class_names), dict(type='DefaultFormatBundle3D', class_names=class_names),
dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d']), dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d']),
] ]
test_pipeline = [ test_pipeline = [
dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range), dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
dict(
type='Resize',
img_scale=[
(1280, 720),
],
multiscale_mode='value',
keep_ratio=True),
dict(type='RandomFlip3D', flip_ratio=0), dict(type='RandomFlip3D', flip_ratio=0),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict( dict(
type='DefaultFormatBundle3D', type='DefaultFormatBundle3D',
class_names=class_names, class_names=class_names,
...@@ -216,7 +205,7 @@ lr_config = dict( ...@@ -216,7 +205,7 @@ lr_config = dict(
warmup='linear', warmup='linear',
warmup_iters=1000, warmup_iters=1000,
warmup_ratio=1.0 / 1000, warmup_ratio=1.0 / 1000,
step=[16, 19]) step=[20, 23])
momentum_config = None momentum_config = None
checkpoint_config = dict(interval=1) checkpoint_config = dict(interval=1)
# yapf:disable # yapf:disable
...@@ -229,10 +218,10 @@ log_config = dict( ...@@ -229,10 +218,10 @@ log_config = dict(
]) ])
# yapf:enable # yapf:enable
# runtime settings # runtime settings
total_epochs = 20 total_epochs = 24
dist_params = dict(backend='nccl') dist_params = dict(backend='nccl')
log_level = 'INFO' log_level = 'INFO'
work_dir = './work_dirs/pp_secfpn_80e' work_dir = './work_dirs/hv_pointpillars_secfpn_sbn-all_4x8_2x_nus-3d'
load_from = None load_from = None
resume_from = None resume_from = None
workflow = [('train', 1)] workflow = [('train', 1)]
...@@ -2,11 +2,11 @@ import torch ...@@ -2,11 +2,11 @@ import torch
from mmcv.parallel import MMDataParallel, MMDistributedDataParallel from mmcv.parallel import MMDataParallel, MMDistributedDataParallel
from mmcv.runner import DistSamplerSeedHook, Runner from mmcv.runner import DistSamplerSeedHook, Runner
from mmdet3d.utils import get_root_logger
from mmdet.apis.train import parse_losses from mmdet.apis.train import parse_losses
from mmdet.core import (DistEvalHook, DistOptimizerHook, EvalHook, from mmdet.core import (DistEvalHook, DistOptimizerHook, EvalHook,
Fp16OptimizerHook, build_optimizer) Fp16OptimizerHook, build_optimizer)
from mmdet.datasets import build_dataloader, build_dataset from mmdet.datasets import build_dataloader, build_dataset
from mmdet.utils import get_root_logger
def batch_processor(model, data, train_mode): def batch_processor(model, data, train_mode):
......
...@@ -38,15 +38,16 @@ def bbox_overlaps_nearest_3d(bboxes1, bboxes2, mode='iou', is_aligned=False): ...@@ -38,15 +38,16 @@ def bbox_overlaps_nearest_3d(bboxes1, bboxes2, mode='iou', is_aligned=False):
"""Calculate nearest 3D IoU """Calculate nearest 3D IoU
Args: Args:
bboxes1: Tensor, shape (N, 7) [x, y, z, h, w, l, ry]? bboxes1: Tensor, shape (N, 7+N) [x, y, z, h, w, l, ry, v]
bboxes2: Tensor, shape (M, 7) [x, y, z, h, w, l, ry]? bboxes2: Tensor, shape (M, 7+N) [x, y, z, h, w, l, ry, v]
mode: mode (str): "iou" (intersection over union) or iof mode: mode (str): "iou" (intersection over union) or iof
(intersection over foreground). (intersection over foreground).
Return: Return:
iou: (M, N) not support aligned mode currently iou: (M, N) not support aligned mode currently
""" """
assert bboxes1.size(-1) == bboxes2.size(-1) == 7 assert bboxes1.size(-1) >= 7
assert bboxes2.size(-1) >= 7
column_index1 = bboxes1.new_tensor([0, 1, 3, 4, 6], dtype=torch.long) column_index1 = bboxes1.new_tensor([0, 1, 3, 4, 6], dtype=torch.long)
rbboxes1_bev = bboxes1.index_select(dim=-1, index=column_index1) rbboxes1_bev = bboxes1.index_select(dim=-1, index=column_index1)
rbboxes2_bev = bboxes2.index_select(dim=-1, index=column_index1) rbboxes2_bev = bboxes2.index_select(dim=-1, index=column_index1)
......
from mmcv.utils import build_from_cfg from mmcv.utils import build_from_cfg
from mmdet3d.utils import get_root_logger
from mmdet.core.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS from mmdet.core.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS
from mmdet.utils import get_root_logger
from .cocktail_optimizer import CocktailOptimizer from .cocktail_optimizer import CocktailOptimizer
......
...@@ -7,9 +7,9 @@ import mmcv ...@@ -7,9 +7,9 @@ import mmcv
import numpy as np import numpy as np
import torch import torch
import torch.utils.data as torch_data import torch.utils.data as torch_data
from mmcv.utils import print_log
from mmdet.datasets import DATASETS from mmdet.datasets import DATASETS
from mmdet.utils import print_log
from ..core.bbox import box_np_ops from ..core.bbox import box_np_ops
from .pipelines import Compose from .pipelines import Compose
from .utils import remove_dontcare from .utils import remove_dontcare
......
...@@ -68,7 +68,7 @@ class DataBaseSampler(object): ...@@ -68,7 +68,7 @@ class DataBaseSampler(object):
db_infos = pickle.load(f) db_infos = pickle.load(f)
# filter database infos # filter database infos
from mmdet.apis import get_root_logger from mmdet3d.utils import get_root_logger
logger = get_root_logger() logger = get_root_logger()
for k, v in db_infos.items(): for k, v in db_infos.items():
logger.info(f'load {len(v)} {k} database infos') logger.info(f'load {len(v)} {k} database infos')
......
import mmcv
import numpy as np import numpy as np
from mmcv.utils import build_from_cfg from mmcv.utils import build_from_cfg
...@@ -34,7 +35,42 @@ class RandomFlip3D(RandomFlip): ...@@ -34,7 +35,42 @@ class RandomFlip3D(RandomFlip):
return gt_bboxes_3d, points return gt_bboxes_3d, points
def __call__(self, input_dict): def __call__(self, input_dict):
super(RandomFlip3D, self).__call__(input_dict) # filp 2D image and its annotations
if 'flip' not in input_dict:
flip = True if np.random.rand() < self.flip_ratio else False
input_dict['flip'] = flip
if 'flip_direction' not in input_dict:
input_dict['flip_direction'] = self.direction
if input_dict['flip']:
# flip image
if 'img' in input_dict:
if isinstance(input_dict['img'], list):
input_dict['img'] = [
mmcv.imflip(
img, direction=input_dict['flip_direction'])
for img in input_dict['img']
]
else:
input_dict['img'] = mmcv.imflip(
input_dict['img'],
direction=input_dict['flip_direction'])
# flip bboxes
for key in input_dict.get('bbox_fields', []):
input_dict[key] = self.bbox_flip(input_dict[key],
input_dict['img_shape'],
input_dict['flip_direction'])
# flip masks
for key in input_dict.get('mask_fields', []):
input_dict[key] = [
mmcv.imflip(mask, direction=input_dict['flip_direction'])
for mask in input_dict[key]
]
# flip segs
for key in input_dict.get('seg_fields', []):
input_dict[key] = mmcv.imflip(
input_dict[key], direction=input_dict['flip_direction'])
if self.sync_2d: if self.sync_2d:
input_dict['pcd_flip'] = input_dict['flip'] input_dict['pcd_flip'] = input_dict['flip']
else: else:
...@@ -50,6 +86,10 @@ class RandomFlip3D(RandomFlip): ...@@ -50,6 +86,10 @@ class RandomFlip3D(RandomFlip):
input_dict['points'] = points input_dict['points'] = points
return input_dict return input_dict
def __repr__(self):
return self.__class__.__name__ + '(flip_ratio={}, sync_2d={})'.format(
self.flip_ratio, self.sync_2d)
@PIPELINES.register_module() @PIPELINES.register_module()
class ObjectSample(object): class ObjectSample(object):
......
...@@ -72,7 +72,7 @@ class SECOND(nn.Module): ...@@ -72,7 +72,7 @@ class SECOND(nn.Module):
def init_weights(self, pretrained=None): def init_weights(self, pretrained=None):
if isinstance(pretrained, str): if isinstance(pretrained, str):
from mmdet3d.apis import get_root_logger from mmdet3d.utils import get_root_logger
logger = get_root_logger() logger = get_root_logger()
load_checkpoint(self, pretrained, strict=False, logger=logger) load_checkpoint(self, pretrained, strict=False, logger=logger)
......
...@@ -59,7 +59,7 @@ class BaseDetector(nn.Module, metaclass=ABCMeta): ...@@ -59,7 +59,7 @@ class BaseDetector(nn.Module, metaclass=ABCMeta):
def init_weights(self, pretrained=None): def init_weights(self, pretrained=None):
if pretrained is not None: if pretrained is not None:
from mmdet3d.apis import get_root_logger from mmdet3d.utils import get_root_logger
logger = get_root_logger() logger = get_root_logger()
logger.info('load model from: {}'.format(pretrained)) logger.info('load model from: {}'.format(pretrained))
......
from mmcv.utils import Registry, build_from_cfg from mmcv.utils import Registry, build_from_cfg, print_log
from mmdet.utils import get_model_complexity_info, get_root_logger, print_log from mmdet.utils import get_model_complexity_info
from .collect_env import collect_env from .collect_env import collect_env
from .logger import get_root_logger
__all__ = [ __all__ = [
'Registry', 'build_from_cfg', 'get_model_complexity_info', 'Registry', 'build_from_cfg', 'get_model_complexity_info',
'get_root_logger', 'print_log', 'collect_env' 'get_root_logger', 'collect_env', 'print_log'
] ]
import logging
from mmcv.utils import get_logger
def get_root_logger(log_file=None, log_level=logging.INFO):
logger = get_logger(name='mmdet3d', log_file=log_file, log_level=log_level)
return logger
matplotlib matplotlib
mmcv>=0.2.15 mmcv>=0.5.0
numba>=0.45.1 numba==0.45.1
numpy numpy
# need older pillow until torchvision is fixed # need older pillow until torchvision is fixed
Pillow<=6.2.2 Pillow<=6.2.2
six six
terminaltables terminaltables
torch>=1.1 torch>=1.3
torchvision torchvision
...@@ -82,7 +82,7 @@ def test_config_build_pipeline(): ...@@ -82,7 +82,7 @@ def test_config_build_pipeline():
# Other configs needs database sampler. # Other configs needs database sampler.
config_names = [ config_names = [
'nus/hv_pointpillars_secfpn_sbn-all_4x8_20e_nus-3d.py', 'nus/hv_pointpillars_secfpn_sbn-all_4x8_2x_nus-3d.py',
] ]
print('Using {} config files'.format(len(config_names))) print('Using {} config files'.format(len(config_names)))
......
...@@ -15,8 +15,8 @@ from mmdet3d import __version__ ...@@ -15,8 +15,8 @@ from mmdet3d import __version__
from mmdet3d.apis import train_detector from mmdet3d.apis import train_detector
from mmdet3d.datasets import build_dataset from mmdet3d.datasets import build_dataset
from mmdet3d.models import build_detector from mmdet3d.models import build_detector
from mmdet3d.utils import collect_env from mmdet3d.utils import collect_env, get_root_logger
from mmdet.apis import get_root_logger, set_random_seed from mmdet.apis import set_random_seed
def parse_args(): def parse_args():
......
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