-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 975c80a
Showing
775 changed files
with
114,749 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
include mmdet3d/.mim/model-index.yml | ||
include requirements/*.txt | ||
recursive-include mmdet3d/.mim/ops *.cpp *.cu *.h *.cc | ||
recursive-include mmdet3d/.mim/configs *.py *.yml | ||
recursive-include mmdet3d/.mim/tools *.sh *.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
## TR3D: Towards Real-Time Indoor 3D Object Detection | ||
|
||
This repository contains an implementation of TR3D, a 3D object detection method introduced in our paper: | ||
|
||
> **TR3D: Towards Real-Time Indoor 3D Object Detection**<br> | ||
> [Danila Rukhovich](https://github.com/filaPro), | ||
> [Anna Vorontsova](https://github.com/highrut), | ||
> [Anton Konushin](https://scholar.google.com/citations?user=ZT_k-wMAAAAJ) | ||
> <br> | ||
> Samsung AI Center Moscow <br> | ||
> https://arxiv.org/abs/2302.????? | ||
### Installation | ||
For convenience, we provide a [Dockerfile](docker/Dockerfile). | ||
|
||
Alternatively, you can install all required packages manually. This implementation is based on [mmdetection3d](https://github.com/open-mmlab/mmdetection3d) framework. | ||
Please refer to the original installation guide [getting_started.md](docs/getting_started.md), including MinkowskiEngine installation, replacing `open-mmlab/mmdetection3d` with `samsunglabs/tr3d`. | ||
|
||
|
||
Most of the `TR3D`-related code locates in the following files: | ||
[detectors/mink_single_stage.py](mmdet3d/models/detectors/mink_single_stage.py), | ||
[detectors/tr3d_ff.py](mmdet3d/models/detectors/tr3d_ff.py), | ||
[dense_heads/tr3d_head.py](mmdet3d/models/dense_heads/tr3d_head.py), | ||
[necks/tr3d_neck.py](mmdet3d/models/necks/tr3d_neck.py). | ||
|
||
### Getting Started | ||
|
||
Please see [getting_started.md](docs/getting_started.md) for basic usage examples. | ||
We follow the mmdetection3d data preparation protocol described in [scannet](data/scannet), [sunrgbd](data/sunrgbd), and [s3dis](data/s3dis). | ||
|
||
**Training** | ||
|
||
To start training, run [train](tools/train.py) with TR3D [configs](configs/tr3d): | ||
```shell | ||
python tools/train.py configs/tr3d/tr3d_scannet-3d-18class.py | ||
``` | ||
|
||
**Testing** | ||
|
||
Test pre-trained model using [test](tools/dist_test.sh) with TR3D [configs](configs/tr3d): | ||
```shell | ||
python tools/test.py configs/tr3d/tr3d_scannet-3d-18class.py \ | ||
work_dirs/tr3d_scannet-3d-18class/latest.pth --eval mAP | ||
``` | ||
|
||
**Visualization** | ||
|
||
Visualizations can be created with [test](tools/test.py) script. | ||
For better visualizations, you may set `score_thr` in configs to `0.3`: | ||
```shell | ||
python tools/test.py configs/tr3d/tr3d_scannet-3d-18class.py \ | ||
work_dirs/tr3d_scannet-3d-18class/latest.pth --eval mAP --show \ | ||
--show-dir work_dirs/tr3d_scannet-3d-18class | ||
``` | ||
|
||
### Models | ||
|
||
The metrics are obtained in 5 training runs followed by 5 test runs. We report both the best and the average values (the latter are given in round brackets). | ||
Inference speed (scenes per second) is measured on a single NVidia RTX 4090. | ||
|
||
**TR3D 3D Detection** | ||
|
||
| Dataset | mAP@0.25 | mAP@0.5 | Scenes <br> per sec.| Download | | ||
|:-------:|:--------:|:-------:|:-------------------:|:--------:| | ||
| ScanNet | 72.9 (72.0) | 58.8 (57.4) | 23.7 | [model](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_scannet.pth) | [log](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_scannet.log.json) | [config](configs/tr3d/tr3d_scannet-3d-18class.py) | | ||
| SUN RGB-D | 67.1 (66.3) | 49.9 (49.5) | 27.5 | [model](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_sunrgbd.pth) | [log](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_sunrgbd.log.json) | [config](configs/tr3d/tr3d_sunrgbd-3d-10class.py) | | ||
| S3DIS | 74.5 (72.1) | 50.6 (46.1) | 21.0 | [model](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_s3dis.pth) | [log](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_s3dis.log.json) | [config](configs/tr3d/tr3d_s3dis-3d-5class.py) | | ||
|
||
**RGB + PC 3D Detection on SUN RGB-D** | ||
|
||
| Model | mAP@0.25 | mAP@0.5 | Scenes <br> per sec.| Download | | ||
|:-----:|:--------:|:-------:|:-------------------:|:--------:| | ||
| ImVoteNet | 63.4 | - | 14.8 | [instruction](configs/imvotenet) | | ||
| VoteNet+FF | 64.5 (63.7) | 39.2 (38.1) | - | [model](https://github.com/samsunglabs/tr3d/releases/download/v1.0/votenet_ff_sunrgbd.pth) | [log](https://github.com/samsunglabs/tr3d/releases/download/v1.0/votenet_ff_sunrgbd.log.json) | [config](configs/votenet/votenet-ff_16x8_sunrgbd-3d-10class.py) | | ||
| TR3D+FF | 69.3 (68.7) | 52.9 (52.4) | 17.5 | [model](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_ff_sunrgbd.pth) | [log](https://github.com/samsunglabs/tr3d/releases/download/v1.0/tr3d_ff_sunrgbd.log.json) | [config](configs/tr3d/tr3d-ff_sunrgbd-3d-10class.py) | | ||
|
||
### Example Detections | ||
|
||
<p align="center"><img src="./resources/github.png" alt="drawing" width="90%"/></p> | ||
|
||
### Citation | ||
|
||
If you find this work useful for your research, please cite our paper: | ||
``` | ||
@inproceedings{rukhovich2023tr3d, | ||
title={TR3D: Towards Real-Time Indoor 3D Object Detection}, | ||
author={Rukhovich, Danila and Vorontsova, Anna and Konushin, Anton}, | ||
journal={arXiv preprint arXiv:2302.?????}, | ||
year={2023} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
_base_ = [ | ||
'../_base_/models/3dssd.py', '../_base_/datasets/kitti-3d-car.py', | ||
'../_base_/default_runtime.py' | ||
] | ||
|
||
# dataset settings | ||
dataset_type = 'KittiDataset' | ||
data_root = 'data/kitti/' | ||
class_names = ['Car'] | ||
point_cloud_range = [0, -40, -5, 70, 40, 3] | ||
input_modality = dict(use_lidar=True, use_camera=False) | ||
db_sampler = dict( | ||
data_root=data_root, | ||
info_path=data_root + 'kitti_dbinfos_train.pkl', | ||
rate=1.0, | ||
prepare=dict(filter_by_difficulty=[-1], filter_by_min_points=dict(Car=5)), | ||
classes=class_names, | ||
sample_groups=dict(Car=15)) | ||
|
||
file_client_args = dict(backend='disk') | ||
# Uncomment the following if use ceph or other file clients. | ||
# See https://mmcv.readthedocs.io/en/latest/api.html#mmcv.fileio.FileClient | ||
# for more details. | ||
# file_client_args = dict( | ||
# backend='petrel', path_mapping=dict(data='s3://kitti_data/')) | ||
|
||
train_pipeline = [ | ||
dict( | ||
type='LoadPointsFromFile', | ||
coord_type='LIDAR', | ||
load_dim=4, | ||
use_dim=4, | ||
file_client_args=file_client_args), | ||
dict( | ||
type='LoadAnnotations3D', | ||
with_bbox_3d=True, | ||
with_label_3d=True, | ||
file_client_args=file_client_args), | ||
dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range), | ||
dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range), | ||
dict(type='ObjectSample', db_sampler=db_sampler), | ||
dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5), | ||
dict( | ||
type='ObjectNoise', | ||
num_try=100, | ||
translation_std=[1.0, 1.0, 0], | ||
global_rot_range=[0.0, 0.0], | ||
rot_range=[-1.0471975511965976, 1.0471975511965976]), | ||
dict( | ||
type='GlobalRotScaleTrans', | ||
rot_range=[-0.78539816, 0.78539816], | ||
scale_ratio_range=[0.9, 1.1]), | ||
# 3DSSD can get a higher performance without this transform | ||
# dict(type='BackgroundPointsFilter', bbox_enlarge_range=(0.5, 2.0, 0.5)), | ||
dict(type='PointSample', num_points=16384), | ||
dict(type='DefaultFormatBundle3D', class_names=class_names), | ||
dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d']) | ||
] | ||
|
||
test_pipeline = [ | ||
dict( | ||
type='LoadPointsFromFile', | ||
coord_type='LIDAR', | ||
load_dim=4, | ||
use_dim=4, | ||
file_client_args=file_client_args), | ||
dict( | ||
type='MultiScaleFlipAug3D', | ||
img_scale=(1333, 800), | ||
pts_scale_ratio=1, | ||
flip=False, | ||
transforms=[ | ||
dict( | ||
type='GlobalRotScaleTrans', | ||
rot_range=[0, 0], | ||
scale_ratio_range=[1., 1.], | ||
translation_std=[0, 0, 0]), | ||
dict(type='RandomFlip3D'), | ||
dict( | ||
type='PointsRangeFilter', point_cloud_range=point_cloud_range), | ||
dict(type='PointSample', num_points=16384), | ||
dict( | ||
type='DefaultFormatBundle3D', | ||
class_names=class_names, | ||
with_label=False), | ||
dict(type='Collect3D', keys=['points']) | ||
]) | ||
] | ||
|
||
data = dict( | ||
samples_per_gpu=4, | ||
workers_per_gpu=4, | ||
train=dict(dataset=dict(pipeline=train_pipeline)), | ||
val=dict(pipeline=test_pipeline), | ||
test=dict(pipeline=test_pipeline)) | ||
|
||
evaluation = dict(interval=2) | ||
|
||
# model settings | ||
model = dict( | ||
bbox_head=dict( | ||
num_classes=1, | ||
bbox_coder=dict( | ||
type='AnchorFreeBBoxCoder', num_dir_bins=12, with_rot=True))) | ||
|
||
# optimizer | ||
lr = 0.002 # max learning rate | ||
optimizer = dict(type='AdamW', lr=lr, weight_decay=0) | ||
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) | ||
lr_config = dict(policy='step', warmup=None, step=[45, 60]) | ||
# runtime settings | ||
runner = dict(type='EpochBasedRunner', max_epochs=80) | ||
|
||
# yapf:disable | ||
log_config = dict( | ||
interval=30, | ||
hooks=[ | ||
dict(type='TextLoggerHook'), | ||
dict(type='TensorboardLoggerHook') | ||
]) | ||
# yapf:enable |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# 3DSSD: Point-based 3D Single Stage Object Detector | ||
|
||
> [3DSSD: Point-based 3D Single Stage Object Detector](https://arxiv.org/abs/2002.10187) | ||
<!-- [ALGORITHM] --> | ||
|
||
## Abstract | ||
|
||
Currently, there have been many kinds of voxel-based 3D single stage detectors, while point-based single stage methods are still underexplored. In this paper, we first present a lightweight and effective point-based 3D single stage object detector, named 3DSSD, achieving a good balance between accuracy and efficiency. In this paradigm, all upsampling layers and refinement stage, which are indispensable in all existing point-based methods, are abandoned to reduce the large computation cost. We novelly propose a fusion sampling strategy in downsampling process to make detection on less representative points feasible. A delicate box prediction network including a candidate generation layer, an anchor-free regression head with a 3D center-ness assignment strategy is designed to meet with our demand of accuracy and speed. Our paradigm is an elegant single stage anchor-free framework, showing great superiority to other existing methods. We evaluate 3DSSD on widely used KITTI dataset and more challenging nuScenes dataset. Our method outperforms all state-of-the-art voxel-based single stage methods by a large margin, and has comparable performance to two stage point-based methods as well, with inference speed more than 25 FPS, 2x faster than former state-of-the-art point-based methods. | ||
|
||
<div align=center> | ||
<img src="https://user-images.githubusercontent.com/30491025/143854187-54ed1257-a046-4764-81cd-d2c8404137d3.png" width="800"/> | ||
</div> | ||
|
||
## Introduction | ||
|
||
We implement 3DSSD and provide the results and checkpoints on KITTI datasets. | ||
|
||
Some settings in our implementation are different from the [official implementation](https://github.com/Jia-Research-Lab/3DSSD), which bring marginal differences to the performance on KITTI datasets in our experiments. To simplify and unify the models of our implementation, we skip them in our models. These differences are listed as below: | ||
|
||
1. We keep the scenes without any object while the official code skips these scenes in training. In the official implementation, only 3229 and 3394 samples are used as training and validation sets, respectively. In our implementation, we keep using 3712 and 3769 samples as training and validation sets, respectively, as those used for all the other models in our implementation on KITTI datasets. | ||
2. We do not modify the decay of `batch normalization` during training. | ||
3. While using [`DataBaseSampler`](https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/datasets/pipelines/dbsampler.py#L80) for data augmentation, the official code uses road planes as reference to place the sampled objects while we do not. | ||
4. We perform detection using LIDAR coordinates while the official code uses camera coordinates. | ||
|
||
## Results and models | ||
|
||
### KITTI | ||
|
||
| Backbone | Class | Lr schd | Mem (GB) | Inf time (fps) | mAP | Download | | ||
| :-------------------------------------------: | :---: | :-----: | :------: | :------------: | :----------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | ||
| [PointNet2SAMSG](./3dssd_4x4_kitti-3d-car.py) | Car | 72e | 4.7 | | 78.58(81.27)<sup>1</sup> | [model](https://download.openmmlab.com/mmdetection3d/v1.0.0_models/3dssd/3dssd_4x4_kitti-3d-car/3dssd_4x4_kitti-3d-car_20210818_203828-b89c8fc4.pth) \| [log](https://download.openmmlab.com/mmdetection3d/v1.0.0_models/3dssd/3dssd_4x4_kitti-3d-car/3dssd_4x4_kitti-3d-car_20210818_203828.log.json) | | ||
|
||
\[1\]: We report two different 3D object detection performance here. 78.58mAP is evaluated by our evaluation code and 81.27mAP is evaluated by the official development kit (so as that used in the paper and official code of 3DSSD ). We found that the commonly used Python implementation of [`rotate_iou`](https://github.com/traveller59/second.pytorch/blob/e42e4a0e17262ab7d180ee96a0a36427f2c20a44/second/core/non_max_suppression/nms_gpu.py#L605) which is used in our KITTI dataset evaluation, is different from the official implementation in [KITTI benchmark](http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d). | ||
|
||
## Citation | ||
|
||
```latex | ||
@inproceedings{yang20203dssd, | ||
author = {Zetong Yang and Yanan Sun and Shu Liu and Jiaya Jia}, | ||
title = {3DSSD: Point-based 3D Single Stage Object Detector}, | ||
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, | ||
year = {2020} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
Collections: | ||
- Name: 3DSSD | ||
Metadata: | ||
Training Data: KITTI | ||
Training Techniques: | ||
- AdamW | ||
Training Resources: 4x TITAN X | ||
Architecture: | ||
- PointNet++ | ||
Paper: | ||
URL: https://arxiv.org/abs/2002.10187 | ||
Title: '3DSSD: Point-based 3D Single Stage Object Detector' | ||
README: configs/3dssd/README.md | ||
Code: | ||
URL: https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/models/detectors/ssd3dnet.py#L7 | ||
Version: v0.6.0 | ||
|
||
Models: | ||
- Name: 3dssd_4x4_kitti-3d-car | ||
In Collection: 3DSSD | ||
Config: configs/3dssd/3dssd_4x4_kitti-3d-car.py | ||
Metadata: | ||
Training Memory (GB): 4.7 | ||
Results: | ||
- Task: 3D Object Detection | ||
Dataset: KITTI | ||
Metrics: | ||
mAP: 78.58 | ||
Weights: https://download.openmmlab.com/mmdetection3d/v1.0.0_models/3dssd/3dssd_4x4_kitti-3d-car/3dssd_4x4_kitti-3d-car_20210818_203828-b89c8fc4.pth |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
dataset_type = 'CocoDataset' | ||
data_root = 'data/coco/' | ||
img_norm_cfg = dict( | ||
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) | ||
train_pipeline = [ | ||
dict(type='LoadImageFromFile'), | ||
dict(type='LoadAnnotations', with_bbox=True, with_mask=True), | ||
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), | ||
dict(type='RandomFlip', flip_ratio=0.5), | ||
dict(type='Normalize', **img_norm_cfg), | ||
dict(type='Pad', size_divisor=32), | ||
dict(type='DefaultFormatBundle'), | ||
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), | ||
] | ||
test_pipeline = [ | ||
dict(type='LoadImageFromFile'), | ||
dict( | ||
type='MultiScaleFlipAug', | ||
img_scale=(1333, 800), | ||
flip=False, | ||
transforms=[ | ||
dict(type='Resize', keep_ratio=True), | ||
dict(type='RandomFlip'), | ||
dict(type='Normalize', **img_norm_cfg), | ||
dict(type='Pad', size_divisor=32), | ||
dict(type='ImageToTensor', keys=['img']), | ||
dict(type='Collect', keys=['img']), | ||
]) | ||
] | ||
data = dict( | ||
samples_per_gpu=2, | ||
workers_per_gpu=2, | ||
train=dict( | ||
type=dataset_type, | ||
ann_file=data_root + 'annotations/instances_train2017.json', | ||
img_prefix=data_root + 'train2017/', | ||
pipeline=train_pipeline), | ||
val=dict( | ||
type=dataset_type, | ||
ann_file=data_root + 'annotations/instances_val2017.json', | ||
img_prefix=data_root + 'val2017/', | ||
pipeline=test_pipeline), | ||
test=dict( | ||
type=dataset_type, | ||
ann_file=data_root + 'annotations/instances_val2017.json', | ||
img_prefix=data_root + 'val2017/', | ||
pipeline=test_pipeline)) | ||
evaluation = dict(metric=['bbox', 'segm']) |
Oops, something went wrong.