Unverified Commit 76e351a7 authored by Wenwei Zhang's avatar Wenwei Zhang Committed by GitHub
Browse files

Release v1.0.0rc2

parents 5111eda8 4422eaab
......@@ -4,45 +4,78 @@ import warnings
from mmcv.cnn import MODELS as MMCV_MODELS
from mmcv.utils import Registry
from mmdet.models.builder import (BACKBONES, DETECTORS, HEADS, LOSSES, NECKS,
ROI_EXTRACTORS, SHARED_HEADS)
from mmseg.models.builder import SEGMENTORS
from mmdet.models.builder import BACKBONES as MMDET_BACKBONES
from mmdet.models.builder import DETECTORS as MMDET_DETECTORS
from mmdet.models.builder import HEADS as MMDET_HEADS
from mmdet.models.builder import LOSSES as MMDET_LOSSES
from mmdet.models.builder import NECKS as MMDET_NECKS
from mmdet.models.builder import ROI_EXTRACTORS as MMDET_ROI_EXTRACTORS
from mmdet.models.builder import SHARED_HEADS as MMDET_SHARED_HEADS
from mmseg.models.builder import LOSSES as MMSEG_LOSSES
MODELS = Registry('models', parent=MMCV_MODELS)
BACKBONES = MODELS
NECKS = MODELS
ROI_EXTRACTORS = MODELS
SHARED_HEADS = MODELS
HEADS = MODELS
LOSSES = MODELS
DETECTORS = MODELS
VOXEL_ENCODERS = MODELS
MIDDLE_ENCODERS = MODELS
FUSION_LAYERS = MODELS
SEGMENTORS = MODELS
def build_backbone(cfg):
"""Build backbone."""
if cfg['type'] in BACKBONES._module_dict.keys():
return BACKBONES.build(cfg)
else:
return MMDET_BACKBONES.build(cfg)
def build_neck(cfg):
"""Build neck."""
if cfg['type'] in NECKS._module_dict.keys():
return NECKS.build(cfg)
else:
return MMDET_NECKS.build(cfg)
def build_roi_extractor(cfg):
"""Build RoI feature extractor."""
if cfg['type'] in NECKS._module_dict.keys():
return ROI_EXTRACTORS.build(cfg)
else:
return MMDET_ROI_EXTRACTORS.build(cfg)
def build_shared_head(cfg):
"""Build shared head of detector."""
if cfg['type'] in SHARED_HEADS._module_dict.keys():
return SHARED_HEADS.build(cfg)
else:
return MMDET_SHARED_HEADS.build(cfg)
def build_head(cfg):
"""Build head."""
if cfg['type'] in HEADS._module_dict.keys():
return HEADS.build(cfg)
else:
return MMDET_HEADS.build(cfg)
def build_loss(cfg):
"""Build loss function."""
if cfg['type'] in LOSSES._module_dict.keys():
return LOSSES.build(cfg)
elif cfg['type'] in MMDET_LOSSES._module_dict.keys():
return MMDET_LOSSES.build(cfg)
else:
return MMSEG_LOSSES.build(cfg)
def build_detector(cfg, train_cfg=None, test_cfg=None):
......@@ -55,8 +88,12 @@ def build_detector(cfg, train_cfg=None, test_cfg=None):
'train_cfg specified in both outer field and model field '
assert cfg.get('test_cfg') is None or test_cfg is None, \
'test_cfg specified in both outer field and model field '
if cfg['type'] in DETECTORS._module_dict.keys():
return DETECTORS.build(
cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg))
else:
return MMDET_DETECTORS.build(
cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg))
def build_segmentor(cfg, train_cfg=None, test_cfg=None):
......
......@@ -2,7 +2,7 @@
from mmcv.cnn.bricks import ConvModule
from mmdet3d.ops import DGCNNFPModule
from mmdet.models import HEADS
from ..builder import HEADS
from .decode_head import Base3DDecodeHead
......
# Copyright (c) OpenMMLab. All rights reserved.
from mmcv.cnn.bricks import ConvModule
from mmdet.models import HEADS
from ..builder import HEADS
from .pointnet2_head import PointNet2Head
......
......@@ -3,7 +3,7 @@ from mmcv.cnn.bricks import ConvModule
from torch import nn as nn
from mmdet3d.ops import PointFPModule
from mmdet.models import HEADS
from ..builder import HEADS
from .decode_head import Base3DDecodeHead
......
......@@ -8,8 +8,7 @@ from mmdet3d.core import (PseudoSampler, box3d_multiclass_nms, limit_period,
xywhr2xyxyr)
from mmdet.core import (build_assigner, build_bbox_coder,
build_prior_generator, build_sampler, multi_apply)
from mmdet.models import HEADS
from ..builder import build_loss
from ..builder import HEADS, build_loss
from .train_mixins import AnchorTrainMixin
......
......@@ -7,7 +7,7 @@ from mmcv.runner import force_fp32
from torch import nn as nn
from mmdet.core import multi_apply
from mmdet.models.builder import HEADS, build_loss
from ..builder import HEADS, build_loss
from .base_mono3d_dense_head import BaseMono3DDenseHead
......
......@@ -4,7 +4,7 @@ from mmcv.cnn.bricks import build_conv_layer
from mmcv.runner import BaseModule
from torch import nn as nn
from mmdet.models.builder import HEADS
from ..builder import HEADS
@HEADS.register_module()
......
......@@ -3,16 +3,16 @@ import copy
import torch
from mmcv.cnn import ConvModule, build_conv_layer
from mmcv.ops import nms_bev as nms_gpu
from mmcv.runner import BaseModule, force_fp32
from torch import nn
from mmdet3d.core import (circle_nms, draw_heatmap_gaussian, gaussian_radius,
xywhr2xyxyr)
from mmdet3d.core.post_processing import nms_bev
from mmdet3d.models import builder
from mmdet3d.models.builder import HEADS, build_loss
from mmdet3d.models.utils import clip_sigmoid
from mmdet.core import build_bbox_coder, multi_apply
from ..builder import HEADS, build_loss
@HEADS.register_module()
......@@ -747,9 +747,9 @@ class CenterHead(BaseModule):
for i, (box_preds, cls_preds, cls_labels) in enumerate(
zip(batch_reg_preds, batch_cls_preds, batch_cls_labels)):
# Apply NMS in birdeye view
# Apply NMS in bird eye view
# get highest score per prediction, than apply nms
# get the highest score per prediction, then apply nms
# to remove overlapped box.
if num_class_with_bg == 1:
top_scores = cls_preds.squeeze(-1)
......@@ -778,7 +778,7 @@ class CenterHead(BaseModule):
box_preds[:, :], self.bbox_coder.code_size).bev)
# the nms in 3d detection just remove overlap boxes.
selected = nms_gpu(
selected = nms_bev(
boxes_for_nms,
top_scores,
thresh=self.test_cfg['nms_thr'],
......
......@@ -11,7 +11,7 @@ from mmdet3d.core import (box3d_multiclass_nms, limit_period, points_img2cam,
xywhr2xyxyr)
from mmdet.core import multi_apply
from mmdet.core.bbox.builder import build_bbox_coder
from mmdet.models.builder import HEADS, build_loss
from ..builder import HEADS, build_loss
from .anchor_free_mono3d_head import AnchorFreeMono3DHead
INF = 1e8
......
......@@ -4,7 +4,7 @@ from mmcv.runner import force_fp32
from torch.nn import functional as F
from mmdet3d.core.bbox import bbox_overlaps_nearest_3d
from mmdet.models import HEADS
from ..builder import HEADS
from .anchor3d_head import Anchor3DHead
from .train_mixins import get_direction_target
......
......@@ -14,9 +14,8 @@ from torch import nn as nn
from torch.nn import functional as F
from mmdet3d.core.post_processing import aligned_3d_nms
from mmdet3d.models.builder import build_loss
from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
from ..builder import HEADS, build_loss
from .base_conv_bbox_head import BaseConvBboxHead
EPS = 1e-6
......
......@@ -9,11 +9,11 @@ from mmdet3d.models.utils import (filter_outside_objs, get_edge_indices,
get_keypoints, handle_proj_objs)
from mmdet.core import multi_apply
from mmdet.core.bbox.builder import build_bbox_coder
from mmdet.models.builder import HEADS, build_loss
from mmdet.models.utils import gaussian_radius, gen_gaussian_target
from mmdet.models.utils.gaussian_target import (get_local_maximum,
get_topk_from_heatmap,
transpose_and_gather_feat)
from ..builder import HEADS, build_loss
from .anchor_free_mono3d_head import AnchorFreeMono3DHead
......
# Copyright (c) OpenMMLab. All rights reserved.
from __future__ import division
import numpy as np
import torch
from mmcv.ops import nms_bev as nms_gpu
from mmcv.ops import nms_normal_bev as nms_normal_gpu
from mmcv.runner import force_fp32
from mmdet3d.core import limit_period, xywhr2xyxyr
from mmdet.models import HEADS
from mmdet3d.core.post_processing import nms_bev, nms_normal_bev
from ..builder import HEADS
from .anchor3d_head import Anchor3DHead
......@@ -261,9 +258,9 @@ class PartA2RPNHead(Anchor3DHead):
_scores = mlvl_max_scores[score_thr_inds]
_bboxes_for_nms = mlvl_bboxes_for_nms[score_thr_inds, :]
if cfg.use_rotate_nms:
nms_func = nms_gpu
nms_func = nms_bev
else:
nms_func = nms_normal_gpu
nms_func = nms_normal_bev
selected = nms_func(_bboxes_for_nms, _scores, cfg.nms_thr)
_mlvl_bboxes = mlvl_bboxes[score_thr_inds, :]
......@@ -288,7 +285,6 @@ class PartA2RPNHead(Anchor3DHead):
scores = torch.cat(scores, dim=0)
cls_scores = torch.cat(cls_scores, dim=0)
labels = torch.cat(labels, dim=0)
dir_scores = torch.cat(dir_scores, dim=0)
if bboxes.shape[0] > max_num:
_, inds = scores.sort(descending=True)
inds = inds[:max_num]
......
......@@ -9,7 +9,7 @@ from torch.nn import functional as F
from mmdet3d.core import box3d_multiclass_nms, xywhr2xyxyr
from mmdet3d.core.bbox import points_cam2img, points_img2cam
from mmdet.core import distance2bbox, multi_apply
from mmdet.models.builder import HEADS, build_loss
from ..builder import HEADS, build_loss
from .fcos_mono3d_head import FCOSMono3DHead
......
# Copyright (c) OpenMMLab. All rights reserved.
import torch
from mmcv.ops import nms_bev as nms_gpu
from mmcv.ops import nms_normal_bev as nms_normal_gpu
from mmcv.runner import BaseModule, force_fp32
from torch import nn as nn
from mmdet3d.core import xywhr2xyxyr
from mmdet3d.core.bbox.structures import (DepthInstance3DBoxes,
LiDARInstance3DBoxes)
from mmdet3d.core.post_processing import nms_bev, nms_normal_bev
from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS, build_loss
from ..builder import HEADS, build_loss
@HEADS.register_module()
......@@ -19,7 +19,7 @@ class PointRPNHead(BaseModule):
num_classes (int): Number of classes.
train_cfg (dict): Train configs.
test_cfg (dict): Test configs.
pred_layer_cfg (dict, optional): Config of classfication and
pred_layer_cfg (dict, optional): Config of classification and
regression prediction layers. Defaults to None.
enlarge_width (float, optional): Enlarge bbox for each side to ignore
close points. Defaults to 0.1.
......@@ -121,7 +121,7 @@ class PointRPNHead(BaseModule):
batch_size, -1, self._get_cls_out_channels())
point_box_preds = self.reg_layers(feat_reg).reshape(
batch_size, -1, self._get_reg_out_channels())
return (point_box_preds, point_cls_preds)
return point_box_preds, point_cls_preds
@force_fp32(apply_to=('bbox_preds'))
def loss(self,
......@@ -159,7 +159,7 @@ class PointRPNHead(BaseModule):
semantic_targets = mask_targets
semantic_targets[negative_mask] = self.num_classes
semantic_points_label = semantic_targets
# for ignore, but now we do not have ignore label
# for ignore, but now we do not have ignored label
semantic_loss_weight = negative_mask.float() + positive_mask.float()
semantic_loss = self.cls_loss(semantic_points,
semantic_points_label.reshape(-1),
......@@ -220,7 +220,7 @@ class PointRPNHead(BaseModule):
gt_bboxes_3d = gt_bboxes_3d[valid_gt]
gt_labels_3d = gt_labels_3d[valid_gt]
# transform the bbox coordinate to the pointcloud coordinate
# transform the bbox coordinate to the point cloud coordinate
gt_bboxes_3d_tensor = gt_bboxes_3d.tensor.clone()
gt_bboxes_3d_tensor[..., 2] += gt_bboxes_3d_tensor[..., 5] / 2
......@@ -233,7 +233,6 @@ class PointRPNHead(BaseModule):
points[..., 0:3], mask_targets)
positive_mask = (points_mask.max(1)[0] > 0)
negative_mask = (points_mask.max(1)[0] == 0)
# add ignore_mask
extend_gt_bboxes_3d = gt_bboxes_3d.enlarged_box(self.enlarge_width)
points_mask, _ = self._assign_targets_by_points_inside(
......@@ -297,9 +296,9 @@ class PointRPNHead(BaseModule):
nms_cfg = self.test_cfg.nms_cfg if not self.training \
else self.train_cfg.nms_cfg
if nms_cfg.use_rotate_nms:
nms_func = nms_gpu
nms_func = nms_bev
else:
nms_func = nms_normal_gpu
nms_func = nms_normal_bev
num_bbox = bbox.shape[0]
bbox = input_meta['box_type_3d'](
......@@ -322,29 +321,33 @@ class PointRPNHead(BaseModule):
else:
raise NotImplementedError('Unsupported bbox type!')
bbox = bbox.tensor[nonempty_box_mask]
bbox = bbox[nonempty_box_mask]
if self.test_cfg.score_thr is not None:
score_thr = self.test_cfg.score_thr
keep = (obj_scores >= score_thr)
obj_scores = obj_scores[keep]
sem_scores = sem_scores[keep]
bbox = bbox[keep]
bbox = bbox.tensor[keep]
if obj_scores.shape[0] > 0:
topk = min(nms_cfg.nms_pre, obj_scores.shape[0])
obj_scores_nms, indices = torch.topk(obj_scores, k=topk)
bbox_for_nms = bbox[indices]
bbox_for_nms = xywhr2xyxyr(bbox[indices].bev)
sem_scores_nms = sem_scores[indices]
keep = nms_func(bbox_for_nms[:, 0:7], obj_scores_nms,
nms_cfg.iou_thr)
keep = nms_func(bbox_for_nms, obj_scores_nms, nms_cfg.iou_thr)
keep = keep[:nms_cfg.nms_post]
bbox_selected = bbox_for_nms[keep]
bbox_selected = bbox.tensor[indices][keep]
score_selected = obj_scores_nms[keep]
cls_preds = sem_scores_nms[keep]
labels = torch.argmax(cls_preds, -1)
else:
bbox_selected = bbox.tensor
score_selected = obj_scores.new_zeros([0])
labels = obj_scores.new_zeros([0])
cls_preds = obj_scores.new_zeros([0, sem_scores.shape[-1]])
return bbox_selected, score_selected, labels, cls_preds
......
......@@ -9,8 +9,7 @@ from torch import nn as nn
from mmdet3d.core import box3d_multiclass_nms, limit_period, xywhr2xyxyr
from mmdet.core import multi_apply
from mmdet.models import HEADS
from ..builder import build_head
from ..builder import HEADS, build_head
from .anchor3d_head import Anchor3DHead
......
......@@ -4,11 +4,11 @@ from torch.nn import functional as F
from mmdet.core import multi_apply
from mmdet.core.bbox.builder import build_bbox_coder
from mmdet.models.builder import HEADS
from mmdet.models.utils import gaussian_radius, gen_gaussian_target
from mmdet.models.utils.gaussian_target import (get_local_maximum,
get_topk_from_heatmap,
transpose_and_gather_feat)
from ..builder import HEADS
from .anchor_free_mono3d_head import AnchorFreeMono3DHead
......
......@@ -7,9 +7,8 @@ from torch.nn import functional as F
from mmdet3d.core.bbox.structures import (DepthInstance3DBoxes,
LiDARInstance3DBoxes,
rotation_3d_in_axis)
from mmdet3d.models.builder import build_loss
from mmdet.core import multi_apply
from mmdet.models import HEADS
from ..builder import HEADS, build_loss
from .vote_head import VoteHead
......
......@@ -6,12 +6,11 @@ from mmcv.runner import BaseModule, force_fp32
from torch.nn import functional as F
from mmdet3d.core.post_processing import aligned_3d_nms
from mmdet3d.models.builder import build_loss
from mmdet3d.models.losses import chamfer_distance
from mmdet3d.models.model_utils import VoteModule
from mmdet3d.ops import build_sa_module
from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
from ..builder import HEADS, build_loss
from .base_conv_bbox_head import BaseConvBboxHead
......
......@@ -2,7 +2,7 @@
import torch
from mmdet3d.core import bbox3d2result, merge_aug_bboxes_3d
from mmdet.models import DETECTORS
from ..builder import DETECTORS
from .mvx_two_stage import MVXTwoStageDetector
......
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