"vscode:/vscode.git/clone" did not exist on "4c51afce2a3e26de31db10174906a2f6db5cc9e0"
Unverified Commit 76e351a7 authored by Wenwei Zhang's avatar Wenwei Zhang Committed by GitHub
Browse files

Release v1.0.0rc2

parents 5111eda8 4422eaab
...@@ -3,8 +3,8 @@ import torch ...@@ -3,8 +3,8 @@ import torch
from torch import nn as nn from torch import nn as nn
from mmdet3d.ops import PAConv, PAConvCUDA from mmdet3d.ops import PAConv, PAConvCUDA
from mmdet.models.builder import LOSSES
from mmdet.models.losses.utils import weight_reduce_loss from mmdet.models.losses.utils import weight_reduce_loss
from ..builder import LOSSES
def weight_correlation(conv): def weight_correlation(conv):
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
import torch import torch
from torch import nn as nn from torch import nn as nn
from mmdet.models.builder import LOSSES
from mmdet.models.losses.utils import weighted_loss from mmdet.models.losses.utils import weighted_loss
from ..builder import LOSSES
@weighted_loss @weighted_loss
......
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
from mmcv.ops import SparseConvTensor, SparseSequential
from mmcv.runner import auto_fp16 from mmcv.runner import auto_fp16
from torch import nn as nn from torch import nn as nn
from mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule from mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule
from mmdet3d.ops.spconv import IS_SPCONV2_AVAILABLE
from ..builder import MIDDLE_ENCODERS from ..builder import MIDDLE_ENCODERS
if IS_SPCONV2_AVAILABLE:
from spconv.pytorch import SparseConvTensor, SparseSequential
else:
from mmcv.ops import SparseConvTensor, SparseSequential
@MIDDLE_ENCODERS.register_module() @MIDDLE_ENCODERS.register_module()
class SparseEncoder(nn.Module): class SparseEncoder(nn.Module):
......
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
import torch import torch
from mmcv.ops import SparseConvTensor, SparseSequential
from mmdet3d.ops.spconv import IS_SPCONV2_AVAILABLE
if IS_SPCONV2_AVAILABLE:
from spconv.pytorch import SparseConvTensor, SparseSequential
else:
from mmcv.ops import SparseConvTensor, SparseSequential
from mmcv.runner import BaseModule, auto_fp16 from mmcv.runner import BaseModule, auto_fp16
from mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule from mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule
......
...@@ -6,7 +6,7 @@ from mmcv.cnn import ConvModule, build_conv_layer ...@@ -6,7 +6,7 @@ from mmcv.cnn import ConvModule, build_conv_layer
from mmcv.runner import BaseModule from mmcv.runner import BaseModule
from torch import nn as nn from torch import nn as nn
from mmdet.models.builder import NECKS from ..builder import NECKS
def fill_up_weights(up): def fill_up_weights(up):
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
from mmcv.cnn import ConvModule from mmcv.cnn import ConvModule
from torch import nn from torch import nn
from mmdet.models import NECKS from ..builder import NECKS
@NECKS.register_module() @NECKS.register_module()
......
...@@ -3,7 +3,7 @@ from mmcv.runner import BaseModule ...@@ -3,7 +3,7 @@ from mmcv.runner import BaseModule
from torch import nn as nn from torch import nn as nn
from mmdet3d.ops import PointFPModule from mmdet3d.ops import PointFPModule
from mmdet.models import NECKS from ..builder import NECKS
@NECKS.register_module() @NECKS.register_module()
......
...@@ -5,7 +5,7 @@ from mmcv.cnn import build_conv_layer, build_norm_layer, build_upsample_layer ...@@ -5,7 +5,7 @@ from mmcv.cnn import build_conv_layer, build_norm_layer, build_upsample_layer
from mmcv.runner import BaseModule, auto_fp16 from mmcv.runner import BaseModule, auto_fp16
from torch import nn as nn from torch import nn as nn
from mmdet.models import NECKS from ..builder import NECKS
@NECKS.register_module() @NECKS.register_module()
......
...@@ -7,11 +7,10 @@ from torch.nn import functional as F ...@@ -7,11 +7,10 @@ from torch.nn import functional as F
from mmdet3d.core.bbox import DepthInstance3DBoxes from mmdet3d.core.bbox import DepthInstance3DBoxes
from mmdet3d.core.post_processing import aligned_3d_nms from mmdet3d.core.post_processing import aligned_3d_nms
from mmdet3d.models.builder import build_loss from mmdet3d.models.builder import HEADS, build_loss
from mmdet3d.models.losses import chamfer_distance from mmdet3d.models.losses import chamfer_distance
from mmdet3d.ops import build_sa_module from mmdet3d.ops import build_sa_module
from mmdet.core import build_bbox_coder, multi_apply from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module() @HEADS.register_module()
......
...@@ -3,17 +3,15 @@ import numpy as np ...@@ -3,17 +3,15 @@ import numpy as np
import torch import torch
from mmcv.cnn import ConvModule, normal_init from mmcv.cnn import ConvModule, normal_init
from mmcv.ops import SparseConvTensor, SparseMaxPool3d, SparseSequential from mmcv.ops import SparseConvTensor, SparseMaxPool3d, SparseSequential
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 from mmcv.runner import BaseModule
from torch import nn as nn from torch import nn as nn
from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes, from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes,
rotation_3d_in_axis, xywhr2xyxyr) rotation_3d_in_axis, xywhr2xyxyr)
from mmdet3d.models.builder import build_loss from mmdet3d.core.post_processing import nms_bev, nms_normal_bev
from mmdet3d.models.builder import HEADS, build_loss
from mmdet3d.ops import make_sparse_convmodule from mmdet3d.ops import make_sparse_convmodule
from mmdet.core import build_bbox_coder, multi_apply from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module() @HEADS.register_module()
...@@ -582,9 +580,9 @@ class PartA2BboxHead(BaseModule): ...@@ -582,9 +580,9 @@ class PartA2BboxHead(BaseModule):
torch.Tensor: Selected indices. torch.Tensor: Selected indices.
""" """
if use_rotate_nms: if use_rotate_nms:
nms_func = nms_gpu nms_func = nms_bev
else: else:
nms_func = nms_normal_gpu nms_func = nms_normal_bev
assert box_probs.shape[ assert box_probs.shape[
1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}' 1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}'
......
...@@ -3,17 +3,15 @@ import numpy as np ...@@ -3,17 +3,15 @@ import numpy as np
import torch import torch
from mmcv.cnn import ConvModule, normal_init from mmcv.cnn import ConvModule, normal_init
from mmcv.cnn.bricks import build_conv_layer from mmcv.cnn.bricks import build_conv_layer
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 from mmcv.runner import BaseModule
from torch import nn as nn from torch import nn as nn
from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes, from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes,
rotation_3d_in_axis, xywhr2xyxyr) rotation_3d_in_axis, xywhr2xyxyr)
from mmdet3d.models.builder import build_loss from mmdet3d.core.post_processing import nms_bev, nms_normal_bev
from mmdet3d.models.builder import HEADS, build_loss
from mmdet3d.ops import build_sa_module from mmdet3d.ops import build_sa_module
from mmdet.core import build_bbox_coder, multi_apply from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module() @HEADS.register_module()
...@@ -239,7 +237,7 @@ class PointRCNNBboxHead(BaseModule): ...@@ -239,7 +237,7 @@ class PointRCNNBboxHead(BaseModule):
rcnn_reg = self.conv_reg(x_reg) rcnn_reg = self.conv_reg(x_reg)
rcnn_cls = rcnn_cls.transpose(1, 2).contiguous().squeeze(dim=1) rcnn_cls = rcnn_cls.transpose(1, 2).contiguous().squeeze(dim=1)
rcnn_reg = rcnn_reg.transpose(1, 2).contiguous().squeeze(dim=1) rcnn_reg = rcnn_reg.transpose(1, 2).contiguous().squeeze(dim=1)
return (rcnn_cls, rcnn_reg) return rcnn_cls, rcnn_reg
def loss(self, cls_score, bbox_pred, rois, labels, bbox_targets, def loss(self, cls_score, bbox_pred, rois, labels, bbox_targets,
pos_gt_bboxes, reg_mask, label_weights, bbox_weights): pos_gt_bboxes, reg_mask, label_weights, bbox_weights):
...@@ -483,7 +481,7 @@ class PointRCNNBboxHead(BaseModule): ...@@ -483,7 +481,7 @@ class PointRCNNBboxHead(BaseModule):
local_roi_boxes[..., 0:3] = 0 local_roi_boxes[..., 0:3] = 0
rcnn_boxes3d = self.bbox_coder.decode(local_roi_boxes, bbox_pred) rcnn_boxes3d = self.bbox_coder.decode(local_roi_boxes, bbox_pred)
rcnn_boxes3d[..., 0:3] = rotation_3d_in_axis( rcnn_boxes3d[..., 0:3] = rotation_3d_in_axis(
rcnn_boxes3d[..., 0:3].unsqueeze(1), (roi_ry), axis=2).squeeze(1) rcnn_boxes3d[..., 0:3].unsqueeze(1), roi_ry, axis=2).squeeze(1)
rcnn_boxes3d[:, 0:3] += roi_xyz rcnn_boxes3d[:, 0:3] += roi_xyz
# post processing # post processing
...@@ -492,7 +490,6 @@ class PointRCNNBboxHead(BaseModule): ...@@ -492,7 +490,6 @@ class PointRCNNBboxHead(BaseModule):
cur_class_labels = class_labels[batch_id] cur_class_labels = class_labels[batch_id]
cur_cls_score = cls_score[roi_batch_id == batch_id].view(-1) cur_cls_score = cls_score[roi_batch_id == batch_id].view(-1)
cur_box_prob = cls_score[batch_id]
cur_box_prob = cur_cls_score.unsqueeze(1) cur_box_prob = cur_cls_score.unsqueeze(1)
cur_rcnn_boxes3d = rcnn_boxes3d[roi_batch_id == batch_id] cur_rcnn_boxes3d = rcnn_boxes3d[roi_batch_id == batch_id]
keep = self.multi_class_nms(cur_box_prob, cur_rcnn_boxes3d, keep = self.multi_class_nms(cur_box_prob, cur_rcnn_boxes3d,
...@@ -524,7 +521,7 @@ class PointRCNNBboxHead(BaseModule): ...@@ -524,7 +521,7 @@ class PointRCNNBboxHead(BaseModule):
merging these two functions in the future. merging these two functions in the future.
Args: Args:
box_probs (torch.Tensor): Predicted boxes probabitilies in box_probs (torch.Tensor): Predicted boxes probabilities in
shape (N,). shape (N,).
box_preds (torch.Tensor): Predicted boxes in shape (N, 7+C). box_preds (torch.Tensor): Predicted boxes in shape (N, 7+C).
score_thr (float): Threshold of scores. score_thr (float): Threshold of scores.
...@@ -537,9 +534,9 @@ class PointRCNNBboxHead(BaseModule): ...@@ -537,9 +534,9 @@ class PointRCNNBboxHead(BaseModule):
torch.Tensor: Selected indices. torch.Tensor: Selected indices.
""" """
if use_rotate_nms: if use_rotate_nms:
nms_func = nms_gpu nms_func = nms_bev
else: else:
nms_func = nms_normal_gpu nms_func = nms_normal_bev
assert box_probs.shape[ assert box_probs.shape[
1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}' 1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}'
......
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
from mmdet3d.core.bbox import bbox3d2result from mmdet3d.core.bbox import bbox3d2result
from mmdet.models import HEADS from ..builder import HEADS, build_head
from ..builder import build_head
from .base_3droi_head import Base3DRoIHead from .base_3droi_head import Base3DRoIHead
......
...@@ -5,9 +5,8 @@ from torch import nn as nn ...@@ -5,9 +5,8 @@ from torch import nn as nn
from torch.nn import functional as F from torch.nn import functional as F
from mmdet3d.core.bbox.structures import rotation_3d_in_axis from mmdet3d.core.bbox.structures import rotation_3d_in_axis
from mmdet3d.models.builder import build_loss from mmdet3d.models.builder import HEADS, build_loss
from mmdet.core import multi_apply from mmdet.core import multi_apply
from mmdet.models import HEADS
@HEADS.register_module() @HEADS.register_module()
......
...@@ -6,11 +6,10 @@ from mmcv.runner import BaseModule ...@@ -6,11 +6,10 @@ from mmcv.runner import BaseModule
from torch import nn as nn from torch import nn as nn
from torch.nn import functional as F from torch.nn import functional as F
from mmdet3d.models.builder import build_loss from mmdet3d.models.builder import HEADS, build_loss
from mmdet3d.models.model_utils import VoteModule from mmdet3d.models.model_utils import VoteModule
from mmdet3d.ops import build_sa_module from mmdet3d.ops import build_sa_module
from mmdet.core import multi_apply from mmdet.core import multi_apply
from mmdet.models import HEADS
@HEADS.register_module() @HEADS.register_module()
......
...@@ -6,8 +6,7 @@ from torch.nn import functional as F ...@@ -6,8 +6,7 @@ from torch.nn import functional as F
from mmdet3d.core import AssignResult from mmdet3d.core import AssignResult
from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi
from mmdet.core import build_assigner, build_sampler from mmdet.core import build_assigner, build_sampler
from mmdet.models import HEADS from ..builder import HEADS, build_head, build_roi_extractor
from ..builder import build_head, build_roi_extractor
from .base_3droi_head import Base3DRoIHead from .base_3droi_head import Base3DRoIHead
......
...@@ -5,8 +5,7 @@ from torch.nn import functional as F ...@@ -5,8 +5,7 @@ from torch.nn import functional as F
from mmdet3d.core import AssignResult from mmdet3d.core import AssignResult
from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi
from mmdet.core import build_assigner, build_sampler from mmdet.core import build_assigner, build_sampler
from mmdet.models import HEADS from ..builder import HEADS, build_head, build_roi_extractor
from ..builder import build_head, build_roi_extractor
from .base_3droi_head import Base3DRoIHead from .base_3droi_head import Base3DRoIHead
......
...@@ -3,7 +3,7 @@ import torch ...@@ -3,7 +3,7 @@ import torch
from mmcv import ops from mmcv import ops
from mmcv.runner import BaseModule from mmcv.runner import BaseModule
from mmdet.models.builder import ROI_EXTRACTORS from mmdet3d.models.builder import ROI_EXTRACTORS
@ROI_EXTRACTORS.register_module() @ROI_EXTRACTORS.register_module()
......
...@@ -4,7 +4,7 @@ from mmcv import ops ...@@ -4,7 +4,7 @@ from mmcv import ops
from torch import nn as nn from torch import nn as nn
from mmdet3d.core.bbox.structures import rotation_3d_in_axis from mmdet3d.core.bbox.structures import rotation_3d_in_axis
from mmdet.models.builder import ROI_EXTRACTORS from mmdet3d.models.builder import ROI_EXTRACTORS
@ROI_EXTRACTORS.register_module() @ROI_EXTRACTORS.register_module()
......
...@@ -5,8 +5,8 @@ from torch import nn as nn ...@@ -5,8 +5,8 @@ from torch import nn as nn
from torch.nn import functional as F from torch.nn import functional as F
from mmseg.core import add_prefix from mmseg.core import add_prefix
from mmseg.models import SEGMENTORS from ..builder import (SEGMENTORS, build_backbone, build_head, build_loss,
from ..builder import build_backbone, build_head, build_loss, build_neck build_neck)
from .base import Base3DSegmentor from .base import Base3DSegmentor
......
...@@ -53,11 +53,27 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d): ...@@ -53,11 +53,27 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d):
# TODO: make mmcv fp16 utils handle customized norm layers # TODO: make mmcv fp16 utils handle customized norm layers
@force_fp32(out_fp16=True) @force_fp32(out_fp16=True)
def forward(self, input): def forward(self, input):
"""
Args:
input (tensor): Has shape (N, C) or (N, C, L), where N is
the batch size, C is the number of features or
channels, and L is the sequence length
Returns:
tensor: Has shape (N, C) or (N, C, L), has same shape
as input.
"""
assert input.dtype == torch.float32, \ assert input.dtype == torch.float32, \
f'input should be in float32 type, got {input.dtype}' f'input should be in float32 type, got {input.dtype}'
if dist.get_world_size() == 1 or not self.training: using_dist = dist.is_available() and dist.is_initialized()
if (not using_dist) or dist.get_world_size() == 1 \
or not self.training:
return super().forward(input) return super().forward(input)
assert input.shape[0] > 0, 'SyncBN does not support empty inputs' assert input.shape[0] > 0, 'SyncBN does not support empty inputs'
is_two_dim = input.dim() == 2
if is_two_dim:
input = input.unsqueeze(2)
C = input.shape[1] C = input.shape[1]
mean = torch.mean(input, dim=[0, 2]) mean = torch.mean(input, dim=[0, 2])
meansqr = torch.mean(input * input, dim=[0, 2]) meansqr = torch.mean(input * input, dim=[0, 2])
...@@ -76,7 +92,10 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d): ...@@ -76,7 +92,10 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d):
bias = self.bias - mean * scale bias = self.bias - mean * scale
scale = scale.reshape(1, -1, 1) scale = scale.reshape(1, -1, 1)
bias = bias.reshape(1, -1, 1) bias = bias.reshape(1, -1, 1)
return input * scale + bias output = input * scale + bias
if is_two_dim:
output = output.squeeze(2)
return output
@NORM_LAYERS.register_module('naiveSyncBN2d') @NORM_LAYERS.register_module('naiveSyncBN2d')
...@@ -107,9 +126,19 @@ class NaiveSyncBatchNorm2d(nn.BatchNorm2d): ...@@ -107,9 +126,19 @@ class NaiveSyncBatchNorm2d(nn.BatchNorm2d):
# TODO: make mmcv fp16 utils handle customized norm layers # TODO: make mmcv fp16 utils handle customized norm layers
@force_fp32(out_fp16=True) @force_fp32(out_fp16=True)
def forward(self, input): def forward(self, input):
"""
Args:
Input (tensor): Feature has shape (N, C, H, W).
Returns:
tensor: Has shape (N, C, H, W), same shape as input.
"""
assert input.dtype == torch.float32, \ assert input.dtype == torch.float32, \
f'input should be in float32 type, got {input.dtype}' f'input should be in float32 type, got {input.dtype}'
if dist.get_world_size() == 1 or not self.training: using_dist = dist.is_available() and dist.is_initialized()
if (not using_dist) or \
dist.get_world_size() == 1 or \
not self.training:
return super().forward(input) return super().forward(input)
assert input.shape[0] > 0, 'SyncBN does not support empty inputs' assert input.shape[0] > 0, 'SyncBN does not support empty inputs'
......
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