From bdc9e4846fae9265f441b0322a7d8c55a772f795 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Sat, 8 May 2021 13:20:53 +0800 Subject: [PATCH 1/9] add configs for pn2 on s3dis --- .../pointnet2_msg_16x2_s3dis-3d-13class.py | 32 +++++++++++++++++++ .../pointnet2_ssg_16x2_s3dis-3d-13class.py | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py create mode 100644 configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py diff --git a/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py new file mode 100644 index 0000000000..cc991f81f9 --- /dev/null +++ b/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/datasets/s3dis_seg-3d-13class.py', + '../_base_/models/pointnet2_msg.py', '../_base_/default_runtime.py' +] + +# data settings +data_root = './data/s3dis/' +data = dict(samples_per_gpu=16) +evaluation = dict(interval=5) + +# model settings +model = dict( + backbone=dict(in_channels=9), # [xyz, rgb, normalized_xyz] + decode_head=dict( + num_classes=13, ignore_index=13, + loss_decode=dict(class_weight=None)), # S3DIS doesn't use class_weight + test_cfg=dict( + num_points=4096, + block_size=1.0, + sample_rate=0.5, + use_normalized_coord=True, + batch_size=24)) + +# optimizer +lr = 0.001 # max learning rate +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) + +# runtime settings +checkpoint_config = dict(interval=5) +runner = dict(type='EpochBasedRunner', max_epochs=150) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py new file mode 100644 index 0000000000..1055a5751b --- /dev/null +++ b/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/datasets/s3dis_seg-3d-13class.py', + '../_base_/models/pointnet2_ssg.py', '../_base_/default_runtime.py' +] + +# data settings +data_root = './data/s3dis/' +data = dict(samples_per_gpu=16) +evaluation = dict(interval=5) + +# model settings +model = dict( + backbone=dict(in_channels=9), # [xyz, rgb, normalized_xyz] + decode_head=dict( + num_classes=13, ignore_index=13, + loss_decode=dict(class_weight=None)), # S3DIS doesn't use class_weight + test_cfg=dict( + num_points=4096, + block_size=1.0, + sample_rate=0.5, + use_normalized_coord=True, + batch_size=24)) + +# optimizer +lr = 0.001 # max learning rate +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) + +# runtime settings +checkpoint_config = dict(interval=5) +runner = dict(type='EpochBasedRunner', max_epochs=150) From 15444b7aed3eaf5ca1cd44025b8dabc9c79d6ed1 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Sat, 8 May 2021 21:22:04 +0800 Subject: [PATCH 2/9] fix bugs --- configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py | 6 +++--- configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py | 6 +++--- mmdet3d/datasets/s3dis_dataset.py | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py index cc991f81f9..a93f76a842 100644 --- a/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py @@ -6,7 +6,7 @@ # data settings data_root = './data/s3dis/' data = dict(samples_per_gpu=16) -evaluation = dict(interval=5) +evaluation = dict(interval=2) # model settings model = dict( @@ -28,5 +28,5 @@ lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) # runtime settings -checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=150) +checkpoint_config = dict(interval=2) +runner = dict(type='EpochBasedRunner', max_epochs=50) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py index 1055a5751b..14cba03243 100644 --- a/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py @@ -6,7 +6,7 @@ # data settings data_root = './data/s3dis/' data = dict(samples_per_gpu=16) -evaluation = dict(interval=5) +evaluation = dict(interval=2) # model settings model = dict( @@ -28,5 +28,5 @@ lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) # runtime settings -checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=150) +checkpoint_config = dict(interval=2) +runner = dict(type='EpochBasedRunner', max_epochs=50) diff --git a/mmdet3d/datasets/s3dis_dataset.py b/mmdet3d/datasets/s3dis_dataset.py index 213ba80eda..d3058eb353 100644 --- a/mmdet3d/datasets/s3dis_dataset.py +++ b/mmdet3d/datasets/s3dis_dataset.py @@ -171,6 +171,7 @@ def get_scene_idxs_and_label_weight(self, scene_idxs, label_weight): @DATASETS.register_module() +@SEG_DATASETS.register_module() class S3DISSegDataset(_S3DISSegDataset): r"""S3DIS Dataset for Semantic Segmentation Task. From 47a49ca5eb1df01015a36111da77e53f9e664e29 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Thu, 13 May 2021 13:58:01 +0800 Subject: [PATCH 3/9] add README for PN2 segmentor --- configs/pointnet2/README.md | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 configs/pointnet2/README.md diff --git a/configs/pointnet2/README.md b/configs/pointnet2/README.md new file mode 100644 index 0000000000..976537045f --- /dev/null +++ b/configs/pointnet2/README.md @@ -0,0 +1,44 @@ +# PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space + +## Introduction + + + +We implement PointNet++ and provide the result and checkpoints on ScanNet and S3DIS datasets. + +``` +@inproceedings{qi2017pointnet++, + title={PointNet++ deep hierarchical feature learning on point sets in a metric space}, + author={Qi, Charles R and Yi, Li and Su, Hao and Guibas, Leonidas J}, + booktitle={Proceedings of the 31st International Conference on Neural Information Processing Systems}, + pages={5105--5114}, + year={2017} +} +``` + +## Results + +### ScanNet + +| Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | +| :------------------: | :-----: | :---------: | :------: | :------------: | :------------: | :------: | +| [PointNet++ (SSG)]() | XYZ | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (SSG)]() | XYZ+Color | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (MSG)]() | XYZ | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (MSG)]() | XYZ+Color | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| + +### S3DIS + +| Method | Split | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | +| :------------------: | :----: | :--------: | :------: | :------------: | :------------: | :------: | +| [PointNet++ (SSG)]() | Area_5 | cosine 50e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (MSG)]() | Area_5 | cosine 50e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| + +**Notes:** + +- We use XYZ+Color+Normalized_XYZ as input in all the experiments on S3DIS datasets. +- `Area_5` Split means training the model on Area_1, 2, 3, 4, 6 and testing on Area_5. + +## Indeterminism + +Since PointNet++ testing adopts sliding patch inference which involves random point sampling, and the test script uses fixed random seeds while the random seeds of validation in training are not fixed, the test results may be slightly different from the results reported above. From 0d88b8820dbdd47616cb0bf339cbef4cdbc054fb Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Thu, 13 May 2021 15:49:38 +0800 Subject: [PATCH 4/9] update configs file after experiments --- ...sg_16x2_cosine_200e_scannet-3d-20class.py} | 4 +- ...2_msg_16x2_cosine_64e_s3dis-3d-13class.py} | 4 +- ...xyz_16x2_cosine_200e_scannet-3d-20class.py | 170 ++++++++++++++++++ ...sg_16x2_cosine_200e_scannet-3d-20class.py} | 4 +- ...2_ssg_16x2_cosine_50e_s3dis-3d-13class.py} | 2 +- ...xyz_16x2_cosine_200e_scannet-3d-20class.py | 170 ++++++++++++++++++ 6 files changed, 347 insertions(+), 7 deletions(-) rename configs/pointnet2/{pointnet2_msg_16x2_scannet-3d-20class.py => pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py} (91%) rename configs/pointnet2/{pointnet2_msg_16x2_s3dis-3d-13class.py => pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py} (88%) create mode 100644 configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py rename configs/pointnet2/{pointnet2_ssg_16x2_scannet-3d-20class.py => pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py} (91%) rename configs/pointnet2/{pointnet2_ssg_16x2_s3dis-3d-13class.py => pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py} (94%) create mode 100644 configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py diff --git a/configs/pointnet2/pointnet2_msg_16x2_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py similarity index 91% rename from configs/pointnet2/pointnet2_msg_16x2_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py index 115fa521fa..98cc69d2dc 100644 --- a/configs/pointnet2/pointnet2_msg_16x2_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py @@ -31,10 +31,10 @@ # optimizer lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) optimizer_config = dict(grad_clip=None) lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=150) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py similarity index 88% rename from configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py index a93f76a842..88909acd17 100644 --- a/configs/pointnet2/pointnet2_msg_16x2_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py @@ -23,10 +23,10 @@ # optimizer lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-3) optimizer_config = dict(grad_clip=None) lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) # runtime settings checkpoint_config = dict(interval=2) -runner = dict(type='EpochBasedRunner', max_epochs=50) +runner = dict(type='EpochBasedRunner', max_epochs=64) diff --git a/configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py new file mode 100644 index 0000000000..75488a2774 --- /dev/null +++ b/configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py @@ -0,0 +1,170 @@ +_base_ = [ + '../_base_/datasets/scannet_seg-3d-20class.py', + '../_base_/models/pointnet2_msg.py', '../_base_/default_runtime.py' +] + +# dataset settings +# in this setting, we only use xyz as network input +# so we need to re-write all the data pipeline +dataset_type = 'ScanNetSegDataset' +data_root = './data/scannet/' +class_names = ('wall', 'floor', 'cabinet', 'bed', 'chair', 'sofa', 'table', + 'door', 'window', 'bookshelf', 'picture', 'counter', 'desk', + 'curtain', 'refrigerator', 'showercurtrain', 'toilet', 'sink', + 'bathtub', 'otherfurniture') +num_points = 8192 +train_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), # only load xyz coordinates + dict( + type='LoadAnnotations3D', + with_bbox_3d=False, + with_label_3d=False, + with_mask_3d=False, + with_seg_3d=True), + dict( + type='PointSegClassMapping', + valid_cat_ids=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, + 33, 34, 36, 39), + max_cat_id=40), + dict( + type='IndoorPatchPointSample', + num_points=num_points, + block_size=1.5, + sample_rate=1.0, + ignore_index=len(class_names), + use_normalized_coord=False), + dict(type='DefaultFormatBundle3D', class_names=class_names), + dict(type='Collect3D', keys=['points', 'pts_semantic_mask']) +] +test_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), + dict( + # a wrapper in order to successfully call test function + # actually we don't perform test-time-aug + 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', + sync_2d=False, + flip_ratio_bev_horizontal=0.0, + flip_ratio_bev_vertical=0.0), + dict( + type='DefaultFormatBundle3D', + class_names=class_names, + with_label=False), + dict(type='Collect3D', keys=['points']) + ]) +] +# construct a pipeline for data and gt loading in show function +# please keep its loading function consistent with test_pipeline (e.g. client) +# we need to load gt seg_mask! +eval_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), + dict( + type='LoadAnnotations3D', + with_bbox_3d=False, + with_label_3d=False, + with_mask_3d=False, + with_seg_3d=True), + dict( + type='PointSegClassMapping', + valid_cat_ids=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, + 33, 34, 36, 39), + max_cat_id=40), + dict( + type='DefaultFormatBundle3D', + with_label=False, + class_names=class_names), + dict(type='Collect3D', keys=['points', 'pts_semantic_mask']) +] + +data = dict( + samples_per_gpu=16, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_train.pkl', + pipeline=train_pipeline, + classes=class_names, + test_mode=False, + ignore_index=len(class_names), + scene_idxs=data_root + 'seg_info/train_resampled_scene_idxs.npy', + label_weight=data_root + 'seg_info/train_label_weight.npy'), + val=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_val.pkl', + pipeline=test_pipeline, + classes=class_names, + test_mode=True, + ignore_index=len(class_names)), + test=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_val.pkl', + pipeline=test_pipeline, + classes=class_names, + test_mode=True, + ignore_index=len(class_names))) + +evaluation = dict(pipeline=eval_pipeline, interval=5) + +# model settings +model = dict( + backbone=dict(in_channels=3), # only [xyz] + decode_head=dict( + num_classes=20, + ignore_index=20, + # `class_weight` is generated in data pre-processing, saved in + # `data/scannet/seg_info/train_label_weight.npy` + # you can copy paste the values here, or input the file path as + # `class_weight=data/scannet/seg_info/train_label_weight.npy` + loss_decode=dict(class_weight=[ + 2.389689, 2.7215734, 4.5944676, 4.8543367, 4.096086, 4.907941, + 4.690836, 4.512031, 4.623311, 4.9242644, 5.358117, 5.360071, + 5.019636, 4.967126, 5.3502126, 5.4023647, 5.4027233, 5.4169416, + 5.3954206, 4.6971426 + ])), + test_cfg=dict( + num_points=8192, + block_size=1.5, + sample_rate=0.5, + use_normalized_coord=False, + batch_size=24)) + +# optimizer +lr = 0.001 # max learning rate +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) + +# runtime settings +checkpoint_config = dict(interval=5) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py similarity index 91% rename from configs/pointnet2/pointnet2_ssg_16x2_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py index ab884d83c7..ed05e0fcd1 100644 --- a/configs/pointnet2/pointnet2_ssg_16x2_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py @@ -31,10 +31,10 @@ # optimizer lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) optimizer_config = dict(grad_clip=None) lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=150) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py similarity index 94% rename from configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py rename to configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py index 14cba03243..fccf99ed34 100644 --- a/configs/pointnet2/pointnet2_ssg_16x2_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py @@ -23,7 +23,7 @@ # optimizer lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-4) +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-3) optimizer_config = dict(grad_clip=None) lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) diff --git a/configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py new file mode 100644 index 0000000000..8e5ffdaf8f --- /dev/null +++ b/configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py @@ -0,0 +1,170 @@ +_base_ = [ + '../_base_/datasets/scannet_seg-3d-20class.py', + '../_base_/models/pointnet2_ssg.py', '../_base_/default_runtime.py' +] + +# dataset settings +# in this setting, we only use xyz as network input +# so we need to re-write all the data pipeline +dataset_type = 'ScanNetSegDataset' +data_root = './data/scannet/' +class_names = ('wall', 'floor', 'cabinet', 'bed', 'chair', 'sofa', 'table', + 'door', 'window', 'bookshelf', 'picture', 'counter', 'desk', + 'curtain', 'refrigerator', 'showercurtrain', 'toilet', 'sink', + 'bathtub', 'otherfurniture') +num_points = 8192 +train_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), # only load xyz coordinates + dict( + type='LoadAnnotations3D', + with_bbox_3d=False, + with_label_3d=False, + with_mask_3d=False, + with_seg_3d=True), + dict( + type='PointSegClassMapping', + valid_cat_ids=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, + 33, 34, 36, 39), + max_cat_id=40), + dict( + type='IndoorPatchPointSample', + num_points=num_points, + block_size=1.5, + sample_rate=1.0, + ignore_index=len(class_names), + use_normalized_coord=False), + dict(type='DefaultFormatBundle3D', class_names=class_names), + dict(type='Collect3D', keys=['points', 'pts_semantic_mask']) +] +test_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), + dict( + # a wrapper in order to successfully call test function + # actually we don't perform test-time-aug + 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', + sync_2d=False, + flip_ratio_bev_horizontal=0.0, + flip_ratio_bev_vertical=0.0), + dict( + type='DefaultFormatBundle3D', + class_names=class_names, + with_label=False), + dict(type='Collect3D', keys=['points']) + ]) +] +# construct a pipeline for data and gt loading in show function +# please keep its loading function consistent with test_pipeline (e.g. client) +# we need to load gt seg_mask! +eval_pipeline = [ + dict( + type='LoadPointsFromFile', + coord_type='DEPTH', + shift_height=False, + use_color=False, + load_dim=6, + use_dim=[0, 1, 2]), + dict( + type='LoadAnnotations3D', + with_bbox_3d=False, + with_label_3d=False, + with_mask_3d=False, + with_seg_3d=True), + dict( + type='PointSegClassMapping', + valid_cat_ids=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, + 33, 34, 36, 39), + max_cat_id=40), + dict( + type='DefaultFormatBundle3D', + with_label=False, + class_names=class_names), + dict(type='Collect3D', keys=['points', 'pts_semantic_mask']) +] + +data = dict( + samples_per_gpu=16, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_train.pkl', + pipeline=train_pipeline, + classes=class_names, + test_mode=False, + ignore_index=len(class_names), + scene_idxs=data_root + 'seg_info/train_resampled_scene_idxs.npy', + label_weight=data_root + 'seg_info/train_label_weight.npy'), + val=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_val.pkl', + pipeline=test_pipeline, + classes=class_names, + test_mode=True, + ignore_index=len(class_names)), + test=dict( + type=dataset_type, + data_root=data_root, + ann_file=data_root + 'scannet_infos_val.pkl', + pipeline=test_pipeline, + classes=class_names, + test_mode=True, + ignore_index=len(class_names))) + +evaluation = dict(pipeline=eval_pipeline, interval=5) + +# model settings +model = dict( + backbone=dict(in_channels=3), # only [xyz] + decode_head=dict( + num_classes=20, + ignore_index=20, + # `class_weight` is generated in data pre-processing, saved in + # `data/scannet/seg_info/train_label_weight.npy` + # you can copy paste the values here, or input the file path as + # `class_weight=data/scannet/seg_info/train_label_weight.npy` + loss_decode=dict(class_weight=[ + 2.389689, 2.7215734, 4.5944676, 4.8543367, 4.096086, 4.907941, + 4.690836, 4.512031, 4.623311, 4.9242644, 5.358117, 5.360071, + 5.019636, 4.967126, 5.3502126, 5.4023647, 5.4027233, 5.4169416, + 5.3954206, 4.6971426 + ])), + test_cfg=dict( + num_points=8192, + block_size=1.5, + sample_rate=0.5, + use_normalized_coord=False, + batch_size=24)) + +# optimizer +lr = 0.001 # max learning rate +optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) + +# runtime settings +checkpoint_config = dict(interval=5) +runner = dict(type='EpochBasedRunner', max_epochs=200) From 954b133f3bba74f8141432d04869c726effc19cd Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Thu, 13 May 2021 17:41:53 +0800 Subject: [PATCH 5/9] update README --- configs/pointnet2/README.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/configs/pointnet2/README.md b/configs/pointnet2/README.md index 976537045f..e14fab97a6 100644 --- a/configs/pointnet2/README.md +++ b/configs/pointnet2/README.md @@ -16,23 +16,37 @@ We implement PointNet++ and provide the result and checkpoints on ScanNet and S3 } ``` +**Notice**: The original PointNet++ paper used step learning rate schedule. We discovered that cosine schedule achieves much better results and adopt it in our implementations. We also use a larger `weight_decay` factor because we find it consistently improving the performance. + ## Results ### ScanNet -| Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | +| Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | mIoU (Test set) | Download | | :------------------: | :-----: | :---------: | :------: | :------------: | :------------: | :------: | -| [PointNet++ (SSG)]() | XYZ | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| -| [PointNet++ (SSG)]() | XYZ+Color | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| -| [PointNet++ (MSG)]() | XYZ | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| -| [PointNet++ (MSG)]() | XYZ+Color | cosine 150e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (SSG)](./pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 1.9 | | | |[model]() | [log]()| +| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py) | XYZ+Color | cosine 200e | 1.9 | | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 2.4 | | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py) | XYZ+Color | cosine 200e | 2.4 | | | |[model]() | [log]()| + +**Notes:** + +- The original PointNet++ paper conducted experiments on the ScanNet V1 dataset, while later point cloud segmentor papers often used ScanNet V2. Following common practice, we report results on the ScanNet V2 dataset. +- Since ScanNet dataset doesn't provide ground-truth labels for the test set, users can only evaluate test set performance by submitting to its online benchmark [website](http://kaldir.vc.in.tum.de/scannet_benchmark/). However, users are only allowed to submit once every two weeks. Therefore, we currently report val set mIoU. Test set performance may be added in the future. +- To generate submission file for ScanNet online benchmark, you need to modify the ScanNet dataset's [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/_base_/datasets/scannet_seg-3d-20class.py#L126). Change `ann_file=data_root + 'scannet_infos_val.pkl'` to `ann_file=data_root + 'scannet_infos_test.pkl'`, and then simply run: + + ```shell + python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --format-only --options 'txt_prefix=exps/pointnet2_scannet_results' + ``` + + This will save the prediction results as `txt` files in `exps/pointnet2_scannet_results/`. Then, go to this folder and zip all files into `pn2_scannet.zip`. Now you can submit it to the online benchmark and wait for the test set result. More instructions can be found at their official [website](http://kaldir.vc.in.tum.de/scannet_benchmark/documentation#submission-policy). ### S3DIS | Method | Split | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | | :------------------: | :----: | :--------: | :------: | :------------: | :------------: | :------: | -| [PointNet++ (SSG)]() | Area_5 | cosine 50e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| -| [PointNet++ (MSG)]() | Area_5 | cosine 50e | 4.1 | 62.90 | 52.50 |[model]() | [log]()| +| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py) | Area_5 | cosine 50e | 3.6 | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py) | Area_5 | cosine 64e | 3.6 | | |[model]() | [log]()| **Notes:** From ca62709792b3cfa9b129d468044915aef8152cd2 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Fri, 14 May 2021 14:21:03 +0800 Subject: [PATCH 6/9] add base schedule files for seg configs --- configs/_base_/schedules/seg_cosine_200e.py | 9 +++++++++ configs/_base_/schedules/seg_cosine_50e.py | 9 +++++++++ configs/pointnet2/README.md | 10 +++++----- ...net2_msg_16x2_cosine_250e_scannet-3d-20class.py} | 12 ++++-------- ...intnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py} | 13 ++++--------- ...xyz-only_16x2_cosine_250e_scannet-3d-20class.py} | 12 ++++-------- ...tnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py | 10 ++-------- ...ointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py | 11 ++--------- ...xyz-only_16x2_cosine_200e_scannet-3d-20class.py} | 10 ++-------- 9 files changed, 41 insertions(+), 55 deletions(-) create mode 100644 configs/_base_/schedules/seg_cosine_200e.py create mode 100644 configs/_base_/schedules/seg_cosine_50e.py rename configs/pointnet2/{pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py => pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py} (75%) rename configs/pointnet2/{pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py => pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py} (61%) rename configs/pointnet2/{pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py => pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py} (94%) rename configs/pointnet2/{pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py => pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py} (94%) diff --git a/configs/_base_/schedules/seg_cosine_200e.py b/configs/_base_/schedules/seg_cosine_200e.py new file mode 100644 index 0000000000..6a49484c8b --- /dev/null +++ b/configs/_base_/schedules/seg_cosine_200e.py @@ -0,0 +1,9 @@ +# optimizer +# This schedule is mainly used on ScanNet dataset in segmentation task +optimizer = dict(type='Adam', lr=0.001, weight_decay=0.01) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) +momentum_config = None + +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/_base_/schedules/seg_cosine_50e.py b/configs/_base_/schedules/seg_cosine_50e.py new file mode 100644 index 0000000000..975a8f9ff8 --- /dev/null +++ b/configs/_base_/schedules/seg_cosine_50e.py @@ -0,0 +1,9 @@ +# optimizer +# This schedule is mainly used on S3DIS dataset in segmentation task +optimizer = dict(type='Adam', lr=0.001, weight_decay=0.001) +optimizer_config = dict(grad_clip=None) +lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) +momentum_config = None + +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=50) diff --git a/configs/pointnet2/README.md b/configs/pointnet2/README.md index e14fab97a6..e36005609d 100644 --- a/configs/pointnet2/README.md +++ b/configs/pointnet2/README.md @@ -16,7 +16,7 @@ We implement PointNet++ and provide the result and checkpoints on ScanNet and S3 } ``` -**Notice**: The original PointNet++ paper used step learning rate schedule. We discovered that cosine schedule achieves much better results and adopt it in our implementations. We also use a larger `weight_decay` factor because we find it consistently improving the performance. +**Notice**: The original PointNet++ paper used step learning rate schedule. We discovered that cosine schedule achieves much better results and adopt it in our implementations. We also use a larger `weight_decay` factor because we find it consistently improves the performance. ## Results @@ -24,10 +24,10 @@ We implement PointNet++ and provide the result and checkpoints on ScanNet and S3 | Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | mIoU (Test set) | Download | | :------------------: | :-----: | :---------: | :------: | :------------: | :------------: | :------: | -| [PointNet++ (SSG)](./pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 1.9 | | | |[model]() | [log]()| +| [PointNet++ (SSG)](./pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 1.9 | | | |[model]() | [log]()| | [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py) | XYZ+Color | cosine 200e | 1.9 | | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 2.4 | | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py) | XYZ+Color | cosine 200e | 2.4 | | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py) | XYZ | cosine 250e | 2.4 | | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py) | XYZ+Color | cosine 250e | 2.4 | | | |[model]() | [log]()| **Notes:** @@ -46,7 +46,7 @@ We implement PointNet++ and provide the result and checkpoints on ScanNet and S3 | Method | Split | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | | :------------------: | :----: | :--------: | :------: | :------------: | :------------: | :------: | | [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py) | Area_5 | cosine 50e | 3.6 | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py) | Area_5 | cosine 64e | 3.6 | | |[model]() | [log]()| +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py) | Area_5 | cosine 80e | 3.6 | | |[model]() | [log]()| **Notes:** diff --git a/configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py similarity index 75% rename from configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py index 98cc69d2dc..fbad158d9f 100644 --- a/configs/pointnet2/pointnet2_msg_16x2_cosine_200e_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py @@ -1,6 +1,7 @@ _base_ = [ '../_base_/datasets/scannet_seg-3d-20class.py', - '../_base_/models/pointnet2_msg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_msg.py', + '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' ] # data settings @@ -29,12 +30,7 @@ use_normalized_coord=False, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=200) +# PointNet2-MSG needs longer training time than PointNet2-SSG +runner = dict(type='EpochBasedRunner', max_epochs=250) diff --git a/configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py similarity index 61% rename from configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py index 88909acd17..ed1e3c4326 100644 --- a/configs/pointnet2/pointnet2_msg_16x2_cosine_64e_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py @@ -1,10 +1,10 @@ _base_ = [ '../_base_/datasets/s3dis_seg-3d-13class.py', - '../_base_/models/pointnet2_msg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_msg.py', + '../_base_/schedules/seg_cosine_50e.py', '../_base_/default_runtime.py' ] # data settings -data_root = './data/s3dis/' data = dict(samples_per_gpu=16) evaluation = dict(interval=2) @@ -21,12 +21,7 @@ use_normalized_coord=True, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-3) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=2) -runner = dict(type='EpochBasedRunner', max_epochs=64) +# PointNet2-MSG needs longer training time than PointNet2-SSG +runner = dict(type='EpochBasedRunner', max_epochs=80) diff --git a/configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py similarity index 94% rename from configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py index 75488a2774..9ba658623a 100644 --- a/configs/pointnet2/pointnet2_msg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py @@ -1,6 +1,7 @@ _base_ = [ '../_base_/datasets/scannet_seg-3d-20class.py', - '../_base_/models/pointnet2_msg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_msg.py', + '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' ] # dataset settings @@ -159,12 +160,7 @@ use_normalized_coord=False, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=200) +# PointNet2-MSG needs longer training time than PointNet2-SSG +runner = dict(type='EpochBasedRunner', max_epochs=250) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py index ed05e0fcd1..b5261077f6 100644 --- a/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py @@ -1,6 +1,7 @@ _base_ = [ '../_base_/datasets/scannet_seg-3d-20class.py', - '../_base_/models/pointnet2_ssg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_ssg.py', + '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' ] # data settings @@ -29,12 +30,5 @@ use_normalized_coord=False, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py index fccf99ed34..b14100d18a 100644 --- a/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py +++ b/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py @@ -1,10 +1,10 @@ _base_ = [ '../_base_/datasets/s3dis_seg-3d-13class.py', - '../_base_/models/pointnet2_ssg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_ssg.py', + '../_base_/schedules/seg_cosine_50e.py', '../_base_/default_runtime.py' ] # data settings -data_root = './data/s3dis/' data = dict(samples_per_gpu=16) evaluation = dict(interval=2) @@ -21,12 +21,5 @@ use_normalized_coord=True, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-3) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=2) -runner = dict(type='EpochBasedRunner', max_epochs=50) diff --git a/configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py similarity index 94% rename from configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py index 8e5ffdaf8f..f2266fc05a 100644 --- a/configs/pointnet2/pointnet2_ssg_only_xyz_16x2_cosine_200e_scannet-3d-20class.py +++ b/configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py @@ -1,6 +1,7 @@ _base_ = [ '../_base_/datasets/scannet_seg-3d-20class.py', - '../_base_/models/pointnet2_ssg.py', '../_base_/default_runtime.py' + '../_base_/models/pointnet2_ssg.py', + '../_base_/schedules/seg_cosine_200e.py', '../_base_/default_runtime.py' ] # dataset settings @@ -159,12 +160,5 @@ use_normalized_coord=False, batch_size=24)) -# optimizer -lr = 0.001 # max learning rate -optimizer = dict(type='Adam', lr=lr, weight_decay=1e-2) -optimizer_config = dict(grad_clip=None) -lr_config = dict(policy='CosineAnnealing', warmup=None, min_lr=1e-5) - # runtime settings checkpoint_config = dict(interval=5) -runner = dict(type='EpochBasedRunner', max_epochs=200) From e2b2b389ecea04889699043cbff63616658b3238 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Sat, 15 May 2021 19:20:20 +0800 Subject: [PATCH 7/9] rename pn2_seg config files --- ...y => pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py} | 0 ...s.py => pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py} | 0 ...tnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py} | 0 ...y => pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py} | 0 ...s.py => pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py} | 0 ...tnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename configs/pointnet2/{pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py => pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py} (100%) rename configs/pointnet2/{pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py => pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py} (100%) rename configs/pointnet2/{pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py => pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py} (100%) rename configs/pointnet2/{pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py => pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py} (100%) rename configs/pointnet2/{pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py => pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py} (100%) rename configs/pointnet2/{pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py => pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py} (100%) diff --git a/configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py similarity index 100% rename from configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py diff --git a/configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py similarity index 100% rename from configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py rename to configs/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py diff --git a/configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py similarity index 100% rename from configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py diff --git a/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py similarity index 100% rename from configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py diff --git a/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py b/configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py similarity index 100% rename from configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py rename to configs/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py diff --git a/configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py b/configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py similarity index 100% rename from configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py rename to configs/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py From 928c9cc696cfe7acc9172ba48ac943eb080ba4d9 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Sat, 15 May 2021 19:57:54 +0800 Subject: [PATCH 8/9] update pn2 links in README --- .dev_scripts/gather_models.py | 8 +++++++- README.md | 2 ++ README_zh-CN.md | 2 ++ configs/pointnet2/README.md | 38 +++++++++++++++++------------------ docs/model_zoo.md | 4 ++++ 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/.dev_scripts/gather_models.py b/.dev_scripts/gather_models.py index 31e2b17fe9..c6d2508098 100644 --- a/.dev_scripts/gather_models.py +++ b/.dev_scripts/gather_models.py @@ -21,7 +21,11 @@ '_3x_': 36, '_4x_': 48, '_24e_': 24, - '_6x_': 73 + '_6x_': 73, + '_50e_': 50, + '_80e_': 80, + '_200e_': 200, + '_250e_': 250 } # TODO: add support for lyft dataset @@ -34,6 +38,8 @@ ], 'kitti-3d-car': ['KITTI/Car_3D_moderate_strict', 'Car_3D_moderate_strict'], 'lyft': ['score'], + 'scannet_seg': ['miou'], + 's3dis_seg': ['miou'], 'scannet': ['mAR_0.50'], 'sunrgbd': ['mAR_0.50'] } diff --git a/README.md b/README.md index d3cad58ae2..8238a18a37 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ Support methods - [x] [SSN (ECCV'2020)](configs/ssn/README.md) - [x] [ImVoteNet (CVPR'2020)](configs/imvotenet/README.md) - [x] [FCOS3D (Arxiv'2021)](configs/fcos3d/README.md) +- [x] [PointNet++ (NeurIPS'2017)](configs/pointnet2/README.md) | | ResNet | ResNeXt | SENet |PointNet++ | HRNet | RegNetX | Res2Net | |--------------------|:--------:|:--------:|:--------:|:---------:|:-----:|:--------:|:-----:| @@ -105,6 +106,7 @@ Support methods | SSN | ☐ | ☐ | ☐ | ✗ | ☐ | ✓ | ☐ | | ImVoteNet | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ | | FCOS3D | ✓ | ☐ | ☐ | ✗ | ☐ | ☐ | ☐ | +| PointNet++ | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ | Other features - [x] [Dynamic Voxelization](configs/dynamic_voxelization/README.md) diff --git a/README_zh-CN.md b/README_zh-CN.md index a12dc9d61e..b23b99cc66 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -89,6 +89,7 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 - [x] [SSN (ECCV'2020)](configs/ssn/README.md) - [x] [ImVoteNet (CVPR'2020)](configs/imvotenet/README.md) - [x] [FCOS3D (Arxiv'2021)](configs/fcos3d/README.md) +- [x] [PointNet++ (NeurIPS'2017)](configs/pointnet2/README.md) | | ResNet | ResNeXt | SENet |PointNet++ | HRNet | RegNetX | Res2Net | |--------------------|:--------:|:--------:|:--------:|:---------:|:-----:|:--------:|:-----:| @@ -104,6 +105,7 @@ MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱, 下一代 | SSN | ☐ | ☐ | ☐ | ✗ | ☐ | ✓ | ☐ | | ImVoteNet | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ | | FCOS3D | ✓ | ☐ | ☐ | ✗ | ☐ | ☐ | ☐ | +| PointNet++ | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ | 其他特性 - [x] [Dynamic Voxelization](configs/dynamic_voxelization/README.md) diff --git a/configs/pointnet2/README.md b/configs/pointnet2/README.md index e36005609d..32f6bfacb2 100644 --- a/configs/pointnet2/README.md +++ b/configs/pointnet2/README.md @@ -22,36 +22,36 @@ We implement PointNet++ and provide the result and checkpoints on ScanNet and S3 ### ScanNet -| Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | mIoU (Test set) | Download | -| :------------------: | :-----: | :---------: | :------: | :------------: | :------------: | :------: | -| [PointNet++ (SSG)](./pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet-3d-20class.py) | XYZ | cosine 200e | 1.9 | | | |[model]() | [log]()| -| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_200e_scannet-3d-20class.py) | XYZ+Color | cosine 200e | 1.9 | | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_xyz-only_16x2_cosine_250e_scannet-3d-20class.py) | XYZ | cosine 250e | 2.4 | | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_250e_scannet-3d-20class.py) | XYZ+Color | cosine 250e | 2.4 | | | |[model]() | [log]()| +| Method | Input | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | mIoU (Test set) | Download | +| :-------------------------------------------------------------------------------------: | :-------: | :---------: | :------: | :------------: | :------------: | :-------------: | ------------------------ | +| [PointNet++ (SSG)](./pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py) | XYZ | cosine 200e | 1.9 | | 53.91 | | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143628-4e341a48.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143628.log.json) | +| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py) | XYZ+Color | cosine 200e | 1.9 | | 54.44 | | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143644-ee73704a.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143644.log.json) | +| [PointNet++ (MSG)](./pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py) | XYZ | cosine 250e | 2.4 | | 54.26 | | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class_20210514_143838-b4a3cf89.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class_20210514_143838.log.json) | +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py) | XYZ+Color | cosine 250e | 2.4 | | 55.05 | | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class_20210514_144009-24477ab1.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class_20210514_144009.log.json) | **Notes:** -- The original PointNet++ paper conducted experiments on the ScanNet V1 dataset, while later point cloud segmentor papers often used ScanNet V2. Following common practice, we report results on the ScanNet V2 dataset. -- Since ScanNet dataset doesn't provide ground-truth labels for the test set, users can only evaluate test set performance by submitting to its online benchmark [website](http://kaldir.vc.in.tum.de/scannet_benchmark/). However, users are only allowed to submit once every two weeks. Therefore, we currently report val set mIoU. Test set performance may be added in the future. -- To generate submission file for ScanNet online benchmark, you need to modify the ScanNet dataset's [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/_base_/datasets/scannet_seg-3d-20class.py#L126). Change `ann_file=data_root + 'scannet_infos_val.pkl'` to `ann_file=data_root + 'scannet_infos_test.pkl'`, and then simply run: +- The original PointNet++ paper conducted experiments on the ScanNet V1 dataset, while later point cloud segmentor papers often used ScanNet V2. Following common practice, we report results on the ScanNet V2 dataset. +- Since ScanNet dataset doesn't provide ground-truth labels for the test set, users can only evaluate test set performance by submitting to its online benchmark [website](http://kaldir.vc.in.tum.de/scannet_benchmark/). However, users are only allowed to submit once every two weeks. Therefore, we currently report val set mIoU. Test set performance may be added in the future. +- To generate submission file for ScanNet online benchmark, you need to modify the ScanNet dataset's [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/_base_/datasets/scannet_seg-3d-20class.py#L126). Change `ann_file=data_root + 'scannet_infos_val.pkl'` to `ann_file=data_root + 'scannet_infos_test.pkl'`, and then simply run: - ```shell - python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --format-only --options 'txt_prefix=exps/pointnet2_scannet_results' - ``` + ```shell + python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --format-only --options 'txt_prefix=exps/pointnet2_scannet_results' + ``` - This will save the prediction results as `txt` files in `exps/pointnet2_scannet_results/`. Then, go to this folder and zip all files into `pn2_scannet.zip`. Now you can submit it to the online benchmark and wait for the test set result. More instructions can be found at their official [website](http://kaldir.vc.in.tum.de/scannet_benchmark/documentation#submission-policy). + This will save the prediction results as `txt` files in `exps/pointnet2_scannet_results/`. Then, go to this folder and zip all files into `pn2_scannet.zip`. Now you can submit it to the online benchmark and wait for the test set result. More instructions can be found at their official [website](http://kaldir.vc.in.tum.de/scannet_benchmark/documentation#submission-policy). ### S3DIS -| Method | Split | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | -| :------------------: | :----: | :--------: | :------: | :------------: | :------------: | :------: | -| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_50e_s3dis-3d-13class.py) | Area_5 | cosine 50e | 3.6 | | |[model]() | [log]()| -| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_80e_s3dis-3d-13class.py) | Area_5 | cosine 80e | 3.6 | | |[model]() | [log]()| +| Method | Split | Lr schd | Mem (GB) | Inf time (fps) | mIoU (Val set) | Download | +| :-------------------------------------------------------------------------: | :----: | :--------: | :------: | :------------: | :------------: | :----------------------: | +| [PointNet++ (SSG)](./pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py) | Area_5 | cosine 50e | 3.6 | | 56.93 | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class_20210514_144205-995d0119.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class_20210514_144205.log.json) | +| [PointNet++ (MSG)](./pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py) | Area_5 | cosine 80e | 3.6 | | 58.04 | [model](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class_20210514_144307-b2059817.pth) | [log](https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class_20210514_144307.log.json) | **Notes:** -- We use XYZ+Color+Normalized_XYZ as input in all the experiments on S3DIS datasets. -- `Area_5` Split means training the model on Area_1, 2, 3, 4, 6 and testing on Area_5. +- We use XYZ+Color+Normalized_XYZ as input in all the experiments on S3DIS datasets. +- `Area_5` Split means training the model on Area_1, 2, 3, 4, 6 and testing on Area_5. ## Indeterminism diff --git a/docs/model_zoo.md b/docs/model_zoo.md index eac324890a..a4da2dbbc0 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -61,3 +61,7 @@ Please refer to [ImVoteNet](https://github.com/open-mmlab/mmdetection3d/blob/mas ### FCOS3D Please refer to [FCOS3D](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/fcos3d) for details. We provide FCOS3D baselines on the nuScenes dataset currently. + +### PointNet++ + +Please refer to [PointNet++](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointnet2) for details. We provide PointNet++ baselines on ScanNet and S3DIS datasets. From ed539d1e982c6cf5bc37adbd36326980ebeaf465 Mon Sep 17 00:00:00 2001 From: Wuziyi616 Date: Mon, 17 May 2021 16:25:26 +0800 Subject: [PATCH 9/9] add metafile for pn2 --- configs/pointnet2/metafile.yml | 89 ++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 configs/pointnet2/metafile.yml diff --git a/configs/pointnet2/metafile.yml b/configs/pointnet2/metafile.yml new file mode 100644 index 0000000000..b342f2b660 --- /dev/null +++ b/configs/pointnet2/metafile.yml @@ -0,0 +1,89 @@ +Collections: + - Name: PointNet++ + Metadata: + Training Techniques: + - Adam + Training Resources: 2x Titan XP GPUs + Architecture: + - PointNet++ + Paper: https://arxiv.org/abs/1706.02413 + README: configs/pointnet2/README.md + +Models: + - Name: pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class.py + Metadata: + Training Data: ScanNet + Training Memory (GB): 1.9 + Results: + - Task: 3D Semantic Segmentation + Dataset: ScanNet + Metrics: + mIoU: 53.91 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_xyz-only_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143628-4e341a48.pth + + - Name: pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class.py + Metadata: + Training Data: ScanNet + Training Memory (GB): 1.9 + Results: + - Task: 3D Semantic Segmentation + Dataset: ScanNet + Metrics: + mIoU: 54.44 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class/pointnet2_ssg_16x2_cosine_200e_scannet_seg-3d-20class_20210514_143644-ee73704a.pth + + - Name: pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class.py + Metadata: + Training Data: ScanNet + Training Memory (GB): 2.4 + Results: + - Task: 3D Semantic Segmentation + Dataset: ScanNet + Metrics: + mIoU: 54.26 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_xyz-only_16x2_cosine_250e_scannet_seg-3d-20class_20210514_143838-b4a3cf89.pth + + - Name: pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class.py + Metadata: + Training Data: ScanNet + Training Memory (GB): 2.4 + Results: + - Task: 3D Semantic Segmentation + Dataset: ScanNet + Metrics: + mIoU: 55.05 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class/pointnet2_msg_16x2_cosine_250e_scannet_seg-3d-20class_20210514_144009-24477ab1.pth + + - Name: pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class.py + Metadata: + Training Data: S3DIS + Training Memory (GB): 3.6 + Results: + - Task: 3D Semantic Segmentation + Dataset: S3DIS + Metrics: + mIoU: 56.93 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class_20210514_144205-995d0119.pth + + - Name: pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py + In Collection: PointNet++ + Config: configs/pointnet/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class.py + Metadata: + Training Data: S3DIS + Training Memory (GB): 3.6 + Results: + - Task: 3D Semantic Segmentation + Dataset: S3DIS + Metrics: + mIoU: 58.04 + Weights: https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class/pointnet2_msg_16x2_cosine_80e_s3dis_seg-3d-13class_20210514_144307-b2059817.pth