Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
mmdetection3d
Commits
76e351a7
Unverified
Commit
76e351a7
authored
May 01, 2022
by
Wenwei Zhang
Committed by
GitHub
May 01, 2022
Browse files
Release v1.0.0rc2
parents
5111eda8
4422eaab
Changes
137
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
286 additions
and
33 deletions
+286
-33
mmdet3d/datasets/pipelines/dbsampler.py
mmdet3d/datasets/pipelines/dbsampler.py
+1
-2
mmdet3d/datasets/pipelines/formating.py
mmdet3d/datasets/pipelines/formating.py
+1
-3
mmdet3d/datasets/pipelines/loading.py
mmdet3d/datasets/pipelines/loading.py
+1
-1
mmdet3d/datasets/pipelines/test_time_aug.py
mmdet3d/datasets/pipelines/test_time_aug.py
+109
-2
mmdet3d/datasets/pipelines/transforms_3d.py
mmdet3d/datasets/pipelines/transforms_3d.py
+1
-2
mmdet3d/datasets/s3dis_dataset.py
mmdet3d/datasets/s3dis_dataset.py
+1
-1
mmdet3d/datasets/scannet_dataset.py
mmdet3d/datasets/scannet_dataset.py
+1
-1
mmdet3d/datasets/semantickitti_dataset.py
mmdet3d/datasets/semantickitti_dataset.py
+30
-1
mmdet3d/datasets/sunrgbd_dataset.py
mmdet3d/datasets/sunrgbd_dataset.py
+1
-1
mmdet3d/datasets/utils.py
mmdet3d/datasets/utils.py
+2
-2
mmdet3d/datasets/waymo_dataset.py
mmdet3d/datasets/waymo_dataset.py
+1
-1
mmdet3d/models/__init__.py
mmdet3d/models/__init__.py
+13
-9
mmdet3d/models/backbones/__init__.py
mmdet3d/models/backbones/__init__.py
+2
-1
mmdet3d/models/backbones/dgcnn.py
mmdet3d/models/backbones/dgcnn.py
+1
-1
mmdet3d/models/backbones/dla.py
mmdet3d/models/backbones/dla.py
+1
-1
mmdet3d/models/backbones/mink_resnet.py
mmdet3d/models/backbones/mink_resnet.py
+116
-0
mmdet3d/models/backbones/multi_backbone.py
mmdet3d/models/backbones/multi_backbone.py
+1
-1
mmdet3d/models/backbones/pointnet2_sa_msg.py
mmdet3d/models/backbones/pointnet2_sa_msg.py
+1
-1
mmdet3d/models/backbones/pointnet2_sa_ssg.py
mmdet3d/models/backbones/pointnet2_sa_ssg.py
+1
-1
mmdet3d/models/backbones/second.py
mmdet3d/models/backbones/second.py
+1
-1
No files found.
mmdet3d/datasets/pipelines/dbsampler.py
View file @
76e351a7
...
...
@@ -8,8 +8,7 @@ import numpy as np
from
mmdet3d.core.bbox
import
box_np_ops
from
mmdet3d.datasets.pipelines
import
data_augment_utils
from
mmdet.datasets
import
PIPELINES
from
..builder
import
OBJECTSAMPLERS
from
..builder
import
OBJECTSAMPLERS
,
PIPELINES
class
BatchSampler
:
...
...
mmdet3d/datasets/pipelines/formating.py
View file @
76e351a7
...
...
@@ -4,10 +4,8 @@ from mmcv.parallel import DataContainer as DC
from
mmdet3d.core.bbox
import
BaseInstance3DBoxes
from
mmdet3d.core.points
import
BasePoints
from
mmdet.datasets.builder
import
PIPELINES
from
mmdet.datasets.pipelines
import
to_tensor
PIPELINES
.
_module_dict
.
pop
(
'DefaultFormatBundle'
)
from
..builder
import
PIPELINES
@
PIPELINES
.
register_module
()
...
...
mmdet3d/datasets/pipelines/loading.py
View file @
76e351a7
...
...
@@ -3,8 +3,8 @@ import mmcv
import
numpy
as
np
from
mmdet3d.core.points
import
BasePoints
,
get_points_type
from
mmdet.datasets.builder
import
PIPELINES
from
mmdet.datasets.pipelines
import
LoadAnnotations
,
LoadImageFromFile
from
..builder
import
PIPELINES
@
PIPELINES
.
register_module
()
...
...
mmdet3d/datasets/pipelines/test_time_aug.py
View file @
76e351a7
...
...
@@ -4,8 +4,115 @@ from copy import deepcopy
import
mmcv
from
mmdet.datasets.builder
import
PIPELINES
from
mmdet.datasets.pipelines
import
Compose
from
..builder
import
PIPELINES
from
.compose
import
Compose
@
PIPELINES
.
register_module
()
class
MultiScaleFlipAug
:
"""Test-time augmentation with multiple scales and flipping. An example
configuration is as followed:
.. code-block::
img_scale=[(1333, 400), (1333, 800)],
flip=True,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(type='RandomFlip'),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='ImageToTensor', keys=['img']),
dict(type='Collect', keys=['img']),
]
After MultiScaleFLipAug with above configuration, the results are wrapped
into lists of the same length as followed:
.. code-block::
dict(
img=[...],
img_shape=[...],
scale=[(1333, 400), (1333, 400), (1333, 800), (1333, 800)]
flip=[False, True, False, True]
...
)
Args:
transforms (list[dict]): Transforms to apply in each augmentation.
img_scale (tuple | list[tuple] | None): Images scales for resizing.
scale_factor (float | list[float] | None): Scale factors for resizing.
flip (bool): Whether apply flip augmentation. Default: False.
flip_direction (str | list[str]): Flip augmentation directions,
options are "horizontal", "vertical" and "diagonal". If
flip_direction is a list, multiple flip augmentations will be
applied. It has no effect when flip == False. Default:
"horizontal".
"""
def
__init__
(
self
,
transforms
,
img_scale
=
None
,
scale_factor
=
None
,
flip
=
False
,
flip_direction
=
'horizontal'
):
self
.
transforms
=
Compose
(
transforms
)
assert
(
img_scale
is
None
)
^
(
scale_factor
is
None
),
(
'Must have but only one variable can be set'
)
if
img_scale
is
not
None
:
self
.
img_scale
=
img_scale
if
isinstance
(
img_scale
,
list
)
else
[
img_scale
]
self
.
scale_key
=
'scale'
assert
mmcv
.
is_list_of
(
self
.
img_scale
,
tuple
)
else
:
self
.
img_scale
=
scale_factor
if
isinstance
(
scale_factor
,
list
)
else
[
scale_factor
]
self
.
scale_key
=
'scale_factor'
self
.
flip
=
flip
self
.
flip_direction
=
flip_direction
if
isinstance
(
flip_direction
,
list
)
else
[
flip_direction
]
assert
mmcv
.
is_list_of
(
self
.
flip_direction
,
str
)
if
not
self
.
flip
and
self
.
flip_direction
!=
[
'horizontal'
]:
warnings
.
warn
(
'flip_direction has no effect when flip is set to False'
)
if
(
self
.
flip
and
not
any
([
t
[
'type'
]
==
'RandomFlip'
for
t
in
transforms
])):
warnings
.
warn
(
'flip has no effect when RandomFlip is not in transforms'
)
def
__call__
(
self
,
results
):
"""Call function to apply test time augment transforms on results.
Args:
results (dict): Result dict contains the data to transform.
Returns:
dict[str: list]: The augmented data, where each value is wrapped
into a list.
"""
aug_data
=
[]
flip_args
=
[(
False
,
None
)]
if
self
.
flip
:
flip_args
+=
[(
True
,
direction
)
for
direction
in
self
.
flip_direction
]
for
scale
in
self
.
img_scale
:
for
flip
,
direction
in
flip_args
:
_results
=
results
.
copy
()
_results
[
self
.
scale_key
]
=
scale
_results
[
'flip'
]
=
flip
_results
[
'flip_direction'
]
=
direction
data
=
self
.
transforms
(
_results
)
aug_data
.
append
(
data
)
# list of dict to dict of list
aug_data_dict
=
{
key
:
[]
for
key
in
aug_data
[
0
]}
for
data
in
aug_data
:
for
key
,
val
in
data
.
items
():
aug_data_dict
[
key
].
append
(
val
)
return
aug_data_dict
def
__repr__
(
self
):
repr_str
=
self
.
__class__
.
__name__
repr_str
+=
f
'(transforms=
{
self
.
transforms
}
, '
repr_str
+=
f
'img_scale=
{
self
.
img_scale
}
, flip=
{
self
.
flip
}
, '
repr_str
+=
f
'flip_direction=
{
self
.
flip_direction
}
)'
return
repr_str
@
PIPELINES
.
register_module
()
...
...
mmdet3d/datasets/pipelines/transforms_3d.py
View file @
76e351a7
...
...
@@ -10,9 +10,8 @@ from mmcv.utils import build_from_cfg
from
mmdet3d.core
import
VoxelGenerator
from
mmdet3d.core.bbox
import
(
CameraInstance3DBoxes
,
DepthInstance3DBoxes
,
LiDARInstance3DBoxes
,
box_np_ops
)
from
mmdet.datasets.builder
import
PIPELINES
from
mmdet.datasets.pipelines
import
RandomFlip
from
..builder
import
OBJECTSAMPLERS
from
..builder
import
OBJECTSAMPLERS
,
PIPELINES
from
.data_augment_utils
import
noise_per_object_v3_
...
...
mmdet3d/datasets/s3dis_dataset.py
View file @
76e351a7
...
...
@@ -5,8 +5,8 @@ import numpy as np
from
mmdet3d.core
import
show_seg_result
from
mmdet3d.core.bbox
import
DepthInstance3DBoxes
from
mmdet.datasets
import
DATASETS
from
mmseg.datasets
import
DATASETS
as
SEG_DATASETS
from
.builder
import
DATASETS
from
.custom_3d
import
Custom3DDataset
from
.custom_3d_seg
import
Custom3DSegDataset
from
.pipelines
import
Compose
...
...
mmdet3d/datasets/scannet_dataset.py
View file @
76e351a7
...
...
@@ -7,8 +7,8 @@ import numpy as np
from
mmdet3d.core
import
instance_seg_eval
,
show_result
,
show_seg_result
from
mmdet3d.core.bbox
import
DepthInstance3DBoxes
from
mmdet.datasets
import
DATASETS
from
mmseg.datasets
import
DATASETS
as
SEG_DATASETS
from
.builder
import
DATASETS
from
.custom_3d
import
Custom3DDataset
from
.custom_3d_seg
import
Custom3DSegDataset
from
.pipelines
import
Compose
...
...
mmdet3d/datasets/semantickitti_dataset.py
View file @
76e351a7
# Copyright (c) OpenMMLab. All rights reserved.
from
os
import
path
as
osp
from
mmdet.datasets
import
DATASETS
from
.builder
import
DATASETS
from
.custom_3d
import
Custom3DDataset
...
...
@@ -60,6 +60,35 @@ class SemanticKITTIDataset(Custom3DDataset):
filter_empty_gt
=
filter_empty_gt
,
test_mode
=
test_mode
)
def
get_data_info
(
self
,
index
):
"""Get data info according to the given index.
Args:
index (int): Index of the sample data to get.
Returns:
dict: Data information that will be passed to the data
preprocessing pipelines. It includes the following keys:
- sample_idx (str): Sample index.
- pts_filename (str): Filename of point clouds.
- file_name (str): Filename of point clouds.
- ann_info (dict): Annotation info.
"""
info
=
self
.
data_infos
[
index
]
sample_idx
=
info
[
'point_cloud'
][
'lidar_idx'
]
pts_filename
=
osp
.
join
(
self
.
data_root
,
info
[
'pts_path'
])
input_dict
=
dict
(
pts_filename
=
pts_filename
,
sample_idx
=
sample_idx
,
file_name
=
pts_filename
)
if
not
self
.
test_mode
:
annos
=
self
.
get_ann_info
(
index
)
input_dict
[
'ann_info'
]
=
annos
if
self
.
filter_empty_gt
and
~
(
annos
[
'gt_labels_3d'
]
!=
-
1
).
any
():
return
None
return
input_dict
def
get_ann_info
(
self
,
index
):
"""Get annotation info according to the given index.
...
...
mmdet3d/datasets/sunrgbd_dataset.py
View file @
76e351a7
...
...
@@ -7,7 +7,7 @@ import numpy as np
from
mmdet3d.core
import
show_multi_modality_result
,
show_result
from
mmdet3d.core.bbox
import
DepthInstance3DBoxes
from
mmdet.core
import
eval_map
from
mmdet.datasets
import
DATASETS
from
.builder
import
DATASETS
from
.custom_3d
import
Custom3DDataset
from
.pipelines
import
Compose
...
...
mmdet3d/datasets/utils.py
View file @
76e351a7
...
...
@@ -10,9 +10,9 @@ from mmdet3d.datasets.pipelines import (Collect3D, DefaultFormatBundle3D,
LoadPointsFromMultiSweeps
,
MultiScaleFlipAug3D
,
PointSegClassMapping
)
# yapf: enable
from
mmdet.datasets.builder
import
PIPELINES
from
mmdet.datasets.pipelines
import
LoadImageFromFile
,
MultiScaleFlipAug
# yapf: enable
from
.builder
import
PIPELINES
def
is_loading_function
(
transform
):
...
...
mmdet3d/datasets/waymo_dataset.py
View file @
76e351a7
...
...
@@ -8,8 +8,8 @@ import numpy as np
import
torch
from
mmcv.utils
import
print_log
from
mmdet.datasets
import
DATASETS
from
..core.bbox
import
Box3DMode
,
points_cam2img
from
.builder
import
DATASETS
from
.kitti_dataset
import
KittiDataset
...
...
mmdet3d/models/__init__.py
View file @
76e351a7
# Copyright (c) OpenMMLab. All rights reserved.
from
.backbones
import
*
# noqa: F401,F403
from
.builder
import
(
FUSION_LAYERS
,
MIDDLE_ENCODERS
,
VOXEL_ENCODERS
,
build_backbone
,
build_detector
,
build_fusion_layer
,
build_head
,
build_loss
,
build_middle_encoder
,
build_model
,
build_neck
,
build_roi_extractor
,
build_shared_head
,
build_voxel_encoder
)
from
.builder
import
(
BACKBONES
,
DETECTORS
,
FUSION_LAYERS
,
HEADS
,
LOSSES
,
MIDDLE_ENCODERS
,
NECKS
,
ROI_EXTRACTORS
,
SEGMENTORS
,
SHARED_HEADS
,
VOXEL_ENCODERS
,
build_backbone
,
build_detector
,
build_fusion_layer
,
build_head
,
build_loss
,
build_middle_encoder
,
build_model
,
build_neck
,
build_roi_extractor
,
build_shared_head
,
build_voxel_encoder
)
from
.decode_heads
import
*
# noqa: F401,F403
from
.dense_heads
import
*
# noqa: F401,F403
from
.detectors
import
*
# noqa: F401,F403
...
...
@@ -18,8 +20,10 @@ from .segmentors import * # noqa: F401,F403
from
.voxel_encoders
import
*
# noqa: F401,F403
__all__
=
[
'VOXEL_ENCODERS'
,
'MIDDLE_ENCODERS'
,
'FUSION_LAYERS'
,
'build_backbone'
,
'build_neck'
,
'build_roi_extractor'
,
'build_shared_head'
,
'build_head'
,
'build_loss'
,
'build_detector'
,
'build_fusion_layer'
,
'build_model'
,
'build_middle_encoder'
,
'build_voxel_encoder'
'BACKBONES'
,
'NECKS'
,
'ROI_EXTRACTORS'
,
'SHARED_HEADS'
,
'HEADS'
,
'LOSSES'
,
'DETECTORS'
,
'SEGMENTORS'
,
'VOXEL_ENCODERS'
,
'MIDDLE_ENCODERS'
,
'FUSION_LAYERS'
,
'build_backbone'
,
'build_neck'
,
'build_roi_extractor'
,
'build_shared_head'
,
'build_head'
,
'build_loss'
,
'build_detector'
,
'build_fusion_layer'
,
'build_model'
,
'build_middle_encoder'
,
'build_voxel_encoder'
]
mmdet3d/models/backbones/__init__.py
View file @
76e351a7
...
...
@@ -2,6 +2,7 @@
from
mmdet.models.backbones
import
SSDVGG
,
HRNet
,
ResNet
,
ResNetV1d
,
ResNeXt
from
.dgcnn
import
DGCNNBackbone
from
.dla
import
DLANet
from
.mink_resnet
import
MinkResNet
from
.multi_backbone
import
MultiBackbone
from
.nostem_regnet
import
NoStemRegNet
from
.pointnet2_sa_msg
import
PointNet2SAMSG
...
...
@@ -11,5 +12,5 @@ from .second import SECOND
__all__
=
[
'ResNet'
,
'ResNetV1d'
,
'ResNeXt'
,
'SSDVGG'
,
'HRNet'
,
'NoStemRegNet'
,
'SECOND'
,
'DGCNNBackbone'
,
'PointNet2SASSG'
,
'PointNet2SAMSG'
,
'MultiBackbone'
,
'DLANet'
'MultiBackbone'
,
'DLANet'
,
'MinkResNet'
]
mmdet3d/models/backbones/dgcnn.py
View file @
76e351a7
...
...
@@ -3,7 +3,7 @@ from mmcv.runner import BaseModule, auto_fp16
from
torch
import
nn
as
nn
from
mmdet3d.ops
import
DGCNNFAModule
,
DGCNNGFModule
from
mmdet.models
import
BACKBONES
from
..builder
import
BACKBONES
@
BACKBONES
.
register_module
()
...
...
mmdet3d/models/backbones/dla.py
View file @
76e351a7
...
...
@@ -6,7 +6,7 @@ from mmcv.cnn import build_conv_layer, build_norm_layer
from
mmcv.runner
import
BaseModule
from
torch
import
nn
from
mmdet.models
.builder
import
BACKBONES
from
.
.builder
import
BACKBONES
def
dla_build_norm_layer
(
cfg
,
num_features
):
...
...
mmdet3d/models/backbones/mink_resnet.py
0 → 100644
View file @
76e351a7
# Copyright (c) OpenMMLab. All rights reserved.
# Follow https://github.com/NVIDIA/MinkowskiEngine/blob/master/examples/resnet.py # noqa
# and mmcv.cnn.ResNet
try
:
import
MinkowskiEngine
as
ME
from
MinkowskiEngine.modules.resnet_block
import
BasicBlock
,
Bottleneck
except
ImportError
:
import
warnings
warnings
.
warn
(
'Please follow `getting_started.md` to install MinkowskiEngine.`'
)
# blocks are used in the static part of MinkResNet
BasicBlock
,
Bottleneck
=
None
,
None
import
torch.nn
as
nn
from
mmdet3d.models.builder
import
BACKBONES
@
BACKBONES
.
register_module
()
class
MinkResNet
(
nn
.
Module
):
r
"""Minkowski ResNet backbone. See `4D Spatio-Temporal ConvNets
<https://arxiv.org/abs/1904.08755>`_ for more details.
Args:
depth (int): Depth of resnet, from {18, 34, 50, 101, 152}.
in_channels (ont): Number of input channels, 3 for RGB.
num_stages (int, optional): Resnet stages. Default: 4.
pool (bool, optional): Add max pooling after first conv if True.
Default: True.
"""
arch_settings
=
{
18
:
(
BasicBlock
,
(
2
,
2
,
2
,
2
)),
34
:
(
BasicBlock
,
(
3
,
4
,
6
,
3
)),
50
:
(
Bottleneck
,
(
3
,
4
,
6
,
3
)),
101
:
(
Bottleneck
,
(
3
,
4
,
23
,
3
)),
152
:
(
Bottleneck
,
(
3
,
8
,
36
,
3
))
}
def
__init__
(
self
,
depth
,
in_channels
,
num_stages
=
4
,
pool
=
True
):
super
(
MinkResNet
,
self
).
__init__
()
if
depth
not
in
self
.
arch_settings
:
raise
KeyError
(
f
'invalid depth
{
depth
}
for resnet'
)
assert
4
>=
num_stages
>=
1
block
,
stage_blocks
=
self
.
arch_settings
[
depth
]
stage_blocks
=
stage_blocks
[:
num_stages
]
self
.
num_stages
=
num_stages
self
.
pool
=
pool
self
.
inplanes
=
64
self
.
conv1
=
ME
.
MinkowskiConvolution
(
in_channels
,
self
.
inplanes
,
kernel_size
=
3
,
stride
=
2
,
dimension
=
3
)
# May be BatchNorm is better, but we follow original implementation.
self
.
norm1
=
ME
.
MinkowskiInstanceNorm
(
self
.
inplanes
)
self
.
relu
=
ME
.
MinkowskiReLU
(
inplace
=
True
)
if
self
.
pool
:
self
.
maxpool
=
ME
.
MinkowskiMaxPooling
(
kernel_size
=
2
,
stride
=
2
,
dimension
=
3
)
for
i
,
num_blocks
in
enumerate
(
stage_blocks
):
setattr
(
self
,
f
'layer
{
i
}
'
,
self
.
_make_layer
(
block
,
64
*
2
**
i
,
stage_blocks
[
i
],
stride
=
2
))
def
init_weights
(
self
):
for
m
in
self
.
modules
():
if
isinstance
(
m
,
ME
.
MinkowskiConvolution
):
ME
.
utils
.
kaiming_normal_
(
m
.
kernel
,
mode
=
'fan_out'
,
nonlinearity
=
'relu'
)
if
isinstance
(
m
,
ME
.
MinkowskiBatchNorm
):
nn
.
init
.
constant_
(
m
.
bn
.
weight
,
1
)
nn
.
init
.
constant_
(
m
.
bn
.
bias
,
0
)
def
_make_layer
(
self
,
block
,
planes
,
blocks
,
stride
):
downsample
=
None
if
stride
!=
1
or
self
.
inplanes
!=
planes
*
block
.
expansion
:
downsample
=
nn
.
Sequential
(
ME
.
MinkowskiConvolution
(
self
.
inplanes
,
planes
*
block
.
expansion
,
kernel_size
=
1
,
stride
=
stride
,
dimension
=
3
),
ME
.
MinkowskiBatchNorm
(
planes
*
block
.
expansion
))
layers
=
[]
layers
.
append
(
block
(
self
.
inplanes
,
planes
,
stride
=
stride
,
downsample
=
downsample
,
dimension
=
3
))
self
.
inplanes
=
planes
*
block
.
expansion
for
i
in
range
(
1
,
blocks
):
layers
.
append
(
block
(
self
.
inplanes
,
planes
,
stride
=
1
,
dimension
=
3
))
return
nn
.
Sequential
(
*
layers
)
def
forward
(
self
,
x
):
"""Forward pass of ResNet.
Args:
x (ME.SparseTensor): Input sparse tensor.
Returns:
list[ME.SparseTensor]: Output sparse tensors.
"""
x
=
self
.
conv1
(
x
)
x
=
self
.
norm1
(
x
)
x
=
self
.
relu
(
x
)
if
self
.
pool
:
x
=
self
.
maxpool
(
x
)
outs
=
[]
for
i
in
range
(
self
.
num_stages
):
x
=
getattr
(
self
,
f
'layer
{
i
}
'
)(
x
)
outs
.
append
(
x
)
return
outs
mmdet3d/models/backbones/multi_backbone.py
View file @
76e351a7
...
...
@@ -7,7 +7,7 @@ from mmcv.cnn import ConvModule
from
mmcv.runner
import
BaseModule
,
auto_fp16
from
torch
import
nn
as
nn
from
mmdet.models
import
BACKBONES
,
build_backbone
from
..builder
import
BACKBONES
,
build_backbone
@
BACKBONES
.
register_module
()
...
...
mmdet3d/models/backbones/pointnet2_sa_msg.py
View file @
76e351a7
...
...
@@ -5,7 +5,7 @@ from mmcv.runner import auto_fp16
from
torch
import
nn
as
nn
from
mmdet3d.ops
import
build_sa_module
from
mmdet.models
import
BACKBONES
from
..builder
import
BACKBONES
from
.base_pointnet
import
BasePointNet
...
...
mmdet3d/models/backbones/pointnet2_sa_ssg.py
View file @
76e351a7
...
...
@@ -4,7 +4,7 @@ from mmcv.runner import auto_fp16
from
torch
import
nn
as
nn
from
mmdet3d.ops
import
PointFPModule
,
build_sa_module
from
mmdet.models
import
BACKBONES
from
..builder
import
BACKBONES
from
.base_pointnet
import
BasePointNet
...
...
mmdet3d/models/backbones/second.py
View file @
76e351a7
...
...
@@ -5,7 +5,7 @@ from mmcv.cnn import build_conv_layer, build_norm_layer
from
mmcv.runner
import
BaseModule
from
torch
import
nn
as
nn
from
mmdet.models
import
BACKBONES
from
..builder
import
BACKBONES
@
BACKBONES
.
register_module
()
...
...
Prev
1
2
3
4
5
6
7
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment