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
from torch import nn as nn
from mmdet3d.ops import PAConv, PAConvCUDA
from mmdet.models.builder import LOSSES
from mmdet.models.losses.utils import weight_reduce_loss
from ..builder import LOSSES
def weight_correlation(conv):
......
......@@ -2,8 +2,8 @@
import torch
from torch import nn as nn
from mmdet.models.builder import LOSSES
from mmdet.models.losses.utils import weighted_loss
from ..builder import LOSSES
@weighted_loss
......
# Copyright (c) OpenMMLab. All rights reserved.
from mmcv.ops import SparseConvTensor, SparseSequential
from mmcv.runner import auto_fp16
from torch import nn as nn
from mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule
from mmdet3d.ops.spconv import IS_SPCONV2_AVAILABLE
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()
class SparseEncoder(nn.Module):
......
# Copyright (c) OpenMMLab. All rights reserved.
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 mmdet3d.ops import SparseBasicBlock, make_sparse_convmodule
......
......@@ -6,7 +6,7 @@ from mmcv.cnn import ConvModule, build_conv_layer
from mmcv.runner import BaseModule
from torch import nn as nn
from mmdet.models.builder import NECKS
from ..builder import NECKS
def fill_up_weights(up):
......
......@@ -2,7 +2,7 @@
from mmcv.cnn import ConvModule
from torch import nn
from mmdet.models import NECKS
from ..builder import NECKS
@NECKS.register_module()
......
......@@ -3,7 +3,7 @@ from mmcv.runner import BaseModule
from torch import nn as nn
from mmdet3d.ops import PointFPModule
from mmdet.models import NECKS
from ..builder import NECKS
@NECKS.register_module()
......
......@@ -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 torch import nn as nn
from mmdet.models import NECKS
from ..builder import NECKS
@NECKS.register_module()
......
......@@ -7,11 +7,10 @@ from torch.nn import functional as F
from mmdet3d.core.bbox import DepthInstance3DBoxes
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.ops import build_sa_module
from mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module()
......
......@@ -3,17 +3,15 @@ import numpy as np
import torch
from mmcv.cnn import ConvModule, normal_init
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 torch import nn as nn
from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes,
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 mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module()
......@@ -582,9 +580,9 @@ class PartA2BboxHead(BaseModule):
torch.Tensor: Selected indices.
"""
if use_rotate_nms:
nms_func = nms_gpu
nms_func = nms_bev
else:
nms_func = nms_normal_gpu
nms_func = nms_normal_bev
assert box_probs.shape[
1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}'
......
......@@ -3,17 +3,15 @@ import numpy as np
import torch
from mmcv.cnn import ConvModule, normal_init
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 torch import nn as nn
from mmdet3d.core.bbox.structures import (LiDARInstance3DBoxes,
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 mmdet.core import build_bbox_coder, multi_apply
from mmdet.models import HEADS
@HEADS.register_module()
......@@ -239,7 +237,7 @@ class PointRCNNBboxHead(BaseModule):
rcnn_reg = self.conv_reg(x_reg)
rcnn_cls = rcnn_cls.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,
pos_gt_bboxes, reg_mask, label_weights, bbox_weights):
......@@ -483,7 +481,7 @@ class PointRCNNBboxHead(BaseModule):
local_roi_boxes[..., 0:3] = 0
rcnn_boxes3d = self.bbox_coder.decode(local_roi_boxes, bbox_pred)
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
# post processing
......@@ -492,7 +490,6 @@ class PointRCNNBboxHead(BaseModule):
cur_class_labels = class_labels[batch_id]
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_rcnn_boxes3d = rcnn_boxes3d[roi_batch_id == batch_id]
keep = self.multi_class_nms(cur_box_prob, cur_rcnn_boxes3d,
......@@ -524,7 +521,7 @@ class PointRCNNBboxHead(BaseModule):
merging these two functions in the future.
Args:
box_probs (torch.Tensor): Predicted boxes probabitilies in
box_probs (torch.Tensor): Predicted boxes probabilities in
shape (N,).
box_preds (torch.Tensor): Predicted boxes in shape (N, 7+C).
score_thr (float): Threshold of scores.
......@@ -537,9 +534,9 @@ class PointRCNNBboxHead(BaseModule):
torch.Tensor: Selected indices.
"""
if use_rotate_nms:
nms_func = nms_gpu
nms_func = nms_bev
else:
nms_func = nms_normal_gpu
nms_func = nms_normal_bev
assert box_probs.shape[
1] == self.num_classes, f'box_probs shape: {str(box_probs.shape)}'
......
# Copyright (c) OpenMMLab. All rights reserved.
from mmdet3d.core.bbox import bbox3d2result
from mmdet.models import HEADS
from ..builder import build_head
from ..builder import HEADS, build_head
from .base_3droi_head import Base3DRoIHead
......
......@@ -5,9 +5,8 @@ from torch import nn as nn
from torch.nn import functional as F
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.models import HEADS
@HEADS.register_module()
......
......@@ -6,11 +6,10 @@ from mmcv.runner import BaseModule
from torch import nn as nn
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.ops import build_sa_module
from mmdet.core import multi_apply
from mmdet.models import HEADS
@HEADS.register_module()
......
......@@ -6,8 +6,7 @@ from torch.nn import functional as F
from mmdet3d.core import AssignResult
from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi
from mmdet.core import build_assigner, build_sampler
from mmdet.models import HEADS
from ..builder import build_head, build_roi_extractor
from ..builder import HEADS, build_head, build_roi_extractor
from .base_3droi_head import Base3DRoIHead
......
......@@ -5,8 +5,7 @@ from torch.nn import functional as F
from mmdet3d.core import AssignResult
from mmdet3d.core.bbox import bbox3d2result, bbox3d2roi
from mmdet.core import build_assigner, build_sampler
from mmdet.models import HEADS
from ..builder import build_head, build_roi_extractor
from ..builder import HEADS, build_head, build_roi_extractor
from .base_3droi_head import Base3DRoIHead
......
......@@ -3,7 +3,7 @@ import torch
from mmcv import ops
from mmcv.runner import BaseModule
from mmdet.models.builder import ROI_EXTRACTORS
from mmdet3d.models.builder import ROI_EXTRACTORS
@ROI_EXTRACTORS.register_module()
......
......@@ -4,7 +4,7 @@ from mmcv import ops
from torch import nn as nn
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()
......
......@@ -5,8 +5,8 @@ from torch import nn as nn
from torch.nn import functional as F
from mmseg.core import add_prefix
from mmseg.models import SEGMENTORS
from ..builder import build_backbone, build_head, build_loss, build_neck
from ..builder import (SEGMENTORS, build_backbone, build_head, build_loss,
build_neck)
from .base import Base3DSegmentor
......
......@@ -53,11 +53,27 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d):
# TODO: make mmcv fp16 utils handle customized norm layers
@force_fp32(out_fp16=True)
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, \
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)
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]
mean = torch.mean(input, dim=[0, 2])
meansqr = torch.mean(input * input, dim=[0, 2])
......@@ -76,7 +92,10 @@ class NaiveSyncBatchNorm1d(nn.BatchNorm1d):
bias = self.bias - mean * scale
scale = scale.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')
......@@ -107,9 +126,19 @@ class NaiveSyncBatchNorm2d(nn.BatchNorm2d):
# TODO: make mmcv fp16 utils handle customized norm layers
@force_fp32(out_fp16=True)
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, \
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)
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