From 6e1e5d1a06cbe2f1db5a2502f1e76a522b9e9c92 Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Thu, 6 Jan 2022 00:24:51 +0800 Subject: [PATCH 01/23] Bump to v0.18.0 (#1148) * Update README & getting_started & changelog & version.py * resolve comments * Update the required maximum version of mmcv-full * Update changelog.md * Update getting_started.md * Add highlight in changelog.md --- README.md | 4 ++-- README_zh-CN.md | 4 ++-- docs/en/changelog.md | 27 +++++++++++++++++++++++++++ docs/en/getting_started.md | 29 +++++++++++++++-------------- docs/zh_cn/getting_started.md | 29 +++++++++++++++-------------- mmdet3d/version.py | 2 +- 6 files changed, 62 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index a8254c0a93..6aa7e240a3 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**News**: We released the codebase v0.17.3. +**News**: We released the codebase v0.18.0. In addition, we have preliminarily supported several new models on the [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) branch, including [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) and [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md). @@ -70,7 +70,7 @@ This project is released under the [Apache 2.0 license](LICENSE). ## Changelog -v0.17.3 was released in 1/12/2021. +v0.18.0 was released in 1/1/2022. Please refer to [changelog.md](docs/en/changelog.md) for details and release history. For branch v1.0.0.dev0, please refer to [changelog_v1.0.md](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) for our latest features and more details. diff --git a/README_zh-CN.md b/README_zh-CN.md index c61c84edbb..144067f3f5 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -8,7 +8,7 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**新闻**: 我们发布了版本 v0.17.3. +**新闻**: 我们发布了版本 v0.18.0. 另外,我们在 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) 分支初步支持了多个新模型,包括 [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) 和 [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md)。 @@ -70,7 +70,7 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 ## 更新日志 -最新的版本 v0.17.3 在 2021.12.01 发布。 +最新的版本 v0.18.0 在 2022.1.1 发布。 如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。 对于分支 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) ,请参考 [v1.0 更新日志](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) 来了解我们的最新功能和更多细节。 diff --git a/docs/en/changelog.md b/docs/en/changelog.md index a248295c49..c9453ba05e 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,5 +1,32 @@ ## Changelog +### v0.18.0 (1/1/2021) + +#### Highlights + +- Update the required minimum version of mmdet and mmseg + +#### Improvements + +- Use the official markdownlint hook and add codespell hook for pre-committing (#1088) +- Improve CI operation (#1095, #1102, #1103) +- Use shared menu content from OpenMMLab's theme and remove duplicated contents from config (#1111) +- Refactor the structure of documentation (#1113, #1121) +- Update the required minimum version of mmdet and mmseg (#1147) + +#### Bug Fixes + +- Fix symlink failure on Windows (#1096) +- Fix the upper bound of mmcv version in the mminstall requirements (#1104) +- Fix API documentation compilation and mmcv build errors (#1116) +- Fix figure links and pdf documentation compilation (#1132, #1135) + +#### Contributors + +A total of 4 developers contributed to this release. + +@ZwwWayne, @ZCMax, @Tai-Wang, @wHao-Wu + ### v0.17.3 (1/12/2021) #### Improvements diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md index 287c9ab5ec..71b6cf069f 100644 --- a/docs/en/getting_started.md +++ b/docs/en/getting_started.md @@ -13,20 +13,21 @@ The required versions of MMCV, MMDetection and MMSegmentation for different vers | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.1 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.16.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.15.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.14.0 | mmdet>=2.10.0, <=2.11.0| mmseg==0.14.0 | mmcv-full>=1.3.1, <=1.5.0| -| 0.13.0 | mmdet>=2.10.0, <=2.11.0| Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.12.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.11.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.10.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.9.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.8.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.5.0| -| 0.7.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.5.0| +| 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.1 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.16.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.15.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.14.0 | mmdet>=2.10.0, <=2.11.0| mmseg==0.14.0 | mmcv-full>=1.3.1, <=1.4.0| +| 0.13.0 | mmdet>=2.10.0, <=2.11.0| Not required | mmcv-full>=1.2.4, <=1.4.0| +| 0.12.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.4.0| +| 0.11.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.10.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.9.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.8.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.3.0| +| 0.7.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.3.0| | 0.6.0 | mmdet>=2.4.0, <=2.11.0 | Not required | mmcv-full>=1.1.3, <=1.2.0| | 0.5.0 | 2.3.0 | Not required | mmcv-full==1.0.5| diff --git a/docs/zh_cn/getting_started.md b/docs/zh_cn/getting_started.md index 776dc65c13..7515ed6e0d 100644 --- a/docs/zh_cn/getting_started.md +++ b/docs/zh_cn/getting_started.md @@ -10,20 +10,21 @@ | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.1 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.17.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.16.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.15.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| -| 0.14.0 | mmdet>=2.10.0, <=2.11.0| mmseg>=0.14.0 | mmcv-full>=1.3.1, <=1.5.0| -| 0.13.0 | mmdet>=2.10.0, <=2.11.0| Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.12.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.11.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.10.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.9.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.5.0| -| 0.8.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.5.0| -| 0.7.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.5.0| +| 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.1 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.17.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.16.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.15.0 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| +| 0.14.0 | mmdet>=2.10.0, <=2.11.0| mmseg==0.14.0 | mmcv-full>=1.3.1, <=1.4.0| +| 0.13.0 | mmdet>=2.10.0, <=2.11.0| Not required | mmcv-full>=1.2.4, <=1.4.0| +| 0.12.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.4.0| +| 0.11.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.10.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.9.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.2.4, <=1.3.0| +| 0.8.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.3.0| +| 0.7.0 | mmdet>=2.5.0, <=2.11.0 | Not required | mmcv-full>=1.1.5, <=1.3.0| | 0.6.0 | mmdet>=2.4.0, <=2.11.0 | Not required | mmcv-full>=1.1.3, <=1.2.0| | 0.5.0 | 2.3.0 | Not required | mmcv-full==1.0.5| diff --git a/mmdet3d/version.py b/mmdet3d/version.py index f887a8eae6..a6f77b8062 100644 --- a/mmdet3d/version.py +++ b/mmdet3d/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '0.17.3' +__version__ = '0.18.0' short_version = __version__ From 292eb31d84d39ee0037447ef90c5ee6398d54248 Mon Sep 17 00:00:00 2001 From: Danila Rukhovich Date: Wed, 5 Jan 2022 19:28:53 +0300 Subject: [PATCH 02/23] update imvoxelnet citation (#1153) --- README.md | 2 +- README_zh-CN.md | 2 +- configs/imvoxelnet/README.md | 11 ++++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6aa7e240a3..ae58bd71c9 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Support methods - [x] [FCOS3D (ICCVW'2021)](configs/fcos3d/README.md) - [x] [PointNet++ (NeurIPS'2017)](configs/pointnet2/README.md) - [x] [Group-Free-3D (ICCV'2021)](configs/groupfree3d/README.md) -- [x] [ImVoxelNet (Arxiv'2021)](configs/imvoxelnet/README.md) +- [x] [ImVoxelNet (WACV'2022)](configs/imvoxelnet/README.md) - [x] [PAConv (CVPR'2021)](configs/paconv/README.md) | | ResNet | ResNeXt | SENet |PointNet++ | HRNet | RegNetX | Res2Net | diff --git a/README_zh-CN.md b/README_zh-CN.md index 144067f3f5..309016e36b 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -101,7 +101,7 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 - [x] [FCOS3D (ICCVW'2021)](configs/fcos3d/README.md) - [x] [PointNet++ (NeurIPS'2017)](configs/pointnet2/README.md) - [x] [Group-Free-3D (ICCV'2021)](configs/groupfree3d/README.md) -- [x] [ImVoxelNet (Arxiv'2021)](configs/imvoxelnet/README.md) +- [x] [ImVoxelNet (WACV'2022)](configs/imvoxelnet/README.md) - [x] [PAConv (CVPR'2021)](configs/paconv/README.md) | | ResNet | ResNeXt | SENet |PointNet++ | HRNet | RegNetX | Res2Net | diff --git a/configs/imvoxelnet/README.md b/configs/imvoxelnet/README.md index 325570fe5b..5f3c5f8199 100644 --- a/configs/imvoxelnet/README.md +++ b/configs/imvoxelnet/README.md @@ -9,11 +9,12 @@ Results for SUN RGB-D, ScanNet and nuScenes are currently available in ImVoxelNe [repo](https://github.com/saic-vul/imvoxelnet) (based on mmdetection3d). ``` -@article{rukhovich2021imvoxelnet, - title={ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection}, - author={Danila Rukhovich, Anna Vorontsova, Anton Konushin}, - journal={arXiv preprint arXiv:2106.01178}, - year={2021} +@inproceedings{rukhovich2022imvoxelnet, + title={Imvoxelnet: Image to voxels projection for monocular and multi-view general-purpose 3d object detection}, + author={Rukhovich, Danila and Vorontsova, Anna and Konushin, Anton}, + booktitle={Proceedings of the IEEE/CVF Winter Conference on Applications of Computer Vision}, + pages={2397--2406}, + year={2022} } ``` From c7272063e818bcf33aebc498a017a95c8d065143 Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Tue, 11 Jan 2022 09:07:35 +0800 Subject: [PATCH 03/23] deprecate the support for "python setup.py test" (#1164) --- setup.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.py b/setup.py index 818f721d4c..4856225c4e 100644 --- a/setup.py +++ b/setup.py @@ -217,8 +217,6 @@ def add_mim_extention(): 'Programming Language :: Python :: 3.7', ], license='Apache License 2.0', - setup_requires=parse_requirements('requirements/build.txt'), - tests_require=parse_requirements('requirements/tests.txt'), install_requires=parse_requirements('requirements/runtime.txt'), extras_require={ 'all': parse_requirements('requirements.txt'), From f3a907e546fc02b8b59e89e599640717560f3569 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Mon, 17 Jan 2022 16:03:28 +0800 Subject: [PATCH 04/23] add OpenMMLab website and platform links (#1176) --- README.md | 17 +++++++++++++++++ README_zh-CN.md | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/README.md b/README.md index ae58bd71c9..4f75a1ba7b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,22 @@
+
 
+
+ OpenMMLab website + + + HOT + + +      + OpenMMLab platform + + + TRY IT OUT + + +
+
 
[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmdetection3d.readthedocs.io/en/latest/) diff --git a/README_zh-CN.md b/README_zh-CN.md index 309016e36b..4b872f6a8d 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -1,5 +1,22 @@
+
 
+
+ OpenMMLab 官网 + + + HOT + + +      + OpenMMLab 开放平台 + + + TRY IT OUT + + +
+
 
[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmdetection3d.readthedocs.io/en/latest/) From c8c5e1a9d7ce5d3c8495bec850852230f49d7588 Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:34:19 +0800 Subject: [PATCH 05/23] [Fix] Update regnet metafile (#1184) * update regnet metafile * Add Architechture in RegNet metafile --- configs/regnet/metafile.yml | 42 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/configs/regnet/metafile.yml b/configs/regnet/metafile.yml index c0a6438fbe..18f13b1d1c 100644 --- a/configs/regnet/metafile.yml +++ b/configs/regnet/metafile.yml @@ -1,27 +1,13 @@ -Collections: - - Name: RegNetX - Metadata: - Training Techniques: - - AdamW - Training Resources: 8x V100 GPUs - Architecture: - - Faster R-CNN - - Hard Voxelization - Paper: - URL: https://arxiv.org/abs/2003.13678 - Title: 'Designing Network Design Spaces' - README: configs/regnet/README.md - Code: - URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/backbones/nostem_regnet.py#L7 - Version: v0.5.0 - Models: - Name: hv_pointpillars_regnet-400mf_secfpn_sbn-all_4x8_2x_nus-3d - In Collection: RegNetX + In Collection: PointPillars Config: configs/regnet/hv_pointpillars_regnet-400mf_secfpn_sbn-all_4x8_2x_nus-3d.py Metadata: Training Data: nuScenes Training Memory (GB): 16.4 + Architecture: + - RegNetX + - Hard Voxelization Results: - Task: 3D Object Detection Dataset: nuScenes @@ -31,11 +17,14 @@ Models: Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/regnet/hv_pointpillars_regnet-400mf_secfpn_sbn-all_4x8_2x_nus-3d/hv_pointpillars_regnet-400mf_secfpn_sbn-all_4x8_2x_nus-3d_20200620_230334-53044f32.pth - Name: hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d - In Collection: RegNetX + In Collection: PointPillars Config: configs/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d.py Metadata: Training Data: nuScenes Training Memory (GB): 17.3 + Architecture: + - RegNetX + - Hard Voxelization Results: - Task: 3D Object Detection Dataset: nuScenes @@ -45,11 +34,14 @@ Models: Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d/hv_pointpillars_regnet-400mf_fpn_sbn-all_4x8_2x_nus-3d_20200620_230239-c694dce7.pth - Name: hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d - In Collection: RegNetX + In Collection: PointPillars Config: configs/regnet/hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d.py Metadata: Training Data: nuScenes Training Memory (GB): 24.0 + Architecture: + - RegNetX + - Hard Voxelization Results: - Task: 3D Object Detection Dataset: nuScenes @@ -59,11 +51,14 @@ Models: Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/regnet/hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d/hv_pointpillars_regnet-1.6gf_fpn_sbn-all_4x8_2x_nus-3d_20200629_050311-dcd4e090.pth - Name: hv_pointpillars_regnet-400mf_secfpn_sbn-all_2x8_2x_lyft-3d - In Collection: RegNetX + In Collection: PointPillars Config: configs/regnet/hv_pointpillars_regnet-400mf_secfpn_sbn-all_2x8_2x_lyft-3d.py Metadata: Training Data: Lyft Training Memory (GB): 15.9 + Architecture: + - RegNetX + - Hard Voxelization Results: - Task: 3D Object Detection Dataset: Lyft @@ -73,11 +68,14 @@ Models: Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/regnet/hv_pointpillars_regnet-400mf_secfpn_sbn-all_2x8_2x_lyft-3d/hv_pointpillars_regnet-400mf_secfpn_sbn-all_2x8_2x_lyft-3d_20210524_092151-42513826.pth - Name: hv_pointpillars_regnet-400mf_fpn_sbn-all_2x8_2x_lyft-3d - In Collection: RegNetX + In Collection: PointPillars Config: configs/regnet/hv_pointpillars_regnet-400mf_fpn_sbn-all_2x8_2x_lyft-3d.py Metadata: Training Data: Lyft Training Memory (GB): 13.0 + Architecture: + - RegNetX + - Hard Voxelization Results: - Task: 3D Object Detection Dataset: Lyft From 19f7461c7270ed6a746ed617b00cf666a9d79169 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 19 Jan 2022 22:54:42 +0800 Subject: [PATCH 06/23] fix axis=0 rotation in master branch (#1182) --- mmdet3d/core/points/base_points.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mmdet3d/core/points/base_points.py b/mmdet3d/core/points/base_points.py index 31b8cecc11..b40e68431f 100644 --- a/mmdet3d/core/points/base_points.py +++ b/mmdet3d/core/points/base_points.py @@ -165,9 +165,9 @@ def rotate(self, rotation, axis=None): [rot_sin, rot_cos, 0], [0, 0, 1]]) elif axis == 0: - rot_mat_T = rotation.new_tensor([[0, rot_cos, -rot_sin], - [0, rot_sin, rot_cos], - [1, 0, 0]]) + rot_mat_T = rotation.new_tensor([[1, 0, 0], + [0, rot_cos, -rot_sin], + [0, rot_sin, rot_cos]]) else: raise ValueError('axis should in range') rot_mat_T = rot_mat_T.T From fab8ea75ab4e06b7a04b4ff976e81812df66d3ec Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 19 Jan 2022 22:55:50 +0800 Subject: [PATCH 07/23] [Enhance] support semantic seg in Flip3D augmentation (#1181) * support semantic seg in flip * change box_dtype_3d to bbox3d_fields --- mmdet3d/datasets/pipelines/transforms_3d.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mmdet3d/datasets/pipelines/transforms_3d.py b/mmdet3d/datasets/pipelines/transforms_3d.py index 388b853fa5..dc34004d65 100644 --- a/mmdet3d/datasets/pipelines/transforms_3d.py +++ b/mmdet3d/datasets/pipelines/transforms_3d.py @@ -112,6 +112,10 @@ def random_flip_data_3d(self, input_dict, direction='horizontal'): updated in the result dict. """ assert direction in ['horizontal', 'vertical'] + # for semantic segmentation task, only points will be flipped. + if 'bbox3d_fields' not in input_dict: + input_dict['points'].flip(direction) + return if len(input_dict['bbox3d_fields']) == 0: # test mode input_dict['bbox3d_fields'].append('empty_box3d') input_dict['empty_box3d'] = input_dict['box_type_3d']( @@ -148,7 +152,7 @@ def __call__(self, input_dict): 'pcd_horizontal_flip' and 'pcd_vertical_flip' keys are added \ into result dict. """ - # filp 2D image and its annotations + # flip 2D image and its annotations super(RandomFlip3D, self).__call__(input_dict) if self.sync_2d: @@ -916,11 +920,11 @@ def __call__(self, results): """ points = results['points'] # Points in Camera coord can provide the depth information. - # TODO: Need to suport distance-based sampling for other coord system. + # TODO: Need to support distance-based sampling for other coord system. if self.sample_range is not None: from mmdet3d.core.points import CameraPoints assert isinstance(points, CameraPoints), \ - 'Sampling based on distance is only appliable for CAMERA coord' + 'Sampling based on distance is only applicable for CAM coord' points, choices = self._points_random_sampling( points, self.num_points, @@ -1288,7 +1292,7 @@ class VoxelBasedPointSampler(object): Args: cur_sweep_cfg (dict): Config for sampling current points. prev_sweep_cfg (dict): Config for sampling previous points. - time_dim (int): Index that indicate the time dimention + time_dim (int): Index that indicate the time dimension for input points. """ @@ -1312,7 +1316,7 @@ def _sample_points(self, points, sampler, point_dim): points (np.ndarray): Points subset to be sampled. sampler (VoxelGenerator): Voxel based sampler for each points subset. - point_dim (int): The dimention of each points + point_dim (int): The dimension of each points Returns: np.ndarray: Sampled points. @@ -1393,7 +1397,7 @@ def __call__(self, results): points_numpy = points_numpy.squeeze(1) results['points'] = points.new_point(points_numpy[..., :original_dim]) - # Restore the correspoinding seg and mask fields + # Restore the corresponding seg and mask fields for key, dim_index in map_fields2dim: results[key] = points_numpy[..., dim_index] From 44aeaf3753dbf20be7d39d41d80e0d13aa9e36d3 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 19 Jan 2022 22:58:38 +0800 Subject: [PATCH 08/23] add point cloud annotation in doc (#1185) --- docs/en/faq.md | 9 +++++++++ docs/zh_cn/faq.md | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/docs/en/faq.md b/docs/en/faq.md index 417b0eddce..112b9609db 100644 --- a/docs/en/faq.md +++ b/docs/en/faq.md @@ -36,3 +36,12 @@ We list some potential troubles encountered by users and developers, along with or ``pip install -e "git+https://github.com/ppwwyyxx/cocoapi#egg=pycocotools&subdirectory=PythonAPI"`` + +## How to annotate point cloud? + +MMDetection3D does not support point cloud annotation. Some open-source annotation tool are offered for reference: + +- [SUSTechPOINTS](https://github.com/naurril/SUSTechPOINTS) +- [LATTE](https://github.com/bernwang/latte) + +Besides, we improved [LATTE](https://github.com/bernwang/latte) for better use. More details can be found [here](https://arxiv.org/abs/2011.10174). diff --git a/docs/zh_cn/faq.md b/docs/zh_cn/faq.md index b235f12504..d473aa2a03 100644 --- a/docs/zh_cn/faq.md +++ b/docs/zh_cn/faq.md @@ -36,3 +36,12 @@ 或者 ``pip install -e "git+https://github.com/ppwwyyxx/cocoapi#egg=pycocotools&subdirectory=PythonAPI"`` + +## 如何标注点云? + +MMDetection3D 不支持点云标注。我们提供一些开源的标注工具供参考: + +- [SUSTechPOINTS](https://github.com/naurril/SUSTechPOINTS) +- [LATTE](https://github.com/bernwang/latte) + +此外,我们改进了 [LATTE](https://github.com/bernwang/latte) 以便更方便的标注。 更多的细节请参考 [这里](https://arxiv.org/abs/2011.10174)。 From 641539bdfe5fd5764864edb5fff45b7cd4420e35 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Thu, 27 Jan 2022 00:18:58 +0800 Subject: [PATCH 09/23] [Fix] Fix bug in non-distributed multi-gpu training/testing (#1197) * Fix bug in non-distributed multi-gpu training/testing * add deprecated warning to void BC-breaking --- tools/test.py | 23 ++++++++++++++++++++++- tools/train.py | 25 ++++++++++++++++++++----- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/tools/test.py b/tools/test.py index 10058bcf5f..a2ac25a315 100644 --- a/tools/test.py +++ b/tools/test.py @@ -28,6 +28,18 @@ def parse_args(): action='store_true', help='Whether to fuse conv and bn, this will slightly increase' 'the inference speed') + parser.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed training)') + parser.add_argument( + '--gpu-id', + type=int, + default=0, + help='id of gpu to use ' + '(only applicable to non-distributed testing)') parser.add_argument( '--format-only', action='store_true', @@ -140,6 +152,15 @@ def main(): for ds_cfg in cfg.data.test: ds_cfg.pipeline = replace_ImageToTensor(ds_cfg.pipeline) + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed testing. Use the first GPU ' + 'in `gpu_ids` now.') + else: + cfg.gpu_ids = [args.gpu_id] + # init distributed env first, since logger depends on the dist info. if args.launcher == 'none': distributed = False @@ -183,7 +204,7 @@ def main(): model.PALETTE = dataset.PALETTE if not distributed: - model = MMDataParallel(model, device_ids=[0]) + model = MMDataParallel(model, device_ids=cfg.gpu_ids) outputs = single_gpu_test(model, data_loader, args.show, args.show_dir) else: model = MMDistributedDataParallel( diff --git a/tools/train.py b/tools/train.py index 330c925c33..2510fdac83 100644 --- a/tools/train.py +++ b/tools/train.py @@ -36,13 +36,19 @@ def parse_args(): group_gpus.add_argument( '--gpus', type=int, - help='number of gpus to use ' + help='(Deprecated, please use --gpu-id) number of gpus to use ' '(only applicable to non-distributed training)') group_gpus.add_argument( '--gpu-ids', type=int, nargs='+', - help='ids of gpus to use ' + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed training)') + group_gpus.add_argument( + '--gpu-id', + type=int, + default=0, + help='number of gpus to use ' '(only applicable to non-distributed training)') parser.add_argument('--seed', type=int, default=0, help='random seed') parser.add_argument( @@ -112,10 +118,19 @@ def main(): osp.splitext(osp.basename(args.config))[0]) if args.resume_from is not None: cfg.resume_from = args.resume_from + if args.gpus is not None: + cfg.gpu_ids = range(1) + warnings.warn('`--gpus` is deprecated because we only support ' + 'single GPU mode in non-distributed training. ' + 'Use `gpus=1` now.') if args.gpu_ids is not None: - cfg.gpu_ids = args.gpu_ids - else: - cfg.gpu_ids = range(1) if args.gpus is None else range(args.gpus) + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed training. Use the first GPU ' + 'in `gpu_ids` now.') + if args.gpus is None and args.gpu_ids is None: + cfg.gpu_ids = [args.gpu_id] if args.autoscale_lr: # apply the linear scaling rule (https://arxiv.org/abs/1706.02677) From b4240bd665686b062e987a61ff33c4d5a57242cd Mon Sep 17 00:00:00 2001 From: Tai-Wang Date: Thu, 27 Jan 2022 00:29:08 +0800 Subject: [PATCH 10/23] Add missing explanation of cam_intrinsic in the nuScenes dataset doc (#1193) --- docs/en/datasets/nuscenes_det.md | 2 +- docs/zh_cn/datasets/nuscenes_det.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/datasets/nuscenes_det.md b/docs/en/datasets/nuscenes_det.md index b2192dbf27..76995c7edd 100644 --- a/docs/en/datasets/nuscenes_det.md +++ b/docs/en/datasets/nuscenes_det.md @@ -77,7 +77,7 @@ Next, we will elaborate on the details recorded in these info files. - info['sweeps'][i]['sensor2lidar_translation']: The translation from the current sensor (for collecting the sweep data) to lidar. (1x3 list) - info['sweeps'][i]['sensor2lidar_rotation']: The rotation from the current sensor (for collecting the sweep data) to lidar. (1x4 list in the quaternion format) - info['cams']: Cameras calibration information. It contains six keys corresponding to each camera: `'CAM_FRONT'`, `'CAM_FRONT_RIGHT'`, `'CAM_FRONT_LEFT'`, `'CAM_BACK'`, `'CAM_BACK_LEFT'`, `'CAM_BACK_RIGHT'`. - Each dictionary contains detailed information following the above way for each sweep data (has the same keys for each information as above). + Each dictionary contains detailed information following the above way for each sweep data (has the same keys for each information as above). In addition, each camera has a key `'cam_intrinsic'` for recording the intrinsic parameters when projecting 3D points to each image plane. - info['lidar2ego_translation']: The translation from lidar to ego vehicle. (1x3 list) - info['lidar2ego_rotation']: The rotation from lidar to ego vehicle. (1x4 list in the quaternion format) - info['ego2global_translation']: The translation from the ego vehicle to global coordinates. (1x3 list) diff --git a/docs/zh_cn/datasets/nuscenes_det.md b/docs/zh_cn/datasets/nuscenes_det.md index e4b6c84f45..18b426bd3d 100644 --- a/docs/zh_cn/datasets/nuscenes_det.md +++ b/docs/zh_cn/datasets/nuscenes_det.md @@ -78,7 +78,7 @@ mmdetection3d - info['sweeps'][i]['sensor2lidar_translation']:从当前传感器(用于收集扫描数据)到激光雷达的转换(1x3 列表)。 - info['sweeps'][i]['sensor2lidar_rotation']:从当前传感器(用于收集扫描数据)到激光雷达的旋转(四元数格式的 1x4 列表)。 - info['cams']:相机校准信息。它包含与每个摄像头对应的六个键值: `'CAM_FRONT'`, `'CAM_FRONT_RIGHT'`, `'CAM_FRONT_LEFT'`, `'CAM_BACK'`, `'CAM_BACK_LEFT'`, `'CAM_BACK_RIGHT'`。 - 每个字典包含每个扫描数据按照上述方式的详细信息(每个信息的关键字与上述相同)。 + 每个字典包含每个扫描数据按照上述方式的详细信息(每个信息的关键字与上述相同)。除此之外,每个相机还包含了一个键值 `'cam_intrinsic'` 用来保存 3D 点投影到图像平面上需要的内参信息。 - info['lidar2ego_translation']:从激光雷达到自车的转换(1x3 列表)。 - info['lidar2ego_rotation']:从激光雷达到自车的旋转(四元数格式的 1x4 列表)。 - info['ego2global_translation']:从自车到全局坐标的转换(1x3 列表)。 From c0d009044af7f643f08cc1373925c6ce7bbd0fce Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Tue, 8 Feb 2022 16:35:32 +0800 Subject: [PATCH 11/23] [Fix] Fix corner bug in different coordinates (#1212) * fix corner bug in cam coord * fix corner bugs in depth & lidar coord --- mmdet3d/core/bbox/structures/cam_box3d.py | 6 +++--- mmdet3d/core/bbox/structures/depth_box3d.py | 6 +++--- mmdet3d/core/bbox/structures/lidar_box3d.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mmdet3d/core/bbox/structures/cam_box3d.py b/mmdet3d/core/bbox/structures/cam_box3d.py index 52488e9d5e..ba0a2cb994 100644 --- a/mmdet3d/core/bbox/structures/cam_box3d.py +++ b/mmdet3d/core/bbox/structures/cam_box3d.py @@ -124,9 +124,9 @@ def corners(self): v down y """ - # TODO: rotation_3d_in_axis function do not support - # empty tensor currently. - assert len(self.tensor) != 0 + if self.tensor.numel() == 0: + return torch.empty([0, 8, 3], device=self.tensor.device) + dims = self.dims corners_norm = torch.from_numpy( np.stack(np.unravel_index(np.arange(8), [2] * 3), axis=1)).to( diff --git a/mmdet3d/core/bbox/structures/depth_box3d.py b/mmdet3d/core/bbox/structures/depth_box3d.py index 69ce1e9082..50d20736ae 100644 --- a/mmdet3d/core/bbox/structures/depth_box3d.py +++ b/mmdet3d/core/bbox/structures/depth_box3d.py @@ -71,9 +71,9 @@ def corners(self): (x0, y0, z0) + ----------- + --------> right x (x1, y0, z0) """ - # TODO: rotation_3d_in_axis function do not support - # empty tensor currently. - assert len(self.tensor) != 0 + if self.tensor.numel() == 0: + return torch.empty([0, 8, 3], device=self.tensor.device) + dims = self.dims corners_norm = torch.from_numpy( np.stack(np.unravel_index(np.arange(8), [2] * 3), axis=1)).to( diff --git a/mmdet3d/core/bbox/structures/lidar_box3d.py b/mmdet3d/core/bbox/structures/lidar_box3d.py index 6c6a61c945..d007f59ffa 100644 --- a/mmdet3d/core/bbox/structures/lidar_box3d.py +++ b/mmdet3d/core/bbox/structures/lidar_box3d.py @@ -69,9 +69,9 @@ def corners(self): left y<-------- + ----------- + (x0, y1, z0) (x0, y0, z0) """ - # TODO: rotation_3d_in_axis function do not support - # empty tensor currently. - assert len(self.tensor) != 0 + if self.tensor.numel() == 0: + return torch.empty([0, 8, 3], device=self.tensor.device) + dims = self.dims corners_norm = torch.from_numpy( np.stack(np.unravel_index(np.arange(8), [2] * 3), axis=1)).to( From f45977008a52baaf97640a0e9b2bbe5ea1c4be34 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 9 Feb 2022 17:06:15 +0800 Subject: [PATCH 12/23] Bump to v0.18.1 (#1218) * bump to v0.18.1 * fix comments --- README.md | 4 ++-- README_zh-CN.md | 4 ++-- docs/en/changelog.md | 24 +++++++++++++++++++++++- docs/en/getting_started.md | 1 + docs/zh_cn/getting_started.md | 1 + mmdet3d/version.py | 2 +- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4f75a1ba7b..0080bbcd39 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**News**: We released the codebase v0.18.0. +**News**: We released the codebase v0.18.1. In addition, we have preliminarily supported several new models on the [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) branch, including [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) and [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md). @@ -87,7 +87,7 @@ This project is released under the [Apache 2.0 license](LICENSE). ## Changelog -v0.18.0 was released in 1/1/2022. +v0.18.1 was released in 1/2/2022. Please refer to [changelog.md](docs/en/changelog.md) for details and release history. For branch v1.0.0.dev0, please refer to [changelog_v1.0.md](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) for our latest features and more details. diff --git a/README_zh-CN.md b/README_zh-CN.md index 4b872f6a8d..e4931c2a74 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -25,7 +25,7 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**新闻**: 我们发布了版本 v0.18.0. +**新闻**: 我们发布了版本 v0.18.1. 另外,我们在 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) 分支初步支持了多个新模型,包括 [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) 和 [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md)。 @@ -87,7 +87,7 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 ## 更新日志 -最新的版本 v0.18.0 在 2022.1.1 发布。 +最新的版本 v0.18.1 在 2022.2.1 发布。 如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。 对于分支 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) ,请参考 [v1.0 更新日志](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) 来了解我们的最新功能和更多细节。 diff --git a/docs/en/changelog.md b/docs/en/changelog.md index c9453ba05e..515cdcd804 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,6 +1,28 @@ ## Changelog -### v0.18.0 (1/1/2021) +### v0.18.1 (1/2/2022) + +#### Improvements + +- Support Flip3D augmentation in semantic segmentation task (#1182) +- Update regnet metafile (#1184) +- Add point cloud annotation tools introduction in FAQ (#1185) +- Add missing explanations of `cam_intrinsic` in the nuScenes dataset doc (#1193) + +#### Bug Fixes + +- Deprecate the support for "python setup.py test" (#1164) +- Fix the rotation matrix while rotation axis=0 (#1182) +- Fix the bug in non-distributed multi-gpu training/testing (#1197) +- Fix a potential bug when generating corners for empty bounding boxes (#1212) + +#### Contributors + +A total of 4 developers contributed to this release. + +@ZwwWayne, @ZCMax, @Tai-Wang, @wHao-Wu + +### v0.18.0 (1/1/2022) #### Highlights diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md index 71b6cf069f..8618e79645 100644 --- a/docs/en/getting_started.md +++ b/docs/en/getting_started.md @@ -13,6 +13,7 @@ The required versions of MMCV, MMDetection and MMSegmentation for different vers | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| 0.18.1 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| | 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| diff --git a/docs/zh_cn/getting_started.md b/docs/zh_cn/getting_started.md index 7515ed6e0d..5f79707693 100644 --- a/docs/zh_cn/getting_started.md +++ b/docs/zh_cn/getting_started.md @@ -10,6 +10,7 @@ | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| 0.18.1 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| | 0.17.2 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| diff --git a/mmdet3d/version.py b/mmdet3d/version.py index a6f77b8062..6067966a77 100644 --- a/mmdet3d/version.py +++ b/mmdet3d/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '0.18.0' +__version__ = '0.18.1' short_version = __version__ From 408c4e658f769bf55774e79fd9da93d036d733db Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 9 Feb 2022 19:25:15 +0800 Subject: [PATCH 13/23] update bazel version (#1223) --- docs/en/datasets/waymo_det.md | 9 +++++++-- docs/zh_cn/datasets/waymo_det.md | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/en/datasets/waymo_det.md b/docs/en/datasets/waymo_det.md index 84a955b995..d86d003b2f 100644 --- a/docs/en/datasets/waymo_det.md +++ b/docs/en/datasets/waymo_det.md @@ -104,16 +104,21 @@ Considering there are many similar frames in the original dataset, we can basica For evaluation on Waymo, please follow the [instruction](https://github.com/waymo-research/waymo-open-dataset/blob/master/docs/quick_start.md/) to build the binary file `compute_detection_metrics_main` for metrics computation and put it into `mmdet3d/core/evaluation/waymo_utils/`. Basically, you can follow the commands below to install `bazel` and build the file. ```shell + # download the code and enter the base directory git clone https://github.com/waymo-research/waymo-open-dataset.git waymo-od cd waymo-od git checkout remotes/origin/master + # use the Bazel build system sudo apt-get install --assume-yes pkg-config zip g++ zlib1g-dev unzip python3 python3-pip - wget https://github.com/bazelbuild/bazel/releases/download/0.28.0/bazel-0.28.0-installer-linux-x86_64.sh - sudo bash bazel-0.28.0-installer-linux-x86_64.sh + BAZEL_VERSION=3.1.0 + wget https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh + sudo bash bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh sudo apt install build-essential + # configure .bazelrc ./configure.sh + # delete previous bazel outputs and reset internal caches bazel clean bazel build waymo_open_dataset/metrics/tools/compute_detection_metrics_main diff --git a/docs/zh_cn/datasets/waymo_det.md b/docs/zh_cn/datasets/waymo_det.md index fe5e764ad3..acadf9e1d7 100644 --- a/docs/zh_cn/datasets/waymo_det.md +++ b/docs/zh_cn/datasets/waymo_det.md @@ -104,16 +104,21 @@ mmdetection3d 为了在 Waymo 数据集上进行检测性能评估,请按照[此处指示](https://github.com/waymo-research/waymo-open-dataset/blob/master/docs/quick_start.md/)构建用于计算评估指标的二进制文件 `compute_detection_metrics_main`,并将它置于 `mmdet3d/core/evaluation/waymo_utils/` 下。您基本上可以按照下方命令安装 `bazel`,然后构建二进制文件: ```shell + # download the code and enter the base directory git clone https://github.com/waymo-research/waymo-open-dataset.git waymo-od cd waymo-od git checkout remotes/origin/master + # use the Bazel build system sudo apt-get install --assume-yes pkg-config zip g++ zlib1g-dev unzip python3 python3-pip - wget https://github.com/bazelbuild/bazel/releases/download/0.28.0/bazel-0.28.0-installer-linux-x86_64.sh - sudo bash bazel-0.28.0-installer-linux-x86_64.sh + BAZEL_VERSION=3.1.0 + wget https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh + sudo bash bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh sudo apt install build-essential + # configure .bazelrc ./configure.sh + # delete previous bazel outputs and reset internal caches bazel clean bazel build waymo_open_dataset/metrics/tools/compute_detection_metrics_main From a63f66f735f229d5f52523a88acf632485e51d99 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 9 Feb 2022 19:29:48 +0800 Subject: [PATCH 14/23] [Fix] fix pointpillars bug on kitti in master branch (#1163) * fix pointpillars bug on kitti in master branch * replace with AlignedAnchorGenerator --- configs/_base_/models/hv_pointpillars_secfpn_kitti.py | 8 ++++---- mmdet3d/datasets/kitti_dataset.py | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/configs/_base_/models/hv_pointpillars_secfpn_kitti.py b/configs/_base_/models/hv_pointpillars_secfpn_kitti.py index 85076d0798..65e727daa0 100644 --- a/configs/_base_/models/hv_pointpillars_secfpn_kitti.py +++ b/configs/_base_/models/hv_pointpillars_secfpn_kitti.py @@ -35,11 +35,11 @@ feat_channels=384, use_direction_classifier=True, anchor_generator=dict( - type='Anchor3DRangeGenerator', + type='AlignedAnchor3DRangeGenerator', ranges=[ - [0, -39.68, -0.6, 70.4, 39.68, -0.6], - [0, -39.68, -0.6, 70.4, 39.68, -0.6], - [0, -39.68, -1.78, 70.4, 39.68, -1.78], + [0, -39.68, -0.6, 69.12, 39.68, -0.6], + [0, -39.68, -0.6, 69.12, 39.68, -0.6], + [0, -39.68, -1.78, 69.12, 39.68, -1.78], ], sizes=[[0.6, 0.8, 1.73], [0.6, 1.76, 1.73], [1.6, 3.9, 1.56]], rotations=[0, 1.57], diff --git a/mmdet3d/datasets/kitti_dataset.py b/mmdet3d/datasets/kitti_dataset.py index 9b5a8b5a07..bd8e3b58a2 100644 --- a/mmdet3d/datasets/kitti_dataset.py +++ b/mmdet3d/datasets/kitti_dataset.py @@ -151,12 +151,14 @@ def get_ann_info(self, index): - gt_bboxes (np.ndarray): 2D ground truth bboxes. - gt_labels (np.ndarray): Labels of ground truths. - gt_names (list[str]): Class names of ground truths. + - difficulty (int): kitti difficulty. """ # Use index to get the annos, thus the evalhook could also use this api info = self.data_infos[index] rect = info['calib']['R0_rect'].astype(np.float32) Trv2c = info['calib']['Tr_velo_to_cam'].astype(np.float32) + difficulty = info['annos']['difficulty'] annos = info['annos'] # we need other objects to avoid collision when sample annos = self.remove_dontcare(annos) @@ -190,7 +192,8 @@ def get_ann_info(self, index): gt_labels_3d=gt_labels_3d, bboxes=gt_bboxes, labels=gt_labels, - gt_names=gt_names) + gt_names=gt_names, + difficulty=difficulty) return anns_results def drop_arrays_by_name(self, gt_names, used_classes): @@ -314,7 +317,7 @@ def evaluate(self, pklfile_prefix (str | None): The prefix of pkl files. It includes the file path and the prefix of filename, e.g., "a/b/prefix". If not specified, a temp file will be created. Default: None. - submission_prefix (str | None): The prefix of submission datas. + submission_prefix (str | None): The prefix of submission data. If not specified, the submission data will not be generated. show (bool): Whether to visualize. Default: False. From dabe3ff4deaedef4c030b026c6f5a131d3d9be70 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 9 Feb 2022 23:14:36 +0800 Subject: [PATCH 15/23] Update the installation of MMCV (#1226) --- .github/workflows/build.yml | 8 ++++---- docs/en/getting_started.md | 7 +++++++ docs/zh_cn/getting_started.md | 7 +++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c8677ade1c..4b2cd1917e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,22 +41,22 @@ jobs: torch: [1.5.0+cu101, 1.6.0+cu101, 1.7.0+cu101, 1.8.0+cu101] include: - torch: 1.5.0+cu101 - torch_version: torch1.5.0 + torch_version: torch1.5 torchvision: 0.6.0+cu101 mmcv_link: "torch1.5.0" cuda_arch: "7.0" - torch: 1.6.0+cu101 - torch_version: torch1.6.0 + torch_version: torch1.6 mmcv_link: "torch1.6.0" torchvision: 0.7.0+cu101 cuda_arch: "7.0" - torch: 1.7.0+cu101 - torch_version: torch1.7.0 + torch_version: torch1.7 mmcv_link: "torch1.7.0" torchvision: 0.8.1+cu101 cuda_arch: "7.0" - torch: 1.8.0+cu101 - torch_version: torch1.8.0 + torch_version: torch1.8 mmcv_link: "torch1.8.0" torchvision: 0.9.0+cu101 cuda_arch: "7.0" diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md index 8618e79645..4ff2e380fa 100644 --- a/docs/en/getting_started.md +++ b/docs/en/getting_started.md @@ -84,6 +84,13 @@ Please replace `{cu_version}` and `{torch_version}` in the url to your desired o pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html ``` +mmcv-full is only compiled on PyTorch 1.x.0 because the compatibility usually holds between 1.x.0 and 1.x.1. If your PyTorch version is 1.x.1, you can install mmcv-full compiled with PyTorch 1.x.0 and it usually works well. + +```shell +# We can ignore the micro version of PyTorch +pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7/index.html +``` + See [here](https://github.com/open-mmlab/mmcv#install-with-pip) for different versions of MMCV compatible to different PyTorch and CUDA versions. Optionally, you could also build the full version from source: diff --git a/docs/zh_cn/getting_started.md b/docs/zh_cn/getting_started.md index 5f79707693..7de264a6c4 100644 --- a/docs/zh_cn/getting_started.md +++ b/docs/zh_cn/getting_started.md @@ -76,6 +76,13 @@ pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{ pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html ``` +PyTorch 在 1.x.0 和 1.x.1 之间通常是兼容的,故 mmcv-full 只提供 1.x.0 的编译包。如果你的 PyTorch 版本是 1.x.1,你可以放心地安装在 1.x.0 版本编译的 mmcv-full。 + +``` +# 我们可以忽略 PyTorch 的小版本号 +pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7/index.html +``` + 请参考 [MMCV](https://mmcv.readthedocs.io/en/latest/#installation) 获取不同版本的 MMCV 所兼容的的不同的 PyTorch 和 CUDA 版本。同时,也可以通过以下命令行从源码编译 MMCV: ```shell From 2e8bda4eb9870c3fb6b57a4c15c136c2d0d5eb0a Mon Sep 17 00:00:00 2001 From: Double-Z Date: Wed, 16 Feb 2022 17:42:56 +0800 Subject: [PATCH 16/23] [Fix] Fix a potential overflow bug when post_max_size is set too large in the circle_nms (#1225) * [Fix] overflow bug * [Fix] typo Co-authored-by: zeyuzeng Co-authored-by: zeyu-hello --- mmdet3d/core/post_processing/box3d_nms.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mmdet3d/core/post_processing/box3d_nms.py b/mmdet3d/core/post_processing/box3d_nms.py index c2bfcb0267..a8d6521d6f 100644 --- a/mmdet3d/core/post_processing/box3d_nms.py +++ b/mmdet3d/core/post_processing/box3d_nms.py @@ -219,4 +219,8 @@ def circle_nms(dets, thresh, post_max_size=83): # ovr = inter / areas[j] if dist <= thresh: suppressed[j] = 1 - return keep[:post_max_size] + + if post_max_size < len(keep): + return keep[:post_max_size] + + return keep From b6c10f5ca862f5481cf660fab48d42b8540483e1 Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Wed, 16 Feb 2022 17:48:15 +0800 Subject: [PATCH 17/23] Fix PointRCNN bugs (#1224) --- configs/_base_/models/point_rcnn.py | 9 ++++-- .../samplers/iou_neg_piecewise_sampler.py | 4 +-- mmdet3d/models/dense_heads/point_rpn_head.py | 29 +++++++++++++++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/configs/_base_/models/point_rcnn.py b/configs/_base_/models/point_rcnn.py index 7a9667e733..02a1414f7d 100644 --- a/configs/_base_/models/point_rcnn.py +++ b/configs/_base_/models/point_rcnn.py @@ -91,7 +91,8 @@ pos_iou_thr=0.55, neg_iou_thr=0.55, min_pos_iou=0.55, - ignore_iof_thr=-1), + ignore_iof_thr=-1, + match_low_quality=False), dict( # for Pedestrian type='MaxIoUAssigner', iou_calculator=dict( @@ -99,7 +100,8 @@ pos_iou_thr=0.55, neg_iou_thr=0.55, min_pos_iou=0.55, - ignore_iof_thr=-1), + ignore_iof_thr=-1, + match_low_quality=False), dict( # for Cyclist type='MaxIoUAssigner', iou_calculator=dict( @@ -107,7 +109,8 @@ pos_iou_thr=0.55, neg_iou_thr=0.55, min_pos_iou=0.55, - ignore_iof_thr=-1) + ignore_iof_thr=-1, + match_low_quality=False) ], sampler=dict( type='IoUNegPiecewiseSampler', diff --git a/mmdet3d/core/bbox/samplers/iou_neg_piecewise_sampler.py b/mmdet3d/core/bbox/samplers/iou_neg_piecewise_sampler.py index c0de845f68..cbd8483cad 100644 --- a/mmdet3d/core/bbox/samplers/iou_neg_piecewise_sampler.py +++ b/mmdet3d/core/bbox/samplers/iou_neg_piecewise_sampler.py @@ -60,9 +60,7 @@ def _sample_neg(self, assign_result, num_expected, **kwargs): if neg_inds.numel() != 0: neg_inds = neg_inds.squeeze(1) if len(neg_inds) <= 0: - raise NotImplementedError( - 'Not support sampling the negative samples when the length ' - 'of negative samples is 0') + return neg_inds.squeeze(1) else: neg_inds_choice = neg_inds.new_zeros([0]) extend_num = 0 diff --git a/mmdet3d/models/dense_heads/point_rpn_head.py b/mmdet3d/models/dense_heads/point_rpn_head.py index 50cc9d5525..48ed1324e4 100644 --- a/mmdet3d/models/dense_heads/point_rpn_head.py +++ b/mmdet3d/models/dense_heads/point_rpn_head.py @@ -272,7 +272,8 @@ def get_bboxes(self, bbox3d = self.bbox_coder.decode(bbox_preds[b], points[b, ..., :3], object_class[b]) bbox_selected, score_selected, labels, cls_preds_selected = \ - self.class_agnostic_nms(obj_scores[b], sem_scores[b], bbox3d) + self.class_agnostic_nms(obj_scores[b], sem_scores[b], bbox3d, + points[b, ..., :3], input_metas[b]) bbox = input_metas[b]['box_type_3d']( bbox_selected.clone(), box_dim=bbox_selected.shape[-1], @@ -280,7 +281,8 @@ def get_bboxes(self, results.append((bbox, score_selected, labels, cls_preds_selected)) return results - def class_agnostic_nms(self, obj_scores, sem_scores, bbox): + def class_agnostic_nms(self, obj_scores, sem_scores, bbox, points, + input_meta): """Class agnostic nms. Args: @@ -298,6 +300,29 @@ def class_agnostic_nms(self, obj_scores, sem_scores, bbox): else: nms_func = nms_normal_gpu + num_bbox = bbox.shape[0] + bbox = input_meta['box_type_3d']( + bbox.clone(), + box_dim=bbox.shape[-1], + with_yaw=True, + origin=(0.5, 0.5, 0.5)) + + if isinstance(bbox, LiDARInstance3DBoxes): + box_idx = bbox.points_in_boxes(points) + box_indices = box_idx.new_zeros([num_bbox + 1]) + box_idx[box_idx == -1] = num_bbox + box_indices.scatter_add_(0, box_idx.long(), + box_idx.new_ones(box_idx.shape)) + box_indices = box_indices[:-1] + nonempty_box_mask = box_indices >= 0 + elif isinstance(bbox, DepthInstance3DBoxes): + box_indices = bbox.points_in_boxes(points) + nonempty_box_mask = box_indices.T.sum(1) >= 0 + else: + raise NotImplementedError('Unsupported bbox type!') + + bbox = bbox.tensor[nonempty_box_mask] + if self.test_cfg.score_thr is not None: score_thr = self.test_cfg.score_thr keep = (obj_scores >= score_thr) From 4a7e5609a9db54a098cfd7c958866635f685d3d3 Mon Sep 17 00:00:00 2001 From: maskjp Date: Wed, 16 Feb 2022 04:10:27 -0600 Subject: [PATCH 18/23] fix bug to allow pointnet to train in fp16 (#1207) * fix bug to allow pointnet to train in fp16 * remove unused import * fix lint * fix lint for gather_points_cuda.cu Co-authored-by: peng --- mmdet3d/ops/gather_points/gather_points.py | 4 +- .../ops/gather_points/src/gather_points.cpp | 55 +++++++-------- .../gather_points/src/gather_points_cuda.cu | 68 +++++++++++++------ mmdet3d/ops/group_points/group_points.py | 10 ++- .../test_common_modules/test_pointnet_ops.py | 15 +++- 5 files changed, 97 insertions(+), 55 deletions(-) diff --git a/mmdet3d/ops/gather_points/gather_points.py b/mmdet3d/ops/gather_points/gather_points.py index 8f109a0cbd..8de4958bb7 100644 --- a/mmdet3d/ops/gather_points/gather_points.py +++ b/mmdet3d/ops/gather_points/gather_points.py @@ -27,7 +27,7 @@ def forward(ctx, features: torch.Tensor, B, npoint = indices.size() _, C, N = features.size() - output = torch.cuda.FloatTensor(B, C, npoint) + output = features.new_zeros((B, C, npoint)) gather_points_ext.gather_points_wrapper(B, C, N, npoint, features, indices, output) @@ -41,7 +41,7 @@ def backward(ctx, grad_out): idx, C, N = ctx.for_backwards B, npoint = idx.size() - grad_features = torch.cuda.FloatTensor(B, C, N).zero_() + grad_features = grad_out.new_zeros((B, C, N)) grad_out_data = grad_out.data.contiguous() gather_points_ext.gather_points_grad_wrapper(B, C, N, npoint, grad_out_data, idx, diff --git a/mmdet3d/ops/gather_points/src/gather_points.cpp b/mmdet3d/ops/gather_points/src/gather_points.cpp index 01a3e4046f..9462d7f6d9 100644 --- a/mmdet3d/ops/gather_points/src/gather_points.cpp +++ b/mmdet3d/ops/gather_points/src/gather_points.cpp @@ -1,57 +1,54 @@ #include +#include #include #include #include #include + extern THCState *state; int gather_points_wrapper(int b, int c, int n, int npoints, - at::Tensor points_tensor, at::Tensor idx_tensor, - at::Tensor out_tensor); + at::Tensor& points_tensor, at::Tensor& idx_tensor, + at::Tensor& out_tensor); void gather_points_kernel_launcher(int b, int c, int n, int npoints, - const float *points, const int *idx, - float *out, cudaStream_t stream); + const at::Tensor& points_tensor, + const at::Tensor& idx_tensor, + at::Tensor& out_tensor); int gather_points_grad_wrapper(int b, int c, int n, int npoints, - at::Tensor grad_out_tensor, - at::Tensor idx_tensor, - at::Tensor grad_points_tensor); + at::Tensor& grad_out_tensor, + at::Tensor& idx_tensor, + at::Tensor& grad_points_tensor); void gather_points_grad_kernel_launcher(int b, int c, int n, int npoints, - const float *grad_out, const int *idx, - float *grad_points, - cudaStream_t stream); + const at::Tensor& grad_out_tensor, + const at::Tensor& idx_tensor, + at::Tensor& grad_points_tensor); int gather_points_wrapper(int b, int c, int n, int npoints, - at::Tensor points_tensor, at::Tensor idx_tensor, - at::Tensor out_tensor) { - const float *points = points_tensor.data_ptr(); - const int *idx = idx_tensor.data_ptr(); - float *out = out_tensor.data_ptr(); - - cudaStream_t stream = at::cuda::getCurrentCUDAStream().stream(); - gather_points_kernel_launcher(b, c, n, npoints, points, idx, out, stream); + at::Tensor& points_tensor, at::Tensor& idx_tensor, + at::Tensor& out_tensor) +{ + gather_points_kernel_launcher(b, c, n, npoints, points_tensor, idx_tensor, out_tensor); return 1; } int gather_points_grad_wrapper(int b, int c, int n, int npoints, - at::Tensor grad_out_tensor, - at::Tensor idx_tensor, - at::Tensor grad_points_tensor) { - const float *grad_out = grad_out_tensor.data_ptr(); - const int *idx = idx_tensor.data_ptr(); - float *grad_points = grad_points_tensor.data_ptr(); - - cudaStream_t stream = at::cuda::getCurrentCUDAStream().stream(); - gather_points_grad_kernel_launcher(b, c, n, npoints, grad_out, idx, - grad_points, stream); + at::Tensor& grad_out_tensor, + at::Tensor& idx_tensor, + at::Tensor& grad_points_tensor) +{ + gather_points_grad_kernel_launcher(b, c, n, npoints, grad_out_tensor, idx_tensor, + grad_points_tensor); return 1; } -PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ m.def("gather_points_wrapper", &gather_points_wrapper, "gather_points_wrapper"); m.def("gather_points_grad_wrapper", &gather_points_grad_wrapper, diff --git a/mmdet3d/ops/gather_points/src/gather_points_cuda.cu b/mmdet3d/ops/gather_points/src/gather_points_cuda.cu index c93f6436d2..1b4ec3f046 100644 --- a/mmdet3d/ops/gather_points/src/gather_points_cuda.cu +++ b/mmdet3d/ops/gather_points/src/gather_points_cuda.cu @@ -1,14 +1,21 @@ #include #include +#include +#include +#include +#include + +#include #define TOTAL_THREADS 1024 #define THREADS_PER_BLOCK 256 #define DIVUP(m, n) ((m) / (n) + ((m) % (n) > 0)) +template __global__ void gather_points_kernel(int b, int c, int n, int m, - const float *__restrict__ points, + const scalar_t *__restrict__ points, const int *__restrict__ idx, - float *__restrict__ out) { + scalar_t *__restrict__ out) { // points: (B, C, N) // idx: (B, M) // output: @@ -26,8 +33,10 @@ __global__ void gather_points_kernel(int b, int c, int n, int m, } void gather_points_kernel_launcher(int b, int c, int n, int npoints, - const float *points, const int *idx, - float *out, cudaStream_t stream) { + const at::Tensor& points_tensor, + const at::Tensor& idx_tensor, + at::Tensor& out_tensor) +{ // points: (B, C, N) // idx: (B, npoints) // output: @@ -35,23 +44,33 @@ void gather_points_kernel_launcher(int b, int c, int n, int npoints, cudaError_t err; dim3 blocks(DIVUP(npoints, THREADS_PER_BLOCK), c, - b); // blockIdx.x(col), blockIdx.y(row) + b); // blockIdx.x(col), blockIdx.y(row) dim3 threads(THREADS_PER_BLOCK); - - gather_points_kernel<<>>(b, c, n, npoints, points, - idx, out); - + cudaStream_t stream = at::cuda::getCurrentCUDAStream().stream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + out_tensor.scalar_type(), "gather_points_kernel", + [&] + { + const scalar_t *points = points_tensor.data_ptr(); + const int *idx = idx_tensor.data_ptr(); + scalar_t *out = out_tensor.data_ptr(); + gather_points_kernel<<>>(b, c, n, npoints, points, + idx, out); + }); err = cudaGetLastError(); - if (cudaSuccess != err) { + if (cudaSuccess != err) + { fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); exit(-1); } } +template __global__ void gather_points_grad_kernel(int b, int c, int n, int m, - const float *__restrict__ grad_out, + const scalar_t *__restrict__ grad_out, const int *__restrict__ idx, - float *__restrict__ grad_points) { + scalar_t *__restrict__ grad_points) { // grad_out: (B, C, M) // idx: (B, M) // output: @@ -70,9 +89,10 @@ __global__ void gather_points_grad_kernel(int b, int c, int n, int m, } void gather_points_grad_kernel_launcher(int b, int c, int n, int npoints, - const float *grad_out, const int *idx, - float *grad_points, - cudaStream_t stream) { + const at::Tensor& grad_out_tensor, + const at::Tensor& idx_tensor, + at::Tensor& grad_points_tensor) +{ // grad_out: (B, C, npoints) // idx: (B, npoints) // output: @@ -80,14 +100,24 @@ void gather_points_grad_kernel_launcher(int b, int c, int n, int npoints, cudaError_t err; dim3 blocks(DIVUP(npoints, THREADS_PER_BLOCK), c, - b); // blockIdx.x(col), blockIdx.y(row) + b); // blockIdx.x(col), blockIdx.y(row) dim3 threads(THREADS_PER_BLOCK); - gather_points_grad_kernel<<>>( - b, c, n, npoints, grad_out, idx, grad_points); + cudaStream_t stream = at::cuda::getCurrentCUDAStream().stream(); + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + grad_points_tensor.scalar_type(), "gather_points_grad_kernel", + [&] + { + const scalar_t *grad_out = grad_out_tensor.data_ptr(); + const int *idx = idx_tensor.data_ptr(); + scalar_t *grad_points = grad_points_tensor.data_ptr(); + gather_points_grad_kernel<<>>( + b, c, n, npoints, grad_out, idx, grad_points); + }); err = cudaGetLastError(); - if (cudaSuccess != err) { + if (cudaSuccess != err) + { fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); exit(-1); } diff --git a/mmdet3d/ops/group_points/group_points.py b/mmdet3d/ops/group_points/group_points.py index 88122a88d5..34c59bd800 100644 --- a/mmdet3d/ops/group_points/group_points.py +++ b/mmdet3d/ops/group_points/group_points.py @@ -1,7 +1,9 @@ +from typing import Tuple + import torch +from mmcv.runner import force_fp32 from torch import nn as nn from torch.autograd import Function -from typing import Tuple from ..ball_query import ball_query from ..knn import knn @@ -60,7 +62,9 @@ def __init__(self, if self.max_radius is None: assert not self.normalize_xyz, \ 'can not normalize grouped xyz when max_radius is None' + self.fp16_enabled = False + @force_fp32() def forward(self, points_xyz, center_xyz, features=None): """forward. @@ -141,7 +145,9 @@ class GroupAll(nn.Module): def __init__(self, use_xyz: bool = True): super().__init__() self.use_xyz = use_xyz + self.fp16_enabled = False + @force_fp32() def forward(self, xyz: torch.Tensor, new_xyz: torch.Tensor, @@ -183,7 +189,7 @@ def forward(ctx, features: torch.Tensor, Args: features (Tensor): (B, C, N) tensor of features to group. - indices (Tensor): (B, npoint, nsample) the indicies of + indices (Tensor): (B, npoint, nsample) the indices of features to group with. Returns: diff --git a/tests/test_models/test_common_modules/test_pointnet_ops.py b/tests/test_models/test_common_modules/test_pointnet_ops.py index 095c2d01ca..ec3a581e63 100644 --- a/tests/test_models/test_common_modules/test_pointnet_ops.py +++ b/tests/test_models/test_common_modules/test_pointnet_ops.py @@ -2,9 +2,16 @@ import pytest import torch -from mmdet3d.ops import (ball_query, furthest_point_sample, - furthest_point_sample_with_dist, gather_points, - grouping_operation, knn, three_interpolate, three_nn) +from mmdet3d.ops import ( + ball_query, + furthest_point_sample, + furthest_point_sample_with_dist, + gather_points, + grouping_operation, + knn, + three_interpolate, + three_nn, +) def test_fps(): @@ -236,6 +243,8 @@ def test_gather_points(): [-0.7172, 0.0462, -0.6227, -0.7172, -0.7172, -0.7172]]]).cuda() assert torch.allclose(output, expected_output) + output_half = gather_points(features.half(), idx) + assert torch.allclose(output_half, expected_output.half()) def test_three_interpolate(): From 63cfb794dad665d6f0a806735d9c7de63218be8a Mon Sep 17 00:00:00 2001 From: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Date: Wed, 16 Feb 2022 23:08:41 +0800 Subject: [PATCH 19/23] [Fix] Recheck import sorting (#1242) * fix missed mmcv * reinstall pre-commit and recheck --- mmdet3d/utils/setup_env.py | 3 ++- tests/test_utils/test_setup_env.py | 3 ++- tools/data_converter/kitti_data_utils.py | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mmdet3d/utils/setup_env.py b/mmdet3d/utils/setup_env.py index 282ad491e7..98bcc8853f 100644 --- a/mmdet3d/utils/setup_env.py +++ b/mmdet3d/utils/setup_env.py @@ -1,8 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. -import cv2 import os import platform import warnings + +import cv2 from torch import multiprocessing as mp diff --git a/tests/test_utils/test_setup_env.py b/tests/test_utils/test_setup_env.py index 08233efa71..0c070c9f0e 100644 --- a/tests/test_utils/test_setup_env.py +++ b/tests/test_utils/test_setup_env.py @@ -1,8 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. -import cv2 import multiprocessing as mp import os import platform + +import cv2 from mmcv import Config from mmdet3d.utils import setup_multi_processes diff --git a/tools/data_converter/kitti_data_utils.py b/tools/data_converter/kitti_data_utils.py index 206d50d680..8e3dba6f35 100644 --- a/tools/data_converter/kitti_data_utils.py +++ b/tools/data_converter/kitti_data_utils.py @@ -4,6 +4,7 @@ from os import path as osp from pathlib import Path +import mmcv import numpy as np from skimage import io From 86cc487cca2eb332ad4e6adf2fff8c879ffc2115 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 16 Feb 2022 23:48:10 +0800 Subject: [PATCH 20/23] fix inference_demo.ipynb bug (#1236) --- demo/inference_demo.ipynb | 64 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/demo/inference_demo.ipynb b/demo/inference_demo.ipynb index e42cc0ba73..5f6731db1f 100644 --- a/demo/inference_demo.ipynb +++ b/demo/inference_demo.ipynb @@ -3,74 +3,74 @@ { "cell_type": "code", "execution_count": 7, + "source": [ + "from mmdet3d.apis import init_model, inference_detector, show_result_meshlab" + ], + "outputs": [], "metadata": { "pycharm": { "is_executing": false } - }, - "outputs": [], - "source": [ - "from mmdet3d.apis import init_detector, inference_detector, show_result_meshlab" - ] + } }, { "cell_type": "code", "execution_count": 8, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], "source": [ "config_file = '../configs/second/hv_second_secfpn_6x8_80e_kitti-3d-car.py'\n", "# download the checkpoint from model zoo and put it in `checkpoints/`\n", "checkpoint_file = '../work_dirs/second/epoch_40.pth'" - ] + ], + "outputs": [], + "metadata": { + "pycharm": { + "is_executing": false + } + } }, { "cell_type": "code", "execution_count": 9, + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_model(config_file, checkpoint_file, device='cuda:0')" + ], + "outputs": [], "metadata": { "pycharm": { "is_executing": false } - }, - "outputs": [], - "source": [ - "# build the model from a config file and a checkpoint file\n", - "model = init_detector(config_file, checkpoint_file, device='cuda:0')" - ] + } }, { "cell_type": "code", "execution_count": 10, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], "source": [ "# test a single sample\n", "pcd = 'kitti_000008.bin'\n", "result, data = inference_detector(model, pcd)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, + ], + "outputs": [], "metadata": { "pycharm": { "is_executing": false } - }, - "outputs": [], + } + }, + { + "cell_type": "code", + "execution_count": 11, "source": [ "# show the results\n", "out_dir = './'\n", "show_result_meshlab(data, result, out_dir)" - ] + ], + "outputs": [], + "metadata": { + "pycharm": { + "is_executing": false + } + } } ], "metadata": { From d8084bdec09ec59522a20e105d375c194634ac17 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Thu, 17 Feb 2022 19:14:16 +0800 Subject: [PATCH 21/23] [Enhance] upgrade PointPillars performace on dev branch (#1166) * upgrade PointPillars performace on dev branch * update DynamicPillarFeatureNet * fix comments * change to AlignedAnchor3DRangeGenerator * change to AlignedAnchor3DRangeGenerator * fix * replace with AlignedAnchorGenerator * fix lint * update using isort --- .../models/hv_pointpillars_secfpn_kitti.py | 1 + ...pillars_secfpn_6x8_160e_kitti-3d-3class.py | 12 +++------- mmdet3d/datasets/kitti_dataset.py | 22 ++++++++++++++++- mmdet3d/datasets/pipelines/dbsampler.py | 11 ++++++++- mmdet3d/datasets/pipelines/transforms_3d.py | 15 ++++++++++-- .../models/voxel_encoders/pillar_encoder.py | 24 +++++++++++++------ 6 files changed, 65 insertions(+), 20 deletions(-) diff --git a/configs/_base_/models/hv_pointpillars_secfpn_kitti.py b/configs/_base_/models/hv_pointpillars_secfpn_kitti.py index 33c80a171c..ac46475d6e 100644 --- a/configs/_base_/models/hv_pointpillars_secfpn_kitti.py +++ b/configs/_base_/models/hv_pointpillars_secfpn_kitti.py @@ -34,6 +34,7 @@ in_channels=384, feat_channels=384, use_direction_classifier=True, + assign_per_class=True, anchor_generator=dict( type='AlignedAnchor3DRangeGenerator', ranges=[ diff --git a/configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py b/configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py index 5c5c939de5..2611e86d3a 100644 --- a/configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py +++ b/configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py @@ -15,21 +15,15 @@ rate=1.0, prepare=dict( filter_by_difficulty=[-1], - filter_by_min_points=dict(Car=5, Pedestrian=10, Cyclist=10)), + filter_by_min_points=dict(Car=5, Pedestrian=5, Cyclist=5)), classes=class_names, - sample_groups=dict(Car=15, Pedestrian=10, Cyclist=10)) + sample_groups=dict(Car=15, Pedestrian=15, Cyclist=15)) # PointPillars uses different augmentation hyper parameters train_pipeline = [ dict(type='LoadPointsFromFile', coord_type='LIDAR', load_dim=4, use_dim=4), dict(type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True), - dict(type='ObjectSample', db_sampler=db_sampler), - dict( - type='ObjectNoise', - num_try=100, - translation_std=[0.25, 0.25, 0.25], - global_rot_range=[0.0, 0.0], - rot_range=[-0.15707963267, 0.15707963267]), + dict(type='ObjectSample', db_sampler=db_sampler, use_ground_plane=False), dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5), dict( type='GlobalRotScaleTrans', diff --git a/mmdet3d/datasets/kitti_dataset.py b/mmdet3d/datasets/kitti_dataset.py index 632456dbe5..9a864efff2 100644 --- a/mmdet3d/datasets/kitti_dataset.py +++ b/mmdet3d/datasets/kitti_dataset.py @@ -153,13 +153,32 @@ def get_ann_info(self, index): - gt_bboxes (np.ndarray): 2D ground truth bboxes. - gt_labels (np.ndarray): Labels of ground truths. - gt_names (list[str]): Class names of ground truths. - - difficulty (int): kitti difficulty. + - difficulty (int): Difficulty defined by KITTI. + 0, 1, 2 represent xxxxx respectively. """ # Use index to get the annos, thus the evalhook could also use this api info = self.data_infos[index] rect = info['calib']['R0_rect'].astype(np.float32) Trv2c = info['calib']['Tr_velo_to_cam'].astype(np.float32) + if 'plane' in info: + # convert ground plane to velodyne coordinates + reverse = np.linalg.inv(rect @ Trv2c) + + (plane_norm_cam, + plane_off_cam) = (info['plane'][:3], + -info['plane'][:3] * info['plane'][3]) + plane_norm_lidar = \ + (reverse[:3, :3] @ plane_norm_cam[:, None])[:, 0] + plane_off_lidar = ( + reverse[:3, :3] @ plane_off_cam[:, None][:, 0] + + reverse[:3, 3]) + plane_lidar = np.zeros_like(plane_norm_lidar, shape=(4, )) + plane_lidar[:3] = plane_norm_lidar + plane_lidar[3] = -plane_norm_lidar.T @ plane_off_lidar + else: + plane_lidar = None + difficulty = info['annos']['difficulty'] annos = info['annos'] # we need other objects to avoid collision when sample @@ -195,6 +214,7 @@ def get_ann_info(self, index): bboxes=gt_bboxes, labels=gt_labels, gt_names=gt_names, + plane=plane_lidar, difficulty=difficulty) return anns_results diff --git a/mmdet3d/datasets/pipelines/dbsampler.py b/mmdet3d/datasets/pipelines/dbsampler.py index d2e844e6d1..f0a7074441 100644 --- a/mmdet3d/datasets/pipelines/dbsampler.py +++ b/mmdet3d/datasets/pipelines/dbsampler.py @@ -189,7 +189,7 @@ def filter_by_min_points(db_infos, min_gt_points_dict): db_infos[name] = filtered_infos return db_infos - def sample_all(self, gt_bboxes, gt_labels, img=None): + def sample_all(self, gt_bboxes, gt_labels, img=None, ground_plane=None): """Sampling all categories of bboxes. Args: @@ -264,6 +264,15 @@ def sample_all(self, gt_bboxes, gt_labels, img=None): gt_labels = np.array([self.cat2label[s['name']] for s in sampled], dtype=np.long) + + if ground_plane is not None: + xyz = sampled_gt_bboxes[:, :3] + dz = (ground_plane[:3][None, :] * + xyz).sum(-1) + ground_plane[3] + sampled_gt_bboxes[:, 2] -= dz + for i, s_points in enumerate(s_points_list): + s_points.tensor[:, 2].sub_(dz[i]) + ret = { 'gt_labels_3d': gt_labels, diff --git a/mmdet3d/datasets/pipelines/transforms_3d.py b/mmdet3d/datasets/pipelines/transforms_3d.py index f0ca81f353..6269dc217b 100644 --- a/mmdet3d/datasets/pipelines/transforms_3d.py +++ b/mmdet3d/datasets/pipelines/transforms_3d.py @@ -268,14 +268,17 @@ class ObjectSample(object): sample_2d (bool): Whether to also paste 2D image patch to the images This should be true when applying multi-modality cut-and-paste. Defaults to False. + use_ground_plane (bool): Whether to use gound plane to adjust the + 3D labels. """ - def __init__(self, db_sampler, sample_2d=False): + def __init__(self, db_sampler, sample_2d=False, use_ground_plane=False): self.sampler_cfg = db_sampler self.sample_2d = sample_2d if 'type' not in db_sampler.keys(): db_sampler['type'] = 'DataBaseSampler' self.db_sampler = build_from_cfg(db_sampler, OBJECTSAMPLERS) + self.use_ground_plane = use_ground_plane @staticmethod def remove_points_in_boxes(points, boxes): @@ -306,6 +309,11 @@ def __call__(self, input_dict): gt_bboxes_3d = input_dict['gt_bboxes_3d'] gt_labels_3d = input_dict['gt_labels_3d'] + if self.use_ground_plane and 'plane' in input_dict['ann_info']: + ground_plane = input_dict['ann_info']['plane'] + input_dict['plane'] = ground_plane + else: + ground_plane = None # change to float for blending operation points = input_dict['points'] if self.sample_2d: @@ -319,7 +327,10 @@ def __call__(self, input_dict): img=img) else: sampled_dict = self.db_sampler.sample_all( - gt_bboxes_3d.tensor.numpy(), gt_labels_3d, img=None) + gt_bboxes_3d.tensor.numpy(), + gt_labels_3d, + img=None, + ground_plane=ground_plane) if sampled_dict is not None: sampled_gt_bboxes_3d = sampled_dict['gt_bboxes_3d'] diff --git a/mmdet3d/models/voxel_encoders/pillar_encoder.py b/mmdet3d/models/voxel_encoders/pillar_encoder.py index 45b8d53886..c91cf282ad 100644 --- a/mmdet3d/models/voxel_encoders/pillar_encoder.py +++ b/mmdet3d/models/voxel_encoders/pillar_encoder.py @@ -15,7 +15,6 @@ class PillarFeatureNet(nn.Module): The network prepares the pillar features and performs forward pass through PFNLayers. - Args: in_channels (int, optional): Number of input features, either x, y, z or x, y, z, r. Defaults to 4. @@ -54,7 +53,7 @@ def __init__(self, if with_cluster_center: in_channels += 3 if with_voxel_center: - in_channels += 2 + in_channels += 3 if with_distance: in_channels += 1 self._with_distance = with_distance @@ -84,8 +83,10 @@ def __init__(self, # Need pillar (voxel) size and x/y offset in order to calculate offset self.vx = voxel_size[0] self.vy = voxel_size[1] + self.vz = voxel_size[2] self.x_offset = self.vx / 2 + point_cloud_range[0] self.y_offset = self.vy / 2 + point_cloud_range[1] + self.z_offset = self.vz / 2 + point_cloud_range[2] self.point_cloud_range = point_cloud_range @force_fp32(out_fp16=True) @@ -97,7 +98,6 @@ def forward(self, features, num_points, coors): (N, M, C). num_points (torch.Tensor): Number of points in each pillar. coors (torch.Tensor): Coordinates of each voxel. - Returns: torch.Tensor: Features of pillars. """ @@ -114,21 +114,27 @@ def forward(self, features, num_points, coors): dtype = features.dtype if self._with_voxel_center: if not self.legacy: - f_center = torch.zeros_like(features[:, :, :2]) + f_center = torch.zeros_like(features[:, :, :3]) f_center[:, :, 0] = features[:, :, 0] - ( coors[:, 3].to(dtype).unsqueeze(1) * self.vx + self.x_offset) f_center[:, :, 1] = features[:, :, 1] - ( coors[:, 2].to(dtype).unsqueeze(1) * self.vy + self.y_offset) + f_center[:, :, 2] = features[:, :, 2] - ( + coors[:, 1].to(dtype).unsqueeze(1) * self.vz + + self.z_offset) else: - f_center = features[:, :, :2] + f_center = features[:, :, :3] f_center[:, :, 0] = f_center[:, :, 0] - ( coors[:, 3].type_as(features).unsqueeze(1) * self.vx + self.x_offset) f_center[:, :, 1] = f_center[:, :, 1] - ( coors[:, 2].type_as(features).unsqueeze(1) * self.vy + self.y_offset) + f_center[:, :, 2] = f_center[:, :, 2] - ( + coors[:, 1].type_as(features).unsqueeze(1) * self.vz + + self.z_offset) features_ls.append(f_center) if self._with_distance: @@ -177,6 +183,8 @@ class DynamicPillarFeatureNet(PillarFeatureNet): Defaults to dict(type='BN1d', eps=1e-3, momentum=0.01). mode (str, optional): The mode to gather point features. Options are 'max' or 'avg'. Defaults to 'max'. + legacy (bool, optional): Whether to use the new behavior or + the original behavior. Defaults to True. """ def __init__(self, @@ -188,7 +196,8 @@ def __init__(self, voxel_size=(0.2, 0.2, 4), point_cloud_range=(0, -40, -3, 70.4, 40, 1), norm_cfg=dict(type='BN1d', eps=1e-3, momentum=0.01), - mode='max'): + mode='max', + legacy=True): super(DynamicPillarFeatureNet, self).__init__( in_channels, feat_channels, @@ -198,7 +207,8 @@ def __init__(self, voxel_size=voxel_size, point_cloud_range=point_cloud_range, norm_cfg=norm_cfg, - mode=mode) + mode=mode, + legacy=legacy) self.fp16_enabled = False feat_channels = [self.in_channels] + list(feat_channels) pfn_layers = [] From b420cd1d7a7fc0a6d94030fd36e2eae75d13a261 Mon Sep 17 00:00:00 2001 From: Tai-Wang Date: Fri, 18 Feb 2022 20:09:17 +0800 Subject: [PATCH 22/23] Bump to v1.0.0.rc0 (#928) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Refactor] Main code modification for coordinate system refactor (#677) * [Enhance] Add script for data update (#774) * Fixed wrong config paths and fixed a bug in test * Fixed metafile * Coord sys refactor (main code) * Update test_waymo_dataset.py * Manually resolve conflict * Removed unused lines and fixed imports * remove coord2box and box2coord * update dir_limit_offset * Some minor improvements * Removed some \s in comments * Revert a change * Change Box3DMode to Coord3DMode where points are converted * Fix points_in_bbox function * Fix Imvoxelnet config * Revert adding a line * Fix rotation bug when batch size is 0 * Keep sign of dir_scores as before * Fix several comments * Add a comment * Fix docstring * Add data update scripts * Fix comments * fix import (#839) * [Enhance] refactor iou_neg_piecewise_sampler.py (#842) * [Refactor] Main code modification for coordinate system refactor (#677) * [Enhance] Add script for data update (#774) * Fixed wrong config paths and fixed a bug in test * Fixed metafile * Coord sys refactor (main code) * Update test_waymo_dataset.py * Manually resolve conflict * Removed unused lines and fixed imports * remove coord2box and box2coord * update dir_limit_offset * Some minor improvements * Removed some \s in comments * Revert a change * Change Box3DMode to Coord3DMode where points are converted * Fix points_in_bbox function * Fix Imvoxelnet config * Revert adding a line * Fix rotation bug when batch size is 0 * Keep sign of dir_scores as before * Fix several comments * Add a comment * Fix docstring * Add data update scripts * Fix comments * fix import * refactor iou_neg_piecewise_sampler.py * add docstring * modify docstring Co-authored-by: Yezhen Cong <52420115+THU17cyz@users.noreply.github.com> Co-authored-by: THU17cyz * [Feature] Add roipooling cuda ops (#843) * [Refactor] Main code modification for coordinate system refactor (#677) * [Enhance] Add script for data update (#774) * Fixed wrong config paths and fixed a bug in test * Fixed metafile * Coord sys refactor (main code) * Update test_waymo_dataset.py * Manually resolve conflict * Removed unused lines and fixed imports * remove coord2box and box2coord * update dir_limit_offset * Some minor improvements * Removed some \s in comments * Revert a change * Change Box3DMode to Coord3DMode where points are converted * Fix points_in_bbox function * Fix Imvoxelnet config * Revert adding a line * Fix rotation bug when batch size is 0 * Keep sign of dir_scores as before * Fix several comments * Add a comment * Fix docstring * Add data update scripts * Fix comments * fix import * add roipooling cuda ops * add roi extractor * add test_roi_extractor unittest * Modify setup.py to install roipooling ops * modify docstring * remove enlarge bbox in roipoint pooling * add_roipooling_ops * modify docstring Co-authored-by: Yezhen Cong <52420115+THU17cyz@users.noreply.github.com> Co-authored-by: THU17cyz * [Refactor] Refactor code structure and docstrings (#803) * refactor points_in_boxes * Merge same functions of three boxes * More docstring fixes and unify x/y/z size * Add "optional" and fix "Default" * Add "optional" and fix "Default" * Add "optional" and fix "Default" * Add "optional" and fix "Default" * Add "optional" and fix "Default" * Remove None in function param type * Fix unittest * Add comments for NMS functions * Merge methods of Points * Add unittest * Add optional and default value * Fix box conversion and add unittest * Fix comments * Add unit test * Indent * Fix CI * Remove useless \\ * Remove useless \\ * Remove useless \\ * Remove useless \\ * Remove useless \\ * Add unit test for box bev * More unit tests and refine docstrings in box_np_ops * Fix comment * Add deprecation warning * [Feature] PointXYZWHLRBBoxCoder (#856) * support PointBasedBoxCoder * fix unittest bug * support unittest in gpu * support unittest in gpu * modified docstring * add args * add args * [Enhance] Change Groupfree3D config (#855) * All mods * PointSample * PointSample * [Doc] Add tutorials/data_pipeline Chinese version (#827) * [Doc] Add tutorials/data_pipeline Chinese version * refine doc * Use the absolute link * Use the absolute link Co-authored-by: Tai-Wang * [Doc] Add Chinese doc for `scannet_det.md` (#836) * Part * Complete * Fix comments * Fix comments * [Doc] Add Chinese doc for `waymo_det.md` (#859) * Add complete translation * Refinements * Fix comments * Fix a minor typo Co-authored-by: Tai-Wang * Remove 2D annotations on Lyft (#867) * Add header for files (#869) * Add header for files * Add header for files * Add header for files * Add header for files * [fix] fix typos (#872) * Fix 3 unworking configs (#882) * [Fix] Fix `index.rst` for Chinese docs (#873) * Fix index.rst for zh docs * Change switch language * [Fix] Centerpoint head nested list transpose (#879) * FIX Transpose nested lists without Numpy * Removed unused Numpy import * [Enhance] Update PointFusion (#791) * update point fusion * remove LIDAR hardcode * move get_proj_mat_by_coord_type to utils * fix lint * remove todo * fix lint * [Doc] Add nuscenes_det.md Chinese version (#854) * add nus chinese doc * add nuScenes Chinese doc * fix typo * fix typo * fix typo * fix typo * fix typo * [Fix] Fix RegNet pretrained weight loading (#889) * Fix regnet pretrained weight loading * Remove unused file * Fix centerpoint tta (#892) * [Enhance] Add benchmark regression script (#808) * Initial commit * [Feature] Support DGCNN (v1.0.0.dev0) (#896) * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * support dgcnn * fix typo * fix typo * fix typo * del gf&fa registry (wo reuse pointnet module) * fix typo * add benchmark and add copyright header (for DGCNN only) * fix typo * fix typo * fix typo * fix typo * fix typo * support dgcnn * Change cam rot_3d_in_axis (#906) * [Doc] Add coord sys tutorial pic and change links to dev branch (#912) * Modify link branch and add pic * Fix pic * Update v1.0.0rc0 changelog * Remove v1.0.0.rc0 changelog * Init v1.0.0.rc0 changelog * Fix minor typos in the zh-CN index.rst * Add master updates in changelog v1.0.0 * Update changelog_v1.0.md * Update changelog_v1.0.md * Update changelog_v1.0.md * Adjust the order of logs * Update the number of developers * Add v1.0.0.rc0 changelog * Delete changelog_v1.0.md * Add RoIPointPool3d back * Change openmmlab pre-commit hook rev * Add links for compatibility doc * Refine details * Update README.md * Update highlights * Update README_zh-CN.md * Update getting_started.md * Update getting_started.md * Update version.py * Fix the released version name * Fix version name * Update version name * Update version name * Update version name * Update version name Co-authored-by: Yezhen Cong <52420115+THU17cyz@users.noreply.github.com> Co-authored-by: Xi Liu <75658786+xiliu8006@users.noreply.github.com> Co-authored-by: THU17cyz Co-authored-by: Wenhao Wu <79644370+wHao-Wu@users.noreply.github.com> Co-authored-by: dingchang Co-authored-by: 谢恩泽 Co-authored-by: Robin Karlsson <34254153+robin-karlsson0@users.noreply.github.com> Co-authored-by: Danila Rukhovich Co-authored-by: ChaimZhu --- .pre-commit-config.yaml | 2 +- README.md | 12 +-- README_zh-CN.md | 12 +-- docs/en/changelog.md | 80 +++++++++++++++++++ docs/en/getting_started.md | 1 + docs/zh_cn/getting_started.md | 1 + .../models/dense_heads/centerpoint_head.py | 4 +- mmdet3d/version.py | 2 +- 8 files changed, 92 insertions(+), 22 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b141730f5c..5bd88c5a27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,7 +40,7 @@ repos: - id: docformatter args: ["--in-place", "--wrap-descriptions", "79"] - repo: https://github.com/open-mmlab/pre-commit-hooks - rev: master # Use the ref you want to point at + rev: v0.2.0 # Use the ref you want to point at hooks: - id: check-algo-readme - id: check-copyright diff --git a/README.md b/README.md index b81da5d024..178c20ae0c 100644 --- a/README.md +++ b/README.md @@ -25,16 +25,12 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**News**: We released the codebase v0.18.1. +**News**: We released the codebase v1.0.0rc0. -In addition, we have preliminarily supported several new models on the [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) branch, including [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) and [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md). - -Note: We are going through large refactoring to provide simpler and more unified usage of many modules. Thus, few features will be added to the master branch in the following months. +Note: We are going through large refactoring to provide simpler and more unified usage of many modules. The compatibilities of models are broken due to the unification and simplification of coordinate systems. For now, most models are benchmarked with similar performance, though few models are still being benchmarked. -You can start experiments with [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) if you are interested. Please note that our new features will only be supported in v1.0.0 branch afterward. - In the [nuScenes 3D detection challenge](https://www.nuscenes.org/object-detection?externalData=all&mapData=all&modalities=Any) of the 5th AI Driving Olympics in NeurIPS 2020, we obtained the best PKL award and the second runner-up by multi-modality entry, and the best vision-only results. Code and models for the best vision-only method, [FCOS3D](https://arxiv.org/abs/2104.10956), have been released. Please stay tuned for [MoCa](https://arxiv.org/abs/2012.12741). @@ -87,11 +83,9 @@ This project is released under the [Apache 2.0 license](LICENSE). ## Changelog -v0.18.1 was released in 1/2/2022. +v1.0.0rc0 was released in 18/2/2022. Please refer to [changelog.md](docs/en/changelog.md) for details and release history. -For branch v1.0.0.dev0, please refer to [changelog_v1.0.md](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) for our latest features and more details. - ## Benchmark and model zoo Supported methods and backbones are shown in the below table. diff --git a/README_zh-CN.md b/README_zh-CN.md index 0cc5ad8a55..85fa01f3de 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -25,16 +25,12 @@ [![license](https://img.shields.io/github/license/open-mmlab/mmdetection3d.svg)](https://github.com/open-mmlab/mmdetection3d/blob/master/LICENSE) -**新闻**: 我们发布了版本 v0.18.1. +**新闻**: 我们发布了版本 v1.0.0rc0. -另外,我们在 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) 分支初步支持了多个新模型,包括 [DGCNN](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/dgcnn/README.md), [SMOKE](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/smoke/README.md) 和 [PGD](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/configs/pgd/README.md)。 - -说明:我们正在进行大规模的重构,以提供对许多模块更简单、更统一的使用。因此,在接下来的几个月里,很少有功能会添加到主分支中。 +说明:我们正在进行大规模的重构,以提供对许多模块更简单、更统一的使用。 由于坐标系的统一和简化,模型的兼容性会受到影响。目前,大多数模型都以类似的性能对齐了精度,但仍有少数模型在进行基准测试。 -如果您感兴趣,可以开始使用 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) 分支进行实验。请注意,我们的新功能将只支持在 v1.0.0 分支。 - 在第三届 [nuScenes 3D 检测挑战赛](https://www.nuscenes.org/object-detection?externalData=all&mapData=all&modalities=Any)(第五届 AI Driving Olympics, NeurIPS 2020)中,我们获得了最佳 PKL 奖、第三名和最好的纯视觉的结果,相关的代码和模型将会在不久后发布。 最好的纯视觉方法 [FCOS3D](https://arxiv.org/abs/2104.10956) 的代码和模型已经发布。请继续关注我们的多模态检测器 [MoCa](https://arxiv.org/abs/2012.12741)。 @@ -87,11 +83,9 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 ## 更新日志 -最新的版本 v0.18.1 在 2022.2.1 发布。 +最新的版本 v1.0.0rc0 在 2022.2.18 发布。 如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。 -对于分支 [v1.0.0.dev0](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0) ,请参考 [v1.0 更新日志](https://github.com/Tai-Wang/mmdetection3d/blob/v1.0.0.dev0-changelog/docs/changelog_v1.0.md) 来了解我们的最新功能和更多细节。 - ## 基准测试和模型库 测试结果和模型可以在[模型库](docs/zh_cn/model_zoo.md)中找到。 diff --git a/docs/en/changelog.md b/docs/en/changelog.md index 515cdcd804..54a4601ee5 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,5 +1,85 @@ ## Changelog +### v1.0.0rc0 (18/2/2022) + +#### Compatibility + +- We refactor our three coordinate systems to make their rotation directions and origins more consistent, and further remove unnecessary hacks in different datasets and models. Therefore, please re-generate data infos or convert the old version to the new one with our provided scripts. We will also provide updated checkpoints in the next version. Please refer to the [compatibility documentation](https://github.com/open-mmlab/mmdetection3d/blob/v1.0.0.dev0/docs/en/compatibility.md) for more details. +- Unify the camera keys for consistent transformation between coordinate systems on different datasets. The modification changes the key names to `lidar2img`, `depth2img`, `cam2img`, etc., for easier understanding. Customized codes using legacy keys may be influenced. +- The next release will begin to move files of CUDA ops to [MMCV](https://github.com/open-mmlab/mmcv). It will influence the way to import related functions. We will not break the compatibility but will raise a warning first and please prepare to migrate it. + +#### Highlights + +- Support new monocular 3D detectors: [PGD](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0/configs/pgd), [SMOKE](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0/configs/smoke), [MonoFlex](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0/configs/monoflex) +- Support a new LiDAR-based detector: [PointRCNN](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0/configs/point_rcnn) +- Support a new backbone: [DGCNN](https://github.com/open-mmlab/mmdetection3d/tree/v1.0.0.dev0/configs/dgcnn) +- Support 3D object detection on the S3DIS dataset +- Support compilation on Windows +- Full benchmark for PAConv on S3DIS +- Further enhancement for documentation, especially on the Chinese documentation + +#### New Features + +- Support 3D object detection on the S3DIS dataset (#835) +- Support PointRCNN (#842, #843, #856, #974, #1022, #1109, #1125) +- Support DGCNN (#896) +- Support PGD (#938, #940, #948, #950, #964, #1014, #1065, #1070, #1157) +- Support SMOKE (#939, #955, #959, #975, #988, #999, #1029) +- Support MonoFlex (#1026, #1044, #1114, #1115, #1183) +- Support CPU Training (#1196) + +#### Improvements + +- Support point sampling based on distance metric (#667, #840) +- Refactor coordinate systems (#677, #774, #803, #899, #906, #912, #968, #1001) +- Unify camera keys in PointFusion and transformations between different systems (#791, #805) +- Refine documentation (#792, #827, #829, #836, #849, #854, #859, #1111, #1113, #1116, #1121, #1132, #1135, #1185, #1193, #1226) +- Add a script to support benchmark regression (#808) +- Benchmark PAConvCUDA on S3DIS (#847) +- Support to download pdf and epub documentation (#850) +- Change the `repeat` setting in Group-Free-3D configs to reduce training epochs (#855) +- Support KITTI AP40 evaluation metric (#927) +- Add the mmdet3d2torchserve tool for SECOND (#977) +- Add code-spell pre-commit hook and fix typos (#995) +- Support the latest numba version (#1043) +- Set a default seed to use when the random seed is not specified (#1072) +- Distribute mix-precision models to each algorithm folder (#1074) +- Add abstract and a representative figure for each algorithm (#1086) +- Upgrade pre-commit hook (#1088, #1217) +- Support augmented data and ground truth visualization (#1092) +- Add local yaw property for `CameraInstance3DBoxes` (#1130) +- Lock the required numba version to 0.53.0 (#1159) +- Support the usage of plane information for KITTI dataset (#1162) +- Deprecate the support for "python setup.py test" (#1164) +- Reduce the number of multi-process threads to accelerate training (#1168) +- Support 3D flip augmentation for semantic segmentation (#1181) +- Update README format for each model (#1195) + +#### Bug Fixes + +- Fix compiling errors on Windows (#766) +- Fix the deprecated nms setting in the ImVoteNet config (#828) +- Use the latest `wrap_fp16_model` import from mmcv (#861) +- Remove 2D annotations generation on Lyft (#867) +- Update index files for the Chinese documentation to be consistent with the English version (#873) +- Fix the nested list transpose in the CenterPoint head (#879) +- Fix deprecated pretrained model loading for RegNet (#889) +- Fix the incorrect dimension indices of rotations and testing config in the CenterPoint test time augmentation (#892) +- Fix and improve visualization tools (#956, #1066, #1073) +- Fix PointPillars FLOPs calculation error (#1075) +- Fix missing dimension information in the SUN RGB-D data generation (#1120) +- Fix incorrect anchor range settings in the PointPillars [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/_base_/models/hv_pointpillars_secfpn_kitti.py) for KITTI (#1163) +- Fix incorrect model information in the RegNet metafile (#1184) +- Fix bugs in non-distributed multi-gpu training and testing (#1197) +- Fix a potential assertion error when generating corners from an empty box (#1212) +- Upgrade bazel version according to the requirement of Waymo Devkit (#1223) + +#### Contributors + +A total of 12 developers contributed to this release. + +@THU17cyz, @wHao-Wu, @wangruohui, @Wuziyi616, @filaPro, @ZwwWayne, @Tai-Wang, @DCNSW, @xieenze, @robin-karlsson0, @ZCMax, @Otteri + ### v0.18.1 (1/2/2022) #### Improvements diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md index 52ed8031f2..a483eaa626 100644 --- a/docs/en/getting_started.md +++ b/docs/en/getting_started.md @@ -13,6 +13,7 @@ The required versions of MMCV, MMDetection and MMSegmentation for different vers | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| v1.0.0rc0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.1 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| diff --git a/docs/zh_cn/getting_started.md b/docs/zh_cn/getting_started.md index 7de264a6c4..cd0772ccdc 100644 --- a/docs/zh_cn/getting_started.md +++ b/docs/zh_cn/getting_started.md @@ -10,6 +10,7 @@ | MMDetection3D version | MMDetection version | MMSegmentation version | MMCV version | |:-------------------:|:-------------------:|:-------------------:|:-------------------:| | master | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| +| v1.0.0rc0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.1 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.18.0 | mmdet>=2.19.0, <=3.0.0| mmseg>=0.20.0, <=1.0.0 | mmcv-full>=1.3.8, <=1.5.0| | 0.17.3 | mmdet>=2.14.0, <=3.0.0| mmseg>=0.14.1, <=1.0.0 | mmcv-full>=1.3.8, <=1.4.0| diff --git a/mmdet3d/models/dense_heads/centerpoint_head.py b/mmdet3d/models/dense_heads/centerpoint_head.py index 0d043d8a6a..0529968f77 100644 --- a/mmdet3d/models/dense_heads/centerpoint_head.py +++ b/mmdet3d/models/dense_heads/centerpoint_head.py @@ -24,7 +24,7 @@ class SeparateHead(BaseModule): heads (dict): Conv information. head_conv (int, optional): Output channels. Default: 64. - final_kernal (int, optional): Kernel size for the last conv layer. + final_kernel (int, optional): Kernel size for the last conv layer. Default: 1. init_bias (float, optional): Initial bias. Default: -2.19. conv_cfg (dict, optional): Config of conv layer. @@ -137,7 +137,7 @@ class DCNSeparateHead(BaseModule): dcn_config (dict): Config of dcn layer. head_conv (int, optional): Output channels. Default: 64. - final_kernal (int, optional): Kernel size for the last conv + final_kernel (int, optional): Kernel size for the last conv layer. Default: 1. init_bias (float, optional): Initial bias. Default: -2.19. conv_cfg (dict, optional): Config of conv layer. diff --git a/mmdet3d/version.py b/mmdet3d/version.py index 6067966a77..9b89d23fe2 100644 --- a/mmdet3d/version.py +++ b/mmdet3d/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '0.18.1' +__version__ = '1.0.0rc0' short_version = __version__ From a8817998d4f36f4f2f178b055af6a0ded1b14a81 Mon Sep 17 00:00:00 2001 From: ChaimZhu Date: Wed, 23 Feb 2022 19:35:19 +0800 Subject: [PATCH 23/23] fix ci in dev branch (#1264) --- mmdet3d/ops/group_points/group_points.py | 1 + .../test_common_modules/test_pointnet_ops.py | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/mmdet3d/ops/group_points/group_points.py b/mmdet3d/ops/group_points/group_points.py index 961285d749..0430aa65e6 100644 --- a/mmdet3d/ops/group_points/group_points.py +++ b/mmdet3d/ops/group_points/group_points.py @@ -1,4 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. + from typing import Tuple import torch diff --git a/tests/test_models/test_common_modules/test_pointnet_ops.py b/tests/test_models/test_common_modules/test_pointnet_ops.py index ec3a581e63..30ad69b5d6 100644 --- a/tests/test_models/test_common_modules/test_pointnet_ops.py +++ b/tests/test_models/test_common_modules/test_pointnet_ops.py @@ -2,16 +2,9 @@ import pytest import torch -from mmdet3d.ops import ( - ball_query, - furthest_point_sample, - furthest_point_sample_with_dist, - gather_points, - grouping_operation, - knn, - three_interpolate, - three_nn, -) +from mmdet3d.ops import (ball_query, furthest_point_sample, + furthest_point_sample_with_dist, gather_points, + grouping_operation, knn, three_interpolate, three_nn) def test_fps():