"...git@developer.sourcefind.cn:renzhc/diffusers_dcu.git" did not exist on "2f489571a7b8496241022af93d0be6f49afc757f"
Commit 1a74819d authored by wuyuefeng's avatar wuyuefeng
Browse files

add docs and TODO

parent 5db915b5
from .pillar_scatter import PointPillarsScatter from .pillar_scatter import PointPillarsScatter
from .sparse_encoder import SparseEncoder from .sparse_encoder import SparseEncoder
from .sparse_unetv2 import SparseUnetV2 from .sparse_unet import SparseUnet
__all__ = ['PointPillarsScatter', 'SparseEncoder', 'SparseUnetV2'] __all__ = ['PointPillarsScatter', 'SparseEncoder', 'SparseUnet']
...@@ -8,15 +8,17 @@ from ..registry import MIDDLE_ENCODERS ...@@ -8,15 +8,17 @@ from ..registry import MIDDLE_ENCODERS
@MIDDLE_ENCODERS.register_module @MIDDLE_ENCODERS.register_module
class SparseUnetV2(nn.Module): class SparseUnet(nn.Module):
def __init__(self, def __init__(self,
in_channels, in_channels,
output_shape, output_shape,
pre_act, pre_act=False,
norm_cfg=dict(type='BN1d', eps=1e-3, momentum=0.01)): norm_cfg=dict(type='BN1d', eps=1e-3, momentum=0.01)):
"""SparseUnet for PartA^2 """SparseUnet for PartA^2
See https://arxiv.org/abs/1907.03670 for more detials.
Args: Args:
in_channels (int): the number of input channels in_channels (int): the number of input channels
output_shape (list[int]): the shape of output tensor output_shape (list[int]): the shape of output tensor
...@@ -32,6 +34,7 @@ class SparseUnetV2(nn.Module): ...@@ -32,6 +34,7 @@ class SparseUnetV2(nn.Module):
# TODO: make the network could be modified # TODO: make the network could be modified
if pre_act: if pre_act:
# TODO: use ConvModule to encapsulate
self.conv_input = spconv.SparseSequential( self.conv_input = spconv.SparseSequential(
spconv.SubMConv3d( spconv.SubMConv3d(
in_channels, in_channels,
...@@ -180,11 +183,8 @@ class SparseUnetV2(nn.Module): ...@@ -180,11 +183,8 @@ class SparseUnetV2(nn.Module):
self.conv5 = spconv.SparseSequential( self.conv5 = spconv.SparseSequential(
block(16, 16, 3, norm_cfg=norm_cfg, padding=1, indice_key='subm1')) block(16, 16, 3, norm_cfg=norm_cfg, padding=1, indice_key='subm1'))
self.seg_cls_layer = nn.Linear(16, 1, bias=True)
self.seg_reg_layer = nn.Linear(16, 3, bias=True)
def forward(self, voxel_features, coors, batch_size): def forward(self, voxel_features, coors, batch_size):
"""Forward of SparseUnetV2 """Forward of SparseUnet
Args: Args:
voxel_features (torch.float32): shape [N, C] voxel_features (torch.float32): shape [N, C]
...@@ -231,14 +231,7 @@ class SparseUnetV2(nn.Module): ...@@ -231,14 +231,7 @@ class SparseUnetV2(nn.Module):
seg_features = x_up1.features seg_features = x_up1.features
seg_cls_preds = self.seg_cls_layer(seg_features) # (N, 1) ret.update({'seg_features': seg_features})
seg_reg_preds = self.seg_reg_layer(seg_features) # (N, 3)
ret.update({
'u_seg_preds': seg_cls_preds,
'u_reg_preds': seg_reg_preds,
'seg_features': seg_features
})
return ret return ret
...@@ -307,6 +300,7 @@ class SparseUnetV2(nn.Module): ...@@ -307,6 +300,7 @@ class SparseUnetV2(nn.Module):
Returns: Returns:
spconv.SparseSequential: pre activate sparse convolution block. spconv.SparseSequential: pre activate sparse convolution block.
""" """
# TODO: use ConvModule to encapsulate
assert conv_type in ['subm', 'spconv', 'inverseconv'] assert conv_type in ['subm', 'spconv', 'inverseconv']
norm_name, norm_layer = build_norm_layer(norm_cfg, in_channels) norm_name, norm_layer = build_norm_layer(norm_cfg, in_channels)
...@@ -374,6 +368,7 @@ class SparseUnetV2(nn.Module): ...@@ -374,6 +368,7 @@ class SparseUnetV2(nn.Module):
Returns: Returns:
spconv.SparseSequential: post activate sparse convolution block. spconv.SparseSequential: post activate sparse convolution block.
""" """
# TODO: use ConvModule to encapsulate
assert conv_type in ['subm', 'spconv', 'inverseconv'] assert conv_type in ['subm', 'spconv', 'inverseconv']
norm_name, norm_layer = build_norm_layer(norm_cfg, out_channels) norm_name, norm_layer = build_norm_layer(norm_cfg, out_channels)
......
import torch import torch
def test_SparseUnetV2(): def test_SparseUnet():
from mmdet3d.models.middle_encoders.sparse_unetv2 import SparseUnetV2 from mmdet3d.models.middle_encoders.sparse_unet import SparseUnet
self = SparseUnetV2( self = SparseUnet(
in_channels=4, output_shape=[41, 1600, 1408], pre_act=False) in_channels=4, output_shape=[41, 1600, 1408], pre_act=False)
voxel_features = torch.tensor([[6.56126, 0.9648336, -1.7339306, 0.315], voxel_features = torch.tensor([[6.56126, 0.9648336, -1.7339306, 0.315],
[6.8162713, -2.480431, -1.3616394, 0.36], [6.8162713, -2.480431, -1.3616394, 0.36],
...@@ -16,13 +16,9 @@ def test_SparseUnetV2(): ...@@ -16,13 +16,9 @@ def test_SparseUnetV2():
dtype=torch.int32) # n, 4(batch, ind_x, ind_y, ind_z) dtype=torch.int32) # n, 4(batch, ind_x, ind_y, ind_z)
unet_ret_dict = self.forward(voxel_features, coordinates, 2) unet_ret_dict = self.forward(voxel_features, coordinates, 2)
seg_cls_preds = unet_ret_dict['u_seg_preds']
seg_reg_preds = unet_ret_dict['u_reg_preds']
seg_features = unet_ret_dict['seg_features'] seg_features = unet_ret_dict['seg_features']
spatial_features = unet_ret_dict['spatial_features'] spatial_features = unet_ret_dict['spatial_features']
assert seg_cls_preds.shape == torch.Size([4, 1])
assert seg_reg_preds.shape == torch.Size([4, 3])
assert seg_features.shape == torch.Size([4, 16]) assert seg_features.shape == torch.Size([4, 16])
assert spatial_features.shape == torch.Size([2, 256, 200, 176]) assert spatial_features.shape == torch.Size([2, 256, 200, 176])
......
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