├── .dev_scripts ├── gather_models.py ├── gen_benchmark_script.py ├── linter.sh ├── test_benchmark.sh └── train_benchmark.sh ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── error-report.md │ ├── feature_request.md │ ├── general_questions.md │ └── reimplementation_questions.md ├── pull_request_template.md └── workflows │ ├── build.yml │ └── deploy.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .readthedocs.yml ├── CITATION.cff ├── LICENSE ├── MANIFEST.in ├── README.md ├── README_zh-CN.md ├── configs ├── 3dssd │ ├── 3dssd_4x4_kitti-3d-car.py │ ├── README.md │ └── metafile.yml ├── _base_ │ ├── datasets │ │ ├── coco_instance.py │ │ ├── kitti-3d-3class.py │ │ ├── kitti-3d-car.py │ │ ├── lyft-3d.py │ │ ├── nuim_instance.py │ │ ├── nus-3d.py │ │ ├── nus-mono3d.py │ │ ├── range100_lyft-3d.py │ │ ├── s3dis-3d-5class.py │ │ ├── s3dis_seg-3d-13class.py │ │ ├── scannet-3d-18class.py │ │ ├── scannet_seg-3d-20class.py │ │ ├── sunrgbd-3d-10class.py │ │ ├── waymoD5-3d-3class.py │ │ └── waymoD5-3d-car.py │ ├── default_runtime.py │ ├── models │ │ ├── 3dssd.py │ │ ├── cascade_mask_rcnn_r50_fpn.py │ │ ├── centerpoint_01voxel_second_secfpn_nus.py │ │ ├── centerpoint_02pillar_second_secfpn_nus.py │ │ ├── fcos3d.py │ │ ├── groupfree3d.py │ │ ├── h3dnet.py │ │ ├── hv_pointpillars_fpn_lyft.py │ │ ├── hv_pointpillars_fpn_nus.py │ │ ├── hv_pointpillars_fpn_range100_lyft.py │ │ ├── hv_pointpillars_secfpn_kitti.py │ │ ├── hv_pointpillars_secfpn_waymo.py │ │ ├── hv_second_secfpn_kitti.py │ │ ├── hv_second_secfpn_waymo.py │ │ ├── imvotenet_image.py │ │ ├── mask_rcnn_r50_fpn.py │ │ ├── paconv_cuda_ssg.py │ │ ├── paconv_ssg.py │ │ ├── parta2.py │ │ ├── pointnet2_msg.py │ │ ├── pointnet2_ssg.py │ │ └── votenet.py │ └── schedules │ │ ├── cosine.py │ │ ├── cyclic_20e.py │ │ ├── cyclic_40e.py │ │ ├── mmdet_schedule_1x.py │ │ ├── schedule_2x.py │ │ ├── schedule_3x.py │ │ ├── seg_cosine_150e.py │ │ ├── seg_cosine_200e.py │ │ └── seg_cosine_50e.py ├── benchmark │ ├── hv_PartA2_secfpn_4x8_cyclic_80e_pcdet_kitti-3d-3class.py │ ├── hv_pointpillars_secfpn_3x8_100e_det3d_kitti-3d-car.py │ ├── hv_pointpillars_secfpn_4x8_80e_pcdet_kitti-3d-3class.py │ └── hv_second_secfpn_4x8_80e_pcdet_kitti-3d-3class.py ├── centerpoint │ ├── README.md │ ├── centerpoint_0075voxel_second_secfpn_4x8_cyclic_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_flip-tta_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_tta_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py │ ├── centerpoint_0075voxel_second_secfpn_dcn_circlenms_4x8_cyclic_flip-tta_20e_nus.py │ ├── centerpoint_01voxel_second_secfpn_4x8_cyclic_20e_nus.py │ ├── centerpoint_01voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus.py │ ├── centerpoint_01voxel_second_secfpn_dcn_4x8_cyclic_20e_nus.py │ ├── centerpoint_01voxel_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py │ ├── centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py │ ├── centerpoint_02pillar_second_secfpn_circlenms_4x8_cyclic_20e_nus.py │ ├── centerpoint_02pillar_second_secfpn_dcn_4x8_cyclic_20e_nus.py │ ├── centerpoint_02pillar_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py │ └── metafile.yml ├── dynamic_voxelization │ ├── README.md │ ├── dv_pointpillars_secfpn_6x8_160e_kitti-3d-car.py │ ├── dv_second_secfpn_2x8_cosine_80e_kitti-3d-3class.py │ ├── dv_second_secfpn_6x8_80e_kitti-3d-car.py │ └── metafile.yml ├── fcos3d │ ├── README.md │ ├── fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d.py │ ├── fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d_finetune.py │ └── metafile.yml ├── fp16 │ ├── README.md │ ├── hv_pointpillars_fpn_sbn-all_fp16_2x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-400mf_fpn_sbn-all_fp16_2x8_2x_nus-3d.py │ ├── hv_pointpillars_secfpn_sbn-all_fp16_2x8_2x_nus-3d.py │ ├── hv_second_secfpn_fp16_6x8_80e_kitti-3d-3class.py │ ├── hv_second_secfpn_fp16_6x8_80e_kitti-3d-car.py │ └── metafile.yml ├── free_anchor │ ├── README.md │ ├── hv_pointpillars_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-1.6gf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-1.6gf_fpn_sbn-all_free-anchor_strong-aug_4x8_3x_nus-3d.py │ ├── hv_pointpillars_regnet-3.2gf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-3.2gf_fpn_sbn-all_free-anchor_strong-aug_4x8_3x_nus-3d.py │ ├── hv_pointpillars_regnet-400mf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py │ └── metafile.yml ├── groupfree3d │ ├── README.md │ ├── groupfree3d_8x4_scannet-3d-18class-L12-O256.py │ ├── groupfree3d_8x4_scannet-3d-18class-L6-O256.py │ ├── groupfree3d_8x4_scannet-3d-18class-w2x-L12-O256.py │ ├── groupfree3d_8x4_scannet-3d-18class-w2x-L12-O512.py │ └── metafile.yml ├── h3dnet │ ├── README.md │ ├── h3dnet_3x8_scannet-3d-18class.py │ └── metafile.yml ├── imvotenet │ ├── README.md │ ├── imvotenet_faster_rcnn_r50_fpn_2x4_sunrgbd-3d-10class.py │ ├── imvotenet_stage2_16x8_sunrgbd-3d-10class.py │ └── metafile.yml ├── imvoxelnet │ ├── README.md │ ├── imvoxelnet_4x8_kitti-3d-car.py │ └── metafile.yml ├── mvxnet │ ├── README.md │ ├── dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class.py │ └── metafile.yml ├── nuimages │ ├── README.md │ ├── cascade_mask_rcnn_r101_fpn_1x_nuim.py │ ├── cascade_mask_rcnn_r50_fpn_1x_nuim.py │ ├── cascade_mask_rcnn_r50_fpn_coco-20e_1x_nuim.py │ ├── cascade_mask_rcnn_r50_fpn_coco-20e_20e_nuim.py │ ├── cascade_mask_rcnn_x101_32x4d_fpn_1x_nuim.py │ ├── htc_r50_fpn_1x_nuim.py │ ├── htc_r50_fpn_coco-20e_1x_nuim.py │ ├── htc_r50_fpn_coco-20e_20e_nuim.py │ ├── htc_without_semantic_r50_fpn_1x_nuim.py │ ├── htc_x101_64x4d_fpn_dconv_c3-c5_coco-20e_16x1_20e_nuim.py │ ├── mask_rcnn_r101_fpn_1x_nuim.py │ ├── mask_rcnn_r50_caffe_fpn_1x_nuim.py │ ├── mask_rcnn_r50_caffe_fpn_coco-3x_1x_nuim.py │ ├── mask_rcnn_r50_caffe_fpn_coco-3x_20e_nuim.py │ ├── mask_rcnn_r50_fpn_1x_nuim.py │ ├── mask_rcnn_r50_fpn_coco-2x_1x_nuim.py │ ├── mask_rcnn_r50_fpn_coco-2x_1x_nus-2d.py │ ├── mask_rcnn_x101_32x4d_fpn_1x_nuim.py │ └── metafile.yml ├── paconv │ ├── README.md │ ├── metafile.yml │ ├── paconv_cuda_ssg_8x8_cosine_200e_s3dis_seg-3d-13class.py │ └── paconv_ssg_8x8_cosine_150e_s3dis_seg-3d-13class.py ├── parta2 │ ├── README.md │ ├── hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class.py │ ├── hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car.py │ └── metafile.yml ├── pointnet2 │ ├── README.md │ ├── metafile.yml │ ├── pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py │ ├── pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py │ ├── pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py │ ├── pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py │ ├── pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py │ └── pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py ├── pointpillars │ ├── README.md │ ├── hv_pointpillars_fpn_sbn-all_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py │ ├── hv_pointpillars_fpn_sbn-all_range100_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py │ ├── hv_pointpillars_secfpn_6x8_160e_kitti-3d-car.py │ ├── hv_pointpillars_secfpn_sbn-all_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_secfpn_sbn-all_4x8_2x_nus-3d.py │ ├── hv_pointpillars_secfpn_sbn-all_range100_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_secfpn_sbn_2x16_2x_waymo-3d-3class.py │ ├── hv_pointpillars_secfpn_sbn_2x16_2x_waymo-3d-car.py │ ├── hv_pointpillars_secfpn_sbn_2x16_2x_waymoD5-3d-3class.py │ ├── hv_pointpillars_secfpn_sbn_2x16_2x_waymoD5-3d-car.py │ └── metafile.yml ├── regnet │ ├── README.md │ ├── hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-400mf_fpn_sbn-all_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-400mf_fpn_sbn-all_range100_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_regnet-400mf_secfpn_sbn-all_2x8_2x_lyft-3d.py │ ├── hv_pointpillars_regnet-400mf_secfpn_sbn-all_4x8_2x_nus-3d.py │ ├── hv_pointpillars_regnet-400mf_secfpn_sbn-all_range100_2x8_2x_lyft-3d.py │ └── metafile.yml ├── second │ ├── README.md │ ├── hv_second_secfpn_6x8_80e_kitti-3d-3class.py │ ├── hv_second_secfpn_6x8_80e_kitti-3d-car.py │ ├── hv_second_secfpn_sbn_2x16_2x_waymoD5-3d-3class.py │ └── metafile.yml ├── sr │ ├── scannet_baseline.py │ └── sunrgbd_baseline.py ├── ssn │ ├── README.md │ ├── hv_ssn_regnet-400mf_secfpn_sbn-all_1x16_2x_lyft-3d.py │ ├── hv_ssn_regnet-400mf_secfpn_sbn-all_2x16_2x_nus-3d.py │ ├── hv_ssn_secfpn_sbn-all_2x16_2x_lyft-3d.py │ ├── hv_ssn_secfpn_sbn-all_2x16_2x_nus-3d.py │ └── metafile.yml └── votenet │ ├── README.md │ ├── metafile.yml │ ├── votenet_16x8_sunrgbd-3d-10class.py │ ├── votenet_8x8_scannet-3d-18class.py │ └── votenet_iouloss_8x8_scannet-3d-18class.py ├── data ├── lyft │ ├── test.txt │ ├── train.txt │ └── val.txt ├── s3dis │ ├── README.md │ ├── collect_indoor3d_data.py │ ├── indoor3d_util.py │ └── meta_data │ │ ├── anno_paths.txt │ │ └── class_names.txt ├── scannet │ ├── README.md │ ├── batch_load_scannet_data.py │ ├── extract_posed_images.py │ ├── load_scannet_data.py │ ├── meta_data │ │ ├── scannet_means.npz │ │ ├── scannet_train.txt │ │ ├── scannetv2-labels.combined.tsv │ │ ├── scannetv2_test.txt │ │ ├── scannetv2_train.txt │ │ └── scannetv2_val.txt │ └── scannet_utils.py └── sunrgbd │ ├── README.md │ └── matlab │ ├── extract_rgbd_data_v1.m │ ├── extract_rgbd_data_v2.m │ └── extract_split.m ├── demo ├── data │ ├── kitti │ │ ├── kitti_000008.bin │ │ ├── kitti_000008.png │ │ └── kitti_000008_infos.pkl │ ├── nuscenes │ │ ├── n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525.jpg │ │ └── n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525_mono3d.coco.json │ ├── scannet │ │ └── scene0000_00.bin │ └── sunrgbd │ │ ├── sunrgbd_000017.bin │ │ ├── sunrgbd_000017.jpg │ │ └── sunrgbd_000017_infos.pkl ├── inference_demo.ipynb ├── mono_det_demo.py ├── multi_modality_demo.py ├── pc_seg_demo.py └── pcd_demo.py ├── docker └── Dockerfile ├── docs ├── 1_exist_data_model.md ├── 2_new_data_model.md ├── Makefile ├── _static │ ├── css │ │ └── readthedocs.css │ └── image │ │ └── mmdet3d-logo.png ├── api.rst ├── benchmarks.md ├── changelog.md ├── compatibility.md ├── conf.py ├── data_preparation.md ├── datasets │ ├── index.rst │ ├── kitti_det.md │ ├── lyft_det.md │ ├── nuscenes_det.md │ ├── s3dis_sem_seg.md │ ├── scannet_det.md │ ├── scannet_sem_seg.md │ ├── sunrgbd_det.md │ └── waymo_det.md ├── demo.md ├── faq.md ├── getting_started.md ├── index.rst ├── make.bat ├── model_zoo.md ├── stat.py ├── supported_tasks │ ├── index.rst │ ├── lidar_det3d.md │ ├── lidar_sem_seg3d.md │ └── vision_det3d.md ├── switch_language.md ├── tutorials │ ├── config.md │ ├── customize_dataset.md │ ├── customize_models.md │ ├── customize_runtime.md │ ├── data_pipeline.md │ └── index.rst └── useful_tools.md ├── docs_zh-CN ├── 1_exist_data_model.md ├── 2_new_data_model.md ├── Makefile ├── _static │ ├── css │ │ └── readthedocs.css │ └── image │ │ └── mmdet3d-logo.png ├── api.rst ├── benchmarks.md ├── changelog.md ├── compatibility.md ├── conf.py ├── data_preparation.md ├── datasets │ ├── index.rst │ ├── kitti_det.md │ ├── lyft_det.md │ ├── nuscenes_det.md │ ├── s3dis_sem_seg.md │ ├── scannet_det.md │ ├── scannet_sem_seg.md │ ├── sunrgbd_det.md │ └── waymo_det.md ├── demo.md ├── faq.md ├── getting_started.md ├── index.rst ├── make.bat ├── model_zoo.md ├── stat.py ├── supported_tasks │ ├── index.rst │ ├── lidar_det3d.md │ ├── lidar_sem_seg3d.md │ └── vision_det3d.md ├── switch_language.md ├── tutorials │ ├── config.md │ ├── customize_dataset.md │ ├── customize_models.md │ ├── customize_runtime.md │ ├── data_pipeline.md │ └── index.rst └── useful_tools.md ├── mmdet3d ├── __init__.py ├── apis │ ├── __init__.py │ ├── inference.py │ ├── test.py │ └── train.py ├── core │ ├── __init__.py │ ├── anchor │ │ ├── __init__.py │ │ └── anchor_3d_generator.py │ ├── bbox │ │ ├── __init__.py │ │ ├── assigners │ │ │ └── __init__.py │ │ ├── box_np_ops.py │ │ ├── coders │ │ │ ├── __init__.py │ │ │ ├── anchor_free_bbox_coder.py │ │ │ ├── centerpoint_bbox_coders.py │ │ │ ├── delta_xyzwhlr_bbox_coder.py │ │ │ ├── groupfree3d_bbox_coder.py │ │ │ └── partial_bin_based_bbox_coder.py │ │ ├── iou_calculators │ │ │ ├── __init__.py │ │ │ └── iou3d_calculator.py │ │ ├── samplers │ │ │ ├── __init__.py │ │ │ └── iou_neg_piecewise_sampler.py │ │ ├── structures │ │ │ ├── __init__.py │ │ │ ├── base_box3d.py │ │ │ ├── box_3d_mode.py │ │ │ ├── cam_box3d.py │ │ │ ├── coord_3d_mode.py │ │ │ ├── depth_box3d.py │ │ │ ├── lidar_box3d.py │ │ │ └── utils.py │ │ └── transforms.py │ ├── evaluation │ │ ├── __init__.py │ │ ├── indoor_eval.py │ │ ├── kitti_utils │ │ │ ├── __init__.py │ │ │ ├── eval.py │ │ │ └── rotate_iou.py │ │ ├── lyft_eval.py │ │ ├── seg_eval.py │ │ └── waymo_utils │ │ │ └── prediction_kitti_to_waymo.py │ ├── points │ │ ├── __init__.py │ │ ├── base_points.py │ │ ├── cam_points.py │ │ ├── depth_points.py │ │ └── lidar_points.py │ ├── post_processing │ │ ├── __init__.py │ │ ├── box3d_nms.py │ │ └── merge_augs.py │ ├── utils │ │ ├── __init__.py │ │ └── gaussian.py │ ├── visualizer │ │ ├── __init__.py │ │ ├── image_vis.py │ │ ├── open3d_vis.py │ │ └── show_result.py │ └── voxel │ │ ├── __init__.py │ │ ├── builder.py │ │ └── voxel_generator.py ├── datasets │ ├── __init__.py │ ├── builder.py │ ├── custom_3d.py │ ├── custom_3d_seg.py │ ├── dataset_wrappers.py │ ├── kitti2d_dataset.py │ ├── kitti_dataset.py │ ├── kitti_mono_dataset.py │ ├── lyft_dataset.py │ ├── nuscenes_dataset.py │ ├── nuscenes_mono_dataset.py │ ├── pipelines │ │ ├── __init__.py │ │ ├── data_augment_utils.py │ │ ├── dbsampler.py │ │ ├── formating.py │ │ ├── loading.py │ │ ├── test_time_aug.py │ │ └── transforms_3d.py │ ├── s3dis_dataset.py │ ├── scannet_dataset.py │ ├── semantickitti_dataset.py │ ├── sunrgbd_dataset.py │ ├── utils.py │ └── waymo_dataset.py ├── models │ ├── __init__.py │ ├── backbones │ │ ├── __init__.py │ │ ├── base_pointnet.py │ │ ├── multi_backbone.py │ │ ├── nostem_regnet.py │ │ ├── pointnet2_sa_msg.py │ │ ├── pointnet2_sa_ssg.py │ │ └── second.py │ ├── builder.py │ ├── decode_heads │ │ ├── __init__.py │ │ ├── decode_head.py │ │ ├── paconv_head.py │ │ └── pointnet2_head.py │ ├── dense_heads │ │ ├── __init__.py │ │ ├── anchor3d_head.py │ │ ├── anchor_free_mono3d_head.py │ │ ├── base_conv_bbox_head.py │ │ ├── base_mono3d_dense_head.py │ │ ├── centerpoint_head.py │ │ ├── fcos_mono3d_head.py │ │ ├── free_anchor3d_head.py │ │ ├── groupfree3d_head.py │ │ ├── parta2_rpn_head.py │ │ ├── shape_aware_head.py │ │ ├── sr_head.py │ │ ├── sr_init_head.py │ │ ├── sr_roi_head.py │ │ ├── ssd_3d_head.py │ │ ├── train_mixins.py │ │ └── vote_head.py │ ├── detectors │ │ ├── __init__.py │ │ ├── base.py │ │ ├── centerpoint.py │ │ ├── dynamic_voxelnet.py │ │ ├── fcos_mono3d.py │ │ ├── groupfree3dnet.py │ │ ├── h3dnet.py │ │ ├── imvotenet.py │ │ ├── imvoxelnet.py │ │ ├── mvx_faster_rcnn.py │ │ ├── mvx_two_stage.py │ │ ├── parta2.py │ │ ├── single_stage.py │ │ ├── single_stage_mono3d.py │ │ ├── ssd3dnet.py │ │ ├── two_stage.py │ │ ├── votenet.py │ │ └── voxelnet.py │ ├── fusion_layers │ │ ├── __init__.py │ │ ├── coord_transform.py │ │ ├── point_fusion.py │ │ └── vote_fusion.py │ ├── losses │ │ ├── __init__.py │ │ ├── axis_aligned_iou_loss.py │ │ ├── chamfer_distance.py │ │ └── paconv_regularization_loss.py │ ├── middle_encoders │ │ ├── __init__.py │ │ ├── pillar_scatter.py │ │ ├── sparse_encoder.py │ │ └── sparse_unet.py │ ├── model_utils │ │ ├── __init__.py │ │ ├── noise_suppression_module.py │ │ ├── transformer.py │ │ ├── utils.py │ │ └── vote_module.py │ ├── necks │ │ ├── __init__.py │ │ ├── imvoxel_neck.py │ │ └── second_fpn.py │ ├── roi_heads │ │ ├── __init__.py │ │ ├── base_3droi_head.py │ │ ├── bbox_heads │ │ │ ├── __init__.py │ │ │ ├── h3d_bbox_head.py │ │ │ └── parta2_bbox_head.py │ │ ├── h3d_roi_head.py │ │ ├── mask_heads │ │ │ ├── __init__.py │ │ │ ├── pointwise_semantic_head.py │ │ │ └── primitive_head.py │ │ ├── part_aggregation_roi_head.py │ │ └── roi_extractors │ │ │ ├── __init__.py │ │ │ └── single_roiaware_extractor.py │ ├── segmentors │ │ ├── __init__.py │ │ ├── base.py │ │ └── encoder_decoder.py │ ├── utils │ │ ├── __init__.py │ │ ├── clip_sigmoid.py │ │ └── mlp.py │ └── voxel_encoders │ │ ├── __init__.py │ │ ├── pillar_encoder.py │ │ ├── utils.py │ │ └── voxel_encoder.py ├── ops │ ├── __init__.py │ ├── ball_query │ │ ├── __init__.py │ │ ├── ball_query.py │ │ └── src │ │ │ ├── ball_query.cpp │ │ │ └── ball_query_cuda.cu │ ├── furthest_point_sample │ │ ├── __init__.py │ │ ├── furthest_point_sample.py │ │ ├── points_sampler.py │ │ ├── src │ │ │ ├── furthest_point_sample.cpp │ │ │ └── furthest_point_sample_cuda.cu │ │ └── utils.py │ ├── gather_points │ │ ├── __init__.py │ │ ├── gather_points.py │ │ └── src │ │ │ ├── gather_points.cpp │ │ │ └── gather_points_cuda.cu │ ├── group_points │ │ ├── __init__.py │ │ ├── group_points.py │ │ └── src │ │ │ ├── group_points.cpp │ │ │ └── group_points_cuda.cu │ ├── interpolate │ │ ├── __init__.py │ │ ├── src │ │ │ ├── interpolate.cpp │ │ │ ├── three_interpolate_cuda.cu │ │ │ └── three_nn_cuda.cu │ │ ├── three_interpolate.py │ │ └── three_nn.py │ ├── iou3d │ │ ├── __init__.py │ │ ├── iou3d_utils.py │ │ └── src │ │ │ ├── iou3d.cpp │ │ │ └── iou3d_kernel.cu │ ├── knn │ │ ├── __init__.py │ │ ├── knn.py │ │ └── src │ │ │ ├── knn.cpp │ │ │ └── knn_cuda.cu │ ├── norm.py │ ├── paconv │ │ ├── __init__.py │ │ ├── assign_score.py │ │ ├── paconv.py │ │ ├── src │ │ │ ├── assign_score_withk.cpp │ │ │ └── assign_score_withk_cuda.cu │ │ └── utils.py │ ├── pointnet_modules │ │ ├── __init__.py │ │ ├── builder.py │ │ ├── paconv_sa_module.py │ │ ├── point_fp_module.py │ │ ├── point_fp_modulev2.py │ │ └── point_sa_module.py │ ├── roiaware_pool3d │ │ ├── __init__.py │ │ ├── points_in_boxes.py │ │ ├── roiaware_pool3d.py │ │ └── src │ │ │ ├── points_in_boxes_cpu.cpp │ │ │ ├── points_in_boxes_cuda.cu │ │ │ ├── roiaware_pool3d.cpp │ │ │ └── roiaware_pool3d_kernel.cu │ ├── sparse_block.py │ ├── spconv │ │ ├── __init__.py │ │ ├── conv.py │ │ ├── functional.py │ │ ├── include │ │ │ ├── paramsgrid.h │ │ │ ├── prettyprint.h │ │ │ ├── pybind11_utils.h │ │ │ ├── spconv │ │ │ │ ├── fused_spconv_ops.h │ │ │ │ ├── geometry.h │ │ │ │ ├── indice.cu.h │ │ │ │ ├── indice.h │ │ │ │ ├── maxpool.h │ │ │ │ ├── mp_helper.h │ │ │ │ ├── point2voxel.h │ │ │ │ ├── pool_ops.h │ │ │ │ ├── reordering.cu.h │ │ │ │ ├── reordering.h │ │ │ │ └── spconv_ops.h │ │ │ ├── tensorview │ │ │ │ ├── helper_kernel.cu.h │ │ │ │ ├── helper_launch.h │ │ │ │ └── tensorview.h │ │ │ ├── torch_utils.h │ │ │ └── utility │ │ │ │ └── timer.h │ │ ├── modules.py │ │ ├── ops.py │ │ ├── pool.py │ │ ├── src │ │ │ ├── all.cc │ │ │ ├── indice.cc │ │ │ ├── indice_cuda.cu │ │ │ ├── maxpool.cc │ │ │ ├── maxpool_cuda.cu │ │ │ ├── reordering.cc │ │ │ └── reordering_cuda.cu │ │ ├── structure.py │ │ └── test_utils.py │ └── voxel │ │ ├── __init__.py │ │ ├── scatter_points.py │ │ ├── src │ │ ├── scatter_points_cpu.cpp │ │ ├── scatter_points_cuda.cu │ │ ├── voxelization.cpp │ │ ├── voxelization.h │ │ ├── voxelization_cpu.cpp │ │ └── voxelization_cuda.cu │ │ └── voxelize.py ├── utils │ ├── __init__.py │ ├── collect_env.py │ └── logger.py └── version.py ├── model-index.yml ├── requirements.txt ├── requirements ├── build.txt ├── docs.txt ├── mminstall.txt ├── optional.txt ├── readthedocs.txt ├── runtime.txt └── tests.txt ├── resources ├── browse_dataset_mono.png ├── browse_dataset_multi_modality.png ├── browse_dataset_seg.png ├── data_pipeline.png ├── loss_curve.png ├── mmdet3d-logo.png ├── mmdet3d_outdoor_demo.gif ├── nuimages_demo.gif ├── open3d_visual.gif ├── qq_group_qrcode.png └── zhihu_qrcode.jpg ├── setup.cfg ├── setup.py ├── tests ├── data │ ├── kitti │ │ ├── a.bin │ │ ├── kitti_dbinfos_train.pkl │ │ ├── kitti_gt_database │ │ │ └── 0_Pedestrian_0.bin │ │ ├── kitti_infos_mono3d.coco.json │ │ ├── kitti_infos_mono3d.pkl │ │ ├── kitti_infos_train.pkl │ │ ├── mono3d_sample_results.pkl │ │ ├── mono3d_sample_results2d.pkl │ │ └── training │ │ │ ├── image_2 │ │ │ ├── 000000.png │ │ │ └── 000007.png │ │ │ ├── velodyne │ │ │ └── 000000.bin │ │ │ └── velodyne_reduced │ │ │ └── 000000.bin │ ├── lyft │ │ ├── lidar │ │ │ ├── host-a017_lidar1_1236118886501000046.bin │ │ │ ├── host-a017_lidar1_1236118886701083686.bin │ │ │ └── host-a017_lidar1_1236118886901125926.bin │ │ ├── lyft_infos.pkl │ │ ├── lyft_infos_val.pkl │ │ ├── sample_results.pkl │ │ ├── v1.01-train │ │ │ ├── maps │ │ │ │ └── map_raster_palo_alto.png │ │ │ └── v1.01-train │ │ │ │ ├── attribute.json │ │ │ │ ├── calibrated_sensor.json │ │ │ │ ├── category.json │ │ │ │ ├── ego_pose.json │ │ │ │ ├── instance.json │ │ │ │ ├── log.json │ │ │ │ ├── map.json │ │ │ │ ├── sample.json │ │ │ │ ├── sample_annotation.json │ │ │ │ ├── sample_data.json │ │ │ │ ├── scene.json │ │ │ │ ├── sensor.json │ │ │ │ └── visibility.json │ │ └── val.txt │ ├── nuscenes │ │ ├── mono3d_sample_results.pkl │ │ ├── nus_info.pkl │ │ ├── nus_infos_mono3d.coco.json │ │ ├── samples │ │ │ ├── CAM_BACK_LEFT │ │ │ │ └── n015-2018-07-18-11-07-57+0800__CAM_BACK_LEFT__1531883530447423.jpg │ │ │ └── LIDAR_TOP │ │ │ │ └── n015-2018-08-02-17-16-37+0800__LIDAR_TOP__1533201470948018.pcd.bin │ │ └── sweeps │ │ │ └── LIDAR_TOP │ │ │ ├── n008-2018-09-18-12-07-26-0400__LIDAR_TOP__1537287083900561.pcd.bin │ │ │ └── n015-2018-08-02-17-16-37+0800__LIDAR_TOP__1533201470898274.pcd.bin │ ├── ops │ │ ├── features_for_fps_distance.npy │ │ └── fps_idx.npy │ ├── s3dis │ │ ├── instance_mask │ │ │ └── Area_1_office_2.bin │ │ ├── points │ │ │ └── Area_1_office_2.bin │ │ ├── s3dis_infos.pkl │ │ └── semantic_mask │ │ │ └── Area_1_office_2.bin │ ├── scannet │ │ ├── instance_mask │ │ │ └── scene0000_00.bin │ │ ├── points │ │ │ └── scene0000_00.bin │ │ ├── scannet_infos.pkl │ │ └── semantic_mask │ │ │ └── scene0000_00.bin │ ├── semantickitti │ │ ├── semantickitti_infos.pkl │ │ └── sequences │ │ │ └── 00 │ │ │ ├── labels │ │ │ └── 000000.label │ │ │ └── velodyne │ │ │ └── 000000.bin │ ├── sunrgbd │ │ ├── points │ │ │ └── 000001.bin │ │ ├── sunrgbd_infos.pkl │ │ └── sunrgbd_trainval │ │ │ └── image │ │ │ └── 000001.jpg │ └── waymo │ │ ├── kitti_format │ │ ├── training │ │ │ ├── image_0 │ │ │ │ ├── 0000000.png │ │ │ │ └── 1000000.png │ │ │ └── velodyne │ │ │ │ ├── 0000000.bin │ │ │ │ └── 1000000.bin │ │ ├── waymo_dbinfos_train.pkl │ │ ├── waymo_gt_database │ │ │ └── 0_Car_0.bin │ │ ├── waymo_infos_train.pkl │ │ └── waymo_infos_val.pkl │ │ └── waymo_format │ │ ├── gt.bin │ │ └── validation │ │ └── val.tfrecord ├── test_data │ ├── test_datasets │ │ ├── test_dataset_wrappers.py │ │ ├── test_kitti_dataset.py │ │ ├── test_kitti_mono_dataset.py │ │ ├── test_lyft_dataset.py │ │ ├── test_nuscene_dataset.py │ │ ├── test_nuscenes_mono_dataset.py │ │ ├── test_s3dis_dataset.py │ │ ├── test_scannet_dataset.py │ │ ├── test_semantickitti_dataset.py │ │ ├── test_sunrgbd_dataset.py │ │ └── test_waymo_dataset.py │ └── test_pipelines │ │ ├── test_augmentations │ │ ├── test_data_augment_utils.py │ │ ├── test_test_augment_utils.py │ │ └── test_transforms_3d.py │ │ ├── test_indoor_pipeline.py │ │ ├── test_indoor_sample.py │ │ ├── test_loadings │ │ ├── test_load_images_from_multi_views.py │ │ ├── test_load_points_from_multi_sweeps.py │ │ └── test_loading.py │ │ └── test_outdoor_pipeline.py ├── test_metrics │ ├── test_indoor_eval.py │ ├── test_kitti_eval.py │ ├── test_losses.py │ └── test_seg_eval.py ├── test_models │ ├── test_backbones.py │ ├── test_common_modules │ │ ├── test_middle_encoders.py │ │ ├── test_paconv_modules.py │ │ ├── test_paconv_ops.py │ │ ├── test_pointnet_modules.py │ │ ├── test_pointnet_ops.py │ │ ├── test_roiaware_pool3d.py │ │ ├── test_sparse_unet.py │ │ └── test_vote_module.py │ ├── test_detectors.py │ ├── test_forward.py │ ├── test_fusion │ │ ├── test_fusion_coord_trans.py │ │ ├── test_point_fusion.py │ │ └── test_vote_fusion.py │ ├── test_heads │ │ ├── test_heads.py │ │ ├── test_paconv_decode_head.py │ │ ├── test_parta2_bbox_head.py │ │ ├── test_pointnet2_decode_head.py │ │ ├── test_roi_extractors.py │ │ └── test_semantic_heads.py │ ├── test_necks │ │ ├── test_fpn.py │ │ └── test_necks.py │ ├── test_segmentors.py │ └── test_voxel_encoder │ │ ├── test_dynamic_scatter.py │ │ ├── test_voxel_encoders.py │ │ ├── test_voxel_generator.py │ │ └── test_voxelize.py ├── test_runtime │ ├── test_apis.py │ └── test_config.py ├── test_samples │ └── parta2_roihead_inputs.npz └── test_utils │ ├── test_anchors.py │ ├── test_assigners.py │ ├── test_bbox_coders.py │ ├── test_box3d.py │ ├── test_box_np_ops.py │ ├── test_coord_3d_mode.py │ ├── test_merge_augs.py │ ├── test_nms.py │ ├── test_points.py │ ├── test_samplers.py │ └── test_utils.py └── tools ├── analysis_tools ├── analyze_logs.py ├── benchmark.py └── get_flops.py ├── create_data.py ├── create_data.sh ├── data_converter ├── __init__.py ├── create_gt_database.py ├── indoor_converter.py ├── kitti_converter.py ├── kitti_data_utils.py ├── lyft_converter.py ├── lyft_data_fixer.py ├── nuimage_converter.py ├── nuscenes_converter.py ├── s3dis_data_utils.py ├── scannet_data_utils.py ├── sunrgbd_data_utils.py └── waymo_converter.py ├── dist_test.sh ├── dist_train.sh ├── misc ├── browse_dataset.py ├── fuse_conv_bn.py ├── print_config.py └── visualize_results.py ├── model_converters ├── convert_h3dnet_checkpoints.py ├── convert_votenet_checkpoints.py ├── publish_model.py └── regnet2mmdet.py ├── slurm_test.sh ├── slurm_train.sh ├── test.py └── train.py /.dev_scripts/linter.sh: -------------------------------------------------------------------------------- 1 | yapf -r -i mmdet3d/ configs/ tests/ tools/ 2 | isort mmdet3d/ configs/ tests/ tools/ 3 | flake8 . 4 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We appreciate all contributions to improve MMDetection3D. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) in MMCV for more details about the contributing guideline. 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/error-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Error report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Thanks for your error report and we appreciate it a lot. 11 | 12 | **Checklist** 13 | 1. I have searched related issues but cannot get the expected help. 14 | 2. The bug has not been fixed in the latest version. 15 | 16 | **Describe the bug** 17 | A clear and concise description of what the bug is. 18 | 19 | **Reproduction** 20 | 1. What command or script did you run? 21 | 22 | ``` 23 | A placeholder for the command. 24 | ``` 25 | 26 | 2. Did you make any modifications on the code or config? Did you understand what you have modified? 27 | 3. What dataset did you use? 28 | 29 | **Environment** 30 | 31 | 1. Please run `python mmdet3d/utils/collect_env.py` to collect necessary environment infomation and paste it here. 32 | 2. You may add addition that may be helpful for locating the problem, such as 33 | - How you installed PyTorch [e.g., pip, conda, source] 34 | - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) 35 | 36 | **Error traceback** 37 | If applicable, paste the error trackback here. 38 | 39 | ``` 40 | A placeholder for trackback. 41 | ``` 42 | 43 | **Bug fix** 44 | If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! 45 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the feature** 11 | 12 | **Motivation** 13 | A clear and concise description of the motivation of the feature. 14 | Ex1. It is inconvenient when [....]. 15 | Ex2. There is a recent paper [....], which is very helpful for [....]. 16 | 17 | **Related resources** 18 | If there is an official code release or third-party implementations, please also provide the information here, which would be very helpful. 19 | 20 | **Additional context** 21 | Add any other context or screenshots about the feature request here. 22 | If you would like to implement the feature and create a PR, please leave a comment here and that would be much appreciated. 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/general_questions.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General questions 3 | about: Ask general questions to get help 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. 2 | 3 | ## Motivation 4 | Please describe the motivation of this PR and the goal you want to achieve through this PR. 5 | 6 | ## Modification 7 | Please briefly describe what modification is made in this PR. 8 | 9 | ## BC-breaking (Optional) 10 | Does the modification introduce changes that break the back-compatibility of the downstream repos? 11 | If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. 12 | 13 | ## Use cases (Optional) 14 | If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. 15 | 16 | ## Checklist 17 | 18 | 1. Pre-commit or other linting tools are used to fix the potential lint issues. 19 | 2. The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness. 20 | 3. If the modification has potential influence on downstream projects, this PR should be tested with downstream projects. 21 | 4. The documentation has been modified accordingly, like docstring or example tutorials. 22 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | 3 | on: push 4 | 5 | jobs: 6 | build-n-publish: 7 | runs-on: ubuntu-18.04 8 | if: startsWith(github.event.ref, 'refs/tags') 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Set up Python 3.7 12 | uses: actions/setup-python@v2 13 | with: 14 | python-version: 3.7 15 | - name: Install torch 16 | run: pip install torch 17 | - name: Build MMDet3D 18 | run: python setup.py sdist 19 | - name: Publish distribution to PyPI 20 | run: | 21 | pip install twine 22 | twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} 23 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://gitlab.com/pycqa/flake8.git 3 | rev: 3.8.3 4 | hooks: 5 | - id: flake8 6 | - repo: https://github.com/asottile/seed-isort-config 7 | rev: v2.2.0 8 | hooks: 9 | - id: seed-isort-config 10 | - repo: https://github.com/timothycrosley/isort 11 | rev: 5.0.2 12 | hooks: 13 | - id: isort 14 | - repo: https://github.com/pre-commit/mirrors-yapf 15 | rev: v0.30.0 16 | hooks: 17 | - id: yapf 18 | - repo: https://github.com/pre-commit/pre-commit-hooks 19 | rev: v3.1.0 20 | hooks: 21 | - id: trailing-whitespace 22 | - id: check-yaml 23 | - id: end-of-file-fixer 24 | - id: requirements-txt-fixer 25 | - id: double-quote-string-fixer 26 | - id: check-merge-conflict 27 | - id: fix-encoding-pragma 28 | args: ["--remove"] 29 | - id: mixed-line-ending 30 | args: ["--fix=lf"] 31 | - repo: https://github.com/myint/docformatter 32 | rev: v1.3.1 33 | hooks: 34 | - id: docformatter 35 | args: ["--in-place", "--wrap-descriptions", "79"] 36 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | formats: all 4 | 5 | python: 6 | version: 3.7 7 | install: 8 | - requirements: requirements/docs.txt 9 | - requirements: requirements/runtime.txt 10 | - requirements: requirements/readthedocs.txt 11 | - requirements: requirements/mminstall.txt 12 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software, please cite it as below." 3 | authors: 4 | - name: "MMDetection3D Contributors" 5 | title: "OpenMMLab's Next-generation Platform for General 3D Object Detection" 6 | date-released: 2020-07-23 7 | url: "https://github.com/open-mmlab/mmdetection3d" 8 | license: Apache-2.0 -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include mmdet3d/.mim/model-index.yml 2 | include requirements/*.txt 3 | recursive-include mmdet3d/.mim/ops *.cpp *.cu *.h *.cc 4 | recursive-include mmdet3d/.mim/configs *.py *.yml 5 | recursive-include mmdet3d/.mim/tools *.sh *.py 6 | -------------------------------------------------------------------------------- /configs/3dssd/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: 3DSSD 3 | Metadata: 4 | Training Data: KITTI 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 4x TITAN X 8 | Architecture: 9 | - PointNet++ 10 | Paper: 11 | URL: https://arxiv.org/abs/2002.10187 12 | Title: '3DSSD: Point-based 3D Single Stage Object Detector' 13 | README: configs/3dssd/README.md 14 | Code: 15 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/ssd3dnet.py#L7 16 | Version: v0.6.0 17 | 18 | Models: 19 | - Name: 3dssd_4x4_kitti-3d-car 20 | In Collection: 3DSSD 21 | Config: configs/3dssd/3dssd_4x4_kitti-3d-car.py 22 | Metadata: 23 | Training Memory (GB): 4.7 24 | Results: 25 | - Task: 3D Object Detection 26 | Dataset: KITTI 27 | Metrics: 28 | mAP: 78.69 29 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/3dssd/3dssd_kitti-3d-car_20210602_124438-b4276f56.pth 30 | -------------------------------------------------------------------------------- /configs/_base_/default_runtime.py: -------------------------------------------------------------------------------- 1 | checkpoint_config = dict(interval=1) 2 | # yapf:disable push 3 | # By default we use textlogger hook and tensorboard 4 | # For more loggers see 5 | # https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.LoggerHook 6 | log_config = dict( 7 | interval=50, 8 | hooks=[ 9 | dict(type='TextLoggerHook'), 10 | dict(type='TensorboardLoggerHook') 11 | ]) 12 | # yapf:enable 13 | dist_params = dict(backend='nccl') 14 | log_level = 'INFO' 15 | work_dir = None 16 | load_from = None 17 | resume_from = None 18 | workflow = [('train', 1)] 19 | -------------------------------------------------------------------------------- /configs/_base_/models/hv_pointpillars_fpn_lyft.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_pointpillars_fpn_nus.py' 2 | 3 | # model settings (based on nuScenes model settings) 4 | # Voxel size for voxel encoder 5 | # Usually voxel size is changed consistently with the point cloud range 6 | # If point cloud range is modified, do remember to change all related 7 | # keys in the config. 8 | model = dict( 9 | pts_voxel_layer=dict( 10 | max_num_points=20, 11 | point_cloud_range=[-80, -80, -5, 80, 80, 3], 12 | max_voxels=(60000, 60000)), 13 | pts_voxel_encoder=dict( 14 | feat_channels=[64], point_cloud_range=[-80, -80, -5, 80, 80, 3]), 15 | pts_middle_encoder=dict(output_shape=[640, 640]), 16 | pts_bbox_head=dict( 17 | num_classes=9, 18 | anchor_generator=dict( 19 | ranges=[[-80, -80, -1.8, 80, 80, -1.8]], custom_values=[]), 20 | bbox_coder=dict(type='DeltaXYZWLHRBBoxCoder', code_size=7)), 21 | # model training settings (based on nuScenes model settings) 22 | train_cfg=dict(pts=dict(code_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]))) 23 | -------------------------------------------------------------------------------- /configs/_base_/models/hv_pointpillars_fpn_range100_lyft.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_pointpillars_fpn_nus.py' 2 | 3 | # model settings (based on nuScenes model settings) 4 | # Voxel size for voxel encoder 5 | # Usually voxel size is changed consistently with the point cloud range 6 | # If point cloud range is modified, do remember to change all related 7 | # keys in the config. 8 | model = dict( 9 | pts_voxel_layer=dict( 10 | max_num_points=20, 11 | point_cloud_range=[-100, -100, -5, 100, 100, 3], 12 | max_voxels=(60000, 60000)), 13 | pts_voxel_encoder=dict( 14 | feat_channels=[64], point_cloud_range=[-100, -100, -5, 100, 100, 3]), 15 | pts_middle_encoder=dict(output_shape=[800, 800]), 16 | pts_bbox_head=dict( 17 | num_classes=9, 18 | anchor_generator=dict( 19 | ranges=[[-100, -100, -1.8, 100, 100, -1.8]], custom_values=[]), 20 | bbox_coder=dict(type='DeltaXYZWLHRBBoxCoder', code_size=7)), 21 | # model training settings (based on nuScenes model settings) 22 | train_cfg=dict(pts=dict(code_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]))) 23 | -------------------------------------------------------------------------------- /configs/_base_/models/paconv_cuda_ssg.py: -------------------------------------------------------------------------------- 1 | _base_ = './paconv_ssg.py' 2 | 3 | model = dict( 4 | backbone=dict( 5 | sa_cfg=dict( 6 | type='PAConvCUDASAModule', 7 | scorenet_cfg=dict(mlp_channels=[8, 16, 16])))) 8 | -------------------------------------------------------------------------------- /configs/_base_/models/pointnet2_msg.py: -------------------------------------------------------------------------------- 1 | _base_ = './pointnet2_ssg.py' 2 | 3 | # model settings 4 | model = dict( 5 | backbone=dict( 6 | _delete_=True, 7 | type='PointNet2SAMSG', 8 | in_channels=6, # [xyz, rgb], should be modified with dataset 9 | num_points=(1024, 256, 64, 16), 10 | radii=((0.05, 0.1), (0.1, 0.2), (0.2, 0.4), (0.4, 0.8)), 11 | num_samples=((16, 32), (16, 32), (16, 32), (16, 32)), 12 | sa_channels=(((16, 16, 32), (32, 32, 64)), ((64, 64, 128), (64, 96, 13 | 128)), 14 | ((128, 196, 256), (128, 196, 256)), ((256, 256, 512), 15 | (256, 384, 512))), 16 | aggregation_channels=(None, None, None, None), 17 | fps_mods=(('D-FPS'), ('D-FPS'), ('D-FPS'), ('D-FPS')), 18 | fps_sample_range_lists=((-1), (-1), (-1), (-1)), 19 | dilated_group=(False, False, False, False), 20 | out_indices=(0, 1, 2, 3), 21 | sa_cfg=dict( 22 | type='PointSAModuleMSG', 23 | pool_mod='max', 24 | use_xyz=True, 25 | normalize_xyz=False)), 26 | decode_head=dict( 27 | fp_channels=((1536, 256, 256), (512, 256, 256), (352, 256, 128), 28 | (128, 128, 128, 128)))) 29 | -------------------------------------------------------------------------------- /configs/_base_/models/pointnet2_ssg.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | model = dict( 3 | type='EncoderDecoder3D', 4 | backbone=dict( 5 | type='PointNet2SASSG', 6 | in_channels=6, # [xyz, rgb], should be modified with dataset 7 | num_points=(1024, 256, 64, 16), 8 | radius=(0.1, 0.2, 0.4, 0.8), 9 | num_samples=(32, 32, 32, 32), 10 | sa_channels=((32, 32, 64), (64, 64, 128), (128, 128, 256), (256, 256, 11 | 512)), 12 | fp_channels=(), 13 | norm_cfg=dict(type='BN2d'), 14 | sa_cfg=dict( 15 | type='PointSAModule', 16 | pool_mod='max', 17 | use_xyz=True, 18 | normalize_xyz=False)), 19 | decode_head=dict( 20 | type='PointNet2Head', 21 | fp_channels=((768, 256, 256), (384, 256, 256), (320, 256, 128), 22 | (128, 128, 128, 128)), 23 | channels=128, 24 | dropout_ratio=0.5, 25 | conv_cfg=dict(type='Conv1d'), 26 | norm_cfg=dict(type='BN1d'), 27 | act_cfg=dict(type='ReLU'), 28 | loss_decode=dict( 29 | type='CrossEntropyLoss', 30 | use_sigmoid=False, 31 | class_weight=None, # should be modified with dataset 32 | loss_weight=1.0)), 33 | # model training and testing settings 34 | train_cfg=dict(), 35 | test_cfg=dict(mode='slide')) 36 | -------------------------------------------------------------------------------- /configs/_base_/schedules/cosine.py: -------------------------------------------------------------------------------- 1 | # This schedule is mainly used by models with dynamic voxelization 2 | # optimizer 3 | lr = 0.003 # max learning rate 4 | optimizer = dict( 5 | type='AdamW', 6 | lr=lr, 7 | betas=(0.95, 0.99), # the momentum is change during training 8 | weight_decay=0.001) 9 | optimizer_config = dict(grad_clip=dict(max_norm=10, norm_type=2)) 10 | 11 | lr_config = dict( 12 | policy='CosineAnnealing', 13 | warmup='linear', 14 | warmup_iters=1000, 15 | warmup_ratio=1.0 / 10, 16 | min_lr_ratio=1e-5) 17 | 18 | momentum_config = None 19 | 20 | runner = dict(type='EpochBasedRunner', max_epochs=40) 21 | -------------------------------------------------------------------------------- /configs/_base_/schedules/cyclic_20e.py: -------------------------------------------------------------------------------- 1 | # For nuScenes dataset, we usually evaluate the model at the end of training. 2 | # Since the models are trained by 24 epochs by default, we set evaluation 3 | # interval to be 20. Please change the interval accordingly if you do not 4 | # use a default schedule. 5 | # optimizer 6 | # This schedule is mainly used by models on nuScenes dataset 7 | optimizer = dict(type='AdamW', lr=1e-4, weight_decay=0.01) 8 | # max_norm=10 is better for SECOND 9 | optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) 10 | lr_config = dict( 11 | policy='cyclic', 12 | target_ratio=(10, 1e-4), 13 | cyclic_times=1, 14 | step_ratio_up=0.4, 15 | ) 16 | momentum_config = dict( 17 | policy='cyclic', 18 | target_ratio=(0.85 / 0.95, 1), 19 | cyclic_times=1, 20 | step_ratio_up=0.4, 21 | ) 22 | 23 | # runtime settings 24 | runner = dict(type='EpochBasedRunner', max_epochs=20) 25 | -------------------------------------------------------------------------------- /configs/_base_/schedules/cyclic_40e.py: -------------------------------------------------------------------------------- 1 | # The schedule is usually used by models trained on KITTI dataset 2 | 3 | # The learning rate set in the cyclic schedule is the initial learning rate 4 | # rather than the max learning rate. Since the target_ratio is (10, 1e-4), 5 | # the learning rate will change from 0.0018 to 0.018, than go to 0.0018*1e-4 6 | lr = 0.0018 7 | # The optimizer follows the setting in SECOND.Pytorch, but here we use 8 | # the offcial AdamW optimizer implemented by PyTorch. 9 | optimizer = dict(type='AdamW', lr=lr, betas=(0.95, 0.99), weight_decay=0.01) 10 | optimizer_config = dict(grad_clip=dict(max_norm=10, norm_type=2)) 11 | # We use cyclic learning rate and momentum schedule following SECOND.Pytorch 12 | # https://github.com/traveller59/second.pytorch/blob/3aba19c9688274f75ebb5e576f65cfe54773c021/torchplus/train/learning_schedules_fastai.py#L69 # noqa 13 | # We implement them in mmcv, for more details, please refer to 14 | # https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327 # noqa 15 | # https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130 # noqa 16 | lr_config = dict( 17 | policy='cyclic', 18 | target_ratio=(10, 1e-4), 19 | cyclic_times=1, 20 | step_ratio_up=0.4, 21 | ) 22 | momentum_config = dict( 23 | policy='cyclic', 24 | target_ratio=(0.85 / 0.95, 1), 25 | cyclic_times=1, 26 | step_ratio_up=0.4, 27 | ) 28 | # Although the max_epochs is 40, this schedule is usually used we 29 | # RepeatDataset with repeat ratio N, thus the actual max epoch 30 | # number could be Nx40 31 | runner = dict(type='EpochBasedRunner', max_epochs=40) 32 | -------------------------------------------------------------------------------- /configs/_base_/schedules/mmdet_schedule_1x.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) 3 | optimizer_config = dict(grad_clip=None) 4 | # learning policy 5 | lr_config = dict( 6 | policy='step', 7 | warmup='linear', 8 | warmup_iters=500, 9 | warmup_ratio=0.001, 10 | step=[8, 11]) 11 | runner = dict(type='EpochBasedRunner', max_epochs=12) 12 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_2x.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | # This schedule is mainly used by models on nuScenes dataset 3 | optimizer = dict(type='AdamW', lr=0.001, weight_decay=0.01) 4 | # max_norm=10 is better for SECOND 5 | optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) 6 | lr_config = dict( 7 | policy='step', 8 | warmup='linear', 9 | warmup_iters=1000, 10 | warmup_ratio=1.0 / 1000, 11 | step=[20, 23]) 12 | momentum_config = None 13 | # runtime settings 14 | runner = dict(type='EpochBasedRunner', max_epochs=24) 15 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_3x.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | # This schedule is mainly used by models on indoor dataset, 3 | # e.g., VoteNet on SUNRGBD and ScanNet 4 | lr = 0.008 # max learning rate 5 | optimizer = dict(type='AdamW', lr=lr, weight_decay=0.01) 6 | optimizer_config = dict(grad_clip=dict(max_norm=10, norm_type=2)) 7 | lr_config = dict(policy='step', warmup=None, step=[24, 32]) 8 | # runtime settings 9 | runner = dict(type='EpochBasedRunner', max_epochs=36) 10 | -------------------------------------------------------------------------------- /configs/_base_/schedules/seg_cosine_150e.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | # This schedule is mainly used on S3DIS dataset in segmentation task 3 | optimizer = dict(type='SGD', lr=0.2, weight_decay=0.0001, momentum=0.9) 4 | optimizer_config = dict(grad_clip=None) 5 | lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=0.002) 6 | momentum_config = None 7 | 8 | # runtime settings 9 | runner = dict(type='EpochBasedRunner', max_epochs=150) 10 | -------------------------------------------------------------------------------- /configs/_base_/schedules/seg_cosine_200e.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | # This schedule is mainly used on ScanNet dataset in segmentation task 3 | optimizer = dict(type='Adam', lr=0.001, weight_decay=0.01) 4 | optimizer_config = dict(grad_clip=None) 5 | lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) 6 | momentum_config = None 7 | 8 | # runtime settings 9 | runner = dict(type='EpochBasedRunner', max_epochs=200) 10 | -------------------------------------------------------------------------------- /configs/_base_/schedules/seg_cosine_50e.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | # This schedule is mainly used on S3DIS dataset in segmentation task 3 | optimizer = dict(type='Adam', lr=0.001, weight_decay=0.001) 4 | optimizer_config = dict(grad_clip=None) 5 | lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) 6 | momentum_config = None 7 | 8 | # runtime settings 9 | runner = dict(type='EpochBasedRunner', max_epochs=50) 10 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_0075voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_0075voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict(test_cfg=dict(pts=dict(nms_type='circle'))) 4 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_0075voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3))) 16 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_flip-tta_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = './centerpoint_0075voxel_second_secfpn_dcn_4x8_cyclic_20e_nus.py' 2 | 3 | point_cloud_range = [-54, -54, -5.0, 54, 54, 3.0] 4 | file_client_args = dict(backend='disk') 5 | class_names = [ 6 | 'car', 'truck', 'construction_vehicle', 'bus', 'trailer', 'barrier', 7 | 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone' 8 | ] 9 | 10 | test_pipeline = [ 11 | dict( 12 | type='LoadPointsFromFile', 13 | coord_type='LIDAR', 14 | load_dim=5, 15 | use_dim=5, 16 | file_client_args=file_client_args), 17 | dict( 18 | type='LoadPointsFromMultiSweeps', 19 | sweeps_num=9, 20 | use_dim=[0, 1, 2, 3, 4], 21 | file_client_args=file_client_args, 22 | pad_empty_sweeps=True, 23 | remove_close=True), 24 | dict( 25 | type='MultiScaleFlipAug3D', 26 | img_scale=(1333, 800), 27 | pts_scale_ratio=1, 28 | # Add double-flip augmentation 29 | flip=True, 30 | pcd_horizontal_flip=True, 31 | pcd_vertical_flip=True, 32 | transforms=[ 33 | dict( 34 | type='GlobalRotScaleTrans', 35 | rot_range=[0, 0], 36 | scale_ratio_range=[1., 1.], 37 | translation_std=[0, 0, 0]), 38 | dict(type='RandomFlip3D', sync_2d=False), 39 | dict( 40 | type='PointsRangeFilter', point_cloud_range=point_cloud_range), 41 | dict( 42 | type='DefaultFormatBundle3D', 43 | class_names=class_names, 44 | with_label=False), 45 | dict(type='Collect3D', keys=['points']) 46 | ]) 47 | ] 48 | 49 | data = dict( 50 | val=dict(pipeline=test_pipeline), test=dict(pipeline=test_pipeline)) 51 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_0075voxel_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_0075voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3)), 16 | test_cfg=dict(pts=dict(nms_type='circle'))) 17 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_01voxel_second_secfpn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_01voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict(test_cfg=dict(pts=dict(nms_type='circle'))) 4 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_01voxel_second_secfpn_dcn_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_01voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3))) 16 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_01voxel_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_01voxel_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3)), 16 | test_cfg=dict(pts=dict(nms_type='circle'))) 17 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_02pillar_second_secfpn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict(test_cfg=dict(pts=dict(nms_type='circle'))) 4 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_02pillar_second_secfpn_dcn_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3))) 16 | -------------------------------------------------------------------------------- /configs/centerpoint/centerpoint_02pillar_second_secfpn_dcn_circlenms_4x8_cyclic_20e_nus.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py'] 2 | 3 | model = dict( 4 | pts_bbox_head=dict( 5 | separate_head=dict( 6 | type='DCNSeparateHead', 7 | dcn_config=dict( 8 | type='DCN', 9 | in_channels=64, 10 | out_channels=64, 11 | kernel_size=3, 12 | padding=1, 13 | groups=4), 14 | init_bias=-2.19, 15 | final_kernel=3)), 16 | test_cfg=dict(pts=dict(nms_type='circle'))) 17 | -------------------------------------------------------------------------------- /configs/dynamic_voxelization/dv_pointpillars_secfpn_6x8_160e_kitti-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = '../pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-car.py' 2 | 3 | voxel_size = [0.16, 0.16, 4] 4 | point_cloud_range = [0, -39.68, -3, 69.12, 39.68, 1] 5 | 6 | model = dict( 7 | type='DynamicVoxelNet', 8 | voxel_layer=dict( 9 | max_num_points=-1, 10 | point_cloud_range=point_cloud_range, 11 | voxel_size=voxel_size, 12 | max_voxels=(-1, -1)), 13 | voxel_encoder=dict( 14 | type='DynamicPillarFeatureNet', 15 | in_channels=4, 16 | feat_channels=[64], 17 | with_distance=False, 18 | voxel_size=voxel_size, 19 | point_cloud_range=point_cloud_range)) 20 | -------------------------------------------------------------------------------- /configs/dynamic_voxelization/dv_second_secfpn_2x8_cosine_80e_kitti-3d-3class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_second_secfpn_kitti.py', 3 | '../_base_/datasets/kitti-3d-3class.py', '../_base_/schedules/cosine.py', 4 | '../_base_/default_runtime.py' 5 | ] 6 | 7 | point_cloud_range = [0, -40, -3, 70.4, 40, 1] 8 | voxel_size = [0.05, 0.05, 0.1] 9 | 10 | model = dict( 11 | type='DynamicVoxelNet', 12 | voxel_layer=dict( 13 | _delete_=True, 14 | max_num_points=-1, 15 | point_cloud_range=point_cloud_range, 16 | voxel_size=voxel_size, 17 | max_voxels=(-1, -1)), 18 | voxel_encoder=dict( 19 | _delete_=True, 20 | type='DynamicSimpleVFE', 21 | voxel_size=voxel_size, 22 | point_cloud_range=point_cloud_range)) 23 | -------------------------------------------------------------------------------- /configs/dynamic_voxelization/dv_second_secfpn_6x8_80e_kitti-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = '../second/hv_second_secfpn_6x8_80e_kitti-3d-car.py' 2 | 3 | point_cloud_range = [0, -40, -3, 70.4, 40, 1] 4 | voxel_size = [0.05, 0.05, 0.1] 5 | 6 | model = dict( 7 | type='DynamicVoxelNet', 8 | voxel_layer=dict( 9 | _delete_=True, 10 | max_num_points=-1, 11 | point_cloud_range=point_cloud_range, 12 | voxel_size=voxel_size, 13 | max_voxels=(-1, -1)), 14 | voxel_encoder=dict( 15 | _delete_=True, 16 | type='DynamicSimpleVFE', 17 | voxel_size=voxel_size, 18 | point_cloud_range=point_cloud_range)) 19 | -------------------------------------------------------------------------------- /configs/fcos3d/fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d_finetune.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcos3d_r101_caffe_fpn_gn-head_dcn_2x8_1x_nus-mono3d.py' 2 | # model settings 3 | model = dict( 4 | train_cfg=dict( 5 | code_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.05, 0.05])) 6 | # optimizer 7 | optimizer = dict(lr=0.001) 8 | load_from = 'work_dirs/fcos3d_nus/latest.pth' 9 | -------------------------------------------------------------------------------- /configs/fp16/hv_pointpillars_fpn_sbn-all_fp16_2x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = '../pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py' 2 | data = dict(samples_per_gpu=2, workers_per_gpu=2) 3 | # fp16 settings, the loss scale is specifically tuned to avoid Nan 4 | fp16 = dict(loss_scale=32.) 5 | -------------------------------------------------------------------------------- /configs/fp16/hv_pointpillars_regnet-400mf_fpn_sbn-all_fp16_2x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = '../regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d.py' 2 | data = dict(samples_per_gpu=2, workers_per_gpu=2) 3 | # fp16 settings, the loss scale is specifically tuned to avoid Nan 4 | fp16 = dict(loss_scale=32.) 5 | -------------------------------------------------------------------------------- /configs/fp16/hv_pointpillars_secfpn_sbn-all_fp16_2x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = '../pointpillars/hv_pointpillars_secfpn_sbn-all_4x8_2x_nus-3d.py' 2 | data = dict(samples_per_gpu=2, workers_per_gpu=2) 3 | # fp16 settings, the loss scale is specifically tuned to avoid Nan 4 | fp16 = dict(loss_scale=32.) 5 | -------------------------------------------------------------------------------- /configs/fp16/hv_second_secfpn_fp16_6x8_80e_kitti-3d-3class.py: -------------------------------------------------------------------------------- 1 | _base_ = '../second/hv_second_secfpn_6x8_80e_kitti-3d-3class.py' 2 | # fp16 settings 3 | fp16 = dict(loss_scale=512.) 4 | -------------------------------------------------------------------------------- /configs/fp16/hv_second_secfpn_fp16_6x8_80e_kitti-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = '../second/hv_second_secfpn_6x8_80e_kitti-3d-car.py' 2 | # fp16 settings 3 | fp16 = dict(loss_scale=512.) 4 | -------------------------------------------------------------------------------- /configs/free_anchor/hv_pointpillars_regnet-1.6gf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_pointpillars_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py' 2 | 3 | model = dict( 4 | pts_backbone=dict( 5 | _delete_=True, 6 | type='NoStemRegNet', 7 | arch='regnetx_1.6gf', 8 | init_cfg=dict( 9 | type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf'), 10 | out_indices=(1, 2, 3), 11 | frozen_stages=-1, 12 | strides=(1, 2, 2, 2), 13 | base_channels=64, 14 | stem_channels=64, 15 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 16 | norm_eval=False, 17 | style='pytorch'), 18 | pts_neck=dict(in_channels=[168, 408, 912])) 19 | -------------------------------------------------------------------------------- /configs/free_anchor/hv_pointpillars_regnet-3.2gf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_pointpillars_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py' 2 | 3 | model = dict( 4 | pts_backbone=dict( 5 | _delete_=True, 6 | type='NoStemRegNet', 7 | arch='regnetx_3.2gf', 8 | init_cfg=dict( 9 | type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf'), 10 | out_indices=(1, 2, 3), 11 | frozen_stages=-1, 12 | strides=(1, 2, 2, 2), 13 | base_channels=64, 14 | stem_channels=64, 15 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 16 | norm_eval=False, 17 | style='pytorch'), 18 | pts_neck=dict(in_channels=[192, 432, 1008])) 19 | -------------------------------------------------------------------------------- /configs/free_anchor/hv_pointpillars_regnet-400mf_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_pointpillars_fpn_sbn-all_free-anchor_4x8_2x_nus-3d.py' 2 | 3 | model = dict( 4 | pts_backbone=dict( 5 | _delete_=True, 6 | type='NoStemRegNet', 7 | arch='regnetx_400mf', 8 | init_cfg=dict( 9 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 10 | out_indices=(1, 2, 3), 11 | frozen_stages=-1, 12 | strides=(1, 2, 2, 2), 13 | base_channels=64, 14 | stem_channels=64, 15 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 16 | norm_eval=False, 17 | style='pytorch'), 18 | pts_neck=dict(in_channels=[64, 160, 384])) 19 | -------------------------------------------------------------------------------- /configs/h3dnet/README.md: -------------------------------------------------------------------------------- 1 | # H3DNet: 3D Object Detection Using Hybrid Geometric Primitives 2 | 3 | ## Introduction 4 | 5 | 6 | 7 | We implement H3DNet and provide the result and checkpoints on ScanNet datasets. 8 | 9 | ``` 10 | @inproceedings{zhang2020h3dnet, 11 | author = {Zhang, Zaiwei and Sun, Bo and Yang, Haitao and Huang, Qixing}, 12 | title = {H3DNet: 3D Object Detection Using Hybrid Geometric Primitives}, 13 | booktitle = {Proceedings of the European Conference on Computer Vision}, 14 | year = {2020} 15 | } 16 | ``` 17 | 18 | ## Results 19 | 20 | ### ScanNet 21 | 22 | | Backbone | Lr schd | Mem (GB) | Inf time (fps) | AP@0.25 |AP@0.5| Download | 23 | | :---------: | :-----: | :------: | :------------: | :----: |:----: | :------: | 24 | | [MultiBackbone](./h3dnet_3x8_scannet-3d-18class.py) | 3x |7.9||66.43|48.01|[model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/h3dnet/h3dnet_scannet-3d-18class/h3dnet_scannet-3d-18class_20200830_000136-02e36246.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/h3dnet/h3dnet_scannet-3d-18class/h3dnet_scannet-3d-18class_20200830_000136.log.json) | 25 | 26 | **Notice**: If your current mmdetection3d version >= 0.6.0, and you are using the checkpoints downloaded from the above links or using checkpoints trained with mmdetection3d version < 0.6.0, the checkpoints have to be first converted via [tools/model_converters/convert_h3dnet_checkpoints.py](../../tools/model_converters/convert_h3dnet_checkpoints.py): 27 | 28 | ``` 29 | python ./tools/model_converters/convert_h3dnet_checkpoints.py ${ORIGINAL_CHECKPOINT_PATH} --out=${NEW_CHECKPOINT_PATH} 30 | ``` 31 | 32 | Then you can use the converted checkpoints following [getting_started.md](../../docs/getting_started.md). 33 | -------------------------------------------------------------------------------- /configs/h3dnet/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: H3DNet 3 | Metadata: 4 | Training Data: ScanNet 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 8x GeForce GTX 1080 Ti 8 | Architecture: 9 | Paper: 10 | URL: https://arxiv.org/abs/2006.05682 11 | Title: 'H3DNet: 3D Object Detection Using Hybrid Geometric Primitives' 12 | README: configs/h3dnet/README.md 13 | Code: 14 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/h3dnet.py#L10 15 | Version: v0.6.0 16 | 17 | Models: 18 | - Name: h3dnet_3x8_scannet-3d-18class 19 | In Collection: H3DNet 20 | Config: configs/h3dnet/h3dnet_3x8_scannet-3d-18class.py 21 | Metadata: 22 | Training Memory (GB): 7.9 23 | Results: 24 | - Task: 3D Object Detection 25 | Dataset: ScanNet 26 | Metrics: 27 | AP@0.25: 66.43 28 | AP@0.5: 48.01 29 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/h3dnet/h3dnet_scannet-3d-18class/h3dnet_scannet-3d-18class_20200830_000136-02e36246.pth 30 | -------------------------------------------------------------------------------- /configs/imvotenet/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: ImVoteNet 3 | Metadata: 4 | Training Data: SUNRGBD 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 8x TITAN Xp 8 | Architecture: 9 | - Faster R-CNN 10 | - VoteNet 11 | - Feature Pyramid Network 12 | Paper: 13 | URL: https://arxiv.org/abs/2001.10692 14 | Title: 'ImVoteNet: Boosting 3D Object Detection in Point Clouds with Image Votes' 15 | README: configs/imvotenet/README.md 16 | Code: 17 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/imvotenet.py#L56 18 | Version: v0.12.0 19 | 20 | Models: 21 | - Name: imvotenet_faster_rcnn_r50_fpn_2x4_sunrgbd-3d-10class 22 | In Collection: ImVoteNet 23 | Config: configs/imvotenet/imvotenet_faster_rcnn_r50_fpn_2x4_sunrgbd-3d-10class.py 24 | Metadata: 25 | Training Memory (GB): 2.1 26 | Results: 27 | - Task: Object Detection 28 | Dataset: SUNRGBD-2D 29 | Metrics: 30 | AP@0.5: 62.70 31 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/imvotenet/imvotenet_faster_rcnn_r50_fpn_2x4_sunrgbd-3d-10class/imvotenet_faster_rcnn_r50_fpn_2x4_sunrgbd-3d-10class_20210323_173222-cad62aeb.pth 32 | 33 | - Name: imvotenet_stage2_16x8_sunrgbd-3d-10class 34 | In Collection: ImVoteNet 35 | Config: configs/imvotenet/imvotenet_stage2_16x8_sunrgbd-3d-10class.py 36 | Metadata: 37 | Training Memory (GB): 9.4 38 | Results: 39 | - Task: 3D Object Detection 40 | Dataset: SUNRGBD-3D 41 | Metrics: 42 | AP@0.25: 64.04 43 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/imvotenet/imvotenet_stage2_16x8_sunrgbd-3d-10class/imvotenet_stage2_16x8_sunrgbd-3d-10class_20210323_184021-d44dcb66.pth 44 | -------------------------------------------------------------------------------- /configs/imvoxelnet/README.md: -------------------------------------------------------------------------------- 1 | # ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection 2 | 3 | ## Introduction 4 | 5 | 6 | 7 | We implement a monocular 3D detector ImVoxelNet and provide its results and checkpoints on KITTI dataset. 8 | Results for SUN RGB-D, ScanNet and nuScenes are currently available in ImVoxelNet authors 9 | [repo](https://github.com/saic-vul/imvoxelnet) (based on mmdetection3d). 10 | 11 | ``` 12 | @article{rukhovich2021imvoxelnet, 13 | title={ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection}, 14 | author={Danila Rukhovich, Anna Vorontsova, Anton Konushin}, 15 | journal={arXiv preprint arXiv:2106.01178}, 16 | year={2021} 17 | } 18 | ``` 19 | 20 | ## Results 21 | 22 | ### KITTI 23 | 24 | | Backbone |Class| Lr schd | Mem (GB) | Inf time (fps) | mAP | Download | 25 | | :---------: | :-----: |:-----: | :------: | :------------: | :----: |:----: | 26 | | [ResNet-50](./imvoxelnet_kitti-3d-car.py) | Car | 3x | | |17.4|[model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/imvoxelnet/imvoxelnet_kitti-3d-car_20210610_152323-b9abba85.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/imvoxelnet/imvoxelnet_kitti-3d-car_20210610_152323.log.json)| 27 | -------------------------------------------------------------------------------- /configs/imvoxelnet/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: ImVoxelNet 3 | Metadata: 4 | Training Data: KITTI 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 8x Tesla P40 8 | Architecture: 9 | - Anchor3DHead 10 | Paper: 11 | URL: https://arxiv.org/abs/2106.01178 12 | Title: 'ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection' 13 | README: configs/imvoxelnet/README.md 14 | Code: 15 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/imvoxelnet.py#L11 16 | Version: v0.15.0 17 | 18 | Models: 19 | - Name: imvoxelnet_kitti-3d-car 20 | In Collection: ImVoxelNet 21 | Config: configs/imvoxelnet/imvoxelnet_kitti-3d-car.py 22 | Metadata: 23 | Training Memory (GB): 15.0 24 | Results: 25 | - Task: 3D Object Detection 26 | Dataset: KITTI 27 | Metrics: 28 | mAP: 17.4 29 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/imvoxelnet/imvoxelnet_kitti-3d-car_20210610_152323-b9abba85.pth 30 | -------------------------------------------------------------------------------- /configs/mvxnet/README.md: -------------------------------------------------------------------------------- 1 | # MVX-Net: Multimodal VoxelNet for 3D Object Detection 2 | 3 | ## Introduction 4 | 5 | 6 | 7 | We implement MVX-Net and provide its results and models on KITTI dataset. 8 | 9 | ``` 10 | @inproceedings{sindagi2019mvx, 11 | title={MVX-Net: Multimodal voxelnet for 3D object detection}, 12 | author={Sindagi, Vishwanath A and Zhou, Yin and Tuzel, Oncel}, 13 | booktitle={2019 International Conference on Robotics and Automation (ICRA)}, 14 | pages={7276--7282}, 15 | year={2019}, 16 | organization={IEEE} 17 | } 18 | 19 | ``` 20 | 21 | ## Results 22 | 23 | ### KITTI 24 | 25 | | Backbone |Class| Lr schd | Mem (GB) | Inf time (fps) | mAP | Download | 26 | | :---------: | :-----: | :------: | :------------: | :----: |:----: | :------: | 27 | | [SECFPN](./dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class.py)|3 Class|cosine 80e|6.7||63.0|[model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/mvxnet/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class_20200621_003904-10140f2d.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/mvxnet/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class_20200621_003904.log.json)| 28 | -------------------------------------------------------------------------------- /configs/mvxnet/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: MVX-Net 3 | Metadata: 4 | Training Data: KITTI 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 8x V100 GPUs 8 | Architecture: 9 | - Feature Pyramid Network 10 | - Dynamic Voxelization 11 | Paper: 12 | URL: https://arxiv.org/abs/1904.01649 13 | Title: 'MVX-Net: Multimodal VoxelNet for 3D Object Detection' 14 | README: configs/mvxnet/README.md 15 | Code: 16 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/mvx_two_stage.py#L20 17 | Version: v0.5.0 18 | 19 | Models: 20 | - Name: dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class 21 | In Collection: MVX-Net 22 | Config: configs/mvxnet/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class.py 23 | Metadata: 24 | Training Memory (GB): 6.7 25 | Results: 26 | - Task: 3D Object Detection 27 | Dataset: KITTI 28 | Metrics: 29 | mAP: 63.0 30 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/mvxnet/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class/dv_mvx-fpn_second_secfpn_adamw_2x8_80e_kitti-3d-3class_20200621_003904-10140f2d.pth 31 | -------------------------------------------------------------------------------- /configs/nuimages/cascade_mask_rcnn_r101_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './cascade_mask_rcnn_r50_fpn_1x_nuim.py' 2 | model = dict(pretrained='torchvision://resnet101', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/nuimages/cascade_mask_rcnn_r50_fpn_coco-20e_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './cascade_mask_rcnn_r50_fpn_1x_nuim.py' 2 | 3 | load_from = 'http://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth' # noqa 4 | -------------------------------------------------------------------------------- /configs/nuimages/cascade_mask_rcnn_r50_fpn_coco-20e_20e_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './cascade_mask_rcnn_r50_fpn_1x_nuim.py' 2 | 3 | # learning policy 4 | lr_config = dict(step=[16, 19]) 5 | runner = dict(max_epochs=20) 6 | 7 | load_from = 'http://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth' # noqa 8 | -------------------------------------------------------------------------------- /configs/nuimages/cascade_mask_rcnn_x101_32x4d_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './cascade_mask_rcnn_r50_fpn_1x_nuim.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnext101_32x4d', 4 | backbone=dict( 5 | type='ResNeXt', 6 | depth=101, 7 | groups=32, 8 | base_width=4, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | frozen_stages=1, 12 | norm_cfg=dict(type='BN', requires_grad=True), 13 | style='pytorch')) 14 | -------------------------------------------------------------------------------- /configs/nuimages/htc_r50_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './htc_without_semantic_r50_fpn_1x_nuim.py' 2 | model = dict( 3 | roi_head=dict( 4 | semantic_roi_extractor=dict( 5 | type='SingleRoIExtractor', 6 | roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), 7 | out_channels=256, 8 | featmap_strides=[8]), 9 | semantic_head=dict( 10 | type='FusedSemanticHead', 11 | num_ins=5, 12 | fusion_level=1, 13 | num_convs=4, 14 | in_channels=256, 15 | conv_out_channels=256, 16 | num_classes=32, 17 | ignore_label=0, 18 | loss_weight=0.2))) 19 | 20 | data_root = 'data/nuimages/' 21 | img_norm_cfg = dict( 22 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 23 | train_pipeline = [ 24 | dict(type='LoadImageFromFile'), 25 | dict( 26 | type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), 27 | dict( 28 | type='Resize', 29 | img_scale=[(1280, 720), (1920, 1080)], 30 | multiscale_mode='range', 31 | keep_ratio=True), 32 | dict(type='RandomFlip', flip_ratio=0.5), 33 | dict(type='Normalize', **img_norm_cfg), 34 | dict(type='Pad', size_divisor=32), 35 | dict(type='SegRescale', scale_factor=1 / 8), 36 | dict(type='DefaultFormatBundle'), 37 | dict( 38 | type='Collect', 39 | keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']) 40 | ] 41 | data = dict( 42 | train=dict( 43 | seg_prefix=data_root + 'annotations/semantic_masks/', 44 | pipeline=train_pipeline)) 45 | -------------------------------------------------------------------------------- /configs/nuimages/htc_r50_fpn_coco-20e_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './htc_r50_fpn_1x_nuim.py' 2 | 3 | load_from = 'http://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319-fe28c577.pth' # noqa 4 | -------------------------------------------------------------------------------- /configs/nuimages/htc_r50_fpn_coco-20e_20e_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './htc_r50_fpn_coco-20e_1x_nuim.py' 2 | # learning policy 3 | lr_config = dict(step=[16, 19]) 4 | runner = dict(max_epochs=20) 5 | -------------------------------------------------------------------------------- /configs/nuimages/htc_x101_64x4d_fpn_dconv_c3-c5_coco-20e_16x1_20e_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './htc_r50_fpn_1x_nuim.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnext101_64x4d', 4 | backbone=dict( 5 | type='ResNeXt', 6 | depth=101, 7 | groups=64, 8 | base_width=4, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | frozen_stages=1, 12 | norm_cfg=dict(type='BN', requires_grad=True), 13 | norm_eval=True, 14 | style='pytorch', 15 | dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), 16 | stage_with_dcn=(False, True, True, True))) 17 | 18 | data = dict(samples_per_gpu=1, workers_per_gpu=1) 19 | # learning policy 20 | lr_config = dict(step=[16, 19]) 21 | runner = dict(max_epochs=20) 22 | 23 | load_from = 'http://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312-946fd751.pth' # noqa 24 | -------------------------------------------------------------------------------- /configs/nuimages/mask_rcnn_r101_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './mask_rcnn_r50_fpn_1x_nuim.py' 2 | model = dict(pretrained='torchvision://resnet101', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/nuimages/mask_rcnn_r50_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/mask_rcnn_r50_fpn.py', 3 | '../_base_/datasets/nuim_instance.py', 4 | '../_base_/schedules/mmdet_schedule_1x.py', '../_base_/default_runtime.py' 5 | ] 6 | model = dict( 7 | roi_head=dict( 8 | bbox_head=dict(num_classes=10), mask_head=dict(num_classes=10))) 9 | -------------------------------------------------------------------------------- /configs/nuimages/mask_rcnn_r50_fpn_coco-2x_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/mask_rcnn_r50_fpn.py', 3 | '../_base_/datasets/nuim_instance.py', 4 | '../_base_/schedules/mmdet_schedule_1x.py', '../_base_/default_runtime.py' 5 | ] 6 | model = dict( 7 | roi_head=dict( 8 | bbox_head=dict(num_classes=10), mask_head=dict(num_classes=10))) 9 | load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth' # noqa 10 | -------------------------------------------------------------------------------- /configs/nuimages/mask_rcnn_r50_fpn_coco-2x_1x_nus-2d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/mask_rcnn_r50_fpn.py', 3 | '../_base_/datasets/nuim_instance.py', 4 | '../_base_/schedules/mmdet_schedule_1x.py', '../_base_/default_runtime.py' 5 | ] 6 | model = dict( 7 | roi_head=dict( 8 | bbox_head=dict(num_classes=10), mask_head=dict(num_classes=10))) 9 | 10 | file_client_args = dict( 11 | backend='petrel', 12 | path_mapping=dict({ 13 | './data/nuscenes/': 's3://nuscenes/nuscenes/', 14 | 'data/nuscenes/': 's3://nuscenes/nuscenes/' 15 | })) 16 | img_norm_cfg = dict( 17 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 18 | 19 | test_pipeline = [ 20 | dict(type='LoadImageFromFile', file_client_args=file_client_args), 21 | dict( 22 | type='MultiScaleFlipAug', 23 | img_scale=(1600, 900), 24 | flip=False, 25 | transforms=[ 26 | dict(type='Resize', keep_ratio=True), 27 | dict(type='RandomFlip'), 28 | dict(type='Normalize', **img_norm_cfg), 29 | dict(type='Pad', size_divisor=32), 30 | dict(type='ImageToTensor', keys=['img']), 31 | dict(type='Collect', keys=['img']), 32 | ]) 33 | ] 34 | data_root = 'data/nuimages/' 35 | # data = dict( 36 | # val=dict( 37 | # ann_file=data_root + 'annotations/nuimages_v1.0-mini.json'), 38 | # test=dict( 39 | # ann_file=data_root + 'annotations/nuimages_v1.0-mini.json')) 40 | -------------------------------------------------------------------------------- /configs/nuimages/mask_rcnn_x101_32x4d_fpn_1x_nuim.py: -------------------------------------------------------------------------------- 1 | _base_ = './mask_rcnn_r50_fpn_1x_nuim.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnext101_32x4d', 4 | backbone=dict( 5 | type='ResNeXt', 6 | depth=101, 7 | groups=32, 8 | base_width=4, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | frozen_stages=1, 12 | norm_cfg=dict(type='BN', requires_grad=True), 13 | style='pytorch')) 14 | -------------------------------------------------------------------------------- /configs/paconv/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: PAConv 3 | Metadata: 4 | Training Techniques: 5 | - SGD 6 | Training Resources: 8x Titan XP GPUs 7 | Architecture: 8 | - PAConv 9 | Paper: 10 | URL: https://arxiv.org/abs/2103.14635 11 | Title: 'PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds' 12 | README: configs/paconv/README.md 13 | Code: 14 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/ops/paconv/paconv.py#L106 15 | Version: v0.16.0 16 | 17 | Models: 18 | - Name: paconv_ssg_8x8_cosine_150e_s3dis_seg-3d-13class.py 19 | In Collection: PAConv 20 | Config: configs/paconv/paconv_ssg_8x8_cosine_150e_s3dis_seg-3d-13class.py 21 | Metadata: 22 | Training Data: S3DIS 23 | Training Memory (GB): 5.8 24 | Results: 25 | - Task: 3D Semantic Segmentation 26 | Dataset: S3DIS 27 | Metrics: 28 | mIoU: 66.65 29 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/paconv/paconv_ssg_8x8_cosine_150e_s3dis_seg-3d-13class/paconv_ssg_8x8_cosine_150e_s3dis_seg-3d-13class_20210729_200615-2147b2d1.pth 30 | -------------------------------------------------------------------------------- /configs/parta2/README.md: -------------------------------------------------------------------------------- 1 | # From Points to Parts: 3D Object Detection from Point Cloud with Part-aware and Part-aggregation Network 2 | 3 | ## Introduction 4 | 5 | 6 | 7 | We implement Part-A^2 and provide its results and checkpoints on KITTI dataset. 8 | 9 | ``` 10 | @article{shi2020points, 11 | title={From points to parts: 3d object detection from point cloud with part-aware and part-aggregation network}, 12 | author={Shi, Shaoshuai and Wang, Zhe and Shi, Jianping and Wang, Xiaogang and Li, Hongsheng}, 13 | journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, 14 | year={2020}, 15 | publisher={IEEE} 16 | } 17 | ``` 18 | 19 | ## Results 20 | 21 | ### KITTI 22 | 23 | | Backbone |Class| Lr schd | Mem (GB) | Inf time (fps) | mAP | Download | 24 | | :---------: | :-----: |:-----: | :------: | :------------: | :----: |:----: | 25 | | [SECFPN](./hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class.py) |3 Class|cyclic 80e|4.1||67.9|[model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class_20200620_230724-a2672098.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class_20200620_230724.log.json)| 26 | | [SECFPN](./hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car.py) |Car |cyclic 80e|4.0||79.16|[model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car_20200620_230755-f2a38b9a.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car_20200620_230755.log.json)| 27 | -------------------------------------------------------------------------------- /configs/parta2/metafile.yml: -------------------------------------------------------------------------------- 1 | Collections: 2 | - Name: Part-A^2 3 | Metadata: 4 | Training Data: KITTI 5 | Training Techniques: 6 | - AdamW 7 | Training Resources: 8x V100 GPUs 8 | Architecture: 9 | - Sparse U-Net 10 | Paper: 11 | URL: https://arxiv.org/abs/1907.03670 12 | Title: 'From Points to Parts: 3D Object Detection from Point Cloud with Part-aware and Part-aggregation Network' 13 | README: configs/parta2/README.md 14 | Code: 15 | URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/parta2.py#L12 16 | Version: v0.5.0 17 | 18 | Models: 19 | - Name: hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class 20 | In Collection: Part-A^2 21 | Config: configs/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class.py 22 | Metadata: 23 | Training Memory (GB): 4.1 24 | Results: 25 | - Task: 3D Object Detection 26 | Dataset: KITTI 27 | Metrics: 28 | mAP: 67.9 29 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class_20200620_230724-a2672098.pth 30 | 31 | - Name: hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car 32 | In Collection: Part-A^2 33 | Config: configs/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car.py 34 | Metadata: 35 | Training Memory (GB): 4.0 36 | Results: 37 | - Task: 3D Object Detection 38 | Dataset: KITTI 39 | Metrics: 40 | mAP: 79.16 41 | Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-car_20200620_230755-f2a38b9a.pth 42 | -------------------------------------------------------------------------------- /configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/scannet_seg-3d-20class.py', 3 | '../_base_/models/pointnet2_msg.py', 4 | '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' 5 | ] 6 | 7 | # data settings 8 | data = dict(samples_per_gpu=16) 9 | evaluation = dict(interval=5) 10 | 11 | # model settings 12 | model = dict( 13 | decode_head=dict( 14 | num_classes=20, 15 | ignore_index=20, 16 | # `class_weight` is generated in data pre-processing, saved in 17 | # `data/scannet/seg_info/train_label_weight.npy` 18 | # you can copy paste the values here, or input the file path as 19 | # `class_weight=data/scannet/seg_info/train_label_weight.npy` 20 | loss_decode=dict(class_weight=[ 21 | 2.389689, 2.7215734, 4.5944676, 4.8543367, 4.096086, 4.907941, 22 | 4.690836, 4.512031, 4.623311, 4.9242644, 5.358117, 5.360071, 23 | 5.019636, 4.967126, 5.3502126, 5.4023647, 5.4027233, 5.4169416, 24 | 5.3954206, 4.6971426 25 | ])), 26 | test_cfg=dict( 27 | num_points=8192, 28 | block_size=1.5, 29 | sample_rate=0.5, 30 | use_normalized_coord=False, 31 | batch_size=24)) 32 | 33 | # runtime settings 34 | checkpoint_config = dict(interval=5) 35 | # PointNet2-MSG needs longer training time than PointNet2-SSG 36 | runner = dict(type='EpochBasedRunner', max_epochs=250) 37 | -------------------------------------------------------------------------------- /configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/s3dis_seg-3d-13class.py', 3 | '../_base_/models/pointnet2_msg.py', 4 | '../_base_/schedules/seg_cosine_50e.py', '../_base_/default_runtime.py' 5 | ] 6 | 7 | # data settings 8 | data = dict(samples_per_gpu=16) 9 | evaluation = dict(interval=2) 10 | 11 | # model settings 12 | model = dict( 13 | backbone=dict(in_channels=9), # [xyz, rgb, normalized_xyz] 14 | decode_head=dict( 15 | num_classes=13, ignore_index=13, 16 | loss_decode=dict(class_weight=None)), # S3DIS doesn't use class_weight 17 | test_cfg=dict( 18 | num_points=4096, 19 | block_size=1.0, 20 | sample_rate=0.5, 21 | use_normalized_coord=True, 22 | batch_size=24)) 23 | 24 | # runtime settings 25 | checkpoint_config = dict(interval=2) 26 | # PointNet2-MSG needs longer training time than PointNet2-SSG 27 | runner = dict(type='EpochBasedRunner', max_epochs=80) 28 | -------------------------------------------------------------------------------- /configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/scannet_seg-3d-20class.py', 3 | '../_base_/models/pointnet2_ssg.py', 4 | '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' 5 | ] 6 | 7 | # data settings 8 | data = dict(samples_per_gpu=16) 9 | evaluation = dict(interval=5) 10 | 11 | # model settings 12 | model = dict( 13 | decode_head=dict( 14 | num_classes=20, 15 | ignore_index=20, 16 | # `class_weight` is generated in data pre-processing, saved in 17 | # `data/scannet/seg_info/train_label_weight.npy` 18 | # you can copy paste the values here, or input the file path as 19 | # `class_weight=data/scannet/seg_info/train_label_weight.npy` 20 | loss_decode=dict(class_weight=[ 21 | 2.389689, 2.7215734, 4.5944676, 4.8543367, 4.096086, 4.907941, 22 | 4.690836, 4.512031, 4.623311, 4.9242644, 5.358117, 5.360071, 23 | 5.019636, 4.967126, 5.3502126, 5.4023647, 5.4027233, 5.4169416, 24 | 5.3954206, 4.6971426 25 | ])), 26 | test_cfg=dict( 27 | num_points=8192, 28 | block_size=1.5, 29 | sample_rate=0.5, 30 | use_normalized_coord=False, 31 | batch_size=24)) 32 | 33 | # runtime settings 34 | checkpoint_config = dict(interval=5) 35 | -------------------------------------------------------------------------------- /configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/s3dis_seg-3d-13class.py', 3 | '../_base_/models/pointnet2_ssg.py', 4 | '../_base_/schedules/seg_cosine_50e.py', '../_base_/default_runtime.py' 5 | ] 6 | 7 | # data settings 8 | data = dict(samples_per_gpu=16) 9 | evaluation = dict(interval=2) 10 | 11 | # model settings 12 | model = dict( 13 | backbone=dict(in_channels=9), # [xyz, rgb, normalized_xyz] 14 | decode_head=dict( 15 | num_classes=13, ignore_index=13, 16 | loss_decode=dict(class_weight=None)), # S3DIS doesn't use class_weight 17 | test_cfg=dict( 18 | num_points=4096, 19 | block_size=1.0, 20 | sample_rate=0.5, 21 | use_normalized_coord=True, 22 | batch_size=24)) 23 | 24 | # runtime settings 25 | checkpoint_config = dict(interval=2) 26 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_fpn_sbn-all_2x8_2x_lyft-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_lyft.py', 3 | '../_base_/datasets/lyft-3d.py', '../_base_/schedules/schedule_2x.py', 4 | '../_base_/default_runtime.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_fpn_sbn-all_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_nus.py', 3 | '../_base_/datasets/nus-3d.py', '../_base_/schedules/schedule_2x.py', 4 | '../_base_/default_runtime.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_fpn_sbn-all_range100_2x8_2x_lyft-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_range100_lyft.py', 3 | '../_base_/datasets/range100_lyft-3d.py', 4 | '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_secfpn_sbn_2x16_2x_waymo-3d-3class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_secfpn_waymo.py', 3 | '../_base_/datasets/waymoD5-3d-3class.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | 8 | # data settings 9 | data = dict(train=dict(dataset=dict(load_interval=1))) 10 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_secfpn_sbn_2x16_2x_waymo-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_secfpn_waymo.py', 3 | '../_base_/datasets/waymoD5-3d-car.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | 8 | # data settings 9 | data = dict(train=dict(dataset=dict(load_interval=1))) 10 | 11 | # model settings 12 | model = dict( 13 | type='MVXFasterRCNN', 14 | pts_bbox_head=dict( 15 | type='Anchor3DHead', 16 | num_classes=1, 17 | anchor_generator=dict( 18 | type='AlignedAnchor3DRangeGenerator', 19 | ranges=[[-74.88, -74.88, -0.0345, 74.88, 74.88, -0.0345]], 20 | sizes=[[2.08, 4.73, 1.77]], 21 | rotations=[0, 1.57], 22 | reshape_out=True)), 23 | # model training and testing settings 24 | train_cfg=dict( 25 | _delete_=True, 26 | pts=dict( 27 | assigner=dict( 28 | type='MaxIoUAssigner', 29 | iou_calculator=dict(type='BboxOverlapsNearest3D'), 30 | pos_iou_thr=0.55, 31 | neg_iou_thr=0.4, 32 | min_pos_iou=0.4, 33 | ignore_iof_thr=-1), 34 | allowed_border=0, 35 | code_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 36 | pos_weight=-1, 37 | debug=False))) 38 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_secfpn_sbn_2x16_2x_waymoD5-3d-3class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_secfpn_waymo.py', 3 | '../_base_/datasets/waymoD5-3d-3class.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | -------------------------------------------------------------------------------- /configs/pointpillars/hv_pointpillars_secfpn_sbn_2x16_2x_waymoD5-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_secfpn_waymo.py', 3 | '../_base_/datasets/waymoD5-3d-car.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | 8 | # model settings 9 | model = dict( 10 | type='MVXFasterRCNN', 11 | pts_bbox_head=dict( 12 | type='Anchor3DHead', 13 | num_classes=1, 14 | anchor_generator=dict( 15 | type='AlignedAnchor3DRangeGenerator', 16 | ranges=[[-74.88, -74.88, -0.0345, 74.88, 74.88, -0.0345]], 17 | sizes=[[2.08, 4.73, 1.77]], 18 | rotations=[0, 1.57], 19 | reshape_out=True)), 20 | # model training and testing settings 21 | train_cfg=dict( 22 | _delete_=True, 23 | pts=dict( 24 | assigner=dict( 25 | type='MaxIoUAssigner', 26 | iou_calculator=dict(type='BboxOverlapsNearest3D'), 27 | pos_iou_thr=0.55, 28 | neg_iou_thr=0.4, 29 | min_pos_iou=0.4, 30 | ignore_iof_thr=-1), 31 | allowed_border=0, 32 | code_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 33 | pos_weight=-1, 34 | debug=False))) 35 | -------------------------------------------------------------------------------- /configs/regnet/hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_nus.py', 3 | '../_base_/datasets/nus-3d.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | # model settings 8 | model = dict( 9 | type='MVXFasterRCNN', 10 | pts_backbone=dict( 11 | _delete_=True, 12 | type='NoStemRegNet', 13 | arch='regnetx_1.6gf', 14 | init_cfg=dict( 15 | type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf'), 16 | out_indices=(1, 2, 3), 17 | frozen_stages=-1, 18 | strides=(1, 2, 2, 2), 19 | base_channels=64, 20 | stem_channels=64, 21 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 22 | norm_eval=False, 23 | style='pytorch'), 24 | pts_neck=dict(in_channels=[168, 408, 912])) 25 | -------------------------------------------------------------------------------- /configs/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_2x8_2x_lyft-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_lyft.py', 3 | '../_base_/datasets/lyft-3d.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | # model settings 8 | model = dict( 9 | type='MVXFasterRCNN', 10 | pts_backbone=dict( 11 | _delete_=True, 12 | type='NoStemRegNet', 13 | arch=dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), 14 | init_cfg=dict( 15 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 16 | out_indices=(1, 2, 3), 17 | frozen_stages=-1, 18 | strides=(1, 2, 2, 2), 19 | base_channels=64, 20 | stem_channels=64, 21 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 22 | norm_eval=False, 23 | style='pytorch'), 24 | pts_neck=dict(in_channels=[64, 160, 384])) 25 | -------------------------------------------------------------------------------- /configs/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_nus.py', 3 | '../_base_/datasets/nus-3d.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | # model settings 8 | model = dict( 9 | type='MVXFasterRCNN', 10 | pts_backbone=dict( 11 | _delete_=True, 12 | type='NoStemRegNet', 13 | arch=dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), 14 | init_cfg=dict( 15 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 16 | out_indices=(1, 2, 3), 17 | frozen_stages=-1, 18 | strides=(1, 2, 2, 2), 19 | base_channels=64, 20 | stem_channels=64, 21 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 22 | norm_eval=False, 23 | style='pytorch'), 24 | pts_neck=dict(in_channels=[64, 160, 384])) 25 | -------------------------------------------------------------------------------- /configs/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_range100_2x8_2x_lyft-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_pointpillars_fpn_range100_lyft.py', 3 | '../_base_/datasets/range100_lyft-3d.py', 4 | '../_base_/schedules/schedule_2x.py', 5 | '../_base_/default_runtime.py', 6 | ] 7 | # model settings 8 | model = dict( 9 | type='MVXFasterRCNN', 10 | pts_backbone=dict( 11 | _delete_=True, 12 | type='NoStemRegNet', 13 | arch=dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), 14 | init_cfg=dict( 15 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 16 | out_indices=(1, 2, 3), 17 | frozen_stages=-1, 18 | strides=(1, 2, 2, 2), 19 | base_channels=64, 20 | stem_channels=64, 21 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 22 | norm_eval=False, 23 | style='pytorch'), 24 | pts_neck=dict(in_channels=[64, 160, 384])) 25 | -------------------------------------------------------------------------------- /configs/second/hv_second_secfpn_6x8_80e_kitti-3d-3class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_second_secfpn_kitti.py', 3 | '../_base_/datasets/kitti-3d-3class.py', 4 | '../_base_/schedules/cyclic_40e.py', '../_base_/default_runtime.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/second/hv_second_secfpn_6x8_80e_kitti-3d-car.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/hv_second_secfpn_kitti.py', 3 | '../_base_/datasets/kitti-3d-car.py', '../_base_/schedules/cyclic_40e.py', 4 | '../_base_/default_runtime.py' 5 | ] 6 | point_cloud_range = [0, -40, -3, 70.4, 40, 1] 7 | model = dict( 8 | bbox_head=dict( 9 | type='Anchor3DHead', 10 | num_classes=1, 11 | anchor_generator=dict( 12 | _delete_=True, 13 | type='Anchor3DRangeGenerator', 14 | ranges=[[0, -40.0, -1.78, 70.4, 40.0, -1.78]], 15 | sizes=[[1.6, 3.9, 1.56]], 16 | rotations=[0, 1.57], 17 | reshape_out=True)), 18 | # model training and testing settings 19 | train_cfg=dict( 20 | _delete_=True, 21 | assigner=dict( 22 | type='MaxIoUAssigner', 23 | iou_calculator=dict(type='BboxOverlapsNearest3D'), 24 | pos_iou_thr=0.6, 25 | neg_iou_thr=0.45, 26 | min_pos_iou=0.45, 27 | ignore_iof_thr=-1), 28 | allowed_border=0, 29 | pos_weight=-1, 30 | debug=False)) 31 | -------------------------------------------------------------------------------- /configs/ssn/hv_ssn_regnet-400mf_secfpn_sbn-all_1x16_2x_lyft-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_ssn_secfpn_sbn-all_2x16_2x_lyft-3d.py' 2 | # model settings 3 | model = dict( 4 | type='MVXFasterRCNN', 5 | pts_backbone=dict( 6 | _delete_=True, 7 | type='NoStemRegNet', 8 | arch=dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), 9 | init_cfg=dict( 10 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 11 | out_indices=(1, 2, 3), 12 | frozen_stages=-1, 13 | strides=(1, 2, 2, 2), 14 | base_channels=64, 15 | stem_channels=64, 16 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 17 | norm_eval=False, 18 | style='pytorch'), 19 | pts_neck=dict(in_channels=[64, 160, 384])) 20 | # dataset settings 21 | data = dict(samples_per_gpu=1, workers_per_gpu=2) 22 | -------------------------------------------------------------------------------- /configs/ssn/hv_ssn_regnet-400mf_secfpn_sbn-all_2x16_2x_nus-3d.py: -------------------------------------------------------------------------------- 1 | _base_ = './hv_ssn_secfpn_sbn-all_2x16_2x_nus-3d.py' 2 | # model settings 3 | model = dict( 4 | type='MVXFasterRCNN', 5 | pts_backbone=dict( 6 | _delete_=True, 7 | type='NoStemRegNet', 8 | arch=dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), 9 | init_cfg=dict( 10 | type='Pretrained', checkpoint='open-mmlab://regnetx_400mf'), 11 | out_indices=(1, 2, 3), 12 | frozen_stages=-1, 13 | strides=(1, 2, 2, 2), 14 | base_channels=64, 15 | stem_channels=64, 16 | norm_cfg=dict(type='naiveSyncBN2d', eps=1e-3, momentum=0.01), 17 | norm_eval=False, 18 | style='pytorch'), 19 | pts_neck=dict(in_channels=[64, 160, 384])) 20 | -------------------------------------------------------------------------------- /configs/votenet/votenet_16x8_sunrgbd-3d-10class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/sunrgbd-3d-10class.py', '../_base_/models/votenet.py', 3 | '../_base_/schedules/schedule_3x.py', '../_base_/default_runtime.py' 4 | ] 5 | # model settings 6 | model = dict( 7 | bbox_head=dict( 8 | num_classes=10, 9 | bbox_coder=dict( 10 | type='PartialBinBasedBBoxCoder', 11 | num_sizes=10, 12 | num_dir_bins=12, 13 | with_rot=True, 14 | mean_sizes=[ 15 | [2.114256, 1.620300, 0.927272], [0.791118, 1.279516, 0.718182], 16 | [0.923508, 1.867419, 0.845495], [0.591958, 0.552978, 0.827272], 17 | [0.699104, 0.454178, 0.75625], [0.69519, 1.346299, 0.736364], 18 | [0.528526, 1.002642, 1.172878], [0.500618, 0.632163, 0.683424], 19 | [0.404671, 1.071108, 1.688889], [0.76584, 1.398258, 0.472728] 20 | ]), 21 | )) 22 | -------------------------------------------------------------------------------- /configs/votenet/votenet_8x8_scannet-3d-18class.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/datasets/scannet-3d-18class.py', '../_base_/models/votenet.py', 3 | '../_base_/schedules/schedule_3x.py', '../_base_/default_runtime.py' 4 | ] 5 | 6 | # model settings 7 | model = dict( 8 | bbox_head=dict( 9 | num_classes=18, 10 | bbox_coder=dict( 11 | type='PartialBinBasedBBoxCoder', 12 | num_sizes=18, 13 | num_dir_bins=1, 14 | with_rot=False, 15 | mean_sizes=[[0.76966727, 0.8116021, 0.92573744], 16 | [1.876858, 1.8425595, 1.1931566], 17 | [0.61328, 0.6148609, 0.7182701], 18 | [1.3955007, 1.5121545, 0.83443564], 19 | [0.97949594, 1.0675149, 0.6329687], 20 | [0.531663, 0.5955577, 1.7500148], 21 | [0.9624706, 0.72462326, 1.1481868], 22 | [0.83221924, 1.0490936, 1.6875663], 23 | [0.21132214, 0.4206159, 0.5372846], 24 | [1.4440073, 1.8970833, 0.26985747], 25 | [1.0294262, 1.4040797, 0.87554324], 26 | [1.3766412, 0.65521795, 1.6813129], 27 | [0.6650819, 0.71111923, 1.298853], 28 | [0.41999173, 0.37906948, 1.7513971], 29 | [0.59359556, 0.5912492, 0.73919016], 30 | [0.50867593, 0.50656086, 0.30136237], 31 | [1.1511526, 1.0546296, 0.49706793], 32 | [0.47535285, 0.49249494, 0.5802117]]))) 33 | 34 | # yapf:disable 35 | log_config = dict(interval=30) 36 | # yapf:enable 37 | -------------------------------------------------------------------------------- /configs/votenet/votenet_iouloss_8x8_scannet-3d-18class.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./votenet_8x8_scannet-3d-18class.py'] 2 | 3 | # model settings, add iou loss 4 | model = dict( 5 | bbox_head=dict( 6 | iou_loss=dict( 7 | type='AxisAlignedIoULoss', reduction='sum', loss_weight=10.0 / 8 | 3.0))) 9 | -------------------------------------------------------------------------------- /data/lyft/val.txt: -------------------------------------------------------------------------------- 1 | host-a004-lidar0-1233080749298771736-1233080774198118416 2 | host-a004-lidar0-1232905197298264546-1232905222198133856 3 | host-a011-lidar0-1232732468299489666-1232732493199050666 4 | host-a101-lidar0-1241561147998866622-1241561172899320654 5 | host-a006-lidar0-1237322885198285226-1237322910098576786 6 | host-a004-lidar0-1233963848198981116-1233963873098642176 7 | host-a011-lidar0-1232752543198025666-1232752568099126026 8 | host-a004-lidar0-1232842367198056546-1232842392097783226 9 | host-a004-lidar0-1233615989298293586-1233616014198854636 10 | host-a011-lidar0-1233965426299054906-1233965451199121906 11 | host-a011-lidar0-1236104034298928316-1236104059198988026 12 | host-a007-lidar0-1233946614199227636-1233946639098289666 13 | host-a015-lidar0-1235423696198069636-1235423721098551296 14 | host-a004-lidar0-1233014843199117706-1233014868098023786 15 | host-a011-lidar0-1236093962299300416-1236093987199363346 16 | host-a011-lidar0-1234639296198260986-1234639321099417316 17 | host-a011-lidar0-1233524871199389346-1233524896098591466 18 | host-a011-lidar0-1235933781298838116-1235933806199517736 19 | host-a011-lidar0-1233965312298542226-1233965337198958586 20 | host-a011-lidar0-1233090567199118316-1233090592098933996 21 | host-a007-lidar0-1233621256298511876-1233621281197988026 22 | host-a007-lidar0-1233079617197863906-1233079642098533586 23 | host-a015-lidar0-1236112516098396876-1236112540999028556 24 | host-a008-lidar0-1236016333197799906-1236016358099063636 25 | host-a101-lidar0-1240710366399037786-1240710391298976894 26 | host-a102-lidar0-1242755350298764586-1242755375198787666 27 | host-a101-lidar0-1240877587199107226-1240877612099413030 28 | host-a101-lidar0-1242583745399163026-1242583770298821706 29 | host-a011-lidar0-1232817034199342856-1232817059098800346 30 | host-a004-lidar0-1232905117299287546-1232905142198246226 31 | -------------------------------------------------------------------------------- /data/s3dis/meta_data/class_names.txt: -------------------------------------------------------------------------------- 1 | ceiling 2 | floor 3 | wall 4 | beam 5 | column 6 | window 7 | door 8 | table 9 | chair 10 | sofa 11 | bookcase 12 | board 13 | clutter 14 | -------------------------------------------------------------------------------- /data/scannet/meta_data/scannet_means.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/data/scannet/meta_data/scannet_means.npz -------------------------------------------------------------------------------- /demo/data/kitti/kitti_000008.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/kitti/kitti_000008.bin -------------------------------------------------------------------------------- /demo/data/kitti/kitti_000008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/kitti/kitti_000008.png -------------------------------------------------------------------------------- /demo/data/kitti/kitti_000008_infos.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/kitti/kitti_000008_infos.pkl -------------------------------------------------------------------------------- /demo/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525.jpg -------------------------------------------------------------------------------- /demo/data/nuscenes/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525_mono3d.coco.json: -------------------------------------------------------------------------------- 1 | {"images": [{"file_name": "samples/CAM_BACK/n015-2018-07-24-11-22-45+0800__CAM_BACK__1532402927637525.jpg", "cam_intrinsic": [[809.2209905677063, 0.0, 829.2196003259838], [0.0, 809.2209905677063, 481.77842384512485], [0.0, 0.0, 1.0]]}]} 2 | -------------------------------------------------------------------------------- /demo/data/scannet/scene0000_00.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/scannet/scene0000_00.bin -------------------------------------------------------------------------------- /demo/data/sunrgbd/sunrgbd_000017.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/sunrgbd/sunrgbd_000017.bin -------------------------------------------------------------------------------- /demo/data/sunrgbd/sunrgbd_000017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/sunrgbd/sunrgbd_000017.jpg -------------------------------------------------------------------------------- /demo/data/sunrgbd/sunrgbd_000017_infos.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/demo/data/sunrgbd/sunrgbd_000017_infos.pkl -------------------------------------------------------------------------------- /demo/mono_det_demo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from argparse import ArgumentParser 3 | 4 | from mmdet3d.apis import (inference_mono_3d_detector, init_model, 5 | show_result_meshlab) 6 | 7 | 8 | def main(): 9 | parser = ArgumentParser() 10 | parser.add_argument('image', help='image file') 11 | parser.add_argument('ann', help='ann file') 12 | parser.add_argument('config', help='Config file') 13 | parser.add_argument('checkpoint', help='Checkpoint file') 14 | parser.add_argument( 15 | '--device', default='cuda:0', help='Device used for inference') 16 | parser.add_argument( 17 | '--score-thr', type=float, default=0.15, help='bbox score threshold') 18 | parser.add_argument( 19 | '--out-dir', type=str, default='demo', help='dir to save results') 20 | parser.add_argument( 21 | '--show', 22 | action='store_true', 23 | help='show online visualization results') 24 | parser.add_argument( 25 | '--snapshot', 26 | action='store_true', 27 | help='whether to save online visualization results') 28 | args = parser.parse_args() 29 | 30 | # build the model from a config file and a checkpoint file 31 | model = init_model(args.config, args.checkpoint, device=args.device) 32 | # test a single image 33 | result, data = inference_mono_3d_detector(model, args.image, args.ann) 34 | # show the results 35 | show_result_meshlab( 36 | data, 37 | result, 38 | args.out_dir, 39 | args.score_thr, 40 | show=args.show, 41 | snapshot=args.snapshot, 42 | task='mono-det') 43 | 44 | 45 | if __name__ == '__main__': 46 | main() 47 | -------------------------------------------------------------------------------- /demo/pc_seg_demo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from argparse import ArgumentParser 3 | 4 | from mmdet3d.apis import inference_segmentor, init_model, show_result_meshlab 5 | 6 | 7 | def main(): 8 | parser = ArgumentParser() 9 | parser.add_argument('pcd', help='Point cloud file') 10 | parser.add_argument('config', help='Config file') 11 | parser.add_argument('checkpoint', help='Checkpoint file') 12 | parser.add_argument( 13 | '--device', default='cuda:0', help='Device used for inference') 14 | parser.add_argument( 15 | '--out-dir', type=str, default='demo', help='dir to save results') 16 | parser.add_argument( 17 | '--show', 18 | action='store_true', 19 | help='show online visualization results') 20 | parser.add_argument( 21 | '--snapshot', 22 | action='store_true', 23 | help='whether to save online visualization results') 24 | args = parser.parse_args() 25 | 26 | # build the model from a config file and a checkpoint file 27 | model = init_model(args.config, args.checkpoint, device=args.device) 28 | # test a single image 29 | result, data = inference_segmentor(model, args.pcd) 30 | # show the results 31 | show_result_meshlab( 32 | data, 33 | result, 34 | args.out_dir, 35 | show=args.show, 36 | snapshot=args.snapshot, 37 | task='seg', 38 | palette=model.PALETTE) 39 | 40 | 41 | if __name__ == '__main__': 42 | main() 43 | -------------------------------------------------------------------------------- /demo/pcd_demo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from argparse import ArgumentParser 3 | 4 | from mmdet3d.apis import inference_detector, init_model, show_result_meshlab 5 | 6 | 7 | def main(): 8 | parser = ArgumentParser() 9 | parser.add_argument('pcd', help='Point cloud file') 10 | parser.add_argument('config', help='Config file') 11 | parser.add_argument('checkpoint', help='Checkpoint file') 12 | parser.add_argument( 13 | '--device', default='cuda:0', help='Device used for inference') 14 | parser.add_argument( 15 | '--score-thr', type=float, default=0.0, help='bbox score threshold') 16 | parser.add_argument( 17 | '--out-dir', type=str, default='demo', help='dir to save results') 18 | parser.add_argument( 19 | '--show', 20 | action='store_true', 21 | help='show online visualization results') 22 | parser.add_argument( 23 | '--snapshot', 24 | action='store_true', 25 | help='whether to save online visualization results') 26 | args = parser.parse_args() 27 | 28 | # build the model from a config file and a checkpoint file 29 | model = init_model(args.config, args.checkpoint, device=args.device) 30 | # test a single image 31 | result, data = inference_detector(model, args.pcd) 32 | # show the results 33 | show_result_meshlab( 34 | data, 35 | result, 36 | args.out_dir, 37 | args.score_thr, 38 | show=args.show, 39 | snapshot=args.snapshot, 40 | task='det') 41 | 42 | 43 | if __name__ == '__main__': 44 | main() 45 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG PYTORCH="1.6.0" 2 | ARG CUDA="10.1" 3 | ARG CUDNN="7" 4 | 5 | FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel 6 | 7 | ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" 8 | ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" 9 | ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" 10 | 11 | RUN apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ 12 | && apt-get clean \ 13 | && rm -rf /var/lib/apt/lists/* 14 | 15 | # Install MMCV, MMDetection and MMSegmentation 16 | RUN pip install mmcv-full==1.3.13 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.6.0/index.html 17 | RUN pip install mmdet==2.17.0 18 | RUN pip install mmsegmentation==0.18.0 19 | 20 | # Install MMDetection3D 21 | RUN conda clean --all 22 | RUN git clone https://github.com/open-mmlab/mmdetection3d.git /mmdetection3d 23 | WORKDIR /mmdetection3d 24 | ENV FORCE_CUDA="1" 25 | RUN pip install -r requirements/build.txt 26 | RUN pip install --no-cache-dir -e . 27 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/_static/css/readthedocs.css: -------------------------------------------------------------------------------- 1 | .header-logo { 2 | background-image: url("../image/mmdet3d-logo.png"); 3 | background-size: 182.5px 40px; 4 | height: 40px; 5 | width: 182.5px; 6 | } 7 | -------------------------------------------------------------------------------- /docs/_static/image/mmdet3d-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/docs/_static/image/mmdet3d-logo.png -------------------------------------------------------------------------------- /docs/api.rst: -------------------------------------------------------------------------------- 1 | mmdet3d.core 2 | -------------- 3 | 4 | anchor 5 | ^^^^^^^^^^ 6 | .. automodule:: mmdet3d.core.anchor 7 | :members: 8 | 9 | bbox 10 | ^^^^^^^^^^ 11 | .. automodule:: mmdet3d.core.bbox 12 | :members: 13 | 14 | evaluation 15 | ^^^^^^^^^^ 16 | .. automodule:: mmdet3d.core.evaluation 17 | :members: 18 | 19 | visualizer 20 | ^^^^^^^^^^^^^^^ 21 | .. automodule:: mmdet3d.core.visualizer 22 | :members: 23 | 24 | voxel 25 | ^^^^^^^^^^^^^^^ 26 | .. automodule:: mmdet3d.core.voxel 27 | :members: 28 | 29 | post_processing 30 | ^^^^^^^^^^^^^^^ 31 | .. automodule:: mmdet3d.core.post_processing 32 | :members: 33 | 34 | mmdet3d.datasets 35 | ---------------- 36 | 37 | .. automodule:: mmdet3d.datasets 38 | :members: 39 | 40 | mmdet3d.models 41 | -------------- 42 | 43 | detectors 44 | ^^^^^^^^^^ 45 | .. automodule:: mmdet3d.models.detectors 46 | :members: 47 | 48 | backbones 49 | ^^^^^^^^^^ 50 | .. automodule:: mmdet3d.models.backbones 51 | :members: 52 | 53 | necks 54 | ^^^^^^^^^^ 55 | .. automodule:: mmdet3d.models.necks 56 | :members: 57 | 58 | dense_heads 59 | ^^^^^^^^^^^^ 60 | .. automodule:: mmdet3d.models.dense_heads 61 | :members: 62 | 63 | roi_heads 64 | ^^^^^^^^^^ 65 | .. automodule:: mmdet3d.models.roi_heads 66 | :members: 67 | 68 | fusion_layers 69 | ^^^^^^^^^^^^^ 70 | .. automodule:: mmdet3d.models.fusion_layers 71 | :members: 72 | 73 | losses 74 | ^^^^^^^^^^ 75 | .. automodule:: mmdet3d.models.losses 76 | :members: 77 | 78 | middle_encoders 79 | ^^^^^^^^^^^^^^^ 80 | .. automodule:: mmdet3d.models.middle_encoders 81 | :members: 82 | 83 | model_utils 84 | ^^^^^^^^^^^^^ 85 | .. automodule:: mmdet3d.models.model_utils 86 | :members: 87 | -------------------------------------------------------------------------------- /docs/datasets/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | kitti_det.md 5 | nuscenes_det.md 6 | lyft_det.md 7 | waymo_det.md 8 | sunrgbd_det.md 9 | scannet_det.md 10 | scannet_sem_seg.md 11 | s3dis_sem_seg.md 12 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to MMDetection3D's documentation! 2 | ========================================== 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :caption: Get Started 7 | 8 | getting_started.md 9 | 10 | .. toctree:: 11 | :maxdepth: 1 12 | :caption: Demo 13 | 14 | demo.md 15 | 16 | .. toctree:: 17 | :maxdepth: 1 18 | :caption: Model Zoo 19 | 20 | model_zoo.md 21 | 22 | .. toctree:: 23 | :maxdepth: 1 24 | :caption: Data Preparation 25 | 26 | data_preparation.md 27 | 28 | .. toctree:: 29 | :maxdepth: 1 30 | :caption: Exist Data and Model 31 | 32 | 1_exist_data_model.md 33 | 34 | .. toctree:: 35 | :maxdepth: 1 36 | :caption: New Data and Model 37 | 38 | 2_new_data_model.md 39 | 40 | .. toctree:: 41 | :maxdepth: 1 42 | :caption: Supported Tasks 43 | 44 | supported_tasks/index.rst 45 | 46 | .. toctree:: 47 | :maxdepth: 1 48 | :caption: Datasets 49 | 50 | datasets/index.rst 51 | 52 | .. toctree:: 53 | :maxdepth: 1 54 | :caption: Tutorials 55 | 56 | tutorials/index.rst 57 | 58 | .. toctree:: 59 | :maxdepth: 1 60 | :caption: Useful Tools and Scripts 61 | 62 | useful_tools.md 63 | 64 | .. toctree:: 65 | :maxdepth: 1 66 | :caption: Notes 67 | 68 | benchmarks.md 69 | 70 | .. toctree:: 71 | :maxdepth: 1 72 | :caption: FAQ 73 | 74 | faq.md 75 | 76 | .. toctree:: 77 | :maxdepth: 1 78 | :caption: Compatibility 79 | 80 | compatibility.md 81 | 82 | .. toctree:: 83 | :maxdepth: 1 84 | :caption: API Reference 85 | 86 | api.rst 87 | 88 | .. toctree:: 89 | :maxdepth: 1 90 | :caption: Switch Language 91 | 92 | switch_language.md 93 | 94 | Indices and tables 95 | ================== 96 | 97 | * :ref:`genindex` 98 | * :ref:`search` 99 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/stat.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import functools as func 3 | import glob 4 | import numpy as np 5 | import re 6 | from os import path as osp 7 | 8 | url_prefix = 'https://github.com/open-mmlab/mmdetection3d/blob/master/' 9 | 10 | files = sorted(glob.glob('../configs/*/README.md')) 11 | 12 | stats = [] 13 | titles = [] 14 | num_ckpts = 0 15 | 16 | for f in files: 17 | url = osp.dirname(f.replace('../', url_prefix)) 18 | 19 | with open(f, 'r') as content_file: 20 | content = content_file.read() 21 | 22 | title = content.split('\n')[0].replace('#', '').strip() 23 | ckpts = set(x.lower().strip() 24 | for x in re.findall(r'https?://download.*\.pth', content) 25 | if 'mmdetection3d' in x) 26 | if len(ckpts) == 0: 27 | continue 28 | 29 | _papertype = [x for x in re.findall(r'', content)] 30 | assert len(_papertype) > 0 31 | papertype = _papertype[0] 32 | 33 | paper = set([(papertype, title)]) 34 | 35 | titles.append(title) 36 | num_ckpts += len(ckpts) 37 | statsmsg = f""" 38 | \t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) 39 | """ 40 | stats.append((paper, ckpts, statsmsg)) 41 | 42 | allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) 43 | msglist = '\n'.join(x for _, _, x in stats) 44 | 45 | papertypes, papercounts = np.unique([t for t, _ in allpapers], 46 | return_counts=True) 47 | countstr = '\n'.join( 48 | [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) 49 | 50 | modelzoo = f""" 51 | \n## Model Zoo Statistics 52 | 53 | * Number of papers: {len(set(titles))} 54 | {countstr} 55 | 56 | * Number of checkpoints: {num_ckpts} 57 | {msglist} 58 | """ 59 | 60 | with open('model_zoo.md', 'a') as f: 61 | f.write(modelzoo) 62 | -------------------------------------------------------------------------------- /docs/supported_tasks/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | lidar_det3d.md 5 | vision_det3d.md 6 | lidar_sem_seg3d.md 7 | -------------------------------------------------------------------------------- /docs/switch_language.md: -------------------------------------------------------------------------------- 1 | ## English 2 | 3 | ## 简体中文 4 | -------------------------------------------------------------------------------- /docs/tutorials/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | config.md 5 | customize_dataset.md 6 | data_pipeline.md 7 | customize_models.md 8 | customize_runtime.md 9 | -------------------------------------------------------------------------------- /docs_zh-CN/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs_zh-CN/_static/css/readthedocs.css: -------------------------------------------------------------------------------- 1 | .header-logo { 2 | background-image: url("../image/mmdet3d-logo.png"); 3 | background-size: 182.5px 40px; 4 | height: 40px; 5 | width: 182.5px; 6 | } 7 | -------------------------------------------------------------------------------- /docs_zh-CN/_static/image/mmdet3d-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJULearning/SRDet/12d9302fad742f64ca3c8e05cd601d7dca1bf81e/docs_zh-CN/_static/image/mmdet3d-logo.png -------------------------------------------------------------------------------- /docs_zh-CN/api.rst: -------------------------------------------------------------------------------- 1 | mmdet3d.core 2 | -------------- 3 | 4 | anchor 5 | ^^^^^^^^^^ 6 | .. automodule:: mmdet3d.core.anchor 7 | :members: 8 | 9 | bbox 10 | ^^^^^^^^^^ 11 | .. automodule:: mmdet3d.core.bbox 12 | :members: 13 | 14 | evaluation 15 | ^^^^^^^^^^ 16 | .. automodule:: mmdet3d.core.evaluation 17 | :members: 18 | 19 | visualizer 20 | ^^^^^^^^^^^^^^^ 21 | .. automodule:: mmdet3d.core.visualizer 22 | :members: 23 | 24 | voxel 25 | ^^^^^^^^^^^^^^^ 26 | .. automodule:: mmdet3d.core.voxel 27 | :members: 28 | 29 | post_processing 30 | ^^^^^^^^^^^^^^^ 31 | .. automodule:: mmdet3d.core.post_processing 32 | :members: 33 | 34 | mmdet3d.datasets 35 | ---------------- 36 | 37 | .. automodule:: mmdet3d.datasets 38 | :members: 39 | 40 | mmdet3d.models 41 | -------------- 42 | 43 | detectors 44 | ^^^^^^^^^^ 45 | .. automodule:: mmdet3d.models.detectors 46 | :members: 47 | 48 | backbones 49 | ^^^^^^^^^^ 50 | .. automodule:: mmdet3d.models.backbones 51 | :members: 52 | 53 | necks 54 | ^^^^^^^^^^ 55 | .. automodule:: mmdet3d.models.necks 56 | :members: 57 | 58 | dense_heads 59 | ^^^^^^^^^^^^ 60 | .. automodule:: mmdet3d.models.dense_heads 61 | :members: 62 | 63 | roi_heads 64 | ^^^^^^^^^^ 65 | .. automodule:: mmdet3d.models.roi_heads 66 | :members: 67 | 68 | fusion_layers 69 | ^^^^^^^^^^^^^ 70 | .. automodule:: mmdet3d.models.fusion_layers 71 | :members: 72 | 73 | losses 74 | ^^^^^^^^^^ 75 | .. automodule:: mmdet3d.models.losses 76 | :members: 77 | 78 | middle_encoders 79 | ^^^^^^^^^^^^^^^ 80 | .. automodule:: mmdet3d.models.middle_encoders 81 | :members: 82 | 83 | model_utils 84 | ^^^^^^^^^^^^^ 85 | .. automodule:: mmdet3d.models.model_utils 86 | :members: 87 | -------------------------------------------------------------------------------- /docs_zh-CN/benchmarks.md: -------------------------------------------------------------------------------- 1 | # 基准测试 -------------------------------------------------------------------------------- /docs_zh-CN/changelog.md: -------------------------------------------------------------------------------- 1 | # 变更日志 -------------------------------------------------------------------------------- /docs_zh-CN/compatibility.md: -------------------------------------------------------------------------------- 1 | ## 0.16.0 2 | -------------------------------------------------------------------------------- /docs_zh-CN/datasets/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | kitti_det.md 5 | nuscenes_det.md 6 | lyft_det.md 7 | waymo_det.md 8 | sunrgbd_det.md 9 | scannet_det.md 10 | scannet_sem_seg.md 11 | s3dis_sem_seg.md 12 | -------------------------------------------------------------------------------- /docs_zh-CN/faq.md: -------------------------------------------------------------------------------- 1 | # 常见问题解答 2 | 3 | 我们列出了一些用户和开发者在开发过程中会遇到的常见问题以及对应的解决方案,如果您发现了任何频繁出现的问题,请随时扩充本列表,非常欢迎您提出的任何解决方案。如果您在环境配置、模型训练等工作中遇到任何的问题,请使用[问题模板](https://github.com/open-mmlab/mmdetection3d/blob/master/.github/ISSUE_TEMPLATE/error-report.md/)来创建相应的 issue,并将所需的所有信息填入到问题模板中,我们会尽快解决您的问题。 4 | 5 | ## MMCV/MMDet/MMDet3D Installation 6 | 7 | - 如果您在 `import open3d` 时遇到下面的问题: 8 | 9 | ``OSError: /lib/x86_64-linux-gnu/libm.so.6: version 'GLIBC_2.27' not found`` 10 | 11 | 请将 open3d 的版本降级至 0.9.0.0,因为最新版 open3d 需要 'GLIBC_2.27' 文件的支持, Ubuntu 16.04 系统中缺失该文件,且该文件仅存在于 Ubuntu 18.04 及之后的系统中。 12 | 13 | - 如果您在 `import pycocotools` 时遇到版本错误的问题,这是由于 nuscenes-devkit 需要安装 pycocotools,然而 mmdet 依赖于 mmpycocotools,当前的解决方案如下所示,我们将会在之后全面支持 pycocotools : 14 | 15 | ```shell 16 | pip uninstall pycocotools mmpycocotools 17 | pip install mmpycocotools 18 | ``` 19 | 20 | **注意**: 我们已经在 0.13.0 及之后的版本中全面支持 pycocotools。 21 | 22 | - 如果您遇到下面的问题,并且您的环境包含 numba == 0.48.0 和 numpy >= 1.20.0: 23 | 24 | ``TypeError: expected dtype object, got 'numpy.dtype[bool_]'`` 25 | 26 | 请将 numpy 的版本降级至 < 1.20.0,或者从源码安装 numba == 0.48,这是由于 numpy == 1.20.0 改变了 API,使得在调用 `np.dtype` 会产生子类。请参考 [这里](https://github.com/numba/numba/issues/6041) 获取更多细节。 27 | 28 | - 如果您在导入 pycocotools 相关包时遇到下面的问题: 29 | 30 | ``ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject`` 31 | 32 | 请将 pycocotools 的版本降级至 2.0.1,这是由于最新版本的 pycocotools 与 numpy < 1.20.0 不兼容。或者通过下面的方式从源码进行编译来安装最新版本的 pycocotools : 33 | 34 | ``pip install -e "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"`` 35 | 36 | 或者 37 | 38 | ``pip install -e "git+https://github.com/ppwwyyxx/cocoapi#egg=pycocotools&subdirectory=PythonAPI"`` 39 | -------------------------------------------------------------------------------- /docs_zh-CN/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to MMDetection3D's documentation! 2 | ========================================== 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :caption: 开始你的第一步 7 | 8 | getting_started.md 9 | 10 | .. toctree:: 11 | :maxdepth: 1 12 | :caption: 演示 13 | 14 | demo.md 15 | 16 | .. toctree:: 17 | :maxdepth: 1 18 | :caption: 模型库 19 | 20 | model_zoo.md 21 | 22 | .. toctree:: 23 | :maxdepth: 1 24 | :caption: 数据预处理 25 | 26 | data_preparation.md 27 | 28 | .. toctree:: 29 | :maxdepth: 1 30 | :caption: 使用现有数据及模型 31 | 32 | 1_exist_data_model.md 33 | 34 | .. toctree:: 35 | :maxdepth: 1 36 | :caption: 创建新的数据与模型 37 | 38 | 2_new_data_model.md 39 | 40 | .. toctree:: 41 | :maxdepth: 1 42 | :caption: 支持的任务 43 | 44 | supported_tasks/index.rst 45 | 46 | .. toctree:: 47 | :maxdepth: 1 48 | :caption: 数据集介绍 49 | 50 | datasets/index.rst 51 | 52 | .. toctree:: 53 | :maxdepth: 1 54 | :caption: 教程 55 | 56 | tutorials/index.rst 57 | 58 | .. toctree:: 59 | :maxdepth: 1 60 | :caption: 实用工具与脚本 61 | 62 | useful_tools.md 63 | 64 | .. toctree:: 65 | :maxdepth: 1 66 | :caption: 说明 67 | 68 | benchmarks.md 69 | 70 | .. toctree:: 71 | :maxdepth: 1 72 | :caption: 常见问题 73 | 74 | faq.md 75 | 76 | .. toctree:: 77 | :maxdepth: 1 78 | :caption: 兼容性 79 | 80 | compatibility.md 81 | 82 | .. toctree:: 83 | :maxdepth: 1 84 | :caption: 接口文档(英文) 85 | 86 | api.rst 87 | 88 | .. toctree:: 89 | :maxdepth: 1 90 | :caption: 语言切换 91 | 92 | switch_language.md 93 | 94 | Indices and tables 95 | ================== 96 | 97 | * :ref:`genindex` 98 | * :ref:`search` 99 | -------------------------------------------------------------------------------- /docs_zh-CN/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs_zh-CN/stat.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import functools as func 3 | import glob 4 | import numpy as np 5 | import re 6 | from os import path as osp 7 | 8 | url_prefix = 'https://github.com/open-mmlab/mmdetection3d/blob/master/' 9 | 10 | files = sorted(glob.glob('../configs/*/README.md')) 11 | 12 | stats = [] 13 | titles = [] 14 | num_ckpts = 0 15 | 16 | for f in files: 17 | url = osp.dirname(f.replace('../', url_prefix)) 18 | 19 | with open(f, 'r') as content_file: 20 | content = content_file.read() 21 | 22 | title = content.split('\n')[0].replace('#', '').strip() 23 | ckpts = set(x.lower().strip() 24 | for x in re.findall(r'https?://download.*\.pth', content) 25 | if 'mmdetection3d' in x) 26 | if len(ckpts) == 0: 27 | continue 28 | 29 | _papertype = [x for x in re.findall(r'', content)] 30 | assert len(_papertype) > 0 31 | papertype = _papertype[0] 32 | 33 | paper = set([(papertype, title)]) 34 | 35 | titles.append(title) 36 | num_ckpts += len(ckpts) 37 | statsmsg = f""" 38 | \t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) 39 | """ 40 | stats.append((paper, ckpts, statsmsg)) 41 | 42 | allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) 43 | msglist = '\n'.join(x for _, _, x in stats) 44 | 45 | papertypes, papercounts = np.unique([t for t, _ in allpapers], 46 | return_counts=True) 47 | countstr = '\n'.join( 48 | [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) 49 | 50 | modelzoo = f""" 51 | \n## Model Zoo Statistics 52 | 53 | * Number of papers: {len(set(titles))} 54 | {countstr} 55 | 56 | * Number of checkpoints: {num_ckpts} 57 | {msglist} 58 | """ 59 | 60 | with open('model_zoo.md', 'a') as f: 61 | f.write(modelzoo) 62 | -------------------------------------------------------------------------------- /docs_zh-CN/supported_tasks/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | lidar_det3d.md 5 | vision_det3d.md 6 | lidar_sem_seg3d.md 7 | -------------------------------------------------------------------------------- /docs_zh-CN/supported_tasks/lidar_det3d.md: -------------------------------------------------------------------------------- 1 | # 基于Lidar的3D检测 -------------------------------------------------------------------------------- /docs_zh-CN/supported_tasks/lidar_sem_seg3d.md: -------------------------------------------------------------------------------- 1 | # 基于Lidar的3D语义分割 -------------------------------------------------------------------------------- /docs_zh-CN/supported_tasks/vision_det3d.md: -------------------------------------------------------------------------------- 1 | # 基于视觉的3D检测 -------------------------------------------------------------------------------- /docs_zh-CN/switch_language.md: -------------------------------------------------------------------------------- 1 | ## English 2 | 3 | ## 简体中文 4 | -------------------------------------------------------------------------------- /docs_zh-CN/tutorials/index.rst: -------------------------------------------------------------------------------- 1 | .. toctree:: 2 | :maxdepth: 2 3 | 4 | config.md 5 | customize_dataset.md 6 | data_pipeline.md 7 | customize_models.md 8 | customize_runtime.md 9 | -------------------------------------------------------------------------------- /mmdet3d/apis/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .inference import (convert_SyncBN, inference_detector, 3 | inference_mono_3d_detector, 4 | inference_multi_modality_detector, inference_segmentor, 5 | init_model, show_result_meshlab) 6 | from .test import single_gpu_test 7 | from .train import train_model 8 | 9 | __all__ = [ 10 | 'inference_detector', 'init_model', 'single_gpu_test', 11 | 'inference_mono_3d_detector', 'show_result_meshlab', 'convert_SyncBN', 12 | 'train_model', 'inference_multi_modality_detector', 'inference_segmentor' 13 | ] 14 | -------------------------------------------------------------------------------- /mmdet3d/apis/train.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.apis import train_detector 3 | from mmseg.apis import train_segmentor 4 | 5 | 6 | def train_model(model, 7 | dataset, 8 | cfg, 9 | distributed=False, 10 | validate=False, 11 | timestamp=None, 12 | meta=None): 13 | """A function wrapper for launching model training according to cfg. 14 | 15 | Because we need different eval_hook in runner. Should be deprecated in the 16 | future. 17 | """ 18 | if cfg.model.type in ['EncoderDecoder3D']: 19 | train_segmentor( 20 | model, 21 | dataset, 22 | cfg, 23 | distributed=distributed, 24 | validate=validate, 25 | timestamp=timestamp, 26 | meta=meta) 27 | else: 28 | train_detector( 29 | model, 30 | dataset, 31 | cfg, 32 | distributed=distributed, 33 | validate=validate, 34 | timestamp=timestamp, 35 | meta=meta) 36 | -------------------------------------------------------------------------------- /mmdet3d/core/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .anchor import * # noqa: F401, F403 3 | from .bbox import * # noqa: F401, F403 4 | from .evaluation import * # noqa: F401, F403 5 | from .points import * # noqa: F401, F403 6 | from .post_processing import * # noqa: F401, F403 7 | from .utils import * # noqa: F401, F403 8 | from .visualizer import * # noqa: F401, F403 9 | from .voxel import * # noqa: F401, F403 10 | -------------------------------------------------------------------------------- /mmdet3d/core/anchor/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.core.anchor import build_prior_generator 3 | from .anchor_3d_generator import (AlignedAnchor3DRangeGenerator, 4 | AlignedAnchor3DRangeGeneratorPerCls, 5 | Anchor3DRangeGenerator) 6 | 7 | __all__ = [ 8 | 'AlignedAnchor3DRangeGenerator', 'Anchor3DRangeGenerator', 9 | 'build_prior_generator', 'AlignedAnchor3DRangeGeneratorPerCls' 10 | ] 11 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .assigners import AssignResult, BaseAssigner, MaxIoUAssigner 3 | from .coders import DeltaXYZWLHRBBoxCoder 4 | # from .bbox_target import bbox_target 5 | from .iou_calculators import (AxisAlignedBboxOverlaps3D, BboxOverlaps3D, 6 | BboxOverlapsNearest3D, 7 | axis_aligned_bbox_overlaps_3d, bbox_overlaps_3d, 8 | bbox_overlaps_nearest_3d) 9 | from .samplers import (BaseSampler, CombinedSampler, 10 | InstanceBalancedPosSampler, IoUBalancedNegSampler, 11 | PseudoSampler, RandomSampler, SamplingResult) 12 | from .structures import (BaseInstance3DBoxes, Box3DMode, CameraInstance3DBoxes, 13 | Coord3DMode, DepthInstance3DBoxes, 14 | LiDARInstance3DBoxes, get_box_type, limit_period, 15 | mono_cam_box2vis, points_cam2img, xywhr2xyxyr) 16 | from .transforms import bbox3d2result, bbox3d2roi, bbox3d_mapping_back 17 | 18 | __all__ = [ 19 | 'BaseSampler', 'AssignResult', 'BaseAssigner', 'MaxIoUAssigner', 20 | 'PseudoSampler', 'RandomSampler', 'InstanceBalancedPosSampler', 21 | 'IoUBalancedNegSampler', 'CombinedSampler', 'SamplingResult', 22 | 'DeltaXYZWLHRBBoxCoder', 'BboxOverlapsNearest3D', 'BboxOverlaps3D', 23 | 'bbox_overlaps_nearest_3d', 'bbox_overlaps_3d', 24 | 'AxisAlignedBboxOverlaps3D', 'axis_aligned_bbox_overlaps_3d', 'Box3DMode', 25 | 'LiDARInstance3DBoxes', 'CameraInstance3DBoxes', 'bbox3d2roi', 26 | 'bbox3d2result', 'DepthInstance3DBoxes', 'BaseInstance3DBoxes', 27 | 'bbox3d_mapping_back', 'xywhr2xyxyr', 'limit_period', 'points_cam2img', 28 | 'get_box_type', 'Coord3DMode', 'mono_cam_box2vis' 29 | ] 30 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/assigners/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.core.bbox import AssignResult, BaseAssigner, MaxIoUAssigner 3 | 4 | __all__ = ['BaseAssigner', 'MaxIoUAssigner', 'AssignResult'] 5 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/coders/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.core.bbox import build_bbox_coder 3 | from .anchor_free_bbox_coder import AnchorFreeBBoxCoder 4 | from .centerpoint_bbox_coders import CenterPointBBoxCoder 5 | from .delta_xyzwhlr_bbox_coder import DeltaXYZWLHRBBoxCoder 6 | from .groupfree3d_bbox_coder import GroupFree3DBBoxCoder 7 | from .partial_bin_based_bbox_coder import PartialBinBasedBBoxCoder 8 | 9 | __all__ = [ 10 | 'build_bbox_coder', 'DeltaXYZWLHRBBoxCoder', 'PartialBinBasedBBoxCoder', 11 | 'CenterPointBBoxCoder', 'AnchorFreeBBoxCoder', 'GroupFree3DBBoxCoder' 12 | ] 13 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/iou_calculators/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .iou3d_calculator import (AxisAlignedBboxOverlaps3D, BboxOverlaps3D, 3 | BboxOverlapsNearest3D, 4 | axis_aligned_bbox_overlaps_3d, bbox_overlaps_3d, 5 | bbox_overlaps_nearest_3d) 6 | 7 | __all__ = [ 8 | 'BboxOverlapsNearest3D', 'BboxOverlaps3D', 'bbox_overlaps_nearest_3d', 9 | 'bbox_overlaps_3d', 'AxisAlignedBboxOverlaps3D', 10 | 'axis_aligned_bbox_overlaps_3d' 11 | ] 12 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/samplers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.core.bbox.samplers import (BaseSampler, CombinedSampler, 3 | InstanceBalancedPosSampler, 4 | IoUBalancedNegSampler, OHEMSampler, 5 | PseudoSampler, RandomSampler, 6 | SamplingResult) 7 | from .iou_neg_piecewise_sampler import IoUNegPiecewiseSampler 8 | 9 | __all__ = [ 10 | 'BaseSampler', 'PseudoSampler', 'RandomSampler', 11 | 'InstanceBalancedPosSampler', 'IoUBalancedNegSampler', 'CombinedSampler', 12 | 'OHEMSampler', 'SamplingResult', 'IoUNegPiecewiseSampler' 13 | ] 14 | -------------------------------------------------------------------------------- /mmdet3d/core/bbox/structures/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_box3d import BaseInstance3DBoxes 3 | from .box_3d_mode import Box3DMode 4 | from .cam_box3d import CameraInstance3DBoxes 5 | from .coord_3d_mode import Coord3DMode 6 | from .depth_box3d import DepthInstance3DBoxes 7 | from .lidar_box3d import LiDARInstance3DBoxes 8 | from .utils import (get_box_type, get_proj_mat_by_coord_type, limit_period, 9 | mono_cam_box2vis, points_cam2img, rotation_3d_in_axis, 10 | xywhr2xyxyr) 11 | 12 | __all__ = [ 13 | 'Box3DMode', 'BaseInstance3DBoxes', 'LiDARInstance3DBoxes', 14 | 'CameraInstance3DBoxes', 'DepthInstance3DBoxes', 'xywhr2xyxyr', 15 | 'get_box_type', 'rotation_3d_in_axis', 'limit_period', 'points_cam2img', 16 | 'Coord3DMode', 'mono_cam_box2vis', 'get_proj_mat_by_coord_type' 17 | ] 18 | -------------------------------------------------------------------------------- /mmdet3d/core/evaluation/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .indoor_eval import indoor_eval 3 | from .kitti_utils import kitti_eval, kitti_eval_coco_style 4 | from .lyft_eval import lyft_eval 5 | from .seg_eval import seg_eval 6 | 7 | __all__ = [ 8 | 'kitti_eval_coco_style', 'kitti_eval', 'indoor_eval', 'lyft_eval', 9 | 'seg_eval' 10 | ] 11 | -------------------------------------------------------------------------------- /mmdet3d/core/evaluation/kitti_utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .eval import kitti_eval, kitti_eval_coco_style 3 | 4 | __all__ = ['kitti_eval', 'kitti_eval_coco_style'] 5 | -------------------------------------------------------------------------------- /mmdet3d/core/points/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_points import BasePoints 3 | from .cam_points import CameraPoints 4 | from .depth_points import DepthPoints 5 | from .lidar_points import LiDARPoints 6 | 7 | __all__ = ['BasePoints', 'CameraPoints', 'DepthPoints', 'LiDARPoints'] 8 | 9 | 10 | def get_points_type(points_type): 11 | """Get the class of points according to coordinate type. 12 | 13 | Args: 14 | points_type (str): The type of points coordinate. 15 | The valid value are "CAMERA", "LIDAR", or "DEPTH". 16 | 17 | Returns: 18 | class: Points type. 19 | """ 20 | if points_type == 'CAMERA': 21 | points_cls = CameraPoints 22 | elif points_type == 'LIDAR': 23 | points_cls = LiDARPoints 24 | elif points_type == 'DEPTH': 25 | points_cls = DepthPoints 26 | else: 27 | raise ValueError('Only "points_type" of "CAMERA", "LIDAR", or "DEPTH"' 28 | f' are supported, got {points_type}') 29 | 30 | return points_cls 31 | -------------------------------------------------------------------------------- /mmdet3d/core/post_processing/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.core.post_processing import (merge_aug_bboxes, merge_aug_masks, 3 | merge_aug_proposals, merge_aug_scores, 4 | multiclass_nms) 5 | from .box3d_nms import aligned_3d_nms, box3d_multiclass_nms, circle_nms 6 | from .merge_augs import merge_aug_bboxes_3d 7 | 8 | __all__ = [ 9 | 'multiclass_nms', 'merge_aug_proposals', 'merge_aug_bboxes', 10 | 'merge_aug_scores', 'merge_aug_masks', 'box3d_multiclass_nms', 11 | 'aligned_3d_nms', 'merge_aug_bboxes_3d', 'circle_nms' 12 | ] 13 | -------------------------------------------------------------------------------- /mmdet3d/core/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .gaussian import draw_heatmap_gaussian, gaussian_2d, gaussian_radius 3 | 4 | __all__ = ['gaussian_2d', 'gaussian_radius', 'draw_heatmap_gaussian'] 5 | -------------------------------------------------------------------------------- /mmdet3d/core/visualizer/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .show_result import (show_multi_modality_result, show_result, 3 | show_seg_result) 4 | 5 | __all__ = ['show_result', 'show_seg_result', 'show_multi_modality_result'] 6 | -------------------------------------------------------------------------------- /mmdet3d/core/voxel/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import build_voxel_generator 3 | from .voxel_generator import VoxelGenerator 4 | 5 | __all__ = ['build_voxel_generator', 'VoxelGenerator'] 6 | -------------------------------------------------------------------------------- /mmdet3d/core/voxel/builder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import mmcv 3 | 4 | from . import voxel_generator 5 | 6 | 7 | def build_voxel_generator(cfg, **kwargs): 8 | """Builder of voxel generator.""" 9 | if isinstance(cfg, voxel_generator.VoxelGenerator): 10 | return cfg 11 | elif isinstance(cfg, dict): 12 | return mmcv.runner.obj_from_dict( 13 | cfg, voxel_generator, default_args=kwargs) 14 | else: 15 | raise TypeError('Invalid type {} for building a sampler'.format( 16 | type(cfg))) 17 | -------------------------------------------------------------------------------- /mmdet3d/datasets/pipelines/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.datasets.pipelines import Compose 3 | from .dbsampler import DataBaseSampler 4 | from .formating import Collect3D, DefaultFormatBundle, DefaultFormatBundle3D 5 | from .loading import (LoadAnnotations3D, LoadImageFromFileMono3D, 6 | LoadMultiViewImageFromFiles, LoadPointsFromFile, 7 | LoadPointsFromMultiSweeps, NormalizePointsColor, 8 | PointSegClassMapping) 9 | from .test_time_aug import MultiScaleFlipAug3D 10 | from .transforms_3d import (BackgroundPointsFilter, GlobalAlignment, 11 | GlobalRotScaleTrans, IndoorPatchPointSample, 12 | IndoorPointSample, ObjectNameFilter, ObjectNoise, 13 | ObjectRangeFilter, ObjectSample, PointSample, 14 | PointShuffle, PointsRangeFilter, 15 | RandomDropPointsColor, RandomFlip3D, 16 | RandomJitterPoints, VoxelBasedPointSampler) 17 | 18 | __all__ = [ 19 | 'ObjectSample', 'RandomFlip3D', 'ObjectNoise', 'GlobalRotScaleTrans', 20 | 'PointShuffle', 'ObjectRangeFilter', 'PointsRangeFilter', 'Collect3D', 21 | 'Compose', 'LoadMultiViewImageFromFiles', 'LoadPointsFromFile', 22 | 'DefaultFormatBundle', 'DefaultFormatBundle3D', 'DataBaseSampler', 23 | 'NormalizePointsColor', 'LoadAnnotations3D', 'IndoorPointSample', 24 | 'PointSample', 'PointSegClassMapping', 'MultiScaleFlipAug3D', 25 | 'LoadPointsFromMultiSweeps', 'BackgroundPointsFilter', 26 | 'VoxelBasedPointSampler', 'GlobalAlignment', 'IndoorPatchPointSample', 27 | 'LoadImageFromFileMono3D', 'ObjectNameFilter', 'RandomDropPointsColor', 28 | 'RandomJitterPoints' 29 | ] 30 | -------------------------------------------------------------------------------- /mmdet3d/models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .backbones import * # noqa: F401,F403 3 | from .builder import (FUSION_LAYERS, MIDDLE_ENCODERS, VOXEL_ENCODERS, 4 | build_backbone, build_detector, build_fusion_layer, 5 | build_head, build_loss, build_middle_encoder, 6 | build_model, build_neck, build_roi_extractor, 7 | build_shared_head, build_voxel_encoder) 8 | from .decode_heads import * # noqa: F401,F403 9 | from .dense_heads import * # noqa: F401,F403 10 | from .detectors import * # noqa: F401,F403 11 | from .fusion_layers import * # noqa: F401,F403 12 | from .losses import * # noqa: F401,F403 13 | from .middle_encoders import * # noqa: F401,F403 14 | from .model_utils import * # noqa: F401,F403 15 | from .necks import * # noqa: F401,F403 16 | from .roi_heads import * # noqa: F401,F403 17 | from .segmentors import * # noqa: F401,F403 18 | from .voxel_encoders import * # noqa: F401,F403 19 | 20 | __all__ = [ 21 | 'VOXEL_ENCODERS', 'MIDDLE_ENCODERS', 'FUSION_LAYERS', 'build_backbone', 22 | 'build_neck', 'build_roi_extractor', 'build_shared_head', 'build_head', 23 | 'build_loss', 'build_detector', 'build_fusion_layer', 'build_model', 24 | 'build_middle_encoder', 'build_voxel_encoder' 25 | ] 26 | -------------------------------------------------------------------------------- /mmdet3d/models/backbones/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.backbones import SSDVGG, HRNet, ResNet, ResNetV1d, ResNeXt 3 | from .multi_backbone import MultiBackbone 4 | from .nostem_regnet import NoStemRegNet 5 | from .pointnet2_sa_msg import PointNet2SAMSG 6 | from .pointnet2_sa_ssg import PointNet2SASSG 7 | from .second import SECOND 8 | 9 | __all__ = [ 10 | 'ResNet', 'ResNetV1d', 'ResNeXt', 'SSDVGG', 'HRNet', 'NoStemRegNet', 11 | 'SECOND', 'PointNet2SASSG', 'PointNet2SAMSG', 'MultiBackbone' 12 | ] 13 | -------------------------------------------------------------------------------- /mmdet3d/models/backbones/base_pointnet.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import warnings 3 | from abc import ABCMeta 4 | from mmcv.runner import BaseModule 5 | 6 | 7 | class BasePointNet(BaseModule, metaclass=ABCMeta): 8 | """Base class for PointNet.""" 9 | 10 | def __init__(self, init_cfg=None, pretrained=None): 11 | super(BasePointNet, self).__init__(init_cfg) 12 | self.fp16_enabled = False 13 | assert not (init_cfg and pretrained), \ 14 | 'init_cfg and pretrained cannot be setting at the same time' 15 | if isinstance(pretrained, str): 16 | warnings.warn('DeprecationWarning: pretrained is a deprecated, ' 17 | 'please use "init_cfg" instead') 18 | self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) 19 | 20 | @staticmethod 21 | def _split_point_feats(points): 22 | """Split coordinates and features of input points. 23 | 24 | Args: 25 | points (torch.Tensor): Point coordinates with features, 26 | with shape (B, N, 3 + input_feature_dim). 27 | 28 | Returns: 29 | torch.Tensor: Coordinates of input points. 30 | torch.Tensor: Features of input points. 31 | """ 32 | xyz = points[..., 0:3].contiguous() 33 | if points.size(-1) > 3: 34 | features = points[..., 3:].transpose(1, 2).contiguous() 35 | else: 36 | features = None 37 | 38 | return xyz, features 39 | -------------------------------------------------------------------------------- /mmdet3d/models/decode_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .paconv_head import PAConvHead 3 | from .pointnet2_head import PointNet2Head 4 | 5 | __all__ = ['PointNet2Head', 'PAConvHead'] 6 | -------------------------------------------------------------------------------- /mmdet3d/models/dense_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .anchor3d_head import Anchor3DHead 3 | from .anchor_free_mono3d_head import AnchorFreeMono3DHead 4 | from .base_conv_bbox_head import BaseConvBboxHead 5 | from .base_mono3d_dense_head import BaseMono3DDenseHead 6 | from .centerpoint_head import CenterHead 7 | from .fcos_mono3d_head import FCOSMono3DHead 8 | from .free_anchor3d_head import FreeAnchor3DHead 9 | from .groupfree3d_head import GroupFree3DHead 10 | from .parta2_rpn_head import PartA2RPNHead 11 | from .shape_aware_head import ShapeAwareHead 12 | from .ssd_3d_head import SSD3DHead 13 | from .vote_head import VoteHead 14 | from .sr_head import SRHead 15 | 16 | __all__ = [ 17 | 'Anchor3DHead', 'FreeAnchor3DHead', 'PartA2RPNHead', 'VoteHead', 18 | 'SSD3DHead', 'BaseConvBboxHead', 'CenterHead', 'ShapeAwareHead', 19 | 'BaseMono3DDenseHead', 'AnchorFreeMono3DHead', 'FCOSMono3DHead', 20 | 'GroupFree3DHead', 21 | 'SRHead' 22 | ] 23 | -------------------------------------------------------------------------------- /mmdet3d/models/detectors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base import Base3DDetector 3 | from .centerpoint import CenterPoint 4 | from .dynamic_voxelnet import DynamicVoxelNet 5 | from .fcos_mono3d import FCOSMono3D 6 | from .groupfree3dnet import GroupFree3DNet 7 | from .h3dnet import H3DNet 8 | from .imvotenet import ImVoteNet 9 | from .imvoxelnet import ImVoxelNet 10 | from .mvx_faster_rcnn import DynamicMVXFasterRCNN, MVXFasterRCNN 11 | from .mvx_two_stage import MVXTwoStageDetector 12 | from .parta2 import PartA2 13 | from .single_stage_mono3d import SingleStageMono3DDetector 14 | from .ssd3dnet import SSD3DNet 15 | from .votenet import VoteNet 16 | from .voxelnet import VoxelNet 17 | 18 | __all__ = [ 19 | 'Base3DDetector', 'VoxelNet', 'DynamicVoxelNet', 'MVXTwoStageDetector', 20 | 'DynamicMVXFasterRCNN', 'MVXFasterRCNN', 'PartA2', 'VoteNet', 'H3DNet', 21 | 'CenterPoint', 'SSD3DNet', 'ImVoteNet', 'SingleStageMono3DDetector', 22 | 'FCOSMono3D', 'ImVoxelNet', 'GroupFree3DNet', 23 | ] 24 | -------------------------------------------------------------------------------- /mmdet3d/models/detectors/fcos_mono3d.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.builder import DETECTORS 3 | from .single_stage_mono3d import SingleStageMono3DDetector 4 | 5 | 6 | @DETECTORS.register_module() 7 | class FCOSMono3D(SingleStageMono3DDetector): 8 | r"""`FCOS3D `_ for monocular 3D object detection. 9 | 10 | Currently please refer to our entry on the 11 | `leaderboard `_. 12 | """ # noqa: E501 13 | 14 | def __init__(self, 15 | backbone, 16 | neck, 17 | bbox_head, 18 | train_cfg=None, 19 | test_cfg=None, 20 | pretrained=None): 21 | super(FCOSMono3D, self).__init__(backbone, neck, bbox_head, train_cfg, 22 | test_cfg, pretrained) 23 | -------------------------------------------------------------------------------- /mmdet3d/models/detectors/ssd3dnet.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models import DETECTORS 3 | from .votenet import VoteNet 4 | 5 | 6 | @DETECTORS.register_module() 7 | class SSD3DNet(VoteNet): 8 | """3DSSDNet model. 9 | 10 | https://arxiv.org/abs/2002.10187.pdf 11 | """ 12 | 13 | def __init__(self, 14 | backbone, 15 | bbox_head=None, 16 | train_cfg=None, 17 | test_cfg=None, 18 | init_cfg=None, 19 | pretrained=None): 20 | super(SSD3DNet, self).__init__( 21 | backbone=backbone, 22 | bbox_head=bbox_head, 23 | train_cfg=train_cfg, 24 | test_cfg=test_cfg, 25 | init_cfg=init_cfg, 26 | pretrained=pretrained) 27 | -------------------------------------------------------------------------------- /mmdet3d/models/detectors/two_stage.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models import DETECTORS, TwoStageDetector 3 | from .base import Base3DDetector 4 | 5 | 6 | @DETECTORS.register_module() 7 | class TwoStage3DDetector(Base3DDetector, TwoStageDetector): 8 | """Base class of two-stage 3D detector. 9 | 10 | It inherits original ``:class:TwoStageDetector`` and 11 | ``:class:Base3DDetector``. This class could serve as a base class for all 12 | two-stage 3D detectors. 13 | """ 14 | 15 | def __init__(self, **kwargs): 16 | super(TwoStage3DDetector, self).__init__(**kwargs) 17 | -------------------------------------------------------------------------------- /mmdet3d/models/fusion_layers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .coord_transform import (apply_3d_transformation, bbox_2d_transform, 3 | coord_2d_transform) 4 | from .point_fusion import PointFusion 5 | from .vote_fusion import VoteFusion 6 | 7 | __all__ = [ 8 | 'PointFusion', 'VoteFusion', 'apply_3d_transformation', 9 | 'bbox_2d_transform', 'coord_2d_transform' 10 | ] 11 | -------------------------------------------------------------------------------- /mmdet3d/models/losses/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.losses import FocalLoss, SmoothL1Loss, binary_cross_entropy 3 | from .axis_aligned_iou_loss import AxisAlignedIoULoss, axis_aligned_iou_loss 4 | from .chamfer_distance import ChamferDistance, chamfer_distance 5 | from .paconv_regularization_loss import PAConvRegularizationLoss 6 | 7 | __all__ = [ 8 | 'FocalLoss', 'SmoothL1Loss', 'binary_cross_entropy', 'ChamferDistance', 9 | 'chamfer_distance', 'axis_aligned_iou_loss', 'AxisAlignedIoULoss', 10 | 'PAConvRegularizationLoss' 11 | ] 12 | -------------------------------------------------------------------------------- /mmdet3d/models/middle_encoders/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .pillar_scatter import PointPillarsScatter 3 | from .sparse_encoder import SparseEncoder 4 | from .sparse_unet import SparseUNet 5 | 6 | __all__ = ['PointPillarsScatter', 'SparseEncoder', 'SparseUNet'] 7 | -------------------------------------------------------------------------------- /mmdet3d/models/model_utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .transformer import GroupFree3DMHA 3 | from .vote_module import VoteModule 4 | from .noise_suppression_module import NoiseSuppressionModule 5 | 6 | __all__ = ['VoteModule', 'GroupFree3DMHA', 'NoiseSuppressionModule'] 7 | -------------------------------------------------------------------------------- /mmdet3d/models/necks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.necks.fpn import FPN 3 | from .imvoxel_neck import OutdoorImVoxelNeck 4 | from .second_fpn import SECONDFPN 5 | 6 | __all__ = ['FPN', 'SECONDFPN', 'OutdoorImVoxelNeck'] 7 | -------------------------------------------------------------------------------- /mmdet3d/models/roi_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_3droi_head import Base3DRoIHead 3 | from .bbox_heads import PartA2BboxHead 4 | from .h3d_roi_head import H3DRoIHead 5 | from .mask_heads import PointwiseSemanticHead, PrimitiveHead 6 | from .part_aggregation_roi_head import PartAggregationROIHead 7 | from .roi_extractors import Single3DRoIAwareExtractor, SingleRoIExtractor 8 | 9 | __all__ = [ 10 | 'Base3DRoIHead', 'PartAggregationROIHead', 'PointwiseSemanticHead', 11 | 'Single3DRoIAwareExtractor', 'PartA2BboxHead', 'SingleRoIExtractor', 12 | 'H3DRoIHead', 'PrimitiveHead', 13 | ] 14 | -------------------------------------------------------------------------------- /mmdet3d/models/roi_heads/bbox_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.roi_heads.bbox_heads import (BBoxHead, ConvFCBBoxHead, 3 | DoubleConvFCBBoxHead, 4 | Shared2FCBBoxHead, 5 | Shared4Conv1FCBBoxHead) 6 | from .h3d_bbox_head import H3DBboxHead 7 | from .parta2_bbox_head import PartA2BboxHead 8 | 9 | __all__ = [ 10 | 'BBoxHead', 'ConvFCBBoxHead', 'Shared2FCBBoxHead', 11 | 'Shared4Conv1FCBBoxHead', 'DoubleConvFCBBoxHead', 'PartA2BboxHead', 12 | 'H3DBboxHead' 13 | ] 14 | -------------------------------------------------------------------------------- /mmdet3d/models/roi_heads/mask_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .pointwise_semantic_head import PointwiseSemanticHead 3 | from .primitive_head import PrimitiveHead 4 | 5 | __all__ = ['PointwiseSemanticHead', 'PrimitiveHead'] 6 | -------------------------------------------------------------------------------- /mmdet3d/models/roi_heads/roi_extractors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.roi_heads.roi_extractors import SingleRoIExtractor 3 | from .single_roiaware_extractor import Single3DRoIAwareExtractor 4 | 5 | __all__ = ['SingleRoIExtractor', 'Single3DRoIAwareExtractor'] 6 | -------------------------------------------------------------------------------- /mmdet3d/models/segmentors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base import Base3DSegmentor 3 | from .encoder_decoder import EncoderDecoder3D 4 | 5 | __all__ = ['Base3DSegmentor', 'EncoderDecoder3D'] 6 | -------------------------------------------------------------------------------- /mmdet3d/models/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .clip_sigmoid import clip_sigmoid 3 | from .mlp import MLP 4 | 5 | __all__ = ['clip_sigmoid', 'MLP'] 6 | -------------------------------------------------------------------------------- /mmdet3d/models/utils/clip_sigmoid.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | 5 | def clip_sigmoid(x, eps=1e-4): 6 | """Sigmoid function for input feature. 7 | 8 | Args: 9 | x (torch.Tensor): Input feature map with the shape of [B, N, H, W]. 10 | eps (float): Lower bound of the range to be clamped to. Defaults 11 | to 1e-4. 12 | 13 | Returns: 14 | torch.Tensor: Feature map after sigmoid. 15 | """ 16 | y = torch.clamp(x.sigmoid_(), min=eps, max=1 - eps) 17 | return y 18 | -------------------------------------------------------------------------------- /mmdet3d/models/voxel_encoders/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .pillar_encoder import PillarFeatureNet 3 | from .voxel_encoder import DynamicSimpleVFE, DynamicVFE, HardSimpleVFE, HardVFE 4 | 5 | __all__ = [ 6 | 'PillarFeatureNet', 'HardVFE', 'DynamicVFE', 'HardSimpleVFE', 7 | 'DynamicSimpleVFE' 8 | ] 9 | -------------------------------------------------------------------------------- /mmdet3d/ops/ball_query/__init__.py: -------------------------------------------------------------------------------- 1 | from .ball_query import ball_query 2 | 3 | __all__ = ['ball_query'] 4 | -------------------------------------------------------------------------------- /mmdet3d/ops/ball_query/ball_query.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch.autograd import Function 3 | 4 | from . import ball_query_ext 5 | 6 | 7 | class BallQuery(Function): 8 | """Ball Query. 9 | 10 | Find nearby points in spherical space. 11 | """ 12 | 13 | @staticmethod 14 | def forward(ctx, min_radius: float, max_radius: float, sample_num: int, 15 | xyz: torch.Tensor, center_xyz: torch.Tensor) -> torch.Tensor: 16 | """forward. 17 | 18 | Args: 19 | min_radius (float): minimum radius of the balls. 20 | max_radius (float): maximum radius of the balls. 21 | sample_num (int): maximum number of features in the balls. 22 | xyz (Tensor): (B, N, 3) xyz coordinates of the features. 23 | center_xyz (Tensor): (B, npoint, 3) centers of the ball query. 24 | 25 | Returns: 26 | Tensor: (B, npoint, nsample) tensor with the indicies of 27 | the features that form the query balls. 28 | """ 29 | assert center_xyz.is_contiguous() 30 | assert xyz.is_contiguous() 31 | assert min_radius < max_radius 32 | 33 | # selected samples are not sorted based on the distance 34 | # larger center-xyz can better benifits from GPU 35 | B, N, _ = xyz.size() 36 | npoint = center_xyz.size(1) 37 | idx = torch.cuda.IntTensor(B, npoint, sample_num).zero_() 38 | 39 | ball_query_ext.ball_query_wrapper(B, N, npoint, min_radius, max_radius, 40 | sample_num, center_xyz, xyz, idx) 41 | ctx.mark_non_differentiable(idx) 42 | return idx 43 | 44 | @staticmethod 45 | def backward(ctx, a=None): 46 | return None, None, None, None 47 | 48 | 49 | ball_query = BallQuery.apply 50 | -------------------------------------------------------------------------------- /mmdet3d/ops/furthest_point_sample/__init__.py: -------------------------------------------------------------------------------- 1 | from .furthest_point_sample import (furthest_point_sample, 2 | furthest_point_sample_with_dist) 3 | from .points_sampler import Points_Sampler 4 | 5 | __all__ = [ 6 | 'furthest_point_sample', 'furthest_point_sample_with_dist', 7 | 'Points_Sampler' 8 | ] 9 | -------------------------------------------------------------------------------- /mmdet3d/ops/furthest_point_sample/utils.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | 4 | def calc_square_dist(point_feat_a, point_feat_b, norm=True): 5 | """Calculating square distance between a and b. 6 | 7 | Args: 8 | point_feat_a (Tensor): (B, N, C) Feature vector of each point. 9 | point_feat_b (Tensor): (B, M, C) Feature vector of each point. 10 | norm (Bool): Whether to normalize the distance. 11 | Default: True. 12 | 13 | Returns: 14 | Tensor: (B, N, M) Distance between each pair points. 15 | """ 16 | length_a = point_feat_a.shape[1] 17 | length_b = point_feat_b.shape[1] 18 | num_channel = point_feat_a.shape[-1] 19 | # [bs, n, 1] 20 | a_square = torch.sum(point_feat_a.unsqueeze(dim=2).pow(2), dim=-1) 21 | # [bs, 1, m] 22 | b_square = torch.sum(point_feat_b.unsqueeze(dim=1).pow(2), dim=-1) 23 | a_square = a_square.repeat((1, 1, length_b)) # [bs, n, m] 24 | b_square = b_square.repeat((1, length_a, 1)) # [bs, n, m] 25 | 26 | coor = torch.matmul(point_feat_a, point_feat_b.transpose(1, 2)) 27 | 28 | dist = a_square + b_square - 2 * coor 29 | if norm: 30 | dist = torch.sqrt(dist) / num_channel 31 | return dist 32 | -------------------------------------------------------------------------------- /mmdet3d/ops/gather_points/__init__.py: -------------------------------------------------------------------------------- 1 | from .gather_points import gather_points 2 | 3 | __all__ = ['gather_points'] 4 | -------------------------------------------------------------------------------- /mmdet3d/ops/gather_points/gather_points.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch.autograd import Function 3 | 4 | from . import gather_points_ext 5 | 6 | 7 | class GatherPoints(Function): 8 | """Gather Points. 9 | 10 | Gather points with given index. 11 | """ 12 | 13 | @staticmethod 14 | def forward(ctx, features: torch.Tensor, 15 | indices: torch.Tensor) -> torch.Tensor: 16 | """forward. 17 | 18 | Args: 19 | features (Tensor): (B, C, N) features to gather. 20 | indices (Tensor): (B, M) where M is the number of points. 21 | 22 | Returns: 23 | Tensor: (B, C, M) where M is the number of points. 24 | """ 25 | assert features.is_contiguous() 26 | assert indices.is_contiguous() 27 | 28 | B, npoint = indices.size() 29 | _, C, N = features.size() 30 | output = torch.cuda.FloatTensor(B, C, npoint) 31 | 32 | gather_points_ext.gather_points_wrapper(B, C, N, npoint, features, 33 | indices, output) 34 | 35 | ctx.for_backwards = (indices, C, N) 36 | ctx.mark_non_differentiable(indices) 37 | return output 38 | 39 | @staticmethod 40 | def backward(ctx, grad_out): 41 | idx, C, N = ctx.for_backwards 42 | B, npoint = idx.size() 43 | 44 | grad_features = torch.cuda.FloatTensor(B, C, N).zero_() 45 | grad_out_data = grad_out.data.contiguous() 46 | gather_points_ext.gather_points_grad_wrapper(B, C, N, npoint, 47 | grad_out_data, idx, 48 | grad_features.data) 49 | return grad_features, None 50 | 51 | 52 | gather_points = GatherPoints.apply 53 | -------------------------------------------------------------------------------- /mmdet3d/ops/group_points/__init__.py: -------------------------------------------------------------------------------- 1 | from .group_points import GroupAll, QueryAndGroup, grouping_operation 2 | 3 | __all__ = ['QueryAndGroup', 'GroupAll', 'grouping_operation'] 4 | -------------------------------------------------------------------------------- /mmdet3d/ops/interpolate/__init__.py: -------------------------------------------------------------------------------- 1 | from .three_interpolate import three_interpolate 2 | from .three_nn import three_nn 3 | 4 | __all__ = ['three_nn', 'three_interpolate'] 5 | -------------------------------------------------------------------------------- /mmdet3d/ops/interpolate/three_nn.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch.autograd import Function 3 | from typing import Tuple 4 | 5 | from . import interpolate_ext 6 | 7 | 8 | class ThreeNN(Function): 9 | 10 | @staticmethod 11 | def forward(ctx, target: torch.Tensor, 12 | source: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: 13 | """Find the top-3 nearest neighbors of the target set from the source 14 | set. 15 | 16 | Args: 17 | target (Tensor): shape (B, N, 3), points set that needs to 18 | find the nearest neighbors. 19 | source (Tensor): shape (B, M, 3), points set that is used 20 | to find the nearest neighbors of points in target set. 21 | 22 | Returns: 23 | Tensor: shape (B, N, 3), L2 distance of each point in target 24 | set to their corresponding nearest neighbors. 25 | """ 26 | assert target.is_contiguous() 27 | assert source.is_contiguous() 28 | 29 | B, N, _ = target.size() 30 | m = source.size(1) 31 | dist2 = torch.cuda.FloatTensor(B, N, 3) 32 | idx = torch.cuda.IntTensor(B, N, 3) 33 | 34 | interpolate_ext.three_nn_wrapper(B, N, m, target, source, dist2, idx) 35 | 36 | ctx.mark_non_differentiable(idx) 37 | 38 | return torch.sqrt(dist2), idx 39 | 40 | @staticmethod 41 | def backward(ctx, a=None, b=None): 42 | return None, None 43 | 44 | 45 | three_nn = ThreeNN.apply 46 | -------------------------------------------------------------------------------- /mmdet3d/ops/iou3d/__init__.py: -------------------------------------------------------------------------------- 1 | from .iou3d_utils import boxes_iou_bev, nms_gpu, nms_normal_gpu 2 | 3 | __all__ = ['boxes_iou_bev', 'nms_gpu', 'nms_normal_gpu'] 4 | -------------------------------------------------------------------------------- /mmdet3d/ops/knn/__init__.py: -------------------------------------------------------------------------------- 1 | from .knn import knn 2 | 3 | __all__ = ['knn'] 4 | -------------------------------------------------------------------------------- /mmdet3d/ops/knn/src/knn.cpp: -------------------------------------------------------------------------------- 1 | // Modified from https://github.com/CVMI-Lab/PAConv/tree/main/scene_seg/lib/pointops/src/knnquery_heap 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | extern THCState *state; 10 | 11 | #define CHECK_CUDA(x) TORCH_CHECK(x.is_cuda(), #x, " must be a CUDAtensor ") 12 | #define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x, " must be contiguous ") 13 | #define CHECK_INPUT(x) CHECK_CUDA(x);CHECK_CONTIGUOUS(x) 14 | 15 | 16 | void knn_kernel_launcher( 17 | int b, 18 | int n, 19 | int m, 20 | int nsample, 21 | const float *xyz, 22 | const float *new_xyz, 23 | int *idx, 24 | float *dist2, 25 | cudaStream_t stream 26 | ); 27 | 28 | void knn_wrapper(int b, int n, int m, int nsample, at::Tensor xyz_tensor, at::Tensor new_xyz_tensor, at::Tensor idx_tensor, at::Tensor dist2_tensor) 29 | { 30 | CHECK_INPUT(new_xyz_tensor); 31 | CHECK_INPUT(xyz_tensor); 32 | 33 | const float *new_xyz = new_xyz_tensor.data_ptr(); 34 | const float *xyz = xyz_tensor.data_ptr(); 35 | int *idx = idx_tensor.data_ptr(); 36 | float *dist2 = dist2_tensor.data_ptr(); 37 | 38 | cudaStream_t stream = at::cuda::getCurrentCUDAStream(); 39 | 40 | knn_kernel_launcher(b, n, m, nsample, xyz, new_xyz, idx, dist2, stream); 41 | } 42 | 43 | 44 | PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { 45 | m.def("knn_wrapper", &knn_wrapper, "knn_wrapper"); 46 | } 47 | -------------------------------------------------------------------------------- /mmdet3d/ops/paconv/__init__.py: -------------------------------------------------------------------------------- 1 | from .assign_score import assign_score_withk 2 | from .paconv import PAConv, PAConvCUDA 3 | 4 | __all__ = ['assign_score_withk', 'PAConv', 'PAConvCUDA'] 5 | -------------------------------------------------------------------------------- /mmdet3d/ops/paconv/src/assign_score_withk.cpp: -------------------------------------------------------------------------------- 1 | // Modified from https://github.com/CVMI-Lab/PAConv/tree/main/scene_seg/lib/paconv_lib/src/gpu 2 | 3 | #include 4 | #include 5 | 6 | void assign_score_withk_forward_wrapper( 7 | int B, int N0, int N1, int M, 8 | int K, int O, int aggregate, 9 | const at::Tensor& points, 10 | const at::Tensor& centers, 11 | const at::Tensor& scores, 12 | const at::Tensor& knn_idx, 13 | at::Tensor& output 14 | ); 15 | 16 | void assign_score_withk_backward_wrapper( 17 | int B, int N0, int N1, int M, 18 | int K, int O, int aggregate, 19 | const at::Tensor& grad_out, 20 | const at::Tensor& points, 21 | const at::Tensor& centers, 22 | const at::Tensor& scores, 23 | const at::Tensor& knn_idx, 24 | at::Tensor& grad_points, 25 | at::Tensor& grad_centers, 26 | at::Tensor& grad_scores 27 | ); 28 | 29 | PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { 30 | m.def("assign_score_withk_forward_wrapper", 31 | &assign_score_withk_forward_wrapper, 32 | "Assign score kernel forward (GPU), save memory version"); 33 | m.def("assign_score_withk_backward_wrapper", 34 | &assign_score_withk_backward_wrapper, 35 | "Assign score kernel backward (GPU), save memory version"); 36 | } 37 | -------------------------------------------------------------------------------- /mmdet3d/ops/pointnet_modules/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import build_sa_module 3 | from .paconv_sa_module import (PAConvCUDASAModule, PAConvCUDASAModuleMSG, 4 | PAConvSAModule, PAConvSAModuleMSG) 5 | from .point_fp_module import PointFPModule 6 | from .point_sa_module import PointSAModule, PointSAModuleMSG 7 | from .point_fp_modulev2 import PointFPModulev2 8 | 9 | __all__ = [ 10 | 'build_sa_module', 'PointSAModuleMSG', 'PointSAModule', 'PointFPModule', 11 | 'PAConvSAModule', 'PAConvSAModuleMSG', 'PAConvCUDASAModule', 12 | 'PAConvCUDASAModuleMSG', 'PointFPModulev2', 13 | ] 14 | -------------------------------------------------------------------------------- /mmdet3d/ops/pointnet_modules/builder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmcv.utils import Registry 3 | 4 | SA_MODULES = Registry('point_sa_module') 5 | 6 | 7 | def build_sa_module(cfg, *args, **kwargs): 8 | """Build PointNet2 set abstraction (SA) module. 9 | 10 | Args: 11 | cfg (None or dict): The SA module config, which should contain: 12 | - type (str): Module type. 13 | - module args: Args needed to instantiate an SA module. 14 | args (argument list): Arguments passed to the `__init__` 15 | method of the corresponding module. 16 | kwargs (keyword arguments): Keyword arguments passed to the `__init__` 17 | method of the corresponding SA module . 18 | 19 | Returns: 20 | nn.Module: Created SA module. 21 | """ 22 | if cfg is None: 23 | cfg_ = dict(type='PointSAModule') 24 | else: 25 | if not isinstance(cfg, dict): 26 | raise TypeError('cfg must be a dict') 27 | if 'type' not in cfg: 28 | raise KeyError('the cfg dict must contain the key "type"') 29 | cfg_ = cfg.copy() 30 | 31 | module_type = cfg_.pop('type') 32 | if module_type not in SA_MODULES: 33 | raise KeyError(f'Unrecognized module type {module_type}') 34 | else: 35 | sa_module = SA_MODULES.get(module_type) 36 | 37 | module = sa_module(*args, **kwargs, **cfg_) 38 | 39 | return module 40 | -------------------------------------------------------------------------------- /mmdet3d/ops/roiaware_pool3d/__init__.py: -------------------------------------------------------------------------------- 1 | from .points_in_boxes import (points_in_boxes_batch, points_in_boxes_cpu, 2 | points_in_boxes_gpu) 3 | from .roiaware_pool3d import RoIAwarePool3d 4 | 5 | __all__ = [ 6 | 'RoIAwarePool3d', 'points_in_boxes_gpu', 'points_in_boxes_cpu', 7 | 'points_in_boxes_batch' 8 | ] 9 | -------------------------------------------------------------------------------- /mmdet3d/ops/spconv/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 Yan Yan 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from .conv import (SparseConv2d, SparseConv3d, SparseConvTranspose2d, 16 | SparseConvTranspose3d, SparseInverseConv2d, 17 | SparseInverseConv3d, SubMConv2d, SubMConv3d) 18 | from .modules import SparseModule, SparseSequential 19 | from .pool import SparseMaxPool2d, SparseMaxPool3d 20 | from .structure import SparseConvTensor, scatter_nd 21 | 22 | __all__ = [ 23 | 'SparseConv2d', 24 | 'SparseConv3d', 25 | 'SubMConv2d', 26 | 'SubMConv3d', 27 | 'SparseConvTranspose2d', 28 | 'SparseConvTranspose3d', 29 | 'SparseInverseConv2d', 30 | 'SparseInverseConv3d', 31 | 'SparseModule', 32 | 'SparseSequential', 33 | 'SparseMaxPool2d', 34 | 'SparseMaxPool3d', 35 | 'SparseConvTensor', 36 | 'scatter_nd', 37 | ] 38 | -------------------------------------------------------------------------------- /mmdet3d/ops/spconv/include/spconv/maxpool.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019 Yan Yan 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #ifndef SPARSE_MAXPOOL_FUNCTOR_H_ 16 | #define SPARSE_MAXPOOL_FUNCTOR_H_ 17 | #include 18 | 19 | namespace spconv { 20 | namespace functor { 21 | template 22 | struct SparseMaxPoolForwardFunctor { 23 | void operator()(const Device& d, tv::TensorView outFeatures, 24 | tv::TensorView inFeatures, 25 | tv::TensorView indices, int size); 26 | }; 27 | 28 | template 29 | struct SparseMaxPoolBackwardFunctor { 30 | void operator()(const Device& d, tv::TensorView outFeatures, 31 | tv::TensorView inFeatures, 32 | tv::TensorView dout, tv::TensorView din, 33 | tv::TensorView indices, int size); 34 | }; 35 | 36 | } // namespace functor 37 | } // namespace spconv 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /mmdet3d/ops/spconv/include/spconv/mp_helper.h: -------------------------------------------------------------------------------- 1 | #ifndef MP_HELPER_H_ 2 | #define MP_HELPER_H_ 3 | #include 4 | #include 5 | 6 | namespace spconv { 7 | template 8 | struct mp_list {}; 9 | 10 | template 11 | using mp_list_c = mp_list...>; 12 | 13 | namespace detail { 14 | 15 | template 16 | constexpr F mp_for_each_impl(mp_list, F &&f) { 17 | return std::initializer_list{(f(T()), 0)...}, std::forward(f); 18 | } 19 | 20 | template 21 | constexpr F mp_for_each_impl(mp_list<>, F &&f) { 22 | return std::forward(f); 23 | } 24 | 25 | } // namespace detail 26 | 27 | namespace detail { 28 | 29 | template class B> 30 | struct mp_rename_impl { 31 | // An error "no type named 'type'" here means that the first argument to 32 | // mp_rename is not a list 33 | }; 34 | 35 | template