已合并
Enable SparseConv3d on mmcv cnn conv layer #1841
nanjunjie创建于 2025年12月27日
Enable SparseConv3d on mmcv cnn conv layer #1841
已合并
共 4 个文件变更+44-7
| @@ -3,6 +3,7 @@ __all__ = [ | |||
| 3 | "SparseConv3d", | 3 | "SparseConv3d", |
| 4 | "SparseInverseConv3d", | 4 | "SparseInverseConv3d", |
| 5 | "SubMConv3d", | 5 | "SubMConv3d", |
| 6 | + "SparseConvolution", | ||
| 6 | "SparseConvTensor", | 7 | "SparseConvTensor", |
| 7 | "SparseModule", | 8 | "SparseModule", |
| 8 | "SparseSequential", | 9 | "SparseSequential", |
| @@ -75,7 +76,7 @@ import os | |||
| 75 | import mx_driving._C | 76 | import mx_driving._C |
| 76 | 77 | ||
| 77 | from .modules.roi_point_pool_3d import RoIPointPool3d | 78 | from .modules.roi_point_pool_3d import RoIPointPool3d |
| 78 | -from .modules.sparse_conv import SparseConv3d, SubMConv3d, SparseInverseConv3d | 79 | +from .modules.sparse_conv import SparseConv3d, SubMConv3d, SparseInverseConv3d, SparseConvolution |
| 79 | from .modules.sparse_modules import SparseConvTensor, SparseModule, SparseSequential | 80 | from .modules.sparse_modules import SparseConvTensor, SparseModule, SparseSequential |
| 80 | from .modules.voxelization import Voxelization | 81 | from .modules.voxelization import Voxelization |
| 81 | from .ops.assign_score_withk import assign_score_withk | 82 | from .ops.assign_score_withk import assign_score_withk |
| @@ -58,7 +58,7 @@ __all__ = [ | |||
| 58 | # Some patches in mmengine_patch are applied on mmcv module but organized in mmengine_patch | 58 | # Some patches in mmengine_patch are applied on mmcv module but organized in mmengine_patch |
| 59 | from mx_driving.patcher.mmengine_patch import stream, ddp, optimizer_hooks, optimizer_wrapper | 59 | from mx_driving.patcher.mmengine_patch import stream, ddp, optimizer_hooks, optimizer_wrapper |
| 60 | 60 | ||
| 61 | -from mx_driving.patcher.mmcv_patch import dc, mdc, msda, patch_mmcv_version | 61 | +from mx_driving.patcher.mmcv_patch import dc, mdc, msda, patch_mmcv_version, spconv3d |
| 62 | from mx_driving.patcher.mmdet_patch import pseudo_sampler, resnet_add_relu, resnet_maxpool, resnet_fp16 | 62 | from mx_driving.patcher.mmdet_patch import pseudo_sampler, resnet_add_relu, resnet_maxpool, resnet_fp16 |
| 63 | from mx_driving.patcher.mmdet3d_patch import nuscenes_dataset, nuscenes_metric | 63 | from mx_driving.patcher.mmdet3d_patch import nuscenes_dataset, nuscenes_metric |
| 64 | from mx_driving.patcher.numpy_patch import numpy_type | 64 | from mx_driving.patcher.numpy_patch import numpy_type |
| @@ -69,9 +69,9 @@ from mx_driving.patcher.patcher import Patch, Patcher, PatcherBuilder | |||
| 69 | 69 | ||
| 70 | default_patcher_builder = ( | 70 | default_patcher_builder = ( |
| 71 | PatcherBuilder() | 71 | PatcherBuilder() |
| 72 | - .add_module_patch("mmcv", Patch(msda), Patch(dc), Patch(mdc), Patch(stream), Patch(ddp)) | 72 | + .add_module_patch("mmcv", Patch(msda), Patch(dc), Patch(mdc), Patch(stream), Patch(ddp), Patch(spconv3d)) |
| 73 | .add_module_patch("torch", Patch(index), Patch(batch_matmul)) | 73 | .add_module_patch("torch", Patch(index), Patch(batch_matmul)) |
| 74 | .add_module_patch("numpy", Patch(numpy_type)) | 74 | .add_module_patch("numpy", Patch(numpy_type)) |
| 75 | .add_module_patch("mmdet", Patch(pseudo_sampler), Patch(resnet_add_relu), Patch(resnet_maxpool)) | 75 | .add_module_patch("mmdet", Patch(pseudo_sampler), Patch(resnet_add_relu), Patch(resnet_maxpool)) |
| 76 | .add_module_patch("mmdet3d", Patch(nuscenes_dataset), Patch(nuscenes_metric)) | 76 | .add_module_patch("mmdet3d", Patch(nuscenes_dataset), Patch(nuscenes_metric)) |
| 77 | -) | 77 | +) |
| @@ -72,4 +72,40 @@ def mdc(mmcv: ModuleType, options: Dict): | |||
| 72 | mmcv.ops.modulated_deform_conv.modulated_deform_conv2d = modulated_deform_conv2d | 72 | mmcv.ops.modulated_deform_conv.modulated_deform_conv2d = modulated_deform_conv2d |
| 73 | else: | 73 | else: |
| 74 | raise AttributeError("In mmcv.ops.modulated_deform_conv, ModulatedDeformConv2dFunction or modulated_deform_conv not found") | 74 | raise AttributeError("In mmcv.ops.modulated_deform_conv, ModulatedDeformConv2dFunction or modulated_deform_conv not found") |
| 75 | - | 75 | + |
| 76 | + | ||
| 77 | +def spconv3d(mmcv: ModuleType, options: Dict): | ||
| 78 | + mxd = importlib.import_module("mx_driving") | ||
| 79 | + if ({"ops"}).issubset(mmcv.__dir__()): | ||
| 80 | + ops = importlib.import_module(f"{mmcv.__name__}.ops") | ||
| 81 | + ops.SparseConvTensor = mxd.SparseConvTensor | ||
| 82 | + ops.sparse_structure.SparseConvTensor = mxd.SparseConvTensor | ||
| 83 | + ops.SparseSequential = mxd.SparseSequential | ||
| 84 | + ops.sparse_modules.SparseSequential = mxd.SparseSequential | ||
| 85 | + ops.SparseModule = mxd.SparseModule | ||
| 86 | + ops.sparse_modules.SparseModule = mxd.SparseModule | ||
| 87 | + ops.SparseConvolution = mxd.SparseConvolution | ||
| 88 | + ops.sparse_conv.SparseConvolution = mxd.SparseConvolution | ||
| 89 | + ops.SubMConv3d = mxd.SubMConv3d | ||
| 90 | + ops.sparse_conv.SubMConv3d = mxd.SubMConv3d | ||
| 91 | + ops.SparseConv3d = mxd.SparseConv3d | ||
| 92 | + ops.sparse_conv.SparseConv3d = mxd.SparseConv3d | ||
| 93 | + ops.SparseInverseConv3d = mxd.SparseInverseConv3d | ||
| 94 | + ops.sparse_conv.SparseInverseConv3d = mxd.SparseInverseConv3d | ||
| 95 | + | ||
| 96 | + # support mmcv version 1.7.2 | ||
| 97 | + if ({"cnn"}).issubset(mmcv.__dir__()): | ||
| 98 | + cnn = importlib.import_module(f"{mmcv.__name__}.cnn") | ||
| 99 | + if hasattr(cnn, "CONV_LAYERS"): | ||
S | |||
| 100 | + cnn.CONV_LAYERS.module_dict['SubMConv3d'] = mxd.SubMConv3d | ||
| 101 | + cnn.CONV_LAYERS.module_dict['SparseConv3d'] = mxd.SparseConv3d | ||
| 102 | + cnn.CONV_LAYERS.module_dict['SparseInverseConv3d'] = \ | ||
| 103 | + mxd.SparseInverseConv3d | ||
| 104 | + # support mmcv version 2.0.0 or above | ||
| 105 | + if importlib.util.find_spec("mmengine.registry") is not None: | ||
| 106 | + registry = importlib.import_module("mmengine.registry") | ||
| 107 | + if hasattr(registry, "MODELS"): | ||
| 108 | + registry.MODELS.module_dict['SubMConv3d'] = mxd.SubMConv3d | ||
| 109 | + registry.MODELS.module_dict['SparseConv3d'] = mxd.SparseConv3d | ||
| 110 | + registry.MODELS.module_dict['SparseInverseConv3d'] = \ | ||
| 111 | + mxd.SparseInverseConv3d | ||
| @@ -1,8 +1,8 @@ | |||
| 1 | import warnings | 1 | import warnings |
| 2 | 2 | ||
| 3 | -from .modules.sparse_conv import SparseConv3d, SubMConv3d, SparseInverseConv3d | 3 | +from .modules.sparse_conv import SparseConv3d, SubMConv3d, SparseInverseConv3d, SparseConvolution |
| 4 | from .modules.sparse_modules import SparseConvTensor, SparseModule, SparseSequential | 4 | from .modules.sparse_modules import SparseConvTensor, SparseModule, SparseSequential |
| 5 | 5 | ||
| 6 | warnings.warn( | 6 | warnings.warn( |
| 7 | "This package is deprecated and will be removed in future. Please use `mx_driving.api` instead.", DeprecationWarning | 7 | "This package is deprecated and will be removed in future. Please use `mx_driving.api` instead.", DeprecationWarning |
| 8 | -) | 8 | +) |
mmcv 2.2.0不适配