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(
# yapf:enable
# runtime settings
total_epochs = 80
dist_params = dict(backend='nccl', port=29511)
dist_params = dict(backend='nccl')
log_level = 'INFO'
work_dir = './work_dirs/sec_secfpn_80e'
load_from = None
......
......@@ -130,7 +130,7 @@ input_modality = dict(
use_lidar=True,
use_depth=False,
use_lidar_intensity=True,
use_camera=True,
use_camera=False,
)
db_sampler = dict(
root_path=data_root,
......@@ -156,23 +156,12 @@ train_pipeline = [
dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
dict(type='PointShuffle'),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle3D', class_names=class_names),
dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d']),
]
test_pipeline = [
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='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(
type='DefaultFormatBundle3D',
class_names=class_names,
......@@ -216,7 +205,7 @@ lr_config = dict(
warmup='linear',
warmup_iters=1000,
warmup_ratio=1.0 / 1000,
step=[16, 19])
step=[20, 23])
momentum_config = None
checkpoint_config = dict(interval=1)
# yapf:disable
......@@ -229,10 +218,10 @@ log_config = dict(
])
# yapf:enable
# runtime settings
total_epochs = 20
total_epochs = 24
dist_params = dict(backend='nccl')
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
resume_from = None
workflow = [('train', 1)]
......@@ -2,11 +2,11 @@ import torch
from mmcv.parallel import MMDataParallel, MMDistributedDataParallel
from mmcv.runner import DistSamplerSeedHook, Runner
from mmdet3d.utils import get_root_logger
from mmdet.apis.train import parse_losses
from mmdet.core import (DistEvalHook, DistOptimizerHook, EvalHook,
Fp16OptimizerHook, build_optimizer)
from mmdet.datasets import build_dataloader, build_dataset
from mmdet.utils import get_root_logger
def batch_processor(model, data, train_mode):
......
......@@ -38,15 +38,16 @@ def bbox_overlaps_nearest_3d(bboxes1, bboxes2, mode='iou', is_aligned=False):
"""Calculate nearest 3D IoU
Args:
bboxes1: Tensor, shape (N, 7) [x, y, z, h, w, l, ry]?
bboxes2: Tensor, shape (M, 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+N) [x, y, z, h, w, l, ry, v]
mode: mode (str): "iou" (intersection over union) or iof
(intersection over foreground).
Return:
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)
rbboxes1_bev = bboxes1.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 mmdet3d.utils import get_root_logger
from mmdet.core.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS
from mmdet.utils import get_root_logger
from .cocktail_optimizer import CocktailOptimizer
......
......@@ -7,9 +7,9 @@ import mmcv
import numpy as np
import torch
import torch.utils.data as torch_data
from mmcv.utils import print_log
from mmdet.datasets import DATASETS
from mmdet.utils import print_log
from ..core.bbox import box_np_ops
from .pipelines import Compose
from .utils import remove_dontcare
......
......@@ -68,7 +68,7 @@ class DataBaseSampler(object):
db_infos = pickle.load(f)
# filter database infos
from mmdet.apis import get_root_logger
from mmdet3d.utils import get_root_logger
logger = get_root_logger()
for k, v in db_infos.items():
logger.info(f'load {len(v)} {k} database infos')
......
import mmcv
import numpy as np
from mmcv.utils import build_from_cfg
......@@ -34,7 +35,42 @@ class RandomFlip3D(RandomFlip):
return gt_bboxes_3d, points
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:
input_dict['pcd_flip'] = input_dict['flip']
else:
......@@ -50,6 +86,10 @@ class RandomFlip3D(RandomFlip):
input_dict['points'] = points
return input_dict
def __repr__(self):
return self.__class__.__name__ + '(flip_ratio={}, sync_2d={})'.format(
self.flip_ratio, self.sync_2d)
@PIPELINES.register_module()
class ObjectSample(object):
......
......@@ -72,7 +72,7 @@ class SECOND(nn.Module):
def init_weights(self, pretrained=None):
if isinstance(pretrained, str):
from mmdet3d.apis import get_root_logger
from mmdet3d.utils import get_root_logger
logger = get_root_logger()
load_checkpoint(self, pretrained, strict=False, logger=logger)
......
......@@ -59,7 +59,7 @@ class BaseDetector(nn.Module, metaclass=ABCMeta):
def init_weights(self, pretrained=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.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 .logger import get_root_logger
__all__ = [
'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
mmcv>=0.2.15
numba>=0.45.1
mmcv>=0.5.0
numba==0.45.1
numpy
# need older pillow until torchvision is fixed
Pillow<=6.2.2
six
terminaltables
torch>=1.1
torch>=1.3
torchvision
......@@ -82,7 +82,7 @@ def test_config_build_pipeline():
# Other configs needs database sampler.
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)))
......
......@@ -15,8 +15,8 @@ from mmdet3d import __version__
from mmdet3d.apis import train_detector
from mmdet3d.datasets import build_dataset
from mmdet3d.models import build_detector
from mmdet3d.utils import collect_env
from mmdet.apis import get_root_logger, set_random_seed
from mmdet3d.utils import collect_env, get_root_logger
from mmdet.apis import set_random_seed
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