From b975d3b72a00cedf1aa63fdf257d0e4536a81c3f Mon Sep 17 00:00:00 2001 From: Jerry Jiarui XU Date: Sun, 12 Jul 2020 23:53:56 +0800 Subject: [PATCH] Add test tutorial (#9) * add test tutorial * remote torch/torchvision from requirements * update getting started * rename drop_out_ratio -> dropout_ratio --- configs/_base_/models/ann_r50-d8.py | 4 +-- configs/_base_/models/ccnet_r50-d8.py | 4 +-- configs/_base_/models/danet_r50-d8.py | 4 +-- configs/_base_/models/deeplabv3_r50-d8.py | 4 +-- configs/_base_/models/deeplabv3plus_r50-d8.py | 4 +-- configs/_base_/models/encnet_r50-d8.py | 4 +-- configs/_base_/models/fcn_hr18.py | 2 +- configs/_base_/models/fcn_r50-d8.py | 4 +-- configs/_base_/models/gcnet_r50-d8.py | 4 +-- configs/_base_/models/nonlocal_r50-d8.py | 4 +-- configs/_base_/models/ocrnet_hr18.py | 4 +-- configs/_base_/models/psanet_r50-d8.py | 4 +-- configs/_base_/models/pspnet_r50-d8.py | 4 +-- configs/_base_/models/upernet_r50.py | 4 +-- .../ocrnet/ocrnet_hr18_512x512_160k_ade20k.py | 4 +-- .../ocrnet_hr18_512x512_20k_voc12aug.py | 4 +-- .../ocrnet_hr18_512x512_40k_voc12aug.py | 4 +-- .../ocrnet/ocrnet_hr18_512x512_80k_ade20k.py | 4 +-- .../ocrnet_hr48_512x1024_160k_cityscapes.py | 4 +-- .../ocrnet_hr48_512x1024_40k_cityscapes.py | 4 +-- .../ocrnet_hr48_512x1024_80k_cityscapes.py | 4 +-- .../ocrnet/ocrnet_hr48_512x512_160k_ade20k.py | 4 +-- .../ocrnet_hr48_512x512_20k_voc12aug.py | 4 +-- .../ocrnet_hr48_512x512_40k_voc12aug.py | 4 +-- .../ocrnet/ocrnet_hr48_512x512_80k_ade20k.py | 4 +-- docs/config.md | 4 +-- docs/getting_started.md | 25 ++++++++++++++----- mmseg/datasets/cityscapes.py | 7 +++--- mmseg/models/decode_heads/decode_head.py | 10 ++++---- requirements/build.txt | 1 - requirements/runtime.txt | 2 -- tests/test_models/test_heads.py | 2 +- tools/dist_test.sh | 1 - tools/get_flops.py | 1 + 34 files changed, 81 insertions(+), 70 deletions(-) diff --git a/configs/_base_/models/ann_r50-d8.py b/configs/_base_/models/ann_r50-d8.py index c2287b479..07ed0f3c6 100644 --- a/configs/_base_/models/ann_r50-d8.py +++ b/configs/_base_/models/ann_r50-d8.py @@ -22,7 +22,7 @@ model = dict( project_channels=256, query_scales=(1, ), key_pool_scales=(1, 3, 6, 8), - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -35,7 +35,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/ccnet_r50-d8.py b/configs/_base_/models/ccnet_r50-d8.py index 9f2794c33..28f7360a2 100644 --- a/configs/_base_/models/ccnet_r50-d8.py +++ b/configs/_base_/models/ccnet_r50-d8.py @@ -20,7 +20,7 @@ model = dict( in_index=3, channels=512, recurrence=2, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -33,7 +33,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/danet_r50-d8.py b/configs/_base_/models/danet_r50-d8.py index 76a27054e..65eb17086 100644 --- a/configs/_base_/models/danet_r50-d8.py +++ b/configs/_base_/models/danet_r50-d8.py @@ -20,7 +20,7 @@ model = dict( in_index=3, channels=512, pam_channels=64, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -33,7 +33,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/deeplabv3_r50-d8.py b/configs/_base_/models/deeplabv3_r50-d8.py index 00c1f8796..a9f319c2b 100644 --- a/configs/_base_/models/deeplabv3_r50-d8.py +++ b/configs/_base_/models/deeplabv3_r50-d8.py @@ -20,7 +20,7 @@ model = dict( in_index=3, channels=512, dilations=(1, 12, 24, 36), - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -33,7 +33,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/deeplabv3plus_r50-d8.py b/configs/_base_/models/deeplabv3plus_r50-d8.py index f930b154f..f74a1534f 100644 --- a/configs/_base_/models/deeplabv3plus_r50-d8.py +++ b/configs/_base_/models/deeplabv3plus_r50-d8.py @@ -22,7 +22,7 @@ model = dict( dilations=(1, 12, 24, 36), c1_in_channels=256, c1_channels=48, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -35,7 +35,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/encnet_r50-d8.py b/configs/_base_/models/encnet_r50-d8.py index 46fffa1f8..c643cea62 100644 --- a/configs/_base_/models/encnet_r50-d8.py +++ b/configs/_base_/models/encnet_r50-d8.py @@ -22,7 +22,7 @@ model = dict( num_codes=32, use_se_loss=True, add_lateral=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -37,7 +37,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/fcn_hr18.py b/configs/_base_/models/fcn_hr18.py index e2583a2ac..8293e0653 100644 --- a/configs/_base_/models/fcn_hr18.py +++ b/configs/_base_/models/fcn_hr18.py @@ -41,7 +41,7 @@ model = dict( kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/fcn_r50-d8.py b/configs/_base_/models/fcn_r50-d8.py index 08546755c..97a11ec96 100644 --- a/configs/_base_/models/fcn_r50-d8.py +++ b/configs/_base_/models/fcn_r50-d8.py @@ -21,7 +21,7 @@ model = dict( channels=512, num_convs=2, concat_input=True, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -34,7 +34,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/gcnet_r50-d8.py b/configs/_base_/models/gcnet_r50-d8.py index 9057687c0..b679be125 100644 --- a/configs/_base_/models/gcnet_r50-d8.py +++ b/configs/_base_/models/gcnet_r50-d8.py @@ -22,7 +22,7 @@ model = dict( ratio=1 / 4., pooling_type='att', fusion_types=('channel_add', ), - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -35,7 +35,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/nonlocal_r50-d8.py b/configs/_base_/models/nonlocal_r50-d8.py index 7fa88f9a5..64dbeb080 100644 --- a/configs/_base_/models/nonlocal_r50-d8.py +++ b/configs/_base_/models/nonlocal_r50-d8.py @@ -19,7 +19,7 @@ model = dict( in_channels=2048, in_index=3, channels=512, - drop_out_ratio=0.1, + dropout_ratio=0.1, reduction=2, use_scale=True, mode='embedded_gaussian', @@ -35,7 +35,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/ocrnet_hr18.py b/configs/_base_/models/ocrnet_hr18.py index 4053daa0b..fd88780b6 100644 --- a/configs/_base_/models/ocrnet_hr18.py +++ b/configs/_base_/models/ocrnet_hr18.py @@ -43,7 +43,7 @@ model = dict( kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -56,7 +56,7 @@ model = dict( input_transform='resize_concat', channels=512, ocr_channels=256, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/psanet_r50-d8.py b/configs/_base_/models/psanet_r50-d8.py index 170b48f45..1b4558826 100644 --- a/configs/_base_/models/psanet_r50-d8.py +++ b/configs/_base_/models/psanet_r50-d8.py @@ -25,7 +25,7 @@ model = dict( shrink_factor=2, normalization_factor=1.0, psa_softmax=True, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -38,7 +38,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/pspnet_r50-d8.py b/configs/_base_/models/pspnet_r50-d8.py index c5bb885c5..cf9d8ce0a 100644 --- a/configs/_base_/models/pspnet_r50-d8.py +++ b/configs/_base_/models/pspnet_r50-d8.py @@ -20,7 +20,7 @@ model = dict( in_index=3, channels=512, pool_scales=(1, 2, 3, 6), - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -33,7 +33,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/_base_/models/upernet_r50.py b/configs/_base_/models/upernet_r50.py index 7d736f6bc..19cf45135 100644 --- a/configs/_base_/models/upernet_r50.py +++ b/configs/_base_/models/upernet_r50.py @@ -20,7 +20,7 @@ model = dict( in_index=[0, 1, 2, 3], pool_scales=(1, 2, 3, 6), channels=512, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, @@ -33,7 +33,7 @@ model = dict( channels=256, num_convs=1, concat_input=False, - drop_out_ratio=0.1, + dropout_ratio=0.1, num_classes=19, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py index fe5d20ffb..a3c86e18e 100644 --- a/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py +++ b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py @@ -13,7 +13,7 @@ model = dict(decode_head=[ kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, norm_cfg=norm_cfg, align_corners=False, @@ -26,7 +26,7 @@ model = dict(decode_head=[ input_transform='resize_concat', channels=512, ocr_channels=256, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py index 71e70dcec..ab9d6446c 100644 --- a/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py +++ b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py @@ -14,7 +14,7 @@ model = dict(decode_head=[ kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, norm_cfg=norm_cfg, align_corners=False, @@ -27,7 +27,7 @@ model = dict(decode_head=[ input_transform='resize_concat', channels=512, ocr_channels=256, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py index b3fd74721..df79a9cf1 100644 --- a/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py +++ b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py @@ -14,7 +14,7 @@ model = dict(decode_head=[ kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, norm_cfg=norm_cfg, align_corners=False, @@ -27,7 +27,7 @@ model = dict(decode_head=[ input_transform='resize_concat', channels=512, ocr_channels=256, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py index e41eaf8ac..6ad67722a 100644 --- a/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py +++ b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py @@ -13,7 +13,7 @@ model = dict(decode_head=[ kernel_size=1, num_convs=1, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, norm_cfg=norm_cfg, align_corners=False, @@ -26,7 +26,7 @@ model = dict(decode_head=[ input_transform='resize_concat', channels=512, ocr_channels=256, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, norm_cfg=norm_cfg, align_corners=False, diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py index 70c1ce5b5..c094391b1 100644 --- a/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py +++ b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py index cd777e89b..0aada9d8d 100644 --- a/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py +++ b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py index 6ed60096a..1b2e00943 100644 --- a/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py +++ b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=19, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py index f6cd20e64..3b3e8af95 100644 --- a/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py +++ b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py index 3149cfc37..c2dd6d115 100644 --- a/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py +++ b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py index f97260039..89e6309f5 100644 --- a/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py +++ b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=21, align_corners=False, loss_decode=dict( diff --git a/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py index 94dbe9029..04971226e 100644 --- a/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py +++ b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py @@ -18,7 +18,7 @@ model = dict( num_convs=1, norm_cfg=norm_cfg, concat_input=False, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, align_corners=False, loss_decode=dict( @@ -31,7 +31,7 @@ model = dict( input_transform='resize_concat', in_index=(0, 1, 2, 3), norm_cfg=norm_cfg, - drop_out_ratio=-1, + dropout_ratio=-1, num_classes=150, align_corners=False, loss_decode=dict( diff --git a/docs/config.md b/docs/config.md index e07fdfee8..aace67ff9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -224,8 +224,8 @@ log_config = dict( # config to register logger hook dist_params = dict(backend='nccl') # Parameters to setup distributed training, the port can also be set. log_level = 'INFO' # The level of logging. load_from = None # load models as a pre-trained model from a given path. This will not resume training. -resume_from = None # Resume checkpoints from a given path, the training will be resumed from the epoch when the checkpoint's is saved. -workflow = [('train', 1)] # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once. The workflow trains the model by 12 epochs according to the total_epochs. +resume_from = None # Resume checkpoints from a given path, the training will be resumed from the iteration when the checkpoint's is saved. +workflow = [('train', 1)] # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once. The workflow trains the model by 40000 iterations according to the total_iters. cudnn_benchmark = True # Whether use cudnn_benchmark to speed up, which is fast for fixed input size. optimizer = dict( # Config used to build optimizer, support all the optimizers in PyTorch whose arguments are also the same as those in PyTorch type='SGD', # Type of optimizers, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/optimizer/default_constructor.py#L13 for more details diff --git a/docs/getting_started.md b/docs/getting_started.md index c122ae1d9..3a9b65603 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -125,23 +125,34 @@ Assume that you have already downloaded the checkpoints to the directory `checkp --eval mAP ``` -4. Test PSPNet with 8 GPUs, and evaluate the standard mIoU and cityscapes metric. +4. Test PSPNet with 4 GPUs, and evaluate the standard mIoU and cityscapes metric. ```shell ./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ - 8 --out results.pkl --eval mIoU cityscapes + 4 --out results.pkl --eval mIoU cityscapes ``` -5. Test PSPNet on cityscapes test split with 8 GPUs, and generate the png files to be submit to the official evaluation server. +5. Test PSPNet on cityscapes test split with 4 GPUs, and generate the png files to be submit to the official evaluation server. + + First, add following to config file `configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py`, + + ```python + data = dict( + test=dict( + img_dir='leftImg8bit/test', + ann_dir='gtFine/test')) + ``` + Then run test. ```shell ./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ - 8 --format-only --options "imgfile_prefix=./pspnet_test_results" + 4 --format-only --options "imgfile_prefix=./pspnet_test_results" ``` You will get png files under `./pspnet_test_results` directory. +You may run `zip -r results.zip pspnet_test_results/` and submit the zip file to [evaluation server](https://www.cityscapes-dataset.com/submit/). ### Image demo @@ -205,8 +216,10 @@ By default we evaluate the model on the validation set after some iterations, yo evaluation = dict(interval=4000) # This evaluate the model per 4000 iterations. ``` -**\*Important\***: The default learning rate in config files is for 8 GPUs and 1 img/gpu (batch size = 8x1 = 8). -Equivalently, you may also use 4 GPUs and 2 imgs/gpu since all models using cross-GPU SyncBN. +**\*Important\***: The default learning rate in config files is for 4 GPUs and 2 img/gpu (batch size = 4x2 = 8). +Equivalently, you may also use 8 GPUs and 1 imgs/gpu since all models using cross-GPU SyncBN. + +To trade speed with GPU memory, you may pass in `--options model.backbone.with_cp=True` to enable checkpoint in backbone. ### Train with a single GPU diff --git a/mmseg/datasets/cityscapes.py b/mmseg/datasets/cityscapes.py index 9a12ab172..30e3c2b24 100644 --- a/mmseg/datasets/cityscapes.py +++ b/mmseg/datasets/cityscapes.py @@ -61,6 +61,7 @@ class CityscapesDataset(CustomDataset): list[str: str]: result txt files which contains corresponding semantic segmentation images. """ + mmcv.mkdir_or_exist(imgfile_prefix) result_files = [] prog_bar = mmcv.ProgressBar(len(self)) for idx in range(len(self)): @@ -135,9 +136,9 @@ class CityscapesDataset(CustomDataset): the prefix of filename, e.g., "a/b/prefix". If results are evaluated with cityscapes protocol, it would be the prefix of output png files. The output files would be - png images under folder "a/b/prefix/xxx/", where "xxx" is the - video name of cityscapes. If not specified, a temp file will - be created. + png images under folder "a/b/prefix/xxx.png", where "xxx" is + the image name of cityscapes. If not specified, a temp file + will be created for evaluation. Default: None. Returns: diff --git a/mmseg/models/decode_heads/decode_head.py b/mmseg/models/decode_heads/decode_head.py index d4c874872..1c2636fd1 100644 --- a/mmseg/models/decode_heads/decode_head.py +++ b/mmseg/models/decode_heads/decode_head.py @@ -17,7 +17,7 @@ class BaseDecodeHead(nn.Module, metaclass=ABCMeta): in_channels (int|Sequence[int]): Input channels. channels (int): Channels after modules, before conv_seg. num_classes (int): Number of classes. - drop_out_ratio (float): Ratio of dropout layer. Default: 0.1. + dropout_ratio (float): Ratio of dropout layer. Default: 0.1. conv_cfg (dict|None): Config of conv layers. Default: None. norm_cfg (dict|None): Config of norm layers. Default: None. act_cfg (dict): Config of activation layers. @@ -46,7 +46,7 @@ class BaseDecodeHead(nn.Module, metaclass=ABCMeta): channels, *, num_classes, - drop_out_ratio=0.1, + dropout_ratio=0.1, conv_cfg=None, norm_cfg=None, act_cfg=dict(type='ReLU'), @@ -63,7 +63,7 @@ class BaseDecodeHead(nn.Module, metaclass=ABCMeta): self._init_inputs(in_channels, in_index, input_transform) self.channels = channels self.num_classes = num_classes - self.drop_out_ratio = drop_out_ratio + self.dropout_ratio = dropout_ratio self.conv_cfg = conv_cfg self.norm_cfg = norm_cfg self.act_cfg = act_cfg @@ -77,8 +77,8 @@ class BaseDecodeHead(nn.Module, metaclass=ABCMeta): self.sampler = None self.conv_seg = nn.Conv2d(channels, num_classes, kernel_size=1) - if drop_out_ratio > 0: - self.dropout = nn.Dropout2d(drop_out_ratio) + if dropout_ratio > 0: + self.dropout = nn.Dropout2d(dropout_ratio) else: self.dropout = None diff --git a/requirements/build.txt b/requirements/build.txt index 2f74f3d17..06ef892b4 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -1,3 +1,2 @@ # These must be installed before building mmsegmentation numpy -# torch diff --git a/requirements/runtime.txt b/requirements/runtime.txt index a03605f66..db5d81e01 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,4 +1,2 @@ matplotlib numpy -# torch -# torchvision diff --git a/tests/test_models/test_heads.py b/tests/test_models/test_heads.py index 935239438..3ac6bb0aa 100644 --- a/tests/test_models/test_heads.py +++ b/tests/test_models/test_heads.py @@ -71,7 +71,7 @@ def test_decode_head(): assert hasattr(head, 'dropout') and head.dropout.p == 0.1 # test set dropout - head = BaseDecodeHead(32, 16, num_classes=19, drop_out_ratio=0.2) + head = BaseDecodeHead(32, 16, num_classes=19, dropout_ratio=0.2) assert hasattr(head, 'dropout') and head.dropout.p == 0.2 # test no input_transform diff --git a/tools/dist_test.sh b/tools/dist_test.sh index 7381dfb1d..34fb46541 100755 --- a/tools/dist_test.sh +++ b/tools/dist_test.sh @@ -4,7 +4,6 @@ CONFIG=$1 CHECKPOINT=$2 GPUS=$3 PORT=${PORT:-29500} -$CONFIG\/$GPUS/ PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \ $(dirname "$0")/test.py $CONFIG $CHECKPOINT --launcher pytorch ${@:4} diff --git a/tools/get_flops.py b/tools/get_flops.py index 86f1c5a9e..aef305549 100644 --- a/tools/get_flops.py +++ b/tools/get_flops.py @@ -31,6 +31,7 @@ def main(): raise ValueError('invalid input shape') cfg = Config.fromfile(args.config) + cfg.model.pretrained = None model = build_segmentor( cfg.model, train_cfg=cfg.train_cfg, test_cfg=cfg.test_cfg).cuda() model.eval()