diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..38e625bf59f9ba58f16f758bebaad865030c1e3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright 2020 The MMSegmentation Authors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 The MMSegmentation Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 154df8298fab5ecf322016157858e08cd1bccbe1..8971386332f73c4d90428b2fa8daf4949f56347d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,119 @@ ---- -license: apache-2.0 ---- +# A Large-Scale Benchmark for Food Image Segmentation + +By [Xiongwei Wu](http://xiongweiwu.github.io/), [Xin Fu](https://xinfu607.github.io/), Ying Liu, [Ee-Peng Lim](http://www.mysmu.edu/faculty/eplim/), [Steven C.H. Hoi](https://sites.google.com/view/stevenhoi/home/), [Qianru Sun](https://qianrusun.com/). + + +
+ +
+
+ +## Introduction + +We build a new food image dataset FoodSeg103 containing 7,118 images. We annotate these images with 104 ingredient classes and each image has an average of 6 ingredient labels and pixel-wise masks. +In addition, we propose a multi-modality pre-training approach called ReLeM that explicitly equips a segmentation model with rich and semantic food knowledge. + +In this software, we use three popular semantic segmentation methods (i.e., Dilated Convolution based, Feature Pyramid based, and Vision Transformer based) as baselines, and evaluate them as well as ReLeM on our new datasets. We believe that the FoodSeg103 and the pre-trained models using ReLeM can serve as a benchmark to facilitate future works on fine-grained food image understanding. + +Please refer our [paper](https://arxiv.org/abs/2105.05409) and our [homepage](https://xiongweiwu.github.io/foodseg103.html) for more details. + +## License + +This project is released under the [Apache 2.0 license](LICENSE). + + +## Installation + +Please refer to [get_started.md](docs/get_started.md#installation) for installation. + +## Dataset + +Please download the file from [url](https://research.larc.smu.edu.sg/downloads/datarepo/FoodSeg103.zip) and unzip the data in ./data folder (./data/FoodSeg103/), with passwd: LARCdataset9947 + +## Leaderboard + +Please refer to [leaderboard](https://paperswithcode.com/dataset/foodseg103) in paperwithcode website. + +## Benchmark and model zoo + +:exclamation::exclamation::exclamation: **We have finished the course so the models are available again. Please download the trained models from THIS [link](https://smu-my.sharepoint.com/:u:/g/personal/xwwu_smu_edu_sg/EWBcCC3QrO9LthKX66QCzyoBhFU7PHXKcHhh1lgIC98uKw?e=bHT7vM):eyes: .** + +Encoder | Decoder | Crop Size | Batch Size |mIoU | mAcc | Link +--- |:---:|:---:|:---:|:---:|:---:|:---: +R-50 | [FPN](https://arxiv.org/abs/1901.02446) | 512x1024 | 8 | 27.8 | 38.2 | [Model+Config](https://drive.google.com/drive/folders/1CQ5CXxASAoobj7bKqyuvazkeusqMAM4F?usp=sharing) +ReLeM-R-50 | FPN | 512x1024 | 8 | 29.1 | 39.8 | [Model+Config](https://drive.google.com/drive/folders/1m7N2EE8jkX67a0lD6GZ4NQgr4gEcWpDU?usp=sharing) +R-50 | [CCNet](https://arxiv.org/abs/1811.11721) | 512x1024 | 8 | 35.5 | 45.3 | [Model+Config](https://drive.google.com/drive/folders/1pNPbtrGqCq_Zlina2PCs6X8bIvY9ZZxG?usp=sharing) +ReLeM-R-50 | CCNet | 512x1024 | 8 | 36.8 | 47.4 | [Model+Config](https://drive.google.com/drive/folders/1FWwxAsZzDnBbDBEbohqOA8htyWgMLM4U?usp=sharing) +[PVT-S](https://arxiv.org/abs/2102.12122) | FPN | 512x1024 | 8 | 31.3 | 43.0 | Model+Config +ReLeM-PVT-S | FPN | 512x1024 | 8 | 32.0 | 44.1 | Model+Config +[ViT-16/B](https://openreview.net/forum?id=YicbFdNTTy) | [Naive](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 41.3 | 52.7 | [Model+Config](https://drive.google.com/drive/folders/19b3VG906CA-5kQFaJVk5U6kDxnw9HcWL?usp=sharing) +ReLeM-ViT-16/B | Naive | 768x768 | 4 | 43.9 | 57.0 | [Model+Config](https://drive.google.com/drive/folders/10yKiu8aMeTGphU2CKT2ybeAC3ezgDnXP?usp=sharing) +ViT-16/B | PUP | 768x768 | 4 | 38.5 | 49.1 | Model+Config +ReLeM-ViT-16/B | PUP | 768x768 | 4 | 42.5 | 53.9 | Model+Config +ViT-16/B | [MLA](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 45.1 | 57.4 | [Model+Config](https://drive.google.com/drive/folders/17Ht1HQDaBJmS0FXaXGjHk0VQNhAJxrlF?usp=sharing) +ReLeM-ViT-16/B | MLA | 768x768 | 4 | 43.3 | 55.9 | [Model+Config](https://drive.google.com/drive/folders/12OlkStefNmELNLo-xJqc-lE-kPZ7DvPV?usp=sharing) +[ViT-16/L](https://openreview.net/forum?id=YicbFdNTTy) | MLA | 768x768 | 4 | 44.5 | 56.6 | [Model+Config](https://drive.google.com/drive/folders/1PS4uh2zktNc0hh-mSLZkRTqgNnkfh7xu?usp=sharing) +[Swin-S](https://arxiv.org/abs/2103.14030) | [UperNet](https://arxiv.org/abs/1807.10221) | 512x1024 | 8 | 41.6 | 53.6 | [Model+Config](https://drive.google.com/drive/folders/1E5fZga8h65dNZCX1m8zywvB8MwrleFNg?usp=sharing) +[Swin-B](https://arxiv.org/abs/2103.14030) | UperNet | 512x1024 | 8 | 41.2 | 53.9 | [Model+Config](https://drive.google.com/drive/folders/1kqOsH51h1pa-88tbFVUV3mmzTNCGzqd0?usp=sharing) + + +[1] *We do not include the implementation of [swin](https://arxiv.org/abs/2103.14030) in this software. You can use the official [implementation](https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation) based on our provided models.* \ +[2] *We use Step-wise learning policy to train PVT model since we found this policy can yield higher performance, and for other baselines we adopt the default settings.* \ +[3] *We use Recipe1M to train ReLeM-PVT-S while other ReLeM models are trained with Recipe1M+ due to time limitation.* + + + +## Train & Test + +Train script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config [config] --work-dir [work-dir] --launcher pytorch +``` + +Exmaple: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config configs/foodnet/SETR_Naive_768x768_80k_base_RM.py --work-dir checkpoints/SETR_Naive_ReLeM --launcher pytorch +``` + +Test script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py [config] [weights] --launcher pytorch --eval mIoU +``` + +Example: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base_RM.py checkpoints/SETR_Naive_ReLeM/iter_80000.pth --launcher pytorch --eval mIoU +``` + +## ReLeM +We train recipe information based on the implementation of [im2recipe](https://github.com/torralba-lab/im2recipe-Pytorch) with small modifications, which is trained on [Recipe1M+](http://pic2recipe.csail.mit.edu/) dataset (test images of FoodSeg103 are removed). I may upload the lmdb file later due to the huge datasize (>35G). + +It takes about 2~3 weeks to train a ReLeM ViT-Base model with 8 Tesla-V100 cards, so I strongly recommend you use my pre-trained models([link](https://drive.google.com/drive/folders/1LRCHxeMuCXMb68I1XFI8q-aQ2cCyUx_r?usp=sharing)). + + +## Citation + +If you find this project useful in your research, please consider cite: + +```latex +@inproceedings{wu2021foodseg, + title={A Large-Scale Benchmark for Food Image Segmentation}, + author={Wu, Xiongwei and Fu, Xin and Liu, Ying and Lim, Ee-Peng and Hoi, Steven CH and Sun, Qianru}, + booktitle={Proceedings of ACM international conference on Multimedia}, + year={2021} +} +``` + +## Other Issues + +If you meet other issues in using the software, you can check the original mmsegmentation (see [doc](https://mmsegmentation.readthedocs.io/) for more details). + + +## Acknowledgement + +The segmentation software in this project was developed mainly by extending the [segmentation](https://github.com/open-mmlab/mmsegmentation/). + diff --git a/checkpoints b/checkpoints new file mode 100644 index 0000000000000000000000000000000000000000..88a8114e6c98bc4b67781884748628c76ee8e2e1 --- /dev/null +++ b/checkpoints @@ -0,0 +1 @@ +../checkpoints/ \ No newline at end of file diff --git a/configs/_base_/datasets/FoodSeg103.py b/configs/_base_/datasets/FoodSeg103.py new file mode 100644 index 0000000000000000000000000000000000000000..0db467e549045162fd9a1a9a4fee01f612ea8fc1 --- /dev/null +++ b/configs/_base_/datasets/FoodSeg103.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CustomDataset' +data_root = './data/FoodSeg103/Images' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + 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, + data_root=data_root, + img_dir='img_dir/train', + ann_dir='ann_dir/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/FoodSeg103_768x768.py b/configs/_base_/datasets/FoodSeg103_768x768.py new file mode 100644 index 0000000000000000000000000000000000000000..4ebbc01579714ab10899114407b58d0a5fedfcd0 --- /dev/null +++ b/configs/_base_/datasets/FoodSeg103_768x768.py @@ -0,0 +1,36 @@ +# dataset settings +_base_ = './FoodSeg103.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (768, 768) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2049, 1025), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/ade20k.py b/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..efc8b4bb20c981f3db6df7eb52b3dc0744c94cc0 --- /dev/null +++ b/configs/_base_/datasets/ade20k.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 512), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/chase_db1.py b/configs/_base_/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..298594ea925f87f22b37094a2ec50e370aec96a0 --- /dev/null +++ b/configs/_base_/datasets/chase_db1.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'ChaseDB1Dataset' +data_root = 'data/CHASE_DB1' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (960, 999) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/cityscapes.py b/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f21867c63e1835f6fceb61f066e802fd8fd2a735 --- /dev/null +++ b/configs/_base_/datasets/cityscapes.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + 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, + data_root=data_root, + img_dir='leftImg8bit/train', + ann_dir='gtFine/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/cityscapes_769x769.py b/configs/_base_/datasets/cityscapes_769x769.py new file mode 100644 index 0000000000000000000000000000000000000000..336c7b254fe392b4703039fec86a83acdbd2e1a5 --- /dev/null +++ b/configs/_base_/datasets/cityscapes_769x769.py @@ -0,0 +1,35 @@ +_base_ = './cityscapes.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (769, 769) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2049, 1025), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/drive.py b/configs/_base_/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..06e8ff606e0d2a4514ec8b7d2c6c436a32efcbf4 --- /dev/null +++ b/configs/_base_/datasets/drive.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'DRIVEDataset' +data_root = 'data/DRIVE' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (584, 565) +crop_size = (64, 64) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/hrf.py b/configs/_base_/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..242d790eb1b83e75cf6b7eaa7a35c674099311ad --- /dev/null +++ b/configs/_base_/datasets/hrf.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'HRFDataset' +data_root = 'data/HRF' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (2336, 3504) +crop_size = (256, 256) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_context.py b/configs/_base_/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ff65bad1b86d7e3a5980bb5b9fc55798dc8df5f4 --- /dev/null +++ b/configs/_base_/datasets/pascal_context.py @@ -0,0 +1,60 @@ +# dataset settings +dataset_type = 'PascalContextDataset' +data_root = 'data/VOCdevkit/VOC2010/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +img_scale = (520, 520) +crop_size = (480, 480) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/train.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_voc12.py b/configs/_base_/datasets/pascal_voc12.py new file mode 100644 index 0000000000000000000000000000000000000000..ba1d42d0c5781f56dc177d860d856bb34adce555 --- /dev/null +++ b/configs/_base_/datasets/pascal_voc12.py @@ -0,0 +1,57 @@ +# dataset settings +dataset_type = 'PascalVOCDataset' +data_root = 'data/VOCdevkit/VOC2012' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 512), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/train.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_voc12_aug.py b/configs/_base_/datasets/pascal_voc12_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3f23b6717d53ad29f02dd15046802a2631a5076b --- /dev/null +++ b/configs/_base_/datasets/pascal_voc12_aug.py @@ -0,0 +1,9 @@ +_base_ = './pascal_voc12.py' +# dataset settings +data = dict( + train=dict( + ann_dir=['SegmentationClass', 'SegmentationClassAug'], + split=[ + 'ImageSets/Segmentation/train.txt', + 'ImageSets/Segmentation/aug.txt' + ])) diff --git a/configs/_base_/datasets/stare.py b/configs/_base_/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..3f71b25488cc11a6b4d582ac52b5a24e1ad1cf8e --- /dev/null +++ b/configs/_base_/datasets/stare.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'STAREDataset' +data_root = 'data/STARE' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (605, 700) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..b564cc4e7e7d9a67dacaaddecb100e4d8f5c005b --- /dev/null +++ b/configs/_base_/default_runtime.py @@ -0,0 +1,14 @@ +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True diff --git a/configs/_base_/models/ann_r50-d8.py b/configs/_base_/models/ann_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..a2cb653827e44e6015b3b83bc578003e614a6aa1 --- /dev/null +++ b/configs/_base_/models/ann_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ANNHead', + in_channels=[1024, 2048], + in_index=[2, 3], + channels=512, + project_channels=256, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/apcnet_r50-d8.py b/configs/_base_/models/apcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..c8f5316cbcf3896ba9de7ca2c801eba512f01d5e --- /dev/null +++ b/configs/_base_/models/apcnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='APCHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ccnet_r50-d8.py b/configs/_base_/models/ccnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..4fc3d8f875049b0a2ea5c8a0e1ab442b96bee73c --- /dev/null +++ b/configs/_base_/models/ccnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='CCHead', + in_channels=2048, + in_index=3, + channels=512, + recurrence=2, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/cgnet.py b/configs/_base_/models/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..eff8d9458c877c5db894957e0b1b4597e40da6ab --- /dev/null +++ b/configs/_base_/models/cgnet.py @@ -0,0 +1,35 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='CGNet', + norm_cfg=norm_cfg, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16)), + decode_head=dict( + type='FCNHead', + in_channels=256, + in_index=2, + channels=256, + num_convs=0, + concat_input=False, + dropout_ratio=0, + num_classes=19, + norm_cfg=norm_cfg, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + class_weight=[ + 2.5959933, 6.7415504, 3.5354059, 9.8663225, 9.690899, 9.369352, + 10.289121, 9.953208, 4.3097677, 9.490387, 7.674431, 9.396905, + 10.347791, 6.3927646, 10.226669, 10.241062, 10.280587, + 10.396974, 10.055647 + ])), + # model training and testing settings + train_cfg=dict(sampler=None), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/danet_r50-d8.py b/configs/_base_/models/danet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..2c934939fac48525f22ad86f489a041dd7db7d09 --- /dev/null +++ b/configs/_base_/models/danet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DAHead', + in_channels=2048, + in_index=3, + channels=512, + pam_channels=64, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/deeplabv3_r50-d8.py b/configs/_base_/models/deeplabv3_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d7a43bee01422ad4795dd27874e0cd4bb6cbfecf --- /dev/null +++ b/configs/_base_/models/deeplabv3_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/deeplabv3_unet_s5-d16.py b/configs/_base_/models/deeplabv3_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..0cd262999d8b2cb8e14a5c32190ae73f479d8e81 --- /dev/null +++ b/configs/_base_/models/deeplabv3_unet_s5-d16.py @@ -0,0 +1,50 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='ASPPHead', + in_channels=64, + in_index=4, + channels=16, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/deeplabv3plus_r50-d8.py b/configs/_base_/models/deeplabv3plus_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..050e39e091d816df9028d23aa3ecf9db74e441e1 --- /dev/null +++ b/configs/_base_/models/deeplabv3plus_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DepthwiseSeparableASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/dmnet_r50-d8.py b/configs/_base_/models/dmnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d22ba52640bebd805b3b8d07025e276dfb023759 --- /dev/null +++ b/configs/_base_/models/dmnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DMHead', + in_channels=2048, + in_index=3, + channels=512, + filter_sizes=(1, 3, 5, 7), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/dnl_r50-d8.py b/configs/_base_/models/dnl_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..edb4c174c51e34c103737ba39bfc48bf831e561d --- /dev/null +++ b/configs/_base_/models/dnl_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DNLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/emanet_r50-d8.py b/configs/_base_/models/emanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..26adcd430926de0862204a71d345f2543167f27b --- /dev/null +++ b/configs/_base_/models/emanet_r50-d8.py @@ -0,0 +1,47 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EMAHead', + in_channels=2048, + in_index=3, + channels=256, + ema_channels=512, + num_bases=64, + num_stages=3, + momentum=0.1, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/encnet_r50-d8.py b/configs/_base_/models/encnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..be777123a886503172a95fe0719e956a147bbd68 --- /dev/null +++ b/configs/_base_/models/encnet_r50-d8.py @@ -0,0 +1,48 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(1, 2, 3), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fast_scnn.py b/configs/_base_/models/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..32fdeb659355a5ce5ef2cc7c2f30742703811cdf --- /dev/null +++ b/configs/_base_/models/fast_scnn.py @@ -0,0 +1,57 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True, momentum=0.01) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='FastSCNN', + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + norm_cfg=norm_cfg, + align_corners=False), + decode_head=dict( + type='DepthwiseSeparableFCNHead', + in_channels=128, + channels=128, + concat_input=False, + num_classes=19, + in_index=-1, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=32, + num_convs=1, + num_classes=19, + in_index=-2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=64, + channels=32, + num_convs=1, + num_classes=19, + in_index=-3, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_hr18.py b/configs/_base_/models/fcn_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c3e299bc89ada56ca14bbffcbdb08a586b8ed9e9 --- /dev/null +++ b/configs/_base_/models/fcn_hr18.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + channels=sum([18, 36, 72, 144]), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_r50-d8.py b/configs/_base_/models/fcn_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5e98f6cc918b6146fc6d613c6918e825ef1355c3 --- /dev/null +++ b/configs/_base_/models/fcn_r50-d8.py @@ -0,0 +1,45 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='FCNHead', + in_channels=2048, + in_index=3, + channels=512, + num_convs=2, + concat_input=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_unet_s5-d16.py b/configs/_base_/models/fcn_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..a33e7972877f902d0e7d18401ca675e3e4e60a18 --- /dev/null +++ b/configs/_base_/models/fcn_unet_s5-d16.py @@ -0,0 +1,51 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='FCNHead', + in_channels=64, + in_index=4, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/fpn_r50.py b/configs/_base_/models/fpn_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..86ab327db92e44c14822d65f1c9277cb007f17c1 --- /dev/null +++ b/configs/_base_/models/fpn_r50.py @@ -0,0 +1,36 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/gcnet_r50-d8.py b/configs/_base_/models/gcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..3d2ad69f5c22adfe79d5fdabf920217628987166 --- /dev/null +++ b/configs/_base_/models/gcnet_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='GCHead', + in_channels=2048, + in_index=3, + channels=512, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/lraspp_m-v3-d8.py b/configs/_base_/models/lraspp_m-v3-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..93258242a90695cc94a7c6bd41562d6a75988771 --- /dev/null +++ b/configs/_base_/models/lraspp_m-v3-d8.py @@ -0,0 +1,25 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='MobileNetV3', + arch='large', + out_indices=(1, 3, 16), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 24, 960), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/nonlocal_r50-d8.py b/configs/_base_/models/nonlocal_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5674a39854cafd1f2e363bac99c58ccae62f24da --- /dev/null +++ b/configs/_base_/models/nonlocal_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='NLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ocrnet_hr18.py b/configs/_base_/models/ocrnet_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c60f62a7cdf3f5c5096a7a7e725e8268fddcb057 --- /dev/null +++ b/configs/_base_/models/ocrnet_hr18.py @@ -0,0 +1,68 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ocrnet_r50-d8.py b/configs/_base_/models/ocrnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..615aa3ff703942b6c22b2d6e9642504dd3e41ebd --- /dev/null +++ b/configs/_base_/models/ocrnet_r50-d8.py @@ -0,0 +1,47 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=[ + dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=2048, + in_index=3, + channels=512, + ocr_channels=256, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pointrend_r50.py b/configs/_base_/models/pointrend_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..9d323dbf9466d41e0800aa57ef84045f3d874bdf --- /dev/null +++ b/configs/_base_/models/pointrend_r50.py @@ -0,0 +1,56 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict( + num_points=2048, oversample_ratio=3, importance_sample_ratio=0.75), + test_cfg=dict( + mode='whole', + subdivision_steps=2, + subdivision_num_points=8196, + scale_factor=2)) diff --git a/configs/_base_/models/psanet_r50-d8.py b/configs/_base_/models/psanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..689513fa9d2a40f14bf0ae4ae61f38f0dcc1b3da --- /dev/null +++ b/configs/_base_/models/psanet_r50-d8.py @@ -0,0 +1,49 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSAHead', + in_channels=2048, + in_index=3, + channels=512, + mask_size=(97, 97), + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pspnet_r50-d8.py b/configs/_base_/models/pspnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..f451e08ad2eb0732dcb806b1851eb978d4acf136 --- /dev/null +++ b/configs/_base_/models/pspnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pspnet_unet_s5-d16.py b/configs/_base_/models/pspnet_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..fcff9ec4f41fad158344ecd77313dc14564f3682 --- /dev/null +++ b/configs/_base_/models/pspnet_unet_s5-d16.py @@ -0,0 +1,50 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + channels=16, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/setr_mla.py b/configs/_base_/models/setr_mla.py new file mode 100644 index 0000000000000000000000000000000000000000..2e1750599f9ab574efd4531d13558ce710eb93c8 --- /dev/null +++ b/configs/_base_/models/setr_mla.py @@ -0,0 +1,38 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VIT_MLA', + model_name='vit_large_patch16_384', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=1024, + depth=24, + num_heads=16, + num_classes=19, + drop_rate=0.1, + norm_cfg=norm_cfg, + pos_embed_interp=True, + align_corners=False, + mla_channels=256, + mla_index=(5,11,17,23) + ), + decode_head=dict( + type='VIT_MLAHead', + in_channels=1024, + channels=512, + img_size=768, + mla_channels=256, + mlahead_channels=128, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +# model training and testing settings +train_cfg = dict() +test_cfg = dict(mode='whole') + + diff --git a/configs/_base_/models/setr_naive_pup.py b/configs/_base_/models/setr_naive_pup.py new file mode 100644 index 0000000000000000000000000000000000000000..b6a962f9d7e760f847626d32533d76fd1eac3d5b --- /dev/null +++ b/configs/_base_/models/setr_naive_pup.py @@ -0,0 +1,36 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VisionTransformer', + model_name='vit_base_patch16_224', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=1024, + depth=24, + num_heads=16, + num_classes=19, + drop_rate=0.1, + norm_cfg=norm_cfg, + pos_embed_interp=True, + align_corners=False, + ), + decode_head=dict( + type='VisionTransformerUpHead', + in_channels=1024, + channels=512, + in_index=23, + img_size=768, + embed_dim=1024, + num_classes=19, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +# model training and testing settings +train_cfg = dict() +test_cfg = dict(mode='whole') diff --git a/configs/_base_/models/upernet_r50.py b/configs/_base_/models/upernet_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..10974962fdd7136031fd06de1700f497d355ceaa --- /dev/null +++ b/configs/_base_/models/upernet_r50.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='UPerHead', + in_channels=[256, 512, 1024, 2048], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/schedules/schedule_160k.py b/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000000000000000000000000000000000000..52603890b10f25faf8eec9f9e5a4468fae09b811 --- /dev/null +++ b/configs/_base_/schedules/schedule_160k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=160000) +checkpoint_config = dict(by_epoch=False, interval=16000) +evaluation = dict(interval=16000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_20k.py b/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bf780a1b6f6521833c6a5859675147824efa599d --- /dev/null +++ b/configs/_base_/schedules/schedule_20k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=20000) +checkpoint_config = dict(by_epoch=False, interval=2000) +evaluation = dict(interval=2000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_40k.py b/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000000000000000000000000000000000000..cdbf841abcb26eed87bf76ab816aff4bae0630ee --- /dev/null +++ b/configs/_base_/schedules/schedule_40k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=40000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_80k.py b/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..751963703002309741da12d9060beae1d1be4a96 --- /dev/null +++ b/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() + +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/ann/README.md b/configs/ann/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7fc1648311d8f6789fd2ed99789973afbb940531 --- /dev/null +++ b/configs/ann/README.md @@ -0,0 +1,52 @@ +# Asymmetric Non-local Neural Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{annn, + author = {Zhen Zhu and + Mengde Xu and + Song Bai and + Tengteng Huang and + Xiang Bai}, + title = {Asymmetric Non-local Neural Networks for Semantic Segmentation}, + booktitle={International Conference on Computer Vision}, + year = {2019}, + url = {http://arxiv.org/abs/1908.07678}, +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x1024 | 40000 | 6 | 3.71 | 77.40 | 78.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211.log.json) | +| ANN | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.55 | 76.55 | 78.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243-adf6eece.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243.log.json) | +| ANN | R-50-D8 | 769x769 | 40000 | 6.8 | 1.70 | 78.89 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712-2b46b04d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712.log.json) | +| ANN | R-101-D8 | 769x769 | 40000 | 10.7 | 1.15 | 79.32 | 80.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720-059bff28.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720.log.json) | +| ANN | R-50-D8 | 512x1024 | 80000 | - | - | 77.34 | 78.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911-5a9ad545.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911.log.json) | +| ANN | R-101-D8 | 512x1024 | 80000 | - | - | 77.14 | 78.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728-aceccc6e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728.log.json) | +| ANN | R-50-D8 | 769x769 | 80000 | - | - | 78.88 | 80.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426-cc7ff323.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426.log.json) | +| ANN | R-101-D8 | 769x769 | 80000 | - | - | 78.80 | 80.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713-a9d4be8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x512 | 80000 | 9.1 | 21.01 | 41.01 | 42.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818-26f75e11.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-101-D8 | 512x512 | 80000 | 12.5 | 14.12 | 42.94 | 44.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818-c0153543.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-50-D8 | 512x512 | 160000 | - | - | 41.74 | 42.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733-892247bc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733.log.json) | +| ANN | R-101-D8 | 512x512 | 160000 | - | - | 42.94 | 44.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733-955eb1ec.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x512 | 20000 | 6 | 20.92 | 74.86 | 76.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246-dfcb1c62.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-101-D8 | 512x512 | 20000 | 9.5 | 13.94 | 77.47 | 78.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246-2fad0042.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-50-D8 | 512x512 | 40000 | - | - | 76.56 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314-b5dac322.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314.log.json) | +| ANN | R-101-D8 | 512x512 | 40000 | - | - | 76.70 | 78.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314-bd205bbe.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314.log.json) | diff --git a/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py b/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d494e07333217e0c6830d36d1bb58fa78b03cfb0 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py b/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1eeff0b030cf1db8c6ec9740fa65db44b2026d58 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_160k_ade20k.py b/configs/ann/ann_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9e43af541f6e3df3f36479e736bb0c03fc916970 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py b/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d854f2e4223731f443369febc500dbccdc524d9d --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py b/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..893c53b1ca4bf9788e4d94f0f53cfe92a93f48ce --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_80k_ade20k.py b/configs/ann/ann_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a64dac670ed4d4632e7b9791ec5f8a334dcea78e --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py b/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59508248490b3edbac1c46b4fcc7891f99655b9b --- /dev/null +++ b/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py b/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9c712d1ccfd62ddf6f12ff01ea347ca1995013b --- /dev/null +++ b/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py b/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..00b2594ba8a1c9edc90cca7a6d7c3334fa209edc --- /dev/null +++ b/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py b/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b369dd9e12b2282a30da14f99dd4547c53a7b --- /dev/null +++ b/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ann/ann_r50-d8_512x512_160k_ade20k.py b/configs/ann/ann_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ca6bb248ac867d463c274f975c884aa80a57730f --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py b/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..071f190261c4e8f4a80a5da12a88e0cfcdfef0d8 --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py b/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..82a1c9386c51fb0ada436e51702beb961a534b26 --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ann/ann_r50-d8_512x512_80k_ade20k.py b/configs/ann/ann_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5e04aa7c6ac050d119e07b715e2082f692e1a1de --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py b/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4912bdb9fb298518ae084eb7df0ad22d3e4ff84f --- /dev/null +++ b/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py b/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d1cc072b152986102286f503e3d7b92999bf414c --- /dev/null +++ b/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/apcnet/README.md b/configs/apcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c2ab106a29c1a135fc7a726df9f6f22536357ced --- /dev/null +++ b/configs/apcnet/README.md @@ -0,0 +1,39 @@ +# Adaptive Pyramid Context Network for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{He_2019_CVPR, +author = {He, Junjun and Deng, Zhongying and Zhou, Lei and Wang, Yali and Qiao, Yu}, +title = {Adaptive Pyramid Context Network for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APCNet | R-50-D8 | 512x1024 | 40000 | 7.7 | 3.57 | 78.02 | 79.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 512x1024 | 40000 | 11.2 | 2.15 | 79.08 | 80.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json) | +| APCNet | R-50-D8 | 769x769 | 40000 | 8.7 | 1.52 | 77.89 | 79.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 769x769 | 40000 | 12.7 | 1.03 | 77.96 | 79.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json) | +| APCNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.96 | 79.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json) | +| APCNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.64 | 80.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json) | +| APCNet | R-50-D8 | 769x769 | 80000 | - | - | 78.79 | 80.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json) | +| APCNet | R-101-D8 | 769x769 | 80000 | - | - | 78.45 | 79.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APCNet | R-50-D8 | 512x512 | 80000 | 10.1 | 19.61 | 42.20 | 43.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json) | +| APCNet | R-101-D8 | 512x512 | 80000 | 13.6 | 13.10 | 45.54 | 46.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json) | +| APCNet | R-50-D8 | 512x512 | 160000 | - | - | 43.40 | 43.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json) | +| APCNet | R-101-D8 | 512x512 | 160000 | - | - | 45.41 | 46.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json) | diff --git a/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1e1cec67355abae33d518417eb96eae111f16d2b --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..04cb006ba146268e1d3278151bc6ea00a4fb1bfe --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py b/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ce2279a0fbfd6fcc7cd20e3f552b1a39f47d943 --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py b/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8f10b98406c88256c66d3bbe241c149791d68feb --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c44ebcaf36075e67208c5f033d1e5f9a78dda4e --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..616984575dda73a13fc5870f60ae6ffa30d6b01b --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99c61a942e4868315ce4a9404d113f73fed4a4ea --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..62a0627ae2e9bb17974068e56ee660093e944e0d --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py b/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f7821c559d2f92d23b28e07e040a54cfc425eefc --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py b/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..daafa5fbc12c3ed6c10b5234d520166f774e0f94 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3db6140cb97da1d202fd464d01f793276effa629 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9cac4254f37bc3755bff869a10eb3cb75db4d943 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ccnet/README.md b/configs/ccnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..044d5896781de5824fc5a009d8c0eadf47a44e4e --- /dev/null +++ b/configs/ccnet/README.md @@ -0,0 +1,47 @@ +# CCNet: Criss-Cross Attention for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{huang2018ccnet, + title={CCNet: Criss-Cross Attention for Semantic Segmentation}, + author={Huang, Zilong and Wang, Xinggang and Huang, Lichao and Huang, Chang and Wei, Yunchao and Liu, Wenyu}, + booktitle={ICCV}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x1024 | 40000 | 6 | 3.32 | 77.76 | 78.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517-4123f401.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517.log.json) | +| CCNet | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.31 | 76.35 | 78.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540-a3b84ba6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540.log.json) | +| CCNet | R-50-D8 | 769x769 | 40000 | 6.8 | 1.43 | 78.46 | 79.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125-76d11884.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125.log.json) | +| CCNet | R-101-D8 | 769x769 | 40000 | 10.7 | 1.01 | 76.94 | 78.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428-4f57c8d0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428.log.json) | +| CCNet | R-50-D8 | 512x1024 | 80000 | - | - | 79.03 | 80.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421-869a3423.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 512x1024 | 80000 | - | - | 78.87 | 79.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935-ffae8917.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935.log.json) | +| CCNet | R-50-D8 | 769x769 | 80000 | - | - | 79.29 | 81.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421-73eed8ca.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 769x769 | 80000 | - | - | 79.45 | 80.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502-ad3cd481.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x512 | 80000 | 8.8 | 20.89 | 41.78 | 42.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848-aa37f61e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-101-D8 | 512x512 | 80000 | 12.2 | 14.11 | 43.97 | 45.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848-1f4929a3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-50-D8 | 512x512 | 160000 | - | - | 42.08 | 43.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435-7c97193b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435.log.json) | +| CCNet | R-101-D8 | 512x512 | 160000 | - | - | 43.71 | 45.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644-e849e007.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x512 | 20000 | 6 | 20.45 | 76.17 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212-fad81784.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-101-D8 | 512x512 | 20000 | 9.5 | 13.64 | 77.27 | 79.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212-0007b61d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-50-D8 | 512x512 | 40000 | - | - | 75.96 | 77.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127-c2a15f02.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127.log.json) | +| CCNet | R-101-D8 | 512x512 | 40000 | - | - | 77.87 | 78.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127-c30da577.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127.log.json) | diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py b/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py new file mode 100644 index 0000000000000000000000000000000000000000..d112e4a4248fb4733f60385a0ef338fd9bf8b56c --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py @@ -0,0 +1,2 @@ +_base_ = ['../_base_/datasets/Recipe1M.py', +'../_base_/default_runtime.py','../_base_/models/ccnet_r50-d8.py','../_base_/schedules/schedule_40k.py'] diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2bac38ca6760af6441ede5a04409ed495ef87f3 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..989928ab7f98da86e291451040ff85669a9fbddb --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py b/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c32bf48751f0a18983bff0d99310870b71801663 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py b/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..53eb77c0cd6690668ee7c2a666bd85b9a5f7e73b --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py b/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d7eb668f39bbd22a1f42628428bc19d1645e9865 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py b/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..029c1d525b809b61dc8e548ebe4fb26e5c68a8be --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..43f05fab05ee4e20c3509a923118fe9818543cbd --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..654f377b6f6152c9bd98d33824a39a41d7510c3f --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a4316dde57206fe369e72fa0d32a529fe1a1932 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..16e34356e9f8566ec73e3c25c771e281d3eeb975 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py b/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ad94d8988bb822c1571816255464126d9d5b95d --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py b/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..bbcd29ccea8dcf9f67f1cd198dacd5dab380b265 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py b/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..947b8ac8ce1ddf7906ad39788c6992df3b506d29 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py b/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1a1f49cf6b112afdadf1841571f51b98c010ddf8 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..580d59ca6995ea95a9345ef3ea574ea5b57e9cfb --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6dac64377bb3f73fdf5c836fa9c38757f75ff76 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/cgnet/README.md b/configs/cgnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..00ba387203a257dbb485d68134c88cb43780722d --- /dev/null +++ b/configs/cgnet/README.md @@ -0,0 +1,23 @@ +# CGNet: A Light-weight Context Guided Network for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latext +@article{wu2018cgnet, + title={CGNet: A Light-weight Context Guided Network for Semantic Segmentation}, + author={Wu, Tianyi and Tang, Sheng and Zhang, Rui and Zhang, Yongdong}, + journal={arXiv preprint arXiv:1811.08201}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CGNet | M3N21 | 680x680 | 60000 | 7.5 | 30.51 | 65.63 | 68.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes_20201101_110253-4c0b2f2d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes-20201101_110253.log.json) | +| CGNet | M3N21 | 512x1024 | 60000 | 8.3 | 31.14 | 68.27 | 70.33 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes_20201101_110254-124ea03b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes-20201101_110254.log.json) | diff --git a/configs/cgnet/cgnet_512x1024_60k_cityscapes.py b/configs/cgnet/cgnet_512x1024_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..11421ef9d375d01b01c333c3705d6eb6e3348ee8 --- /dev/null +++ b/configs/cgnet/cgnet_512x1024_60k_cityscapes.py @@ -0,0 +1,66 @@ +_base_ = ['../_base_/models/cgnet.py', '../_base_/default_runtime.py'] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +total_iters = 60000 +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') + +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/train', + ann_dir='gtFine/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline)) diff --git a/configs/cgnet/cgnet_680x680_60k_cityscapes.py b/configs/cgnet/cgnet_680x680_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2b2f8eefb7dbecf81fcd2db54644493480825246 --- /dev/null +++ b/configs/cgnet/cgnet_680x680_60k_cityscapes.py @@ -0,0 +1,50 @@ +_base_ = [ + '../_base_/models/cgnet.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py' +] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +total_iters = 60000 +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') + +img_norm_cfg = dict( + mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True) +crop_size = (680, 680) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=8, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/danet/README.md b/configs/danet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f49ccf96194f820f509aa9448493ba12ead91953 --- /dev/null +++ b/configs/danet/README.md @@ -0,0 +1,47 @@ +# Dual Attention Network for Scene Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{fu2018dual, + title={Dual Attention Network for Scene Segmentation}, + author={Jun Fu, Jing Liu, Haijie Tian, Yong Li, Yongjun Bao, Zhiwei Fang,and Hanqing Lu}, + booktitle={The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.66 | 78.74 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324-c0dbfa5f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324.log.json) | +| DANet | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.99 | 80.52 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831-c57a7157.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831.log.json) | +| DANet | R-50-D8 | 769x769 | 40000 | 8.8 | 1.56 | 78.88 | 80.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703-76681c60.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703.log.json) | +| DANet | R-101-D8 | 769x769 | 40000 | 12.8 | 1.07 | 79.88 | 81.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717-dcb7fd4e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717.log.json) | +| DANet | R-50-D8 | 512x1024 | 80000 | - | - | 79.34 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029-2bfa2293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029.log.json) | +| DANet | R-101-D8 | 512x1024 | 80000 | - | - | 80.41 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918-955e6350.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918.log.json) | +| DANet | R-50-D8 | 769x769 | 80000 | - | - | 79.27 | 80.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954-495689b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954.log.json) | +| DANet | R-101-D8 | 769x769 | 80000 | - | - | 80.47 | 82.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918-f3a929e7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x512 | 80000 | 11.5 | 21.20 | 41.66 | 42.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125-edb18e08.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125.log.json) | +| DANet | R-101-D8 | 512x512 | 80000 | 15 | 14.18 | 43.64 | 45.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126-d0357c73.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126.log.json) | +| DANet | R-50-D8 | 512x512 | 160000 | - | - | 42.45 | 43.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340-9cb35dcd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340.log.json) | +| DANet | R-101-D8 | 512x512 | 160000 | - | - | 44.17 | 45.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348-23bf12f9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x512 | 20000 | 6.5 | 20.94 | 74.45 | 75.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026-9e9e3ab3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-101-D8 | 512x512 | 20000 | 9.9 | 13.76 | 76.02 | 77.23 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026-d48d23b2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-50-D8 | 512x512 | 40000 | - | - | 76.37 | 77.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526-426e3a64.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526.log.json) | +| DANet | R-101-D8 | 512x512 | 40000 | - | - | 76.51 | 77.32 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031-788e232a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031.log.json) | diff --git a/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py b/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3bfb9bdb3064275c2ac3bf2a057ef8eb79c308df --- /dev/null +++ b/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py b/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d80b2ec160ae1c41499d45242713a99122d8adf8 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_160k_ade20k.py b/configs/danet/danet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0f22d0fb6362252ac02f3f152a42997c68b90343 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py b/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..709f93cba3e3bca6ce0635457ab1823b04123bf8 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py b/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5c623eb56836760694b50f3e4e66aa0f1fc069df --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_80k_ade20k.py b/configs/danet/danet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bd31bc8f283fe8c322ee4876deadb89569dc1743 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py b/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..597d76de79610780b03cd91dba5f3a4f10147bcd --- /dev/null +++ b/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py b/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..70f9b31966128e8d9ec37859f57a7edfd8e6d1b2 --- /dev/null +++ b/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py b/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70c5b8d49f04661e23604ca4da56a82b1b99c9 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py b/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..03734310d7338c75d48c914cb325500961c04a79 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/danet/danet_r50-d8_512x512_160k_ade20k.py b/configs/danet/danet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22aaf857c3212d0b36b0b04e7990616025a3ef9b --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py b/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..010f86f1aac1b5c827dec29f692d137dc1c399bf --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py b/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0cef0f09bfa2290d14fc3a783ea500d6c3da2931 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/danet/danet_r50-d8_512x512_80k_ade20k.py b/configs/danet/danet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..154e84890ed73fe4813dddc8c321de6cd2854fc1 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py b/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c5b94e5a27d7f902d4bdea7ef6c4ef0b816bb99 --- /dev/null +++ b/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py b/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c7237ae03c601204dc7c03018ca17ed363090569 --- /dev/null +++ b/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/README.md b/configs/deeplabv3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c4994f6469051efd4881546acfcefef76616332e --- /dev/null +++ b/configs/deeplabv3/README.md @@ -0,0 +1,66 @@ +# Rethinking atrous convolution for semantic image segmentation + +## Introduction + +[ALGORITHM] + +```latext +@article{chen2017rethinking, + title={Rethinking atrous convolution for semantic image segmentation}, + author={Chen, Liang-Chieh and Papandreou, George and Schroff, Florian and Adam, Hartwig}, + journal={arXiv preprint arXiv:1706.05587}, + year={2017} +} +``` + +## Results and models + +Note: `D-8` here corresponding to the output stride 8 setting for DeepLab series. + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x1024 | 40000 | 6.1 | 2.57 | 79.09 | 80.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449-acadc2f8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 40000 | 9.6 | 1.92 | 77.12 | 79.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241-7fd3f799.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 40000 | 6.9 | 1.11 | 78.58 | 79.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723-7eda553c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 40000 | 10.9 | 0.83 | 79.27 | 80.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809-c64f889f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809.log.json) | +| DeepLabV3 | R-18-D8 | 512x1024 | 80000 | 1.7 | 13.78 | 76.70 | 78.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes_20201225_021506-23dffbe2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 512x1024 | 80000 | - | - | 79.32 | 80.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404-b92cfdd4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 80000 | - | - | 80.20 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503-9e428899.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503.log.json) | +| DeepLabV3 | R-18-D8 | 769x769 | 80000 | 1.9 | 5.55 | 76.60 | 78.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes_20201225_021506-6452126a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 80000 | - | - | 79.89 | 81.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338-788d6228.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 80000 | - | - | 79.67 | 80.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353-60e95418.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 40000 | 4.7 | - 6.96 | 76.71 | 78.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-67b0c992.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 80000 | - | - | 78.36 | 79.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-57bb8425.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-18b-D8 | 512x1024 | 80000 | 1.6 | 13.93 | 76.26 | 77.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes_20201225_094144-46040cef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 512x1024 | 80000 | 6.0 | 2.74 | 79.63 | 80.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes_20201225_155148-ec368954.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes-20201225_155148.log.json) | +| DeepLabV3 | R-101b-D8| 512x1024 | 80000 | 9.5 | 1.81 | 80.01 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes_20201226_171821-8fd49503.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes-20201226_171821.log.json) | +| DeepLabV3 | R-18b-D8 | 769x769 | 80000 | 1.8 | 5.79 | 76.63 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes_20201225_094144-fdc985d9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.16 | 78.80 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes_20201225_155404-87fb0cf4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes-20201225_155404.log.json) | +| DeepLabV3 | R-101b-D8| 769x769 | 80000 | 10.7 | 0.82 | 79.41 | 80.73 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes_20201226_190843-9142ee57.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes-20201226_190843.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x512 | 80000 | 8.9 | 14.76 | 42.42 | 43.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028-0bb3f844.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 80000 | 12.4 | 10.14 | 44.08 | 45.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256-d89c7fa4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 160000 | - | - | 42.66 | 44.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227-5d0ee427.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 160000 | - | - | 45.00 | 46.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816-b1f72b3b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x512 | 20000 | 6.1 | 13.88 | 76.17 | 77.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906-596905ef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 20000 | 9.6 | 9.81 | 78.70 | 79.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932-8d13832f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 40000 | - | - | 77.68 | 78.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546-2ae96e7e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 40000 | - | - | 77.92 | 79.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432-0017d784.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-101-D8 | 480x480 | 40000 | 9.2 | 7.09 | 46.55 | 47.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context_20200911_204118-1aa27336.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context-20200911_204118.log.json) | +| DeepLabV3 | R-101-D8 | 480x480 | 80000 | - | - | 46.42 | 47.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context_20200911_170155-2a21fff3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context-20200911_170155.log.json) | diff --git a/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f20f260e23a95dfee9dfdceef9badab992246f53 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..de4a8a5e9f030f1e8a8802596885186163f23eed --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py b/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5256f7b7b053cbe8d9e4ca2ec6139bb02387f6 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py b/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..001b7a69c15299fc1fe5b269a5accf92c5ece032 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8c707c79d659bc544d242352bcb29686eb40b004 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6804a5781369d1031f179d421a3b5a160fd575d3 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df6f36ef7c3b71ba7979aa7a1b226b3e3ebd9bb4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40f5f62373e59d1c6c01ca3f57777698461127c9 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..fb2be22f8bc2e10cdfba4f58b2ad1ced913b4ea4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..796ba3fb142394c4d93a29ba57548dca59d8d02b --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e6d58a67b3b4dddf3da42efca30fa599e623f183 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..13094a98ee9be3cf8c88370e1e111cb4dde03ec4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5186bf614bc9ebffe47323ea61afbc9604be265b --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d185db95adc61734f11f0dcd7b6c45aa652680b0 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e084e95c70b0b7b0c9dcc3388d6b7d3d51d54b6d --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a990c076536ad9455a9203f5b6a60157f2f2f99f --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b25e725ed98324e6ea648567740dc67e0413b4f9 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd920f0ca7c690d3d1c44f5f7be1cbea18fa14d4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py b/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..9d493ef527bb161be98d0e4ea433104b3bb9ff48 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py b/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..71a0fda48aa2538e4d913e73e94a71564377ea50 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8e7420d24a20b662286266cac58cab4721dc8df3 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..132787db98d3fc9df5ed62e31738c82da8c279bf --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b4a9d4e1b9123b3c965cd430237ce9fcc7018a11 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62da1a8090da389a77d77a9887926af2a7ded49 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..492bd3dfdce331070cb9645dbe55142e9b662da1 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..78f4d0d9de3d6b8dd2b097531317956d8e3b19f1 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e35d1988f0bb7ad47a73ef1a64b73d9b40e0ba40 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd7c16580d0620bc854f2c6eb7c881bdcd23020a --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e742d9a5ec2b6addf829cb802de27ea1afd53301 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332d9cfb79fb698c7867f0f80053c1fd29bf2c1d --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3plus/README.md b/configs/deeplabv3plus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dc02660428fe534605ae3bf9659382c282379a4e --- /dev/null +++ b/configs/deeplabv3plus/README.md @@ -0,0 +1,68 @@ +# Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{deeplabv3plus2018, + title={Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation}, + author={Liang-Chieh Chen and Yukun Zhu and George Papandreou and Florian Schroff and Hartwig Adam}, + booktitle={ECCV}, + year={2018} +} +``` + +## Results and models + +Note: +`D-8`/`D-16` here corresponding to the output stride 8/16 setting for DeepLab series. +`MG-124` stands for multi-grid dilation in the last stage of ResNet. + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x1024 | 40000 | 7.5 | 3.94 | 79.61 | 81.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610-d222ffcd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 40000 | 11 | 2.60 | 80.21 | 81.82 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614-3769eecf.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 40000 | 8.5 | 1.72 | 78.97 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143-1dcb0e3c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 40000 | 12.5 | 1.15 | 79.46 | 80.50 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304-ff414b9e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304.log.json) | +| DeepLabV3+ | R-18-D8 | 512x1024 | 80000 | 2.2 | 14.27 | 76.89 | 78.76 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes-20201226_080942.log.json) | +| DeepLabV3+ | R-50-D8 | 512x1024 | 80000 | - | - | 80.09 | 81.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 80000 | - | - | 80.97 | 82.03 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ | R-18-D8 | 769x769 | 80000 | 2.5 | 5.74 | 76.26 | 77.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes_20201226_083346-f326e06a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes-20201226_083346.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 80000 | - | - | 79.83 | 81.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 80000 | - | - | 80.98 | 82.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405-a7573d20.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 40000 | 5.8 | 7.48 | 79.09 | 80.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-cf9ce186.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 80000 | 9.9 | - | 79.90 | 81.33 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-ee6158e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-18b-D8 | 512x1024 | 80000 | 2.1 | 14.95 | 75.87 | 77.52 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes_20201226_090828-e451abd9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes-20201226_090828.log.json) | +| DeepLabV3+ | R-50b-D8 | 512x1024 | 80000 | 7.4 | 3.94 | 80.28 | 81.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes_20201225_213645-a97e4e43.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes-20201225_213645.log.json) | +| DeepLabV3+ | R-101b-D8| 512x1024 | 80000 | 10.9 | 2.60 | 80.16 | 81.41 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes_20201226_190843-9c3c93a4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes-20201226_190843.log.json) | +| DeepLabV3+ | R-18b-D8 | 769x769 | 80000 | 2.4 | 5.96 | 76.36 | 78.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes_20201226_151312-2c868aff.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes-20201226_151312.log.json) | +| DeepLabV3+ | R-50b-D8 | 769x769 | 80000 | 8.4 | 1.72 | 79.41 | 80.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes_20201225_224655-8b596d1c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes-20201225_224655.log.json) | +| DeepLabV3+ | R-101b-D8| 769x769 | 80000 | 12.3 | 1.10 | 79.88 | 81.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes_20201226_205041-227cdf7c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes-20201226_205041.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 10.6 | 21.01 | 42.72 | 43.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028-bf1400d8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 14.1 | 14.16 | 44.60 | 46.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139-d5730af7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 160000 | - | - | 43.95 | 44.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504-6135c7e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 160000 | - | - | 45.47 | 46.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232-38ed86bb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232.log.json) | + +#### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x512 | 20000 | 7.6 | 21 | 75.93 | 77.50 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323-aad58ef1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 20000 | 11 | 13.88 | 77.22 | 78.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345-c7ff3d56.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 40000 | - | - | 76.81 | 77.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759-e1b43aa9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 40000 | - | - | 78.62 | 79.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333-faf03387.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333.log.json) | + +#### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-101-D8 | 480x480 | 40000 | - | 9.09 | 47.30 | 48.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context_20200911_165459-d3c8a29e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context-20200911_165459.log.json) | +| DeepLabV3+ | R-101-D8 | 480x480 | 80000 | - | - | 47.23 | 48.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context_20200911_155322-145d3ee8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context-20200911_155322.log.json) | diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bf39d2f12b719b1c91e38bef71f0f5232543b0dc --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c53ec41baf9043029549b4893b2380372ea5ecd9 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..68e2b072e4b8d076e8c3e929dfdc73bcd24ce859 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..3a46c28608add5325ec1decf33624c3c00bff1d7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ce85aea5a960e76f8154a5319c7c52e98c4c45 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0ebbd3c70ee5e33c6ef4ae76b6c6a6ce828d07b4 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a75c9d3019b13d01c0dd13dae53bce3d15791d52 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ebb1a8eaee16de7443ab3e79e02a37340de511d7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3caa6cf8ae61d467628378d99a919c9db1253b91 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..53fd3a909585367ca59eb827c2fbbab4cdf234ea --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c3c92eb26f8fead94f5ad7ac7d7fb60d92c57114 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5ea9cdb5b639e5284cd46e02ce1b67b4729950f7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..398d9759cafc1d01e78c138abd249808531a97b9 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..136449083f7a9efbad6df94f1acd04170147aaba --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aff70c93e6142ddda3a874d9dfd57ec6c4cd89b3 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0172d9a87d6dc1c75bf75a9c48363eb985d389a8 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b292b03a80aa37b8ca236746cf7cddc4ac27e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b49da3581d9697e726e114b1564fc58a55ef1099 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..318845de1e2124a4dff3348749ec5a13d78d686f --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..1736c2397a9b2a4b4fb12eee8175e5ee98eaf805 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7243d0390f6394fdd528c881bb128b2c13d08037 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3304d3677f5357f1a3e343b39fcd97b238abdb5e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1491e3b8247c9d163d6016caf2fcd8043a053b7e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1056ad4d1e2a4f956d12f6daf506620fab27dd17 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..e36c83ba601884b81c06ee69445a94e76224c828 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..352d870bc8eab11974640c4b2d9c80dc6fbbaaf2 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e4bda3eded693bfd44a8c86ced7ae6ee9963c583 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1420b97a4bd0dc0f5451623697666012a2de635c --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd8e1da9c7b1d86bc8a0c834bbede9d0fd40acf5 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c0ba019136c2e4f33b015be3d82505bee2066655 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/dmnet/README.md b/configs/dmnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9b12c8d862fb7b7633c5b2f4a1c357803abdcd32 --- /dev/null +++ b/configs/dmnet/README.md @@ -0,0 +1,39 @@ +# Dynamic Multi-scale Filters for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{He_2019_ICCV, +author = {He, Junjun and Deng, Zhongying and Qiao, Yu}, +title = {Dynamic Multi-Scale Filters for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, +month = {October}, +year = {2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DMNet | R-50-D8 | 512x1024 | 40000 | 7.0 | 3.66 | 77.78 | 79.14 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json) | +| DMNet | R-101-D8 | 512x1024 | 40000 | 10.6 | 2.54 | 78.37 | 79.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json) | +| DMNet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.57 | 78.49 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json) | +| DMNet | R-101-D8 | 769x769 | 40000 | 12.0 | 1.01 | 77.62 | 78.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json) | +| DMNet | R-50-D8 | 512x1024 | 80000 | - | - | 79.07 | 80.22 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json) | +| DMNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.64 | 80.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json) | +| DMNet | R-50-D8 | 769x769 | 80000 | - | - | 79.22 | 80.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json) | +| DMNet | R-101-D8 | 769x769 | 80000 | - | - | 79.19 | 80.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DMNet | R-50-D8 | 512x512 | 80000 | 9.4 | 20.95 | 42.37 | 43.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json) | +| DMNet | R-101-D8 | 512x512 | 80000 | 13.0 | 13.88 | 45.34 | 46.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json) | +| DMNet | R-50-D8 | 512x512 | 160000 | - | - | 43.15 | 44.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json) | +| DMNet | R-101-D8 | 512x512 | 160000 | - | - | 45.42 | 46.76 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json) | diff --git a/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd6897691d3f8f200783fae7bfe231735f25a11b --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..116cbdcede32bf24ad95f04291e98754011172c9 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py b/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d78d46c040f75d16225307d4b4151b87e6e3db29 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py b/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9713b731a47df9c5e23d26a08ad17d03a0d5e9fe --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b222e730073dd42df618db5660ee9d4117f3956 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36d490e9c9b31de7eedf735d2712e55f35db998 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9a917fa4223bd2428f2b2d10eac446f7ecc71a --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b38f90dc4318f23d32971e7afbf90a327768f2d --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py b/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8fbd9beb11f3d1308ce2cd12da2a177c2d39478 --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py b/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..74f6d6a85a06e96580a3c8d5843f660c85bca5ad --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..19841547a42315164de547a4121cfd64739cf24b --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..31d95f96eb10025c2ad054cde4c81f47db21f0f2 --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dnlnet/README.md b/configs/dnlnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..172dfe1a0f07646c5f8cc47ddd62f5cb6da85a55 --- /dev/null +++ b/configs/dnlnet/README.md @@ -0,0 +1,42 @@ +# Disentangled Non-Local Neural Networks + +## Introduction + +[ALGORITHM] + +This example is to reproduce ["Disentangled Non-Local Neural Networks"](https://arxiv.org/abs/2006.06668) for semantic segmentation. It is still in progress. + +## Citation + +```latex +@misc{yin2020disentangled, + title={Disentangled Non-Local Neural Networks}, + author={Minghao Yin and Zhuliang Yao and Yue Cao and Xiu Li and Zheng Zhang and Stephen Lin and Han Hu}, + year={2020}, + booktitle={ECCV} +} +``` + +## Results and models (in progress) + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| dnl | R-50-D8 | 512x1024 | 40000 | 7.3 | 2.56 | 78.61 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes_20200904_233629-53d4ea93.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| dnl | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.96 | 78.31 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes_20200904_233629-9928ffef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| dnl | R-50-D8 | 769x769 | 40000 | 9.2 | 1.50 | 78.44 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes_20200820_232206-0f283785.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes-20200820_232206.log.json) | +| dnl | R-101-D8 | 769x769 | 40000 | 12.6 | 1.02 | 76.39 | 77.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes_20200820_171256-76c596df.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes-20200820_171256.log.json) | +| dnl | R-50-D8 | 512x1024 | 80000 | - | - | 79.33 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes_20200904_233629-58b2f778.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| dnl | R-101-D8 | 512x1024 | 80000 | - | - | 80.41 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes_20200904_233629-758e2dd4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| dnl | R-50-D8 | 769x769 | 80000 | - | - | 79.36 | 80.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes_20200820_011925-366bc4c7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes-20200820_011925.log.json) | +| dnl | R-101-D8 | 769x769 | 80000 | - | - | 79.41 | 80.68 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes_20200821_051111-95ff84ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes-20200821_051111.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DNL | R-50-D8 | 512x512 | 80000 | 8.8 | 20.66 | 41.76 | 42.99 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k_20200826_183354-1cf6e0c1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNL | R-101-D8 | 512x512 | 80000 | 12.8 | 12.54 | 43.76 | 44.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k_20200826_183354-d820d6ea.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNL | R-50-D8 | 512x512 | 160000 | - | - | 41.87 | 43.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k_20200826_183350-37837798.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k-20200826_183350.log.json) | +| DNL | R-101-D8 | 512x512 | 160000 | - | - | 44.25 | 45.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k_20200826_183350-ed522c61.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k-20200826_183350.log.json) | diff --git a/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a36e3c80a13f91e37e4d90b7ae47c7e0d204144 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0f2e1b6da7e63841f4429b1caed5fbe9d537c4f8 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py b/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..aca44e478b67d5a226681c099e64fe67d93cf39b --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py b/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ebd27a1d1c6bf0e983fafed2e5659701dadb8f24 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..575e9d01343a4563e0d3ba89b361ea8e358d2dee --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9e19411eb963d16fd2a8174529e69ecd5a1a --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7aa7444d4c8022563db642478beec4dc5ab0dab --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fdff93f543af6bac93949e68532daea45e437167 --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py b/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5305689d09b944f6e37aa85567ce3f29fc6974a7 --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py b/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..09604c39729abfc9015eb971069b987c8d8a82cb --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0666199b63e604b09fe8187c378589c25d0d311b --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7b07c4f47629c07faa013b9d1eae3462d898c6f --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) +optimizer = dict( + paramwise_cfg=dict( + custom_keys=dict(theta=dict(wd_mult=0.), phi=dict(wd_mult=0.)))) diff --git a/configs/emanet/README.md b/configs/emanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..40df946ed446cf862847dad084324412e5aa52ee --- /dev/null +++ b/configs/emanet/README.md @@ -0,0 +1,26 @@ +# Expectation-Maximization Attention Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{li2019expectation, + title={Expectation-maximization attention networks for semantic segmentation}, + author={Li, Xia and Zhong, Zhisheng and Wu, Jianlong and Yang, Yibo and Lin, Zhouchen and Liu, Hong}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision}, + pages={9167--9176}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| EMANet | R-50-D8 | 512x1024 | 80000 | 5.4 | 4.58 | 77.59 | 79.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes_20200901_100301-c43fcef1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 512x1024 | 80000 | 6.2 | 2.87 | 79.10 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes_20200901_100301-2d970745.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-50-D8 | 769x769 | 80000 | 8.9 | 1.97 | 79.33 | 80.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes_20200901_100301-16f8de52.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 769x769 | 80000 | 10.1 | 1.22 | 79.62 | 81.00 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes_20200901_100301-47a324ce.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes-20200901_100301.log.json) | diff --git a/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py b/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..58f28b43f55f54c7a604960735963e6b7c13b6f1 --- /dev/null +++ b/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py b/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c5dbf20b0fcc7bc1dd077bd8b7077772251d4c1a --- /dev/null +++ b/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py b/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..73b7788bf924be2e1588596a88f0155ddc37358e --- /dev/null +++ b/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py b/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..699aa212c3518901b2f84db3f062c16b023c7538 --- /dev/null +++ b/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/README.md b/configs/encnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ba42f69fae5e52254b34195b6cd0ed689c5bf6c --- /dev/null +++ b/configs/encnet/README.md @@ -0,0 +1,39 @@ +# Context Encoding for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{Zhang_2018_CVPR, +author = {Zhang, Hang and Dana, Kristin and Shi, Jianping and Zhang, Zhongyue and Wang, Xiaogang and Tyagi, Ambrish and Agrawal, Amit}, +title = {Context Encoding for Semantic Segmentation}, +booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| encnet | R-50-D8 | 512x1024 | 40000 | 8.6 | 4.58 | 75.67 | 77.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes_20200621_220958-68638a47.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes-20200621_220958.log.json) | +| encnet | R-101-D8 | 512x1024 | 40000 | 12.1 | 2.66 | 75.81 | 77.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes_20200621_220933-35e0a3e8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes-20200621_220933.log.json) | +| encnet | R-50-D8 | 769x769 | 40000 | 9.8 | 1.82 | 76.24 | 77.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes_20200621_220958-3bcd2884.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes-20200621_220958.log.json) | +| encnet | R-101-D8 | 769x769 | 40000 | 13.7 | 1.26 | 74.25 | 76.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes_20200621_220933-2fafed55.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes-20200621_220933.log.json) | +| encnet | R-50-D8 | 512x1024 | 80000 | - | - | 77.94 | 79.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes_20200622_003554-fc5c5624.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes-20200622_003554.log.json) | +| encnet | R-101-D8 | 512x1024 | 80000 | - | - | 78.55 | 79.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes_20200622_003555-1de64bec.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes-20200622_003555.log.json) | +| encnet | R-50-D8 | 769x769 | 80000 | - | - | 77.44 | 78.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes_20200622_003554-55096dcb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes-20200622_003554.log.json) | +| encnet | R-101-D8 | 769x769 | 80000 | - | - | 76.10 | 76.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes_20200622_003555-470ef79d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes-20200622_003555.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| encnet | R-50-D8 | 512x512 | 80000 | 10.1 | 22.81 | 39.53 | 41.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k_20200622_042412-44b46b04.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k-20200622_042412.log.json) | +| encnet | R-101-D8 | 512x512 | 80000 | 13.6 | 14.87 | 42.11 | 43.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k_20200622_101128-dd35e237.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k-20200622_101128.log.json) | +| encnet | R-50-D8 | 512x512 | 160000 | - | - | 40.10 | 41.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k_20200622_101059-b2db95e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k-20200622_101059.log.json) | +| encnet | R-101-D8 | 512x512 | 160000 | - | - | 42.61 | 44.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k_20200622_073348-7989641f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k-20200622_073348.log.json) | diff --git a/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py b/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f34373d9ebab5ef6f4c01e3eab8a97c288495be0 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py b/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0b0207b3144460d25229e3ac4c4d0d9fc1d34292 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py b/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8fec6ba255f33d48a66a831de4571346a7a2bd2e --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py b/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c264af998b5ef6a9e521db204205fb998cce68a9 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py b/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6968ea583758191fa8e94497c7186e653c7afb --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..94151004ea88394373cf8f135b065d5056b11179 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py b/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ade67b76ce04e1ede3ff99aab4863705cff446 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py b/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..55648c08b2c4eb78d7d5ae65482e5e5b291c058a --- /dev/null +++ b/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py b/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea6ed0e84f3aa7d2c7acd8dd5c459a8cd3ce45c --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py b/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2feeef7e982550481365f8187cb1a50f0fafcc9 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py b/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2a5dc203cc793860aae7743d16c4fb9a564ad1d8 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py b/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9cb7952cede58165d2ed0f35d2208ad1ffb65232 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py b/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3cbfbf516e833821c49deecd8f167170021f0 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..835375cb0447378fc76431158eb0b8fc011d36bc --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py b/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d311e33f56ba431a882b0e7079001b0e9932a011 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py b/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7b535f3c80818ce6b692b66f18ceee8e7b181fdc --- /dev/null +++ b/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..600b701a7194ead496cc924bee897b6096e1c7ca --- /dev/null +++ b/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict(stem_channels=128), + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/fastscnn/README.md b/configs/fastscnn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bb87a9f7aeb8d3630aeccc04b585a4dfec9f2b7e --- /dev/null +++ b/configs/fastscnn/README.md @@ -0,0 +1,22 @@ +# Fast-SCNN for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{poudel2019fast, + title={Fast-scnn: Fast semantic segmentation network}, + author={Poudel, Rudra PK and Liwicki, Stephan and Cipolla, Roberto}, + journal={arXiv preprint arXiv:1902.04502}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|-----------|-----------|--------:|----------|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Fast-SCNN | Fast-SCNN | 512x1024 | 80000 | 8.4 | 63.61 | 69.06 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_4x8_80k_lr0.12_cityscapes-f5096c79.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_4x8_80k_lr0.12_cityscapes-20200807_165744.log.json) | diff --git a/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py b/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3d9c9999370c8b1c28af3063a3aded0d88c91caf --- /dev/null +++ b/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fast_scnn.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +# Re-config the data sampler. +data = dict(samples_per_gpu=2, workers_per_gpu=4) + +# Re-config the optimizer. +optimizer = dict(type='SGD', lr=0.12, momentum=0.9, weight_decay=4e-5) diff --git a/configs/fcn/README.md b/configs/fcn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..95ca2ac0439c3a33ef13f2e22d7fa7a83754142b --- /dev/null +++ b/configs/fcn/README.md @@ -0,0 +1,66 @@ +# Fully Convolutional Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{shelhamer2017fully, + title={Fully convolutional networks for semantic segmentation}, + author={Shelhamer, Evan and Long, Jonathan and Darrell, Trevor}, + journal={IEEE transactions on pattern analysis and machine intelligence}, + volume={39}, + number={4}, + pages={640--651}, + year={2017}, + publisher={IEEE Trans Pattern Anal Mach Intell} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x1024 | 40000 | 5.7 | 4.17 | 72.25 | 73.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608.log.json) | +| FCN | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.66 | 75.45 | 76.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852-a883d3a1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852.log.json) | +| FCN | R-50-D8 | 769x769 | 40000 | 6.5 | 1.80 | 71.47 | 72.54 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104-977b5d02.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104.log.json) | +| FCN | R-101-D8 | 769x769 | 40000 | 10.4 | 1.19 | 73.93 | 75.14 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208-7d4ab69c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208.log.json) | +| FCN | R-18-D8 | 512x1024 | 80000 | 1.7 | 14.65 | 71.11 | 72.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes-20201225_021327.log.json) | +| FCN | R-50-D8 | 512x1024 | 80000 | - | | 73.61 | 74.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019-03aa804d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019.log.json) | +| FCN | R-101-D8 | 512x1024 | 80000 | - | - | 75.13 | 75.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038-3fb937eb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038.log.json) | +| FCN | R-18-D8 | 769x769 | 80000 | 1.9 | 6.40 | 70.80 | 73.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes_20201225_021451-9739d1b8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes-20201225_021451.log.json) | +| FCN | R-50-D8 | 769x769 | 80000 | - | - | 72.64 | 73.32 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749-f5caeabc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749.log.json) | +| FCN | R-101-D8 | 769x769 | 80000 | - | - | 75.52 | 76.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354-45cbac68.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354.log.json) | +| FCN | R-18b-D8 | 512x1024 | 80000 | 1.6 | 16.74 | 70.24 | 72.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes_20201225_230143-92c0f445.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes-20201225_230143.log.json) | +| FCN | R-50b-D8 | 512x1024 | 80000 | 5.6 | 4.20 | 75.65 | 77.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes_20201225_094221-82957416.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes-20201225_094221.log.json) | +| FCN | R-101b-D8| 512x1024 | 80000 | 9.1 | 2.73 | 77.37 | 78.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes_20201226_160213-4543858f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes-20201226_160213.log.json) | +| FCN | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.70 | 69.66 | 72.07 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes_20201226_004430-32d504e5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes-20201226_004430.log.json) | +| FCN | R-50b-D8 | 769x769 | 80000 | 6.3 | 1.82 | 73.83 | 76.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes_20201225_094223-94552d38.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes-20201225_094223.log.json) | +| FCN | R-101b-D8| 769x769 | 80000 | 10.3 | 1.15 | 77.02 | 78.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes_20201226_170012-82be37e2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes-20201226_170012.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x512 | 80000 | 8.5 | 23.49 | 35.94 | 37.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016.log.json) | +| FCN | R-101-D8 | 512x512 | 80000 | 12 | 14.78 | 39.61 | 40.83 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143-bc1809f7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143.log.json) | +| FCN | R-50-D8 | 512x512 | 160000 | - | - | 36.10 | 38.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713-4edbc3b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713.log.json) | +| FCN | R-101-D8 | 512x512 | 160000 | - | - | 39.91 | 41.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816-fd192bd5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x512 | 20000 | 5.7 | 23.28 | 67.08 | 69.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715-52dc5306.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715.log.json) | +| FCN | R-101-D8 | 512x512 | 20000 | 9.2 | 14.81 | 71.16 | 73.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842-0bb4e798.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842.log.json) | +| FCN | R-50-D8 | 512x512 | 40000 | - | - | 66.97 | 69.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222-5e2dbf40.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| FCN | R-101-D8 | 512x512 | 40000 | - | - | 69.91 | 72.38 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240-4c8bcefd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-101-D8 | 480x480 | 40000 | - | 9.93 | 44.14 | 45.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context_20200911_212515-9b565a6d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context-20200911_212515.log.json) | +| FCN | R-101-D8 | 480x480 | 80000 | - | - | 44.47 | 45.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context_20200915_032644-a3828480.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context-20200915_032644.log.json) | diff --git a/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py b/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..f3a15b41054318d508e98685632921f262029de0 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py b/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..bdccfd99ba0c25646f02850483c2cdf679fdbf3d --- /dev/null +++ b/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py b/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7918dd10d05cd98dbc02f02ef1b93e3134f52357 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..528110dc73c15008869a9ad9851ef487f0c952c7 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py b/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf6780f2c821052692ddcb904bd10e6256c1e71 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py b/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..09a5fe5468f0155f8fd0bf2cd1574a33624d8492 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py b/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..eafefaa67565513c277c5eb42e3661a88133cb27 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py b/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6d0294530f4c817b352cb020d111e3248690ae1f --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py b/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b4cc571294fa45b4442c2bfeb9fda13a14fc5c2 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3503c76935e294c881130b309999d32f13df8839 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b9bf60fc13364ca1b7b3842664950f653426e67 --- /dev/null +++ b/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36eb02e68707d502cbe315ff8f6f25b232dee92 --- /dev/null +++ b/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5a1d29e480cb46a763cb17d2105b3f040153d417 --- /dev/null +++ b/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6644a58dea86fd38e208abbedffe4f836e677078 --- /dev/null +++ b/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..92accfc703fc398d2845d7dc2f1d5336f24738e8 --- /dev/null +++ b/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5dd34dd2134c745275c66adc5488b4b9f68d6809 --- /dev/null +++ b/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py b/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fdc6314f704e61d064f5fb7bdd30bc38a9e87ee5 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py b/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0870f928b82b24b8179305f6c9fc7f6013fb481e --- /dev/null +++ b/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py b/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..401c6ea7330d45d8f7604a1da63fc6e15faea424 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..990a085eda2f2dc47f1a1289bfbf2726ad8c9c4f --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py b/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9ca7fd23cedc0567a015bd5f8641a509ead6110a --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py b/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..17206a5171dcc357c589a1711afa52d87faeece0 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py b/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8cec429c3e27ad2543b7e38fa206e6606fda4d5a --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py b/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ef194cb594eb76316324066e23e48184d8cede27 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py b/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fca98c1d9ace73a61ae395914e5960832216bf67 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7d75cd9f49343355b14c7d60bb0df0936ffe0278 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..28ef13f8d17e977f710ba9a863f182b1f80dc8cf --- /dev/null +++ b/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..106f7b6a1ece974c9f732ee813724bd8bda3bef3 --- /dev/null +++ b/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/foodnet/README.md b/configs/foodnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7aa6d7db2cdb9aa3b82537aa08396589a9511345 --- /dev/null +++ b/configs/foodnet/README.md @@ -0,0 +1,49 @@ +# Baseline for FoodSeg103 + +## Introduction + +[ALGORITHM] + +```latex +@article{xu2021foodseg, + title={A Large-Scale Benchmark for Food Image Segmentation}, + author={Wu, Xiongwei and Fu, Xin and Liu, Ying and Lim, Ee-Peng and Hoi, Steven CH and Sun, Qianru}, + journal={arXiv preprint arXiv:XXXX.XXXX}, + year={2021} +} + +@inproceedings{huang2018ccnet, + title={CCNet: Criss-Cross Attention for Semantic Segmentation}, + author={Huang, Zilong and Wang, Xinggang and Huang, Lichao and Huang, Chang and Wei, Yunchao and Liu, Wenyu}, + booktitle={ICCV}, + year={2019} +} +@inproceedings{Kirillov_2019, + title={Panoptic Feature Pyramid Networks}, + author={Kirillov, Alexander and Girshick, Ross and He, Kaiming and Dollar, Piotr}, + booktitle={CVPR}, + year={2019}, +} +@inproceedings{SETR, + title={Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers}, + author={Zheng, Sixiao and Lu, Jiachen and Zhao, Hengshuang and Zhu, Xiatian and Luo, Zekun and Wang, Yabiao and Fu, Yanwei and Feng, Jianfeng and Xiang, Tao and Torr, Philip H.S. and Zhang, Li}, + booktitle={CVPR}, + year={2021} +} + +@article{liu2021Swin, + title={Swin Transformer: Hierarchical Vision Transformer using Shifted Windows}, + author={Liu, Ze and Lin, Yutong and Cao, Yue and Hu, Han and Wei, Yixuan and Zhang, Zheng and Lin, Stephen and Guo, Baining}, + journal={arXiv preprint arXiv:2103.14030}, + year={2021} +} + +@article{wang2021pyramid, + title={Pyramid vision transformer: A versatile backbone for dense prediction without convolutions}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2102.12122}, + year={2021} +} +``` + + diff --git a/configs/foodnet/SETR_MLA_768x768_80k_base.py b/configs/foodnet/SETR_MLA_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..28beb61a243849ccf09dcb18a2e3880aeb8610f4 --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_base.py @@ -0,0 +1,69 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,7,9,11) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py b/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..6f3a76d44ce1efd203c27bd586566d3793d0a57c --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + pretrain_weights='pretrained_model/VIT_base_224_ReLeM.pth', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,7,9,11) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_MLA_768x768_80k_large.py b/configs/foodnet/SETR_MLA_768x768_80k_large.py new file mode 100644 index 0000000000000000000000000000000000000000..caf8c3d1b462cfd9fd646291674519e255fb4532 --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_large.py @@ -0,0 +1,68 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,11,17,23) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) + +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=80000, metric='mIoU') diff --git a/configs/foodnet/SETR_Naive_768x768_80k_base.py b/configs/foodnet/SETR_Naive_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a51b67876051d356294c51ec1c333c56ac5c9042 --- /dev/null +++ b/configs/foodnet/SETR_Naive_768x768_80k_base.py @@ -0,0 +1,80 @@ +_base_ = [ + '../_base_/models/setr_naive_pup.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + align_corners=False, + num_classes=104, + drop_rate=0. + ), + decode_head=dict( + img_size=768, + in_channels=768, + in_index=11, + channels=512, + num_classes=104, + embed_dim=768, + align_corners=False, + num_conv=2, + upsampling_method='bilinear', + ), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=7, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=9, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py b/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..e171cf36329b0ce0a71fa05b13c20f0f13979ce3 --- /dev/null +++ b/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py @@ -0,0 +1,81 @@ +_base_ = [ + '../_base_/models/setr_naive_pup.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + pretrain_weights='pretrained_model/VIT_base_224_ReLeM.pth', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + align_corners=False, + num_classes=104, + drop_rate=0. + ), + decode_head=dict( + img_size=768, + in_channels=768, + in_index=11, + channels=512, + num_classes=104, + embed_dim=768, + align_corners=False, + num_conv=2, + upsampling_method='bilinear', + ), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=7, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=9, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/ccnet_r50-d8_512x1024_80k.py b/configs/foodnet/ccnet_r50-d8_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..a65634569402a018ed238142ff34cce446e8ffe2 --- /dev/null +++ b/configs/foodnet/ccnet_r50-d8_512x1024_80k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py b/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..bf9c68ea153ac90398afe4080886ae16044f4d06 --- /dev/null +++ b/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(pretrained='./pretrained_model/R50_ReLeM.pth', backbone=dict(type='ResNet')) diff --git a/configs/foodnet/fpn_r50_512x1024_80k.py b/configs/foodnet/fpn_r50_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..da856c77ee311eaac410e37be3f9e2268bdd1442 --- /dev/null +++ b/configs/foodnet/fpn_r50_512x1024_80k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +model = dict(decode_head=dict(num_classes=104)) + +optimizer_config = dict() + +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/foodnet/fpn_r50_512x1024_80k_RM.py b/configs/foodnet/fpn_r50_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..31291a171e6d0d451367094e208babf310275c2c --- /dev/null +++ b/configs/foodnet/fpn_r50_512x1024_80k_RM.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +model = dict(pretrained='./pretrained_model/R50_ReLeM.pth', + backbone=dict(type='ResNet'), + decode_head=dict(num_classes=104)) + +optimizer_config = dict() + +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/fp16/README.md b/configs/fp16/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8d12e4d78025313fb9689bb320b07520bd7648ef --- /dev/null +++ b/configs/fp16/README.md @@ -0,0 +1,25 @@ +# Mixed Precision Training + +## Introduction + +[OTHERS] + +```latex +@article{micikevicius2017mixed, + title={Mixed precision training}, + author={Micikevicius, Paulius and Narang, Sharan and Alben, Jonah and Diamos, Gregory and Elsen, Erich and Garcia, David and Ginsburg, Boris and Houston, Michael and Kuchaiev, Oleksii and Venkatesh, Ganesh and others}, + journal={arXiv preprint arXiv:1710.03740}, + year={2017} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-101-D8 | 512x1024 | 80000 | 5.50 | 2.66 | 76.80 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes/fcn_r101-d8_512x1024_80k_fp16_cityscapes-50245227.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes/fcn_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230921.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 80000 | 5.47 | 2.68 | 79.46 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes/pspnet_r101-d8_512x1024_80k_fp16_cityscapes-ade37931.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes/pspnet_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230919.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 80000 | 5.91 | 1.93 | 80.48 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes-bc86dc84.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230920.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 80000 | 6.46 | 2.60 | 80.46 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes-cc58bc8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230920.log.json) | diff --git a/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..60d8350e98605c2445ce8359ca9a7a1951fe0085 --- /dev/null +++ b/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c263d6907ec9ddfdad32b380a7d926d1391e393c --- /dev/null +++ b/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8100a8e64d780c1b9c272b57e4e171c5e1a4120b --- /dev/null +++ b/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aefac2953abf65c10023599ec42c709a794935c8 --- /dev/null +++ b/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/gcnet/README.md b/configs/gcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b840d5bf9f844e7af89803b48a43b76b887ced36 --- /dev/null +++ b/configs/gcnet/README.md @@ -0,0 +1,48 @@ +# GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{cao2019gcnet, + title={Gcnet: Non-local networks meet squeeze-excitation networks and beyond}, + author={Cao, Yue and Xu, Jiarui and Lin, Stephen and Wei, Fangyun and Hu, Han}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision Workshops}, + pages={0--0}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x1024 | 40000 | 5.8 | 3.93 | 77.69 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436-4b0fd17b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.61 | 78.28 | 79.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436-5e62567f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-50-D8 | 769x769 | 40000 | 6.5 | 1.67 | 78.12 | 80.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814-a26f4471.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814.log.json) | +| GCNet | R-101-D8 | 769x769 | 40000 | 10.5 | 1.13 | 78.95 | 80.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550-ca4f0a84.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550.log.json) | +| GCNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.48 | 80.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450-ef8f069b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.03 | 79.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450-778ebf69.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-50-D8 | 769x769 | 80000 | - | - | 78.68 | 80.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516-4839565b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516.log.json) | +| GCNet | R-101-D8 | 769x769 | 80000 | - | - | 79.18 | 80.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628-8e043423.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.38 | 41.47 | 42.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146-91a6da41.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146.log.json) | +| GCNet | R-101-D8 | 512x512 | 80000 | 12 | 15.20 | 42.82 | 44.54 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811-c3fcb6dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811.log.json) | +| GCNet | R-50-D8 | 512x512 | 160000 | - | - | 42.37 | 43.52 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122-d95f3e1f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122.log.json) | +| GCNet | R-101-D8 | 512x512 | 160000 | - | - | 43.69 | 45.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406-615528d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x512 | 20000 | 5.8 | 23.35 | 76.42 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701-3cbfdab1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701.log.json) | +| GCNet | R-101-D8 | 512x512 | 20000 | 9.2 | 14.80 | 77.41 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713-6c720aa9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713.log.json) | +| GCNet | R-50-D8 | 512x512 | 40000 | - | - | 76.24 | 77.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105-9797336d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105.log.json) | +| GCNet | R-101-D8 | 512x512 | 40000 | - | - | 77.84 | 78.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806-1e38208d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806.log.json) | diff --git a/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..27bd9422dad49bc5a06f577ee45cd834bdbe3912 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f0f83fe39da31fe9a5b497e0481e1c79a33e764 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py b/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9888120f65b045df1c7d4d05fb010373abf82ccf --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py b/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70ca8e46a0409379f5ae9809ce03de203426ad --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py b/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..b17c7a12b547ee4e1cd60d667c575eab06eb071c --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py b/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a2183fc2db1ff188b0ad5418e55f71005da926cc --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..08a6031f20234b1cc1d792ea5d4891613503a185 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5efb61339cdbdde585f7814e9650be2e2df654ac --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..610467c07204140bf604f8dda2aa57978c565ed3 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..155e28f42194112703bb21473e5e3dd0fca40d49 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py b/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1549a4d5bf10cd3fd6e3bd57bf7a48e7e5e1ede8 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py b/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a496204bdb061d975c40cb7ef2aaada40e020a13 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py b/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d85cf6550fea5da7cf1fa078eb4fa30e017166b4 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py b/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..89d5e1ae0f3ef44626f3b5534c504cbce7389a32 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332495d3d7f7d7c7c0e0aca4e379cd54e2ed07de --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6d9cb1c64bcf8c3e952b6f8adc11bec0403d106 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/hrnet/README.md b/configs/hrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d77cefe3e51091bc2264df8b201968addd81e8d --- /dev/null +++ b/configs/hrnet/README.md @@ -0,0 +1,59 @@ +# Deep High-Resolution Representation Learning for Human Pose Estimation + +## Introduction + +[ALGORITHM] + +```latext +@inproceedings{SunXLW19, + title={Deep High-Resolution Representation Learning for Human Pose Estimation}, + author={Ke Sun and Bin Xiao and Dong Liu and Jingdong Wang}, + booktitle={CVPR}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x1024 | 40000 | 1.7 | 23.74 | 73.86 | 75.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216-93db27d0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 40000 | 2.9 | 12.97 | 77.19 | 78.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216-f196fb4e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 40000 | 6.2 | 6.42 | 78.48 | 79.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240-a989b146.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | 75.31 | 77.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700-1462b75d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 80000 | - | - | 78.65 | 80.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255-4e7b345e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 80000 | - | - | 79.93 | 80.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606-58ea95d6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | 76.31 | 78.31 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 160000 | - | - | 78.80 | 80.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822-221e4a4f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 160000 | - | - | 80.65 | 81.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 3.8 | 38.66 | 31.38 | 32.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345-77fc814a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 4.9 | 22.57 | 35.51 | 36.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20200614_185145-66f20cb7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20200614_185145.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 8.2 | 21.23 | 41.90 | 43.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946-7ba5258d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | 33.00 | 34.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20200614_214413-870f65ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20200614_214413.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 160000 | - | - | 36.79 | 38.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426-ca961836.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 160000 | - | - | 42.02 | 43.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x512 | 20000 | 1.8 | 43.36 | 65.20 | 68.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20200617_224503-56e36088.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20200617_224503.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 20000 | 2.9 | 23.48 | 72.30 | 74.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503-488d45f7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 20000 | 6.2 | 22.05 | 75.87 | 78.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419-89de05cd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | 66.61 | 70.00 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648-4f8d6e7f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 40000 | - | - | 72.90 | 75.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401-1b4b76cd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 40000 | - | - | 76.24 | 78.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111-1b0f18bc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W48 | 480x480 | 40000 | 6.1 | 8.86 | 45.14 | 47.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context_20200911_164852-667d00b0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context-20200911_164852.log.json) | +| FCN | HRNetV2p-W48 | 480x480 | 80000 | - | - | 45.84 | 47.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context_20200911_155322-847a6711.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context-20200911_155322.log.json) | diff --git a/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..5ff05aa595399d77ee51552c243e489f395a820e --- /dev/null +++ b/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cf315a4f0e6f397768572c590a634cc1b9d298a9 --- /dev/null +++ b/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9f04e935c39b08de66629f913b30675ffff2a8fe --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99760c36d8399204ca8e35f32690bcd369676852 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a653dda19255214a1a412b645abddd3fc5c0d853 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..45ed99b6813324a58575f9bb74ce0534626e10c4 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f06448b168af4d2dcc5a1f96e4430a7948b7e170 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict(decode_head=dict(num_classes=21)) diff --git a/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d74e95943afca04ba4073e411e0b713985384129 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(decode_head=dict(num_classes=21)) diff --git a/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52bc9f5e91f2fdf9ce8f9e3a873902dd8db56522 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..d09931048f762cd2ac224d62c2fe2ed8e0e148c8 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_480x480_40k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..584b7135fd95464f3d2c965440a0b92161cde09a --- /dev/null +++ b/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_480x480_80k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ddbe3801f99dc21120548af85c55c7cdcfadaea2 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e31d26e093b6cb2d59b24bb3060c92bd7dccdea --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ee2831d99d859c419b158b5f828d8a84063564ea --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22a3ce0b38f36efc96595fe1c3ef428fc1575eb0 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d0de5df75242e58ba572277d6fc5cf93675a097e --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..409db3c628edf63cd40e002f436884ce1fb75970 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8400979b1e94dd42343de656ffbc5fbb7a07944 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0e2d96cb6ce7249852cb1d9b36a2f24bdce00199 --- /dev/null +++ b/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_480x480_40k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..e28164e3dc9d321bf0a97b37f14f3184f95a27a5 --- /dev/null +++ b/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_480x480_80k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..394a61c99f038c94fce58ac9c422b7c3ee4b5f50 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d37ab1d09ef51b1321ed8b3634fd99445efee543 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9bab32b52ca41155062c7655986ed84677a8280 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dff4fea85ced568c38d39408d459697e88ca0faa --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a8d1deb98659d05755c6316c2aff2295afb0bb9c --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1084a57e978195df6d45a9a00415953ddbaeeb51 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7eca7fa4b8102c6225af3b484ffff5bdc7c0f201 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/mobilenet_v2/README.md b/configs/mobilenet_v2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e0e75e028db703129551402ae9d63c6a2861dc4b --- /dev/null +++ b/configs/mobilenet_v2/README.md @@ -0,0 +1,35 @@ +# MobileNetV2: Inverted Residuals and Linear Bottlenecks + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{sandler2018mobilenetv2, + title={Mobilenetv2: Inverted residuals and linear bottlenecks}, + author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={4510--4520}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | M-V2-D8 | 512x1024 | 80000 | 3.4 | 14.2 | 61.54 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes/fcn_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-d24c28c1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes/fcn_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json) | +| PSPNet | M-V2-D8 | 512x1024 | 80000 | 3.6 | 11.2 | 70.23 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-19e81d51.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json) | +| DeepLabV3 | M-V2-D8 | 512x1024 | 80000 | 3.9 | 8.4 | 73.84 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-bef03590.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x1024 | 80000 | 5.1 | 8.4 | 75.20 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-d256dd4b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | + +### ADE20k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | M-V2-D8 | 512x512 | 160000 | 6.5 | 64.4 | 19.71 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k_20200825_214953-c40e1095.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| PSPNet | M-V2-D8 | 512x512 | 160000 | 6.5 | 57.7 | 29.68 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k_20200825_214953-f5942f7a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| DeepLabV3 | M-V2-D8 | 512x512 | 160000 | 6.8 | 39.9 | 34.08 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k_20200825_223255-63986343.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x512 | 160000 | 8.2 | 43.1 | 34.02 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k_20200825_223255-465a01d4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | diff --git a/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..267483d88ff25d75dc18c5c2d37375cd77c9639c --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e15b8cc82b09ac3e64875936cdfd0f663aaba936 --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4533d79a25771905d7f1900bf7b34037885a77a --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7615a7c19a3f19635b71801a55e4544be4d215b5 --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a535bd0ed8a4883134acdc52cf3f77c8d897ce82 --- /dev/null +++ b/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c5f6ab0d62e269e44dac016eb5ac58f49c1fa292 --- /dev/null +++ b/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../fcn/fcn_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7403bee864d833bcc31160665e4b54fdd738cc13 --- /dev/null +++ b/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5b72ac830be29b865ed52adaf41f2fe800f252cc --- /dev/null +++ b/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v3/README.md b/configs/mobilenet_v3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2bad2a731c63ba51ee05518af893618cf7ed94a0 --- /dev/null +++ b/configs/mobilenet_v3/README.md @@ -0,0 +1,28 @@ +# Searching for MobileNetV3 + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{Howard_2019_ICCV, + title={Searching for MobileNetV3}, + author={Howard, Andrew and Sandler, Mark and Chu, Grace and Chen, Liang-Chieh and Chen, Bo and Tan, Mingxing and Wang, Weijun and Zhu, Yukun and Pang, Ruoming and Vasudevan, Vijay and Le, Quoc V. and Adam, Hartwig}, + booktitle={The IEEE International Conference on Computer Vision (ICCV)}, + pages={1314-1324}, + month={October}, + year={2019}, + doi={10.1109/ICCV.2019.00140}} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| LRASPP | M-V3-D8 | 512x1024 | 320000 | 8.9 | 15.22 | 69.54 | 70.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes_20201224_220337-cfe8fb07.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes-20201224_220337.log.json)| +| LRASPP | M-V3-D8 (scratch) | 512x1024 | 320000 | 8.9 | 14.77 | 67.87 | 69.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes_20201224_220337-9f29cd72.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes-20201224_220337.log.json)| +| LRASPP | M-V3s-D8 | 512x1024 | 320000 | 5.3 | 23.64 | 64.11 | 66.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes_20201224_223935-61565b34.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes-20201224_223935.log.json)| +| LRASPP | M-V3s-D8 (scratch) | 512x1024 | 320000 | 5.3 | 24.50 | 62.74 | 65.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes_20201224_223935-03daeabb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes-20201224_223935.log.json)| diff --git a/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e59a78b48be3a0997a31524fd78e7fad5636bc82 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] + +model = dict(pretrained='open-mmlab://contrib/mobilenet_v3_large') + +# Re-config the data sampler. +data = dict(samples_per_gpu=4, workers_per_gpu=4) + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c5435142db6b1f81421f5fd96d07ece32b5f38 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] + +# Re-config the data sampler. +data = dict(samples_per_gpu=4, workers_per_gpu=4) + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4e368b2a11ed6433d8f2594a2cc3184fe5ddfff --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py @@ -0,0 +1,23 @@ +_base_ = './lraspp_m-v3-d8_512x1024_320k_cityscapes.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://contrib/mobilenet_v3_small', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0c5f707200c5d8b6d39493762baf59023dcaad11 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py @@ -0,0 +1,22 @@ +_base_ = './lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/configs/nonlocal_net/README.md b/configs/nonlocal_net/README.md new file mode 100644 index 0000000000000000000000000000000000000000..76352e265a9db69640c650e192f66ab75b1f19b3 --- /dev/null +++ b/configs/nonlocal_net/README.md @@ -0,0 +1,48 @@ +# Non-local Neural Networks + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{wang2018non, + title={Non-local neural networks}, + author={Wang, Xiaolong and Girshick, Ross and Gupta, Abhinav and He, Kaiming}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={7794--7803}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.72 | 78.24 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748-c75e81e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocal | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.95 | 78.66 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748-d63729fa.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocal | R-50-D8 | 769x769 | 40000 | 8.9 | 1.52 | 78.33 | 79.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243-82ef6749.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243.log.json) | +| NonLocal | R-101-D8 | 769x769 | 40000 | 12.8 | 1.05 | 78.57 | 80.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348-8fe9a9dc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348.log.json) | +| NonLocal | R-50-D8 | 512x1024 | 80000 | - | - | 78.01 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518-d6839fae.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518.log.json) | +| NonLocal | R-101-D8 | 512x1024 | 80000 | - | - | 78.93 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411-32700183.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411.log.json) | +| NonLocal | R-50-D8 | 769x769 | 80000 | - | - | 79.05 | 80.68 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506-1f9792f6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506.log.json) | +| NonLocal | R-101-D8 | 769x769 | 80000 | - | - | 79.40 | 80.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428-0e1fa4f9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x512 | 80000 | 9.1 | 21.37 | 40.75 | 42.05 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801-5ae0aa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801.log.json) | +| NonLocal | R-101-D8 | 512x512 | 80000 | 12.6 | 13.97 | 42.90 | 44.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758-24105919.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758.log.json) | +| NonLocal | R-50-D8 | 512x512 | 160000 | - | - | 42.03 | 43.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410-baef45e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410.log.json) | +| NonLocal | R-101-D8 | 512x512 | 160000 | - | - | 43.36 | 44.83 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20200616_003422-affd0f8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20200616_003422.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x512 | 20000 | 6.4 | 21.21 | 76.20 | 77.12 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613-07f2a57c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613.log.json) | +| NonLocal | R-101-D8 | 512x512 | 20000 | 9.8 | 14.01 | 78.15 | 78.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615-948c68ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615.log.json) | +| NonLocal | R-50-D8 | 512x512 | 40000 | - | - | 76.65 | 77.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028-0139d4a9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028.log.json) | +| NonLocal | R-101-D8 | 512x512 | 40000 | - | - | 78.27 | 79.12 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028-7e5ff470.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028.log.json) | diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b06dd3806c1d93be41943ab4d7d49f68ac830 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7a1e66cf1c239eac3c6a4876a35d82e7b6ccec2e --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df9c2aca9c7c1999d74a08a58aca5d220f7df54a --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..490f9873a29f2626ad764825eec97f16ee7f9f96 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40d9190fba223251b794c105b036e4794865f785 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0c6f60dac7b457d3b936a5f7f43eb84713c77e05 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23e6da7f23180c2350253ea400f444c0c3064fd6 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0627e2b5a76dead859212d4cab116c160df21404 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9d4dc7390370d0ffe21e7dcb686eeff7261952c4 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b0672b687ade8d554b71fdf0bc54de9f024fa30c --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b1adfbab882d9825a3f348ed99e401d1f164cd11 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2e808d8072f34d09a7b0859f90261dd66c8815dd --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..66b443abec3282242c0f794a2f91e066596e7ee9 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8a7a2f509ba6627ad5ab972ac090362bbcd2ecb7 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..75adef324877d56c157b457eecbf8446aa6b192f --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a0726c293d6026898110f7fa55d5e7d2d55d7a02 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ocrnet/README.md b/configs/ocrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0a4c75c708330be9163dae675b0c1f84d7722728 --- /dev/null +++ b/configs/ocrnet/README.md @@ -0,0 +1,69 @@ +# Object-Contextual Representations for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{YuanW18, + title={Ocnet: Object context network for scene parsing}, + author={Yuhui Yuan and Jingdong Wang}, + booktitle={arXiv preprint arXiv:1809.00916}, + year={2018} +} + +@article{YuanCW20, + title={Object-Contextual Representations for Semantic Segmentation}, + author={Yuhui Yuan and Xilin Chen and Jingdong Wang}, + booktitle={ECCV}, + year={2020} +} +``` + +## Results and models + +### Cityscapes + +#### HRNet backbone + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 40000 | 3.5 | 10.45 | 74.30 | 75.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes/ocrnet_hr18s_512x1024_40k_cityscapes_20200601_033304-fa2436c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes/ocrnet_hr18s_512x1024_40k_cityscapes_20200601_033304.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 40000 | 4.7 | 7.50 | 77.72 | 79.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320-401c5bdd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 40000 | 8 | 4.22 | 80.58 | 81.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336-55b32491.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | 77.16 | 78.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735-55979e63.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 80000 | - | - | 78.57 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521-c2e1dd4a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 80000 | - | - | 80.70 | 81.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752-9076bcdf.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | 78.45 | 79.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005-f4a7af28.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 160000 | - | - | 79.47 | 80.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001-b9172d0c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 160000 | - | - | 81.35 | 82.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037-dfbf1b0c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037.log.json) | + +#### ResNet backbone + +| Method | Backbone | Crop Size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------|----------|-----------|----------------|------|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | R-101-D8 | 512x1024 | 8 | 40000 | - | - | 80.09 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes-02ac0f13.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 40000 | 8.8 | 3.02 | 80.30 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes-db500f80.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 80000 | 8.8 | 3.02 | 80.81 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes-78688424.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x512 | 80000 | 6.7 | 28.98 | 35.06 | 35.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600-e80b62af.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 80000 | 7.9 | 18.93 | 37.79 | 39.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157-d173d83b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 80000 | 11.2 | 16.99 | 43.00 | 44.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518-d168c2d1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | 37.19 | 38.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505-8e913058.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 160000 | - | - | 39.32 | 40.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940-d8fcd9d1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 160000 | - | - | 43.25 | 44.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705-a073726d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x512 | 20000 | 3.5 | 31.55 | 71.70 | 73.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913-02b04fcb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 20000 | 4.7 | 19.91 | 74.75 | 77.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932-8954cbb7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 20000 | 8.1 | 17.83 | 77.72 | 79.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932-9e82080a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | 72.76 | 74.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025-42b587ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 40000 | - | - | 74.98 | 77.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958-714302be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 40000 | - | - | 77.14 | 79.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958-255bc5ce.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958.log.json) | diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1c86eba17c46a863091d999b1a090e1237202ec5 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2c73b3839c8c1bc859eb3b8864256a00cfd022fe --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..506ad9319a9418f50650c477698c9b5cb9bf6663 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c86e18ea65c6aaa36a4fb6e2708f08c7ae1698 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ab9d6446c9089bfae533b9dcd66e1352d81f74d0 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..df79a9cf13963d26384b00ced0cf5efa9f68a420 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad67722a50c2b2ece5fcb7f0dd1819061ff6b3e --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fc7909785f743071cad2cd1032000405435f81d4 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..923731f74f80c11e196f6099b1c84875686cd441 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..be6bf16a2fd234f3526bf8fb8c30179f1ef9df78 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3d5cb91607134bb1d844d78df7a3c411c134d --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ceb944815b5a979ddb72015295375f6fe0c31a89 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..70babc91c99eb99ee4f941b34ea886236531832e --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..36e77219ac2d7ee6795db7c40ad7341749a3b1c7 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c094391b1dfcef2fa6278f0c181fb50c303f7a4c --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_160k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0aada9d8dcd792fd4fc7da8908cc11d44a9ff521 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_40k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b2e0094393151fa8975a0d53c48b6048b7e1929 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_80k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..3b3e8af9538e6ce3c929a902e3d1ee5be53469a5 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_160k_ade20k.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c2dd6d1158bd31ecdd7874827fd37bffb5d26db6 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_20k_voc12aug.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..89e6309f55f6b939f7d79271513da4934bbacbb6 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_40k_voc12aug.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..04971226eb0fd6461b715358ac955dfb78102992 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_80k_ade20k.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3dd70b74a0bf912d8a6fd39f1f26be7f7571ccd6 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) +optimizer = dict(lr=0.02) +lr_config = dict(min_lr=2e-4) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e34f3432e581ff506c9d2951c98b5aad7b1be6a5 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33d96c76f68b92217ed38afe9538144dfedc4fd2 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) +optimizer = dict(lr=0.02) +lr_config = dict(min_lr=2e-4) diff --git a/configs/point_rend/README.md b/configs/point_rend/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0dea3e31f8c1eb3da33251fa1e10227ae98561e3 --- /dev/null +++ b/configs/point_rend/README.md @@ -0,0 +1,32 @@ +# PointRend: Image Segmentation as Rendering + +## Introduction + +[ALGORITHM] + +``` +@misc{alex2019pointrend, + title={PointRend: Image Segmentation as Rendering}, + author={Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, + year={2019}, + eprint={1912.08193}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PointRend | R-50 | 512x1024 | 80000 | 3.1 | 8.48 | 76.47 | 78.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes_20200711_015821-bb1ff523.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes-20200715_214714.log.json) | +| PointRend | R-101 | 512x1024 | 80000 | 4.2 | 7.00 | 78.30 | 79.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes_20200711_170850-d0ca84be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes-20200715_214824.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PointRend | R-50 | 512x512 | 160000 | 5.1 | 17.31 | 37.64 | 39.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k_20200807_232644-ac3febf2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k-20200807_232644.log.json) | +| PointRend | R-101 | 512x512 | 160000 | 6.1 | 15.50 | 40.02 | 41.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k_20200808_030852-8834902a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k-20200808_030852.log.json) | diff --git a/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py b/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a8c14c8cf91d7cbcc05065a6dc387101dff8cdf6 --- /dev/null +++ b/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py b/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..4d1f8c8154431b056fb8371772f03dfa49ac1ad3 --- /dev/null +++ b/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py b/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..96cbaa48d61ee208117d074e9f06bf4218407d78 --- /dev/null +++ b/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +lr_config = dict(warmup='linear', warmup_iters=200) diff --git a/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py b/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..db8c634c0f889c69ce80f86c445c493dcfdbd3c8 --- /dev/null +++ b/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) +]) +lr_config = dict(warmup='linear', warmup_iters=200) diff --git a/configs/psanet/README.md b/configs/psanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fcb24103b8e2dd649c0ad8938319f201e3254d19 --- /dev/null +++ b/configs/psanet/README.md @@ -0,0 +1,48 @@ +# PSANet: Point-wise Spatial Attention Network for Scene Parsing + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{zhao2018psanet, + title={Psanet: Point-wise spatial attention network for scene parsing}, + author={Zhao, Hengshuang and Zhang, Yi and Liu, Shu and Shi, Jianping and Change Loy, Chen and Lin, Dahua and Jia, Jiaya}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={267--283}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x1024 | 40000 | 7 | 3.17 | 77.63 | 79.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117-99fac37c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117.log.json) | +| PSANet | R-101-D8 | 512x1024 | 40000 | 10.5 | 2.20 | 79.14 | 80.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418-27b9cfa7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418.log.json) | +| PSANet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.40 | 77.99 | 79.64 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717-d5365506.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717.log.json) | +| PSANet | R-101-D8 | 769x769 | 40000 | 11.9 | 0.98 | 78.43 | 80.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107-997da1e6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107.log.json) | +| PSANet | R-50-D8 | 512x1024 | 80000 | - | - | 77.24 | 78.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842-ab60a24f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842.log.json) | +| PSANet | R-101-D8 | 512x1024 | 80000 | - | - | 79.31 | 80.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823-0f73a169.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823.log.json) | +| PSANet | R-50-D8 | 769x769 | 80000 | - | - | 79.31 | 80.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134-fe42f49e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134.log.json) | +| PSANet | R-101-D8 | 769x769 | 80000 | - | - | 79.69 | 80.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550-7665827b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x512 | 80000 | 9 | 18.91 | 41.14 | 41.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141-835e4b97.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141.log.json) | +| PSANet | R-101-D8 | 512x512 | 80000 | 12.5 | 13.13 | 43.80 | 44.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117-1fab60d4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117.log.json) | +| PSANet | R-50-D8 | 512x512 | 160000 | - | - | 41.67 | 42.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258-148077dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258.log.json) | +| PSANet | R-101-D8 | 512x512 | 160000 | - | - | 43.74 | 45.38 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537-dbfa564c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x512 | 20000 | 6.9 | 18.24 | 76.39 | 77.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413-2f1bbaa1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413.log.json) | +| PSANet | R-101-D8 | 512x512 | 20000 | 10.4 | 12.63 | 77.91 | 79.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624-946fef11.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624.log.json) | +| PSANet | R-50-D8 | 512x512 | 40000 | - | - | 76.30 | 77.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946-f596afb5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946.log.json) | +| PSANet | R-101-D8 | 512x512 | 40000 | - | - | 77.73 | 79.05 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946-1f560f9e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946.log.json) | diff --git a/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py b/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69d212f158552cf5a24f62174b24a9d4976477bb --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py b/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bc25d6aaf67ccb7e9fcb44ba2d803bebfa31b160 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py b/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6795e5ef0e4bf1d10ee7ed4f608bf93ac24216 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py b/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1a3c43495bbf9d302216d7ddf62df75446907a36 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py b/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62eef9773ddf41d996104de571bcda00c488e14 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py b/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f8865a7c4d795d9de3f5bc6b762b305b3cabc22f --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py b/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ffc99f010903267fc7c1893f4a6b0dcd2cbe42e6 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py b/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a9efc55ad2062facf3a568f8cdbba76c8c55950 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py b/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6671fcb4bf8430bc0128cd93a4b8cedea1856b03 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py b/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a441013a4c1adc39fc064dbac23caaac9efdc4a6 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py b/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9c6364eb43e2abc95011205b569627ff9367d0e5 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py b/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..af06cb66cc808c206d6946a4b2420a6942d3dc7e --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py b/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..803c42da35eda861bf32ce0e7866cdc9fad96d0d --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py b/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0141a6d0925c2a2aa37517670a9f12ac7d3a02d4 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py b/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..690f8b5ef359be8a8be3a2d768aede24216a8706 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py b/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0966b4770cc649e95525c366b09801408b99567a --- /dev/null +++ b/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/README.md b/configs/pspnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..931cad900680281d6970626b511124704e954c43 --- /dev/null +++ b/configs/pspnet/README.md @@ -0,0 +1,62 @@ +# Pyramid Scene Parsing Network + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{zhao2017pspnet, + title={Pyramid Scene Parsing Network}, + author={Zhao, Hengshuang and Shi, Jianping and Qi, Xiaojuan and Wang, Xiaogang and Jia, Jiaya}, + booktitle={CVPR}, + year={2017} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x1024 | 40000 | 6.1 | 4.07 | 77.85 | 79.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 40000 | 9.6 | 2.68 | 78.34 | 79.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-50-D8 | 769x769 | 40000 | 6.9 | 1.76 | 78.26 | 79.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725-86638686.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725.log.json) | +| PSPNet | R-101-D8 | 769x769 | 40000 | 10.9 | 1.15 | 79.08 | 80.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753-61c6f5be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753.log.json) | +| PSPNet | R-18-D8 | 512x1024 | 80000 | 1.7 | 15.71 | 74.87 | 76.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes_20201225_021458-09ffa746.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.55 | 79.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.76 | 81.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211.log.json) | +| PSPNet | R-18-D8 | 769x769 | 80000 | 1.9 | 6.20 | 75.90 | 77.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes_20201225_021458-3deefc62.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 769x769 | 80000 | - | - | 79.59 | 80.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121-5ccf03dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121.log.json) | +| PSPNet | R-101-D8 | 769x769 | 80000 | - | - | 79.77 | 81.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055-dba412fa.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055.log.json) | +| PSPNet | R-18b-D8 | 512x1024 | 80000 | 1.5 | 16.28 | 74.23 | 75.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes_20201226_063116-26928a60.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes-20201226_063116.log.json) | +| PSPNet | R-50b-D8 | 512x1024 | 80000 | 6.0 | 4.30 | 78.22 | 79.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes_20201225_094315-6344287a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes-20201225_094315.log.json) | +| PSPNet | R-101b-D8| 512x1024 | 80000 | 9.5 | 2.76 | 79.69 | 80.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | +| PSPNet | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.41 | 74.92 | 76.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes_20201226_080942-bf98d186.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes-20201226_080942.log.json) | +| PSPNet | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.88 | 78.50 | 79.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes_20201225_094316-4c643cf6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes-20201225_094316.log.json) | +| PSPNet | R-101b-D8| 769x769 | 80000 | 10.8 | 1.17 | 78.87 | 80.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes_20201226_171823-f0e7c293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes-20201226_171823.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.53 | 41.13 | 41.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128-15a8b914.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 12 | 15.30 | 43.57 | 44.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423-b6e782f0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423.log.json) | +| PSPNet | R-50-D8 | 512x512 | 160000 | - | - | 42.48 | 43.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358.log.json) | +| PSPNet | R-101-D8 | 512x512 | 160000 | - | - | 44.39 | 45.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x512 | 20000 | 6.1 | 23.59 | 76.78 | 77.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958-ed5dfbd9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958.log.json) | +| PSPNet | R-101-D8 | 512x512 | 20000 | 9.6 | 15.02 | 78.47 | 79.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003-4aef3c9a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003.log.json) | +| PSPNet | R-50-D8 | 512x512 | 40000 | - | - | 77.29 | 78.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222-ae9c1b8c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| PSPNet | R-101-D8 | 512x512 | 40000 | - | - | 78.52 | 79.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222-bc933b18.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-101-D8 | 480x480 | 40000 | 8.8 | 9.68 | 46.60 | 47.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context_20200911_211210-bf0f5d7c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context-20200911_211210.log.json) | +| PSPNet | R-101-D8 | 480x480 | 80000 | - | - | 46.03 | 47.15 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context_20200911_190530-c86d6233.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context-20200911_190530.log.json) | diff --git a/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py b/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5a990604a77238375cb6d2b8298a382a457dd6 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py b/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fda9110603d71e14cab6e537949be191f2adf6db --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..38fee11bc23d8c92c529acd0c02a68204e34ab91 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9931a07bc2d137eb49b3fa4dad8f8681d4f5e943 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py b/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6107b41544378ad371cee95ee5ebc2e98ccbd9ad --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py b/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2221b202d6c53c4b04f2431d3344379cbfe06dd7 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py b/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..15f578b6002c481ada06befc3ea66accbbdd1f66 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py b/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..fb7c3d55d57b09296ea24889b218f9a0fb997463 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6e7e58508f31627766b8ab748bd81cd51c77eca --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59b8c6dd5ef234334bcdfa3d5e3594b7a9989b17 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ab8a3d3e3fcc12dd41223af190e2ae04f14d1cb8 --- /dev/null +++ b/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a7cb708e551e90a12ad4267e2af6938c353f0ba --- /dev/null +++ b/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d914f93c023a6384e0e856b8608280cef589d5c6 --- /dev/null +++ b/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5893e66a41cad73e8fb24aa58dc78ef002aecca5 --- /dev/null +++ b/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..abeeedf84387d7846a8a2c10480b94c9d8405559 --- /dev/null +++ b/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..284be6d09af1806b99bee5b85286b55ce02e8cbd --- /dev/null +++ b/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py b/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..86da94de5b32576f04240a2d02dfeccc0d6ddd45 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60)) +test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320)) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py b/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cbb02714b9e252bab38b3f9d9095dabe570b9005 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60)) +test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320)) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5deb5872b00a30d5c18a980c4d6c1b0d915908b9 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e9972849d6899fe43f435284d0e0b1bc3b0e7a9 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py b/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..86584573a3d1afac73041b85516112ac21f1f17c --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py b/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..cd88154d5e0be1a519e973331e0a14ae8a7de13e --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py b/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f0c20c12f6bcf04b732dccaa4bfdba10bd10b5e6 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py b/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52efdf51d7d66c3205c1448c45ae281649a0901e --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..145cadb24016eeea87fccff8171c5b0dfb78f7ab --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23a81eb7ef56a4cd8e7c9da65b86f3d0e562001a --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..946bf4fc84236942a4462c2daa7637cace4e90cf --- /dev/null +++ b/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b6087dcf9f7cc04e12a2b9bcbde7abc4a56e972e --- /dev/null +++ b/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/resnest/README.md b/configs/resnest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..31bac01ec9f659d6c30f220a104c385326d3f04b --- /dev/null +++ b/configs/resnest/README.md @@ -0,0 +1,34 @@ +# ResNeSt: Split-Attention Networks + +## Introduction + +[ALGORITHM] + +```latex +@article{zhang2020resnest, +title={ResNeSt: Split-Attention Networks}, +author={Zhang, Hang and Wu, Chongruo and Zhang, Zhongyue and Zhu, Yi and Zhang, Zhi and Lin, Haibin and Sun, Yue and He, Tong and Muller, Jonas and Manmatha, R. and Li, Mu and Smola, Alexander}, +journal={arXiv preprint arXiv:2004.08955}, +year={2020} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | S-101-D8 | 512x1024 | 80000 | 11.4 | 2.39 | 77.56 | 78.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes_20200807_140631-f8d155b3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| PSPNet | S-101-D8 | 512x1024 | 80000 | 11.8 | 2.52 | 78.57 | 79.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| DeepLabV3 | S-101-D8 | 512x1024 | 80000 | 11.9 | 1.88 | 79.67 | 80.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes_20200807_144429-b73c4270.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | +| DeepLabV3+ | S-101-D8 | 512x1024 | 80000 | 13.2 | 2.36 | 79.62 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes_20200807_144429-1239eb43.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | + +### ADE20k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | S-101-D8 | 512x512 | 160000 | 14.2 | 12.86 | 45.62 | 46.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k_20200807_145416-d3160329.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| PSPNet | S-101-D8 | 512x512 | 160000 | 14.2 | 13.02 | 45.44 | 46.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| DeepLabV3 | S-101-D8 | 512x512 | 160000 | 14.6 | 9.28 | 45.71 | 46.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k_20200807_144503-17ecabe5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | +| DeepLabV3+ | S-101-D8 | 512x512 | 160000 | 16.2 | 11.96 | 46.47 | 47.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k_20200807_144503-27b26226.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | diff --git a/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f98398690eb3e1e77975d7fb94ea865424aa331b --- /dev/null +++ b/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py b/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e3924ad679cb3d7ba731322f9cdb67410baae59a --- /dev/null +++ b/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69bef7238345cf6aabb126012af992602f910287 --- /dev/null +++ b/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py b/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d51bccb965dafc40d7859219d132dc9467740a1b --- /dev/null +++ b/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33fa0252d8b4cc786f1297605c169ee6068195a4 --- /dev/null +++ b/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py b/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dcee8c280e833825f84b944c6db21e9a43125e06 --- /dev/null +++ b/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9737849cbd7470b03ef3fcb3b1225283370eb503 --- /dev/null +++ b/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py b/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6a622eae963401e143004a62ff53071ddbf61c01 --- /dev/null +++ b/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/sem_fpn/README.md b/configs/sem_fpn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c73ade624817b61be2f226c6fae03d0b023c570a --- /dev/null +++ b/configs/sem_fpn/README.md @@ -0,0 +1,35 @@ +# Panoptic Feature Pyramid Networks + +## Introduction + +[ALGORITHM] + +```latex +@article{Kirillov_2019, + title={Panoptic Feature Pyramid Networks}, + ISBN={9781728132938}, + url={http://dx.doi.org/10.1109/CVPR.2019.00656}, + DOI={10.1109/cvpr.2019.00656}, + journal={2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + publisher={IEEE}, + author={Kirillov, Alexander and Girshick, Ross and He, Kaiming and Dollar, Piotr}, + year={2019}, + month={Jun} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FPN | R-50 | 512x1024 | 80000 | 2.8 | 13.54 | 74.52 | 76.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes_20200717_021437-94018a0d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes-20200717_021437.log.json) | +| FPN | R-101 | 512x1024 | 80000 | 3.9 | 10.29 | 75.80 | 77.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes_20200717_012416-c5800d4c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes-20200717_012416.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FPN | R-50 | 512x512 | 160000 | 4.9 | 55.77 | 37.49 | 39.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k_20200718_131734-5b5a6ab9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k-20200718_131734.log.json) | +| FPN | R-101 | 512x512 | 160000 | 5.9 | 40.58 | 39.35 | 40.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k_20200718_131734-306b5004.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k-20200718_131734.log.json) | diff --git a/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py b/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f8710d4be4ee0664f644b9037fd4653e4655907 --- /dev/null +++ b/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fpn_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py b/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2654096dfd78ecdd4065ac2d26cab3e2f11a9c65 --- /dev/null +++ b/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fpn_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py b/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4bf3edd825296fbbed883effc3622793e9adf071 --- /dev/null +++ b/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py b/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5cdfc8ca264c6045dcb7ad890d89f15537bef233 --- /dev/null +++ b/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/unet/README.md b/configs/unet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d815510a19ade68c4962f04b8dee2c317f1788ce --- /dev/null +++ b/configs/unet/README.md @@ -0,0 +1,50 @@ +# U-Net: Convolutional Networks for Biomedical Image Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{ronneberger2015u, + title={U-net: Convolutional networks for biomedical image segmentation}, + author={Ronneberger, Olaf and Fischer, Philipp and Brox, Thomas}, + booktitle={International Conference on Medical image computing and computer-assisted intervention}, + pages={234--241}, + year={2015}, + organization={Springer} +} +``` + +## Results and models + +### DRIVE + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 584x565 | 64x64 | 42x42 | 40000 | 0.680 | - | 78.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive_20201223_191051-26cee593.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 584x565 | 64x64 | 42x42 | 40000 | 0.599 | - | 78.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive_20201227_181818-aac73387.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 584x565 | 64x64 | 42x42 | 40000 | 0.596 | - | 78.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive_20201226_094047-0671ff20.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive-20201226_094047.log.json) | + +### STARE + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 605x700 | 128x128 | 85x85 | 40000 | 0.968 | - | 81.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare_20201223_191051-6ea7cfda.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 605x700 | 128x128 | 85x85 | 40000 | 0.982 | - | 81.22 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare_20201227_181818-3c2923c4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 605x700 | 128x128 | 85x85 | 40000 | 0.999 | - | 80.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare_20201226_094047-93dcb93c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare-20201226_094047.log.json) | + +### CHASE_DB1 + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 960x999 | 128x128 | 85x85 | 40000 | 0.968 | - | 80.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1_20201223_191051-95852f45.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 960x999 | 128x128 | 85x85 | 40000 | 0.982 | - | 80.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1_20201227_181818-68d4e609.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 960x999 | 128x128 | 85x85 | 40000 | 0.999 | - | 80.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1_20201226_094047-4c5aefa3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1-20201226_094047.log.json) | + +### HRF + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 2336x3504 | 256x256 | 170x170 | 40000 | 2.525 | - | 79.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf_20201223_173724-df3ec8c4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf-20201223_173724.log.json) | +| UNet-S5-D16 | PSPNet | 2336x3504 | 256x256 | 170x170 | 40000 | 2.588 | - | 80.07 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf_20201227_181818-fdb7e29b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 2336x3504 | 256x256 | 170x170 | 40000 | 2.604 | - | 80.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf_20201226_094047-3a1fdf85.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf-20201226_094047.log.json) | diff --git a/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..c706cf3548e311a7930e5b58299e05af30c43d98 --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..0ef02dcc491871f148b1ad038d281d250eb6e2f4 --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..118428bc44d3078517e231399b131db492f2bc7e --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py b/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..1f8862a0e89243d67634f37c3aca94ca98feff5c --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..2bc52d96293f214adf1e3e1878746ed8bd2434f6 --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/chase_db1.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py b/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..5d836c61dfd568dd4d29d876980001067dcaa200 --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..be8eec77792f4eb16475dc5ab8607fb5682f0acf --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py b/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..80483ade4a4bc3dc5cb8805e8b74c100e872da0c --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..b085a17d6bab5f4d33668bfcf232e30f2a9830fe --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py b/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..9d729cea699e1c845549c74b52703c9ee3273662 --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..f57c9166b67a18fd74f474754b3baec6584b17cf --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py b/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..7b5421ad6877e4b35b0a6ae6e516e577404547ce --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/upernet/README.md b/configs/upernet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d53a92f9bdb67ca9e4c3974ee368ca49d84619c --- /dev/null +++ b/configs/upernet/README.md @@ -0,0 +1,48 @@ +# Unified Perceptual Parsing for Scene Understanding + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{xiao2018unified, + title={Unified perceptual parsing for scene understanding}, + author={Xiao, Tete and Liu, Yingcheng and Zhou, Bolei and Jiang, Yuning and Sun, Jian}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={418--434}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x1024 | 40000 | 6.4 | 4.25 | 77.10 | 78.37 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827-aa54cb54.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827.log.json) | +| UPerNet | R-101 | 512x1024 | 40000 | 7.4 | 3.79 | 78.69 | 80.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933-ebce3b10.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933.log.json) | +| UPerNet | R-50 | 769x769 | 40000 | 7.2 | 1.76 | 77.98 | 79.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048-92d21539.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048.log.json) | +| UPerNet | R-101 | 769x769 | 40000 | 8.4 | 1.56 | 79.03 | 80.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819-83c95d01.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819.log.json) | +| UPerNet | R-50 | 512x1024 | 80000 | - | - | 78.19 | 79.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207-848beca8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207.log.json) | +| UPerNet | R-101 | 512x1024 | 80000 | - | - | 79.40 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403-f05f2345.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403.log.json) | +| UPerNet | R-50 | 769x769 | 80000 | - | - | 79.39 | 80.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107-82ae7d15.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107.log.json) | +| UPerNet | R-101 | 769x769 | 80000 | - | - | 80.10 | 81.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014-082fc334.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x512 | 80000 | 8.1 | 23.40 | 40.70 | 41.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127-ecc8377b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127.log.json) | +| UPerNet | R-101 | 512x512 | 80000 | 9.1 | 20.34 | 42.91 | 43.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117-32e4db94.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117.log.json) | +| UPerNet | R-50 | 512x512 | 160000 | - | - | 42.05 | 42.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328-8534de8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328.log.json) | +| UPerNet | R-101 | 512x512 | 160000 | - | - | 43.82 | 44.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951-91b32684.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x512 | 20000 | 6.4 | 23.17 | 74.82 | 76.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330-5b5890a7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330.log.json) | +| UPerNet | R-101 | 512x512 | 20000 | 7.5 | 19.98 | 77.10 | 78.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629-f14e7f27.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629.log.json) | +| UPerNet | R-50 | 512x512 | 40000 | - | - | 75.92 | 77.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257-ca9bcc6b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257.log.json) | +| UPerNet | R-101 | 512x512 | 40000 | - | - | 77.43 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549-e26476ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549.log.json) | diff --git a/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py b/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b597d831a664761d6051397d2b1862feb59c6 --- /dev/null +++ b/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py b/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..420ca2e42836099213c1f91cb925088cfe7c1269 --- /dev/null +++ b/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_160k_ade20k.py b/configs/upernet/upernet_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..146f13eb79053cc69d4934d294aad9ba723b2577 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_20k_voc12aug.py b/configs/upernet/upernet_r101_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..56345d1806482ac822d709893fe6942f44be6f74 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_40k_voc12aug.py b/configs/upernet/upernet_r101_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0669b741b9b3e3e1a309147b920d3d2a1952ab75 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_80k_ade20k.py b/configs/upernet/upernet_r101_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..abfb9c5d9f35407d590cdc3325006b396ec52820 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_769x769_40k_cityscapes.py b/configs/upernet/upernet_r101_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f3a3fae18cb769fd04b0c669785c5728cf479f --- /dev/null +++ b/configs/upernet/upernet_r101_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_769x769_80k_cityscapes.py b/configs/upernet/upernet_r101_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a709165657d257df4fc76148d225261c63f88d8a --- /dev/null +++ b/configs/upernet/upernet_r101_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py b/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d621e89ce62c06424db7c2e5f5fd00a0a2e85a61 --- /dev/null +++ b/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py b/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..95fffcc76c2ff4f61f8dd80a00d35b7875262a50 --- /dev/null +++ b/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/upernet/upernet_r50_512x512_160k_ade20k.py b/configs/upernet/upernet_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f5dd9aa4ed59d4939bcb49ffe129a9935e303201 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/upernet/upernet_r50_512x512_20k_voc12aug.py b/configs/upernet/upernet_r50_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..95f5c09567144db47e07fc802b114bedd6a00725 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/upernet/upernet_r50_512x512_40k_voc12aug.py b/configs/upernet/upernet_r50_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9621fd1f5c24e582b4a1eda18fcc0a13d2bcb953 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/upernet/upernet_r50_512x512_80k_ade20k.py b/configs/upernet/upernet_r50_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f561e309e3bddb439c90af930c4de5a0c7e209a7 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/upernet/upernet_r50_769x769_40k_cityscapes.py b/configs/upernet/upernet_r50_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..89b18aa2840d12e67339ce0b7a0561fa2ba0c6fa --- /dev/null +++ b/configs/upernet/upernet_r50_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/upernet/upernet_r50_769x769_80k_cityscapes.py b/configs/upernet/upernet_r50_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..29af98f2ebe341998fcf93f8a5c018cabcc0c0ba --- /dev/null +++ b/configs/upernet/upernet_r50_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/demo/MMSegmentation_Tutorial.ipynb b/demo/MMSegmentation_Tutorial.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..127ad4e6a7d14d83ddca96ca519a26e5ba52eb64 --- /dev/null +++ b/demo/MMSegmentation_Tutorial.ipynb @@ -0,0 +1,1416 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "MMSegmentation Tutorial.ipynb", + "provenance": [], + "collapsed_sections": [], + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "40a3c0b2c7a44085b69b9c741df20b3e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_ec96fb4251ea4b8ea268a2bc62b9c75b", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_dae4b284c5a944639991d29f4e79fac5", + "IPY_MODEL_c78567afd0a6418781118ac9f4ecdea9" + ] + } + }, + "ec96fb4251ea4b8ea268a2bc62b9c75b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "dae4b284c5a944639991d29f4e79fac5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_32b7d27a143c41b5bb90f1d8e66a1c67", + "_dom_classes": [], + "description": "100%", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 102567401, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 102567401, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_55d75951f51c4ab89e32045c3d6db8a4" + } + }, + "c78567afd0a6418781118ac9f4ecdea9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_9d29e2d02731416d9852e9c7c08d1665", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 97.8M/97.8M [00:10<00:00, 9.75MB/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_1bb2b93526cd421aa5d5b86d678932ab" + } + }, + "32b7d27a143c41b5bb90f1d8e66a1c67": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "55d75951f51c4ab89e32045c3d6db8a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9d29e2d02731416d9852e9c7c08d1665": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "1bb2b93526cd421aa5d5b86d678932ab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "source": [], + "metadata": { + "collapsed": false + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FVmnaxFJvsb8", + "colab_type": "text" + }, + "source": [ + "# MMSegmentation Tutorial\n", + "Welcome to MMSegmentation! \n", + "\n", + "In this tutorial, we demo\n", + "* How to do inference with MMSeg trained weight\n", + "* How to train on your own dataset and visualize the results. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QS8YHrEhbpas", + "colab_type": "text" + }, + "source": [ + "## Install MMSegmentation\n", + "This step may take several minutes. \n", + "\n", + "We use PyTorch 1.5.0 and CUDA 10.1 for this tutorial. You may install other versions by change the version number in pip install command. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UWyLrLYaNEaL", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "outputId": "35b19c63-d6f3-49e1-dcaa-aed3ecd85ed7" + }, + "source": [ + "# Check nvcc version\n", + "!nvcc -V\n", + "# Check GCC version\n", + "!gcc --version" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2019 NVIDIA Corporation\n", + "Built on Sun_Jul_28_19:07:16_PDT_2019\n", + "Cuda compilation tools, release 10.1, V10.1.243\n", + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ki3WUBjKbutg", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 340 + }, + "outputId": "69f42fab-3f44-44d0-bd62-b73836f90a3d" + }, + "source": [ + "# Install PyTorch\n", + "!pip install -U torch==1.5.0+cu101 torchvision==0.6.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html\n", + "# Install MMCV\n", + "!pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Looking in links: https://download.pytorch.org/whl/torch_stable.html\n", + "Requirement already up-to-date: torch==1.5.0+cu101 in /usr/local/lib/python3.6/dist-packages (1.5.0+cu101)\n", + "Requirement already up-to-date: torchvision==0.6.0+cu101 in /usr/local/lib/python3.6/dist-packages (0.6.0+cu101)\n", + "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from torch==1.5.0+cu101) (0.16.0)\n", + "Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.6/dist-packages (from torch==1.5.0+cu101) (1.18.5)\n", + "Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.6/dist-packages (from torchvision==0.6.0+cu101) (7.0.0)\n", + "Looking in links: https://download.openmmlab.com/mmcv/dist/index.html\n", + "Collecting mmcv-full==latest+torch1.5.0+cu101\n", + " Using cached https://download.openmmlab.com/mmcv/dist/latest/torch1.5.0/cu101/mmcv_full-latest%2Btorch1.5.0%2Bcu101-cp36-cp36m-manylinux1_x86_64.whl\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (1.18.5)\n", + "Requirement already satisfied: addict in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (2.2.1)\n", + "Requirement already satisfied: yapf in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (0.30.0)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (3.13)\n", + "Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (4.1.2.30)\n", + "Installing collected packages: mmcv-full\n", + " Found existing installation: mmcv-full 1.0.0\n", + " Uninstalling mmcv-full-1.0.0:\n", + " Successfully uninstalled mmcv-full-1.0.0\n", + "Successfully installed mmcv-full-1.0.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nR-hHRvbNJJZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "outputId": "ca6d9c48-0034-47cf-97b5-f31f529cc31c" + }, + "source": [ + "!rm -rf mmsegmentation\n", + "!git clone https://github.com/open-mmlab/mmsegmentation.git \n", + "%cd mmsegmentation\n", + "!pip install -e ." + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Cloning into 'mmsegmentation'...\n", + "remote: Enumerating objects: 485, done.\u001b[K\n", + "remote: Counting objects: 100% (485/485), done.\u001b[K\n", + "remote: Compressing objects: 100% (303/303), done.\u001b[K\n", + "remote: Total 649 (delta 280), reused 317 (delta 171), pack-reused 164\u001b[K\n", + "Receiving objects: 100% (649/649), 1.96 MiB | 3.99 MiB/s, done.\n", + "Resolving deltas: 100% (364/364), done.\n", + "/content/mmsegmentation\n", + "Obtaining file:///content/mmsegmentation\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from mmseg==0.5.0+b2724da) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from mmseg==0.5.0+b2724da) (1.18.5)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (2.4.7)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (2.8.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (0.10.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib->mmseg==0.5.0+b2724da) (1.12.0)\n", + "Installing collected packages: mmseg\n", + " Found existing installation: mmseg 0.5.0+b2724da\n", + " Can't uninstall 'mmseg'. No files were found to uninstall.\n", + " Running setup.py develop for mmseg\n", + "Successfully installed mmseg\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mAE_h7XhPT7d", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "912ec9be-4103-40b8-91cc-4d31e9415f60" + }, + "source": [ + "# Check Pytorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__, torch.cuda.is_available())\n", + "\n", + "# Check MMSegmentation installation\n", + "import mmseg\n", + "print(mmseg.__version__)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.5.0+cu101 True\n", + "0.5.0+b2724da\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eUcuC3dUv32I", + "colab_type": "text" + }, + "source": [ + "## Run Inference with MMSeg trained weight" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2hd41IGaiNet", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "outputId": "2834674e-deef-49d7-cd4c-db8dd1ae9733" + }, + "source": [ + "!mkdir checkpoints\n", + "!wget https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P checkpoints" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-07-09 19:13:21-- https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n", + "Resolving open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)... 52.219.56.140\n", + "Connecting to open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)|52.219.56.140|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 196205945 (187M) [application/x-www-form-urlencoded]\n", + "Saving to: ‘checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth’\n", + "\n", + "pspnet_r50-d8_512x1 100%[===================>] 187.12M 11.8MB/s in 18s \n", + "\n", + "2020-07-09 19:13:40 (10.4 MB/s) - ‘checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth’ saved [196205945/196205945]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H8Fxg8i-wHJE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot\n", + "from mmseg.core.evaluation import get_palette" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "umk8sJ0Xuace", + "colab_type": "code", + "colab": {} + }, + "source": [ + "config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py'\n", + "checkpoint_file = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "nWlQFuTgudxu", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_segmentor(config_file, checkpoint_file, device='cuda:0')" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "izFv6pSRujk9", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# test a single image\n", + "img = 'demo/demo.png'\n", + "result = inference_segmentor(model, img)" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "bDcs9udgunQK", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 504 + }, + "outputId": "8221fdb1-92af-4d7c-e65b-c7adf0f5a8af" + }, + "source": [ + "# show the results\n", + "show_result_pyplot(model, img, result, get_palette('cityscapes'))" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/content/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ta51clKX4cwM", + "colab_type": "text" + }, + "source": [ + "## Train a semantic segmentation model on a new dataset\n", + "\n", + "To train on a customized dataset, the following steps are neccessary. \n", + "1. Add a new dataset class. \n", + "2. Create a config file accordingly. \n", + "3. Perform training and evaluation. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AcZg6x_K5Zs3", + "colab_type": "text" + }, + "source": [ + "### Add a new dataset\n", + "\n", + "Datasets in MMSegmentation require image and semantic segmentation maps to be placed in folders with the same perfix. To support a new dataset, we may need to modify the original file structure. \n", + "\n", + "In this tutorial, we give an example of converting the dataset. You may refer to [docs](https://github.com/open-mmlab/mmsegmentation/docs/tutorials/new_dataset.md) for details about dataset reorganization. \n", + "\n", + "We use [Standord Background Dataset](http://dags.stanford.edu/projects/scenedataset.html) as an example. The dataset contains 715 images chosen from existing public datasets [LabelMe](http://labelme.csail.mit.edu), [MSRC](http://research.microsoft.com/en-us/projects/objectclassrecognition), [PASCAL VOC](http://pascallin.ecs.soton.ac.uk/challenges/VOC) and [Geometric Context](http://www.cs.illinois.edu/homes/dhoiem/). Images from these datasets are mainly outdoor scenes, each containing approximately 320-by-240 pixels. \n", + "In this tutorial, we use the region annotations as labels. There are 8 classes in total, i.e. sky, tree, road, grass, water, building, mountain, and foreground object. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TFIt7MHq5Wls", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "outputId": "5e56d5dc-4f1c-4d7c-f833-51cfdbf8d481" + }, + "source": [ + "# download and unzip\n", + "!wget http://dags.stanford.edu/data/iccv09Data.tar.gz -O standford_background.tar.gz\n", + "!tar xf standford_background.tar.gz" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-07-09 19:13:50-- http://dags.stanford.edu/data/iccv09Data.tar.gz\n", + "Resolving dags.stanford.edu (dags.stanford.edu)... 171.64.68.10\n", + "Connecting to dags.stanford.edu (dags.stanford.edu)|171.64.68.10|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 14727974 (14M) [application/x-gzip]\n", + "Saving to: ‘standford_background.tar.gz’\n", + "\n", + "standford_backgroun 100%[===================>] 14.04M 3.22MB/s in 4.4s \n", + "\n", + "2020-07-09 19:13:55 (3.22 MB/s) - ‘standford_background.tar.gz’ saved [14727974/14727974]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "78LIci7F9WWI", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "outputId": "a7f339c7-a071-40db-f30d-44028dd2ce1c" + }, + "source": [ + "# Let's take a look at the dataset\n", + "import mmcv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "plt.figure(figsize=(8, 6))\n", + "plt.imshow(mmcv.bgr2rgb(img))\n", + "plt.show()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L5mNQuc2GsVE", + "colab_type": "text" + }, + "source": [ + "We need to convert the annotation into semantic map format as an image." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WnGZfribFHCx", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import os.path as osp\n", + "import numpy as np\n", + "from PIL import Image\n", + "# convert dataset annotation to semantic segmentation map\n", + "data_root = 'iccv09Data'\n", + "img_dir = 'images'\n", + "ann_dir = 'labels'\n", + "# define class and plaette for better visualization\n", + "classes = ('sky', 'tree', 'road', 'grass', 'water', 'bldg', 'mntn', 'fg obj')\n", + "palette = [[128, 128, 128], [129, 127, 38], [120, 69, 125], [53, 125, 34], \n", + " [0, 11, 123], [118, 20, 12], [122, 81, 25], [241, 134, 51]]\n", + "for file in mmcv.scandir(osp.join(data_root, ann_dir), suffix='.regions.txt'):\n", + " seg_map = np.loadtxt(osp.join(data_root, ann_dir, file)).astype(np.uint8)\n", + " seg_img = Image.fromarray(seg_map).convert('P')\n", + " seg_img.putpalette(np.array(palette, dtype=np.uint8))\n", + " seg_img.save(osp.join(data_root, ann_dir, file.replace('.regions.txt', \n", + " '.png')))" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5MCSS9ABfSks", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "outputId": "d093e054-8db3-40e5-a800-061de844597f" + }, + "source": [ + "# Let's take a look at the segmentation map we got\n", + "import matplotlib.patches as mpatches\n", + "img = Image.open('iccv09Data/labels/6000124.png')\n", + "plt.figure(figsize=(8, 6))\n", + "im = plt.imshow(np.array(img.convert('RGB')))\n", + "\n", + "# create a patch (proxy artist) for every color \n", + "patches = [mpatches.Patch(color=np.array(palette[i])/255., \n", + " label=classes[i]) for i in range(8)]\n", + "# put those patched as legend-handles into the legend\n", + "plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \n", + " fontsize='large')\n", + "\n", + "plt.show()" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WbeLYCp2k5hl", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# split train/val set randomly\n", + "split_dir = 'splits'\n", + "mmcv.mkdir_or_exist(osp.join(data_root, split_dir))\n", + "filename_list = [osp.splitext(filename)[0] for filename in mmcv.scandir(\n", + " osp.join(data_root, ann_dir), suffix='.png')]\n", + "with open(osp.join(data_root, split_dir, 'train.txt'), 'w') as f:\n", + " # select first 4/5 as train set\n", + " train_length = int(len(filename_list)*4/5)\n", + " f.writelines(line + '\\n' for line in filename_list[:train_length])\n", + "with open(osp.join(data_root, split_dir, 'val.txt'), 'w') as f:\n", + " # select last 1/5 as train set\n", + " f.writelines(line + '\\n' for line in filename_list[train_length:])" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HchvmGYB_rrO", + "colab_type": "text" + }, + "source": [ + "After downloading the data, we need to implement `load_annotations` function in the new dataset class `StandfordBackgroundDataset`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "LbsWOw62_o-X", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmseg.datasets.builder import DATASETS\n", + "from mmseg.datasets.custom import CustomDataset\n", + "\n", + "@DATASETS.register_module()\n", + "class StandfordBackgroundDataset(CustomDataset):\n", + " CLASSES = classes\n", + " PALETTE = palette\n", + " def __init__(self, split, **kwargs):\n", + " super().__init__(img_suffix='.jpg', seg_map_suffix='.png', \n", + " split=split, **kwargs)\n", + " assert osp.exists(self.img_dir) and self.split is not None\n", + "\n", + " " + ], + "execution_count": 16, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yUVtmn3Iq3WA", + "colab_type": "text" + }, + "source": [ + "### Create a config file\n", + "In the next step, we need to modify the config for the training. To accelerate the process, we finetune the model from trained weights." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Wwnj9tRzqX_A", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmcv import Config\n", + "cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py')" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1y2oV5w97jQo", + "colab_type": "text" + }, + "source": [ + "Since the given config is used to train PSPNet on cityscapes dataset, we need to modify it accordingly for our new dataset. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eyKnYC1Z7iCV", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "a25241e2-431c-4944-b0b8-b9c792d5aadd" + }, + "source": [ + "from mmseg.apis import set_random_seed\n", + "\n", + "# Since we use ony one GPU, BN is used instead of SyncBN\n", + "cfg.norm_cfg = dict(type='BN', requires_grad=True)\n", + "cfg.model.backbone.norm_cfg = cfg.norm_cfg\n", + "cfg.model.decode_head.norm_cfg = cfg.norm_cfg\n", + "cfg.model.auxiliary_head.norm_cfg = cfg.norm_cfg\n", + "# modify num classes of the model in decode/auxiliary head\n", + "cfg.model.decode_head.num_classes = 8\n", + "cfg.model.auxiliary_head.num_classes = 8\n", + "\n", + "# Modify dataset type and path\n", + "cfg.dataset_type = 'StandfordBackgroundDataset'\n", + "cfg.data_root = data_root\n", + "\n", + "cfg.data.samples_per_gpu = 8\n", + "cfg.data.workers_per_gpu=8\n", + "\n", + "cfg.img_norm_cfg = dict(\n", + " mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)\n", + "cfg.crop_size = (256, 256)\n", + "cfg.train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=cfg.crop_size, cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(type='Normalize', **cfg.img_norm_cfg),\n", + " dict(type='Pad', size=cfg.crop_size, pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg']),\n", + "]\n", + "\n", + "cfg.test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(type='Normalize', **cfg.img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img']),\n", + " ])\n", + "]\n", + "\n", + "\n", + "cfg.data.train.type = cfg.dataset_type\n", + "cfg.data.train.data_root = cfg.data_root\n", + "cfg.data.train.img_dir = img_dir\n", + "cfg.data.train.ann_dir = ann_dir\n", + "cfg.data.train.pipeline = cfg.train_pipeline\n", + "cfg.data.train.split = 'splits/train.txt'\n", + "\n", + "cfg.data.val.type = cfg.dataset_type\n", + "cfg.data.val.data_root = cfg.data_root\n", + "cfg.data.val.img_dir = img_dir\n", + "cfg.data.val.ann_dir = ann_dir\n", + "cfg.data.val.pipeline = cfg.test_pipeline\n", + "cfg.data.val.split = 'splits/val.txt'\n", + "\n", + "cfg.data.test.type = cfg.dataset_type\n", + "cfg.data.test.data_root = cfg.data_root\n", + "cfg.data.test.img_dir = img_dir\n", + "cfg.data.test.ann_dir = ann_dir\n", + "cfg.data.test.pipeline = cfg.test_pipeline\n", + "cfg.data.test.split = 'splits/val.txt'\n", + "\n", + "# We can still use the pre-trained Mask RCNN model though we do not need to\n", + "# use the mask branch\n", + "cfg.load_from = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'\n", + "\n", + "# Set up working dir to save files and logs.\n", + "cfg.work_dir = './work_dirs/tutorial'\n", + "\n", + "cfg.total_iters = 200\n", + "cfg.log_config.interval = 10\n", + "cfg.evaluation.interval = 200\n", + "cfg.checkpoint_config.interval = 200\n", + "\n", + "# Set seed to facitate reproducing the result\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=False)\n", + "cfg.gpu_ids = range(1)\n", + "\n", + "# Let's have a look at the final config used for training\n", + "print(f'Config:\\n{cfg.pretty_text}')" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Config:\n", + "norm_cfg = dict(type='BN', requires_grad=True)\n", + "model = dict(\n", + " type='EncoderDecoder',\n", + " pretrained='open-mmlab://resnet50_v1c',\n", + " backbone=dict(\n", + " type='ResNetV1c',\n", + " depth=50,\n", + " num_stages=4,\n", + " out_indices=(0, 1, 2, 3),\n", + " dilations=(1, 1, 2, 4),\n", + " strides=(1, 2, 1, 1),\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " norm_eval=False,\n", + " style='pytorch',\n", + " contract_dilation=True),\n", + " decode_head=dict(\n", + " type='PSPHead',\n", + " in_channels=2048,\n", + " in_index=3,\n", + " channels=512,\n", + " pool_scales=(1, 2, 3, 6),\n", + " dropout_ratio=0.1,\n", + " num_classes=8,\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " align_corners=False,\n", + " loss_decode=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),\n", + " auxiliary_head=dict(\n", + " type='FCNHead',\n", + " in_channels=1024,\n", + " in_index=2,\n", + " channels=256,\n", + " num_convs=1,\n", + " concat_input=False,\n", + " dropout_ratio=0.1,\n", + " num_classes=8,\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " align_corners=False,\n", + " loss_decode=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)))\n", + "train_cfg = dict()\n", + "test_cfg = dict(mode='whole')\n", + "dataset_type = 'StandfordBackgroundDataset'\n", + "data_root = 'iccv09Data'\n", + "img_norm_cfg = dict(\n", + " mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)\n", + "crop_size = (256, 256)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=(256, 256), cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='Pad', size=(256, 256), pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=8,\n", + " workers_per_gpu=8,\n", + " train=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=(256, 256), cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='Pad', size=(256, 256), pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg'])\n", + " ],\n", + " split='splits/train.txt'),\n", + " val=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " split='splits/val.txt'),\n", + " test=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " split='splits/val.txt'))\n", + "log_config = dict(\n", + " interval=10, hooks=[dict(type='TextLoggerHook', by_epoch=False)])\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "cudnn_benchmark = True\n", + "optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)\n", + "optimizer_config = dict()\n", + "lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False)\n", + "total_iters = 200\n", + "checkpoint_config = dict(by_epoch=False, interval=200)\n", + "evaluation = dict(interval=200, metric='mIoU')\n", + "work_dir = './work_dirs/tutorial'\n", + "seed = 0\n", + "gpu_ids = range(0, 1)\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QWuH14LYF2gQ", + "colab_type": "text" + }, + "source": [ + "### Train and Evaluation" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jYKoSfdMF12B", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 953, + "referenced_widgets": [ + "40a3c0b2c7a44085b69b9c741df20b3e", + "ec96fb4251ea4b8ea268a2bc62b9c75b", + "dae4b284c5a944639991d29f4e79fac5", + "c78567afd0a6418781118ac9f4ecdea9", + "32b7d27a143c41b5bb90f1d8e66a1c67", + "55d75951f51c4ab89e32045c3d6db8a4", + "9d29e2d02731416d9852e9c7c08d1665", + "1bb2b93526cd421aa5d5b86d678932ab" + ] + }, + "outputId": "1c0b5a11-434b-4c96-a4aa-9d685fff0856" + }, + "source": [ + "from mmseg.datasets import build_dataset\n", + "from mmseg.models import build_segmentor\n", + "from mmseg.apis import train_segmentor\n", + "\n", + "\n", + "# Build the dataset\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "\n", + "# Build the detector\n", + "model = build_segmentor(\n", + " cfg.model, train_cfg=cfg.train_cfg, test_cfg=cfg.test_cfg)\n", + "# Add an attribute for visualization convenience\n", + "model.CLASSES = datasets[0].CLASSES\n", + "\n", + "# Create work_dir\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "train_segmentor(model, datasets, cfg, distributed=False, validate=True, \n", + " meta=dict())" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:27,264 - mmseg - INFO - Loaded 572 images\n", + "Downloading: \"https://open-mmlab.s3.ap-northeast-2.amazonaws.com/pretrain/third_party/resnet50_v1c-2cccc1ad.pth\" to /root/.cache/torch/checkpoints/resnet50_v1c-2cccc1ad.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40a3c0b2c7a44085b69b9c741df20b3e", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=102567401.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:39,770 - mmseg - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "unexpected key in source state_dict: fc.weight, fc.bias\n", + "\n", + "2020-07-09 19:14:39,836 - mmseg - INFO - Loaded 143 images\n", + "2020-07-09 19:14:39,837 - mmseg - INFO - load checkpoint from checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:39,990 - mmseg - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "size mismatch for decode_head.conv_seg.weight: copying a param with shape torch.Size([19, 512, 1, 1]) from checkpoint, the shape in current model is torch.Size([8, 512, 1, 1]).\n", + "size mismatch for decode_head.conv_seg.bias: copying a param with shape torch.Size([19]) from checkpoint, the shape in current model is torch.Size([8]).\n", + "size mismatch for auxiliary_head.conv_seg.weight: copying a param with shape torch.Size([19, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([8, 256, 1, 1]).\n", + "size mismatch for auxiliary_head.conv_seg.bias: copying a param with shape torch.Size([19]) from checkpoint, the shape in current model is torch.Size([8]).\n", + "2020-07-09 19:14:39,994 - mmseg - INFO - Start running, host: root@71c6cf9b06c5, work_dir: /content/mmsegmentation/work_dirs/tutorial\n", + "2020-07-09 19:14:39,995 - mmseg - INFO - workflow: [('train', 1)], max: 200 iters\n", + "2020-07-09 19:14:54,192 - mmseg - INFO - Iter [10/200]\tlr: 9.598e-03, eta: 0:04:21, time: 1.379, data_time: 0.002, memory: 3772, decode.loss_seg: 1.5616, decode.acc_seg: 46.9241, aux.loss_seg: 0.6853, aux.acc_seg: 38.7292, loss: 2.2469\n", + "2020-07-09 19:15:07,556 - mmseg - INFO - Iter [20/200]\tlr: 9.149e-03, eta: 0:04:04, time: 1.336, data_time: 0.016, memory: 3772, decode.loss_seg: 0.8215, decode.acc_seg: 68.8879, aux.loss_seg: 0.5371, aux.acc_seg: 67.9098, loss: 1.3586\n", + "2020-07-09 19:15:20,914 - mmseg - INFO - Iter [30/200]\tlr: 8.698e-03, eta: 0:03:49, time: 1.336, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5890, decode.acc_seg: 66.6747, aux.loss_seg: 0.3591, aux.acc_seg: 65.8590, loss: 0.9481\n", + "2020-07-09 19:15:34,235 - mmseg - INFO - Iter [40/200]\tlr: 8.244e-03, eta: 0:03:35, time: 1.332, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5888, decode.acc_seg: 71.6006, aux.loss_seg: 0.3192, aux.acc_seg: 66.5800, loss: 0.9079\n", + "2020-07-09 19:15:47,580 - mmseg - INFO - Iter [50/200]\tlr: 7.788e-03, eta: 0:03:21, time: 1.335, data_time: 0.016, memory: 3772, decode.loss_seg: 0.7011, decode.acc_seg: 65.8105, aux.loss_seg: 0.3223, aux.acc_seg: 62.9866, loss: 1.0235\n", + "2020-07-09 19:16:00,900 - mmseg - INFO - Iter [60/200]\tlr: 7.328e-03, eta: 0:03:07, time: 1.332, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5531, decode.acc_seg: 66.3968, aux.loss_seg: 0.2624, aux.acc_seg: 63.4624, loss: 0.8156\n", + "2020-07-09 19:16:14,199 - mmseg - INFO - Iter [70/200]\tlr: 6.865e-03, eta: 0:02:54, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5888, decode.acc_seg: 66.5814, aux.loss_seg: 0.2905, aux.acc_seg: 62.6161, loss: 0.8792\n", + "2020-07-09 19:16:28,148 - mmseg - INFO - Iter [80/200]\tlr: 6.398e-03, eta: 0:02:41, time: 1.395, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4988, decode.acc_seg: 69.7736, aux.loss_seg: 0.2388, aux.acc_seg: 68.5068, loss: 0.7376\n", + "2020-07-09 19:16:41,440 - mmseg - INFO - Iter [90/200]\tlr: 5.928e-03, eta: 0:02:27, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5177, decode.acc_seg: 72.9874, aux.loss_seg: 0.2512, aux.acc_seg: 71.1549, loss: 0.7690\n", + "2020-07-09 19:16:54,703 - mmseg - INFO - Iter [100/200]\tlr: 5.453e-03, eta: 0:02:14, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5794, decode.acc_seg: 65.9114, aux.loss_seg: 0.2557, aux.acc_seg: 65.2695, loss: 0.8351\n", + "2020-07-09 19:17:07,972 - mmseg - INFO - Iter [110/200]\tlr: 4.974e-03, eta: 0:02:00, time: 1.327, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5395, decode.acc_seg: 69.2955, aux.loss_seg: 0.2443, aux.acc_seg: 68.5840, loss: 0.7838\n", + "2020-07-09 19:17:21,227 - mmseg - INFO - Iter [120/200]\tlr: 4.489e-03, eta: 0:01:47, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5568, decode.acc_seg: 70.1717, aux.loss_seg: 0.2490, aux.acc_seg: 69.4707, loss: 0.8058\n", + "2020-07-09 19:17:34,513 - mmseg - INFO - Iter [130/200]\tlr: 3.998e-03, eta: 0:01:33, time: 1.328, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5222, decode.acc_seg: 72.1791, aux.loss_seg: 0.2446, aux.acc_seg: 71.0046, loss: 0.7668\n", + "2020-07-09 19:17:47,812 - mmseg - INFO - Iter [140/200]\tlr: 3.500e-03, eta: 0:01:20, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5178, decode.acc_seg: 72.7657, aux.loss_seg: 0.2552, aux.acc_seg: 70.8837, loss: 0.7730\n", + "2020-07-09 19:18:01,667 - mmseg - INFO - Iter [150/200]\tlr: 2.994e-03, eta: 0:01:07, time: 1.386, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4719, decode.acc_seg: 72.4819, aux.loss_seg: 0.2263, aux.acc_seg: 69.9169, loss: 0.6982\n", + "2020-07-09 19:18:14,904 - mmseg - INFO - Iter [160/200]\tlr: 2.478e-03, eta: 0:00:53, time: 1.324, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4494, decode.acc_seg: 75.4808, aux.loss_seg: 0.2228, aux.acc_seg: 73.2249, loss: 0.6723\n", + "2020-07-09 19:18:28,151 - mmseg - INFO - Iter [170/200]\tlr: 1.949e-03, eta: 0:00:40, time: 1.325, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4412, decode.acc_seg: 72.4503, aux.loss_seg: 0.2177, aux.acc_seg: 69.9681, loss: 0.6589\n", + "2020-07-09 19:18:41,413 - mmseg - INFO - Iter [180/200]\tlr: 1.402e-03, eta: 0:00:26, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4127, decode.acc_seg: 74.4395, aux.loss_seg: 0.1955, aux.acc_seg: 72.5129, loss: 0.6082\n", + "2020-07-09 19:18:54,678 - mmseg - INFO - Iter [190/200]\tlr: 8.277e-04, eta: 0:00:13, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4733, decode.acc_seg: 74.7937, aux.loss_seg: 0.2285, aux.acc_seg: 72.0337, loss: 0.7019\n", + "2020-07-09 19:19:07,808 - mmseg - INFO - Saving checkpoint at 200 iterations\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 143/143, 10.9 task/s, elapsed: 13s, ETA: 0s" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:19:22,647 - mmseg - INFO - per class results:\n", + "Class IoU Acc\n", + "sky 88.67 94.28\n", + "tree 68.95 86.73\n", + "road 86.23 94.42\n", + "grass 70.01 91.35\n", + "water 62.08 68.32\n", + "bldg 81.11 88.89\n", + "mntn 0.00 0.00\n", + "fg obj 70.39 82.49\n", + "Summary:\n", + "Scope mIoU mAcc aAcc\n", + "global 65.93 75.81 87.48\n", + "\n", + "2020-07-09 19:19:22,660 - mmseg - INFO - Iter [200/200]\tlr: 1.841e-04, mIoU: 0.6593, mAcc: 0.7581, aAcc: 0.8748\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DEkWOP-NMbc_", + "colab_type": "text" + }, + "source": [ + "Inference with trained model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ekG__UfaH_OU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 645 + }, + "outputId": "ac1eb835-19ed-48e6-8f77-e6d325b915c4" + }, + "source": [ + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_segmentor(model, img)\n", + "plt.figure(figsize=(8, 6))\n", + "show_result_pyplot(model, img, result, palette)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/content/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} diff --git a/demo/demo.png b/demo/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e82d7a0773cea14b36f0021fea603de0961b5d8 Binary files /dev/null and b/demo/demo.png differ diff --git a/demo/image_demo.py b/demo/image_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..183f23871b7ff4607066b4e29727313e575b14e4 --- /dev/null +++ b/demo/image_demo.py @@ -0,0 +1,29 @@ +from argparse import ArgumentParser + +from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot +from mmseg.core.evaluation import get_palette + + +def main(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--palette', + default='cityscapes', + help='Color palette used for segmentation map') + args = parser.parse_args() + + # build the model from a config file and a checkpoint file + model = init_segmentor(args.config, args.checkpoint, device=args.device) + # test a single image + result = inference_segmentor(model, args.img) + # show the results + show_result_pyplot(model, args.img, result, get_palette(args.palette)) + + +if __name__ == '__main__': + main() diff --git a/demo/inference_demo.ipynb b/demo/inference_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..e47d964e3c41d1db5e348d22d8ec01641c8aa88b --- /dev/null +++ b/demo/inference_demo.ipynb @@ -0,0 +1,150 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mkdir: cannot create directory ‘../checkpoints’: File exists\n", + "--2020-07-07 08:54:25-- https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n", + "Resolving open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)... 52.219.58.55\n", + "Connecting to open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)|52.219.58.55|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 196205945 (187M) [application/x-www-form-urlencoded]\n", + "Saving to: ‘../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.1’\n", + "\n", + "pspnet_r50-d8_512x1 100%[===================>] 187.12M 16.5MB/s in 13s \n", + "\n", + "2020-07-07 08:54:38 (14.8 MB/s) - ‘../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.1’ saved [196205945/196205945]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir ../checkpoints\n", + "!wget https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P ../checkpoints" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "from mmseg.apis import init_segmentor, inference_segmentor, show_result_pyplot\n", + "from mmseg.core.evaluation import get_palette" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "config_file = '../configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py'\n", + "checkpoint_file = '../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_segmentor(config_file, checkpoint_file, device='cuda:0')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# test a single image\n", + "img = 'demo.png'\n", + "result = inference_segmentor(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mnt/v-liubin/code/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# show the results\n", + "show_result_pyplot(model, img, result, get_palette('cityscapes'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "open-mmlab", + "language": "python", + "name": "open-mmlab" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..8e090f73a9e5b8aa09eee256e7876c8b4401f055 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,22 @@ +ARG PYTORCH="1.6.0" +ARG CUDA="10.1" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" +ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" +ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" + +RUN apt-get update && apt-get install -y git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install mmsegmentation +RUN conda clean --all + +RUN pip install mmcv-full==latest+torch1.6.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +RUN git clone https://github.com/open-mmlab/mmsegmenation.git /mmsegmentation +WORKDIR /mmsegmentation +RUN pip install -r requirements/build.txt +RUN pip install --no-cache-dir -e . diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d4bb2cbb9eddb1bb1b4f366623044af8e4830919 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 0000000000000000000000000000000000000000..9c14a67564029b83900001ab565954539bb7c081 --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,61 @@ +API Reference +============== + +mmseg.apis +-------------- +.. automodule:: mmseg.apis + :members: + +mmseg.core +-------------- + +seg +^^^^^^^^^^ +.. automodule:: mmseg.core.seg + :members: + +evaluation +^^^^^^^^^^ +.. automodule:: mmseg.core.evaluation + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmseg.core.utils + :members: + +mmseg.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmseg.datasets + :members: + +pipelines +^^^^^^^^^^ +.. automodule:: mmseg.datasets.pipelines + :members: + +mmseg.models +-------------- + +segmentors +^^^^^^^^^^ +.. automodule:: mmseg.models.segmentors + :members: + +backbones +^^^^^^^^^^ +.. automodule:: mmseg.models.backbones + :members: + +decode_heads +^^^^^^^^^^^^ +.. automodule:: mmseg.models.decode_heads + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmseg.models.losses + :members: diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000000000000000000000000000000000000..faf1df3d217d728ea84f8c4685722018ae523a72 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,157 @@ +## Changelog + +### V0.11 (02/02/2021) + +**Highlights** + +- Support memory efficient test, add more UNet models. + +**Bug Fixes** + +- Fixed TTA resize scale ([#334](https://github.com/open-mmlab/mmsegmentation/pull/334)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) +- Fixed ADE20k test ([#359](https://github.com/open-mmlab/mmsegmentation/pull/359)) + +**New Features** + +- Support memory efficient test ([#330](https://github.com/open-mmlab/mmsegmentation/pull/330)) +- Add more UNet benchmarks ([#324](https://github.com/open-mmlab/mmsegmentation/pull/324)) +- Support Lovasz Loss ([#351](https://github.com/open-mmlab/mmsegmentation/pull/351)) + +**Improvements** + +- Move train_cfg/test_cfg inside model ([#341](https://github.com/open-mmlab/mmsegmentation/pull/341)) + +### V0.10 (01/01/2021) + +**Highlights** + +- Support MobileNetV3, DMNet, APCNet. Add models of ResNet18V1b, ResNet18V1c, ResNet50V1b. + +**Bug Fixes** + +- Fixed CPU TTA ([#276](https://github.com/open-mmlab/mmsegmentation/pull/276)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) + +**New Features** + +- Add ResNet18V1b, ResNet18V1c, ResNet50V1b, ResNet101V1b models ([#316](https://github.com/open-mmlab/mmsegmentation/pull/316)) +- Support MobileNetV3 ([#268](https://github.com/open-mmlab/mmsegmentation/pull/268)) +- Add 4 retinal vessel segmentation benchmark ([#315](https://github.com/open-mmlab/mmsegmentation/pull/315)) +- Support DMNet ([#313](https://github.com/open-mmlab/mmsegmentation/pull/313)) +- Support APCNet ([#299](https://github.com/open-mmlab/mmsegmentation/pull/299)) + +**Improvements** + +- Refactor Documentation page ([#311](https://github.com/open-mmlab/mmsegmentation/pull/311)) +- Support resize data augmentation according to original image size ([#291](https://github.com/open-mmlab/mmsegmentation/pull/291)) + +### V0.9 (30/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support RandomRotate transform ([#215](https://github.com/open-mmlab/mmsegmentation/pull/215), [#260](https://github.com/open-mmlab/mmsegmentation/pull/260)) +- Support RGB2Gray transform ([#227](https://github.com/open-mmlab/mmsegmentation/pull/227)) +- Support Rerange transform ([#228](https://github.com/open-mmlab/mmsegmentation/pull/228)) +- Support ignore_index for BCE loss ([#210](https://github.com/open-mmlab/mmsegmentation/pull/210)) +- Add modelzoo statistics ([#263](https://github.com/open-mmlab/mmsegmentation/pull/263)) +- Support Dice evaluation metric ([#225](https://github.com/open-mmlab/mmsegmentation/pull/225)) +- Support Adjust Gamma transform ([#232](https://github.com/open-mmlab/mmsegmentation/pull/232)) +- Support CLAHE transform ([#229](https://github.com/open-mmlab/mmsegmentation/pull/229)) + +**Bug Fixes** + +- Fixed detail API link ([#267](https://github.com/open-mmlab/mmsegmentation/pull/267)) + +### V0.8 (03/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support customize runner ([#118](https://github.com/open-mmlab/mmsegmentation/pull/118)) +- Support UNet ([#161](https://github.com/open-mmlab/mmsegmentation/pull/162)) +- Support CHASE_DB1, DRIVE, STARE, HRD ([#203](https://github.com/open-mmlab/mmsegmentation/pull/203)) +- Support CGNet ([#223](https://github.com/open-mmlab/mmsegmentation/pull/223)) + +### V0.7 (07/10/2020) + +**Highlights** + +- Support Pascal Context dataset and customizing class dataset. + +**Bug Fixes** + +- Fixed CPU inference ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +**New Features** + +- Add DeepLab OS16 models ([#154](https://github.com/open-mmlab/mmsegmentation/pull/154)) +- Support Pascal Context dataset ([#133](https://github.com/open-mmlab/mmsegmentation/pull/133)) +- Support customizing dataset classes ([#71](https://github.com/open-mmlab/mmsegmentation/pull/71)) +- Support customizing dataset palette ([#157](https://github.com/open-mmlab/mmsegmentation/pull/157)) + +**Improvements** + +- Support 4D tensor output in ONNX ([#150](https://github.com/open-mmlab/mmsegmentation/pull/150)) +- Remove redundancies in ONNX export ([#160](https://github.com/open-mmlab/mmsegmentation/pull/160)) +- Migrate to MMCV DepthwiseSeparableConv ([#158](https://github.com/open-mmlab/mmsegmentation/pull/158)) +- Migrate to MMCV collect_env ([#137](https://github.com/open-mmlab/mmsegmentation/pull/137)) +- Use img_prefix and seg_prefix for loading ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +### V0.6 (10/09/2020) + +**Highlights** + +- Support new methods i.e. MobileNetV2, EMANet, DNL, PointRend, Semantic FPN, Fast-SCNN, ResNeSt. + +**Bug Fixes** + +- Fixed sliding inference ONNX export ([#90](https://github.com/open-mmlab/mmsegmentation/pull/90)) + +**New Features** + +- Support MobileNet v2 ([#86](https://github.com/open-mmlab/mmsegmentation/pull/86)) +- Support EMANet ([#34](https://github.com/open-mmlab/mmsegmentation/pull/34)) +- Support DNL ([#37](https://github.com/open-mmlab/mmsegmentation/pull/37)) +- Support PointRend ([#109](https://github.com/open-mmlab/mmsegmentation/pull/109)) +- Support Semantic FPN ([#94](https://github.com/open-mmlab/mmsegmentation/pull/94)) +- Support Fast-SCNN ([#58](https://github.com/open-mmlab/mmsegmentation/pull/58)) +- Support ResNeSt backbone ([#47](https://github.com/open-mmlab/mmsegmentation/pull/47)) +- Support ONNX export (experimental) ([#12](https://github.com/open-mmlab/mmsegmentation/pull/12)) + +**Improvements** + +- Support Upsample in ONNX ([#100](https://github.com/open-mmlab/mmsegmentation/pull/100)) +- Support Windows install (experimental) ([#75](https://github.com/open-mmlab/mmsegmentation/pull/75)) +- Add more OCRNet results ([#20](https://github.com/open-mmlab/mmsegmentation/pull/20)) +- Add PyTorch 1.6 CI ([#64](https://github.com/open-mmlab/mmsegmentation/pull/64)) +- Get version and githash automatically ([#55](https://github.com/open-mmlab/mmsegmentation/pull/55)) + +### v0.5.1 (11/08/2020) + +**Highlights** + +- Support FP16 and more generalized OHEM + +**Bug Fixes** + +- Fixed Pascal VOC conversion script (#19) +- Fixed OHEM weight assign bug (#54) +- Fixed palette type when palette is not given (#27) + +**New Features** + +- Support FP16 (#21) +- Generalized OHEM (#54) + +**Improvements** + +- Add load-from flag (#33) +- Fixed training tricks doc about different learning rates of model (#26) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..f472acb30abdbcf5191926a8d89f478c1210744c --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,88 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +sys.path.insert(0, os.path.abspath('..')) + +# -- Project information ----------------------------------------------------- + +project = 'MMSegmentation' +copyright = '2020-2020, OpenMMLab' +author = 'MMSegmentation Authors' +version_file = '../mmseg/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'recommonmark', + 'sphinx_markdown_tables', +] + +autodoc_mock_imports = ['matplotlib', 'pycocotools', 'mmseg.version'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/dataset_prepare.md b/docs/dataset_prepare.md new file mode 100644 index 0000000000000000000000000000000000000000..5407339f13909c3bf32556dc273076d8bb351ba6 --- /dev/null +++ b/docs/dataset_prepare.md @@ -0,0 +1,165 @@ +## Prepare datasets + +It is recommended to symlink the dataset root to `$MMSEGMENTATION/data`. +If your folder structure is different, you may need to change the corresponding paths in config files. + +```none +mmsegmentation +├── mmseg +├── tools +├── configs +├── data +│ ├── cityscapes +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2012 +│ │ │ ├── JPEGImages +│ │ │ ├── SegmentationClass +│ │ │ ├── ImageSets +│ │ │ │ ├── Segmentation +│ │ ├── VOC2010 +│ │ │ ├── JPEGImages +│ │ │ ├── SegmentationClassContext +│ │ │ ├── ImageSets +│ │ │ │ ├── SegmentationContext +│ │ │ │ │ ├── train.txt +│ │ │ │ │ ├── val.txt +│ │ │ ├── trainval_merged.json +│ │ ├── VOCaug +│ │ │ ├── dataset +│ │ │ │ ├── cls +│ ├── ade +│ │ ├── ADEChallengeData2016 +│ │ │ ├── annotations +│ │ │ │ ├── training +│ │ │ │ ├── validation +│ │ │ ├── images +│ │ │ │ ├── training +│ │ │ │ ├── validation +│ ├── CHASE_DB1 +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── DRIVE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── HRF +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── STARE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation + +``` + +### Cityscapes + +The data could be found [here](https://www.cityscapes-dataset.com/downloads/) after registration. + +By convention, `**labelTrainIds.png` are used for cityscapes training. +We provided a [scripts](https://github.com/open-mmlab/mmsegmentation/blob/master/tools/convert_datasets/cityscapes.py) based on [cityscapesscripts](https://github.com/mcordts/cityscapesScripts) +to generate `**labelTrainIds.png`. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/convert_datasets/cityscapes.py data/cityscapes --nproc 8 +``` + +### Pascal VOC + +Pascal VOC 2012 could be downloaded from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar). +Beside, most recent works on Pascal VOC dataset usually exploit extra augmentation data, which could be found [here](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz). + +If you would like to use augmented VOC dataset, please run following command to convert augmentation annotations into proper format. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/convert_datasets/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 +``` + +Please refer to [concat dataset](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/tutorials/new_dataset.md#concatenate-dataset) for details about how to concatenate them and train them together. + +### ADE20K + +The training and validation set of ADE20K could be download from this [link](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip). +We may also download test set from [here](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip). + +### Pascal Context + +The training and validation set of Pascal Context could be download from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar). You may also download test set from [here](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) after registration. + +To split the training and validation set from original dataset, you may download trainval_merged.json from [here](https://codalabuser.blob.core.windows.net/public/trainval_merged.json). + +If you would like to use Pascal Context dataset, please install [Detail](https://github.com/zhanghang1989/detail-api) and then run the following command to convert annotations into proper format. + +```shell +python tools/convert_datasets/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json +``` + +### CHASE DB1 + +The training and validation set of CHASE DB1 could be download from [here](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip). + +To convert CHASE DB1 dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/chase_db1.py /path/to/CHASEDB1.zip +``` + +The script will make directory structure automatically. + +### DRIVE + +The training and validation set of DRIVE could be download from [here](https://drive.grand-challenge.org/). Before that, you should register an account. Currently '1st_manual' is not provided officially. + +To convert DRIVE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/drive.py /path/to/training.zip /path/to/test.zip +``` + +The script will make directory structure automatically. + +### HRF + +First, download [healthy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy.zip), [glaucoma.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma.zip), [diabetic_retinopathy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy.zip), [healthy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy_manualsegm.zip), [glaucoma_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma_manualsegm.zip) and [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip). + +To convert HRF dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/hrf.py /path/to/healthy.zip /path/to/healthy_manualsegm.zip /path/to/glaucoma.zip /path/to/glaucoma_manualsegm.zip /path/to/diabetic_retinopathy.zip /path/to/diabetic_retinopathy_manualsegm.zip +``` + +The script will make directory structure automatically. + +### STARE + +First, download [stare-images.tar](http://cecas.clemson.edu/~ahoover/stare/probing/stare-images.tar), [labels-ah.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-ah.tar) and [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar). + +To convert STARE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar +``` + +The script will make directory structure automatically. diff --git a/docs/get_started.md b/docs/get_started.md new file mode 100644 index 0000000000000000000000000000000000000000..3182c53451dae3024a4e99aace1c766856773d66 --- /dev/null +++ b/docs/get_started.md @@ -0,0 +1,193 @@ +## Prerequisites + +- Linux or macOS (Windows is in experimental support) +- Python 3.6+ +- PyTorch 1.3+ +- CUDA 9.2+ (If you build PyTorch from source, CUDA 9.0 is also compatible) +- GCC 5+ +- [MMCV](https://mmcv.readthedocs.io/en/latest/#installation) + +Note: You need to run `pip uninstall mmcv` first if you have mmcv installed. +If mmcv and mmcv-full are both installed, there will be `ModuleNotFoundError`. + +## Installation + +a. Create a conda virtual environment and activate it. + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab +``` + +b. Install PyTorch and torchvision following the [official instructions](https://pytorch.org/). +Here we use PyTorch 1.6.0 and CUDA 10.1. +You may also switch to other version by specifying the version number. + +```shell +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +``` + +c. Install [MMCV](https://mmcv.readthedocs.io/en/latest/) following the [official instructions](https://mmcv.readthedocs.io/en/latest/#installation). +Either `mmcv` or `mmcv-full` is compatible with MMSegmentation, but for methods like CCNet and PSANet, CUDA ops in `mmcv-full` is required. + +**Install mmcv for Linux:** + +The pre-build mmcv-full (with PyTorch 1.5 and CUDA 10.1) can be installed by running: (other available versions could be found [here](https://mmcv.readthedocs.io/en/latest/#install-with-pip)) + +```shell +pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +``` + +**Install mmcv for Windows (Experimental):** + +For Windows, the installation of MMCV requires native C++ compilers, such as cl.exe. Please add the compiler to %PATH%. + +A typical path for cl.exe looks like the following if you have Windows SDK and Visual Studio installed on your computer: + +```shell +C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64 +``` + +Or you should download the cl compiler from web and then set up the path. + +Then, clone mmcv from github and install mmcv via pip: + +```shell +git clone https://github.com/open-mmlab/mmcv.git +cd mmcv +pip install -e . +``` + +Or simply: + +```shell +pip install mmcv +``` + +Currently, mmcv-full is not supported on Windows. + +d. Install MMSegmentation. + +```shell +pip install mmsegmentation # install the latest release +``` + +or + +```shell +pip install git+https://github.com/open-mmlab/mmsegmentation.git # install the master branch +``` + +Instead, if you would like to install MMSegmentation in `dev` mode, run following + +```shell +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" +``` + +Note: + +1. When training or testing models on Windows, please ensure that all the '\\' in paths are replaced with '/'. Add .replace('\\', '/') to your python code wherever path strings occur. +2. The `version+git_hash` will also be saved in trained models meta, e.g. 0.5.0+c415a2e. +3. When MMsegmentation is installed on `dev` mode, any local modifications made to the code will take effect without the need to reinstall it. +4. If you would like to use `opencv-python-headless` instead of `opencv-python`, + you can install it before installing MMCV. +5. Some dependencies are optional. Simply running `pip install -e .` will only install the minimum runtime requirements. + To use optional dependencies like `cityscapessripts` either install them manually with `pip install -r requirements/optional.txt` or specify desired extras when calling `pip` (e.g. `pip install -e .[optional]`). Valid keys for the extras field are: `all`, `tests`, `build`, and `optional`. + +### A from-scratch setup script + +#### Linux + +Here is a full script for setting up mmsegmentation with conda and link the dataset path (supposing that your dataset path is $DATA_ROOT). + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab + +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" + +mkdir data +ln -s $DATA_ROOT data +``` + +#### Windows(Experimental) + +Here is a full script for setting up mmsegmentation with conda and link the dataset path (supposing that your dataset path is +%DATA_ROOT%. Notice: It must be an absolute path). + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab + +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +set PATH=full\path\to\your\cpp\compiler;%PATH% +pip install mmcv + +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" + +mklink /D data %DATA_ROOT% +``` + +#### Developing with multiple MMSegmentation versions + +The train and test scripts already modify the `PYTHONPATH` to ensure the script use the MMSegmentation in the current directory. + +To use the default MMSegmentation installed in the environment rather than that you are working with, you can remove the following line in those scripts + +```shell +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH +``` + +## Verification + +To verify whether MMSegmentation and the required environment are installed correctly, we can run sample python codes to initialize a detector and inference a demo image: + +```python +from mmseg.apis import inference_segmentor, init_segmentor +import mmcv + +config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py' +checkpoint_file = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# build the model from a config file and a checkpoint file +model = init_segmentor(config_file, checkpoint_file, device='cuda:0') + +# test a single image and show the results +img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once +result = inference_segmentor(model, img) +# visualize the results in a new window +model.show_result(img, result, show=True) +# or save the visualization results to image files +model.show_result(img, result, out_file='result.jpg') + +# test a video and show the results +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_segmentor(model, frame) + model.show_result(frame, result, wait_time=1) +``` + +The above code is supposed to run successfully upon you finish the installation. + +We also provide a demo script to test a single image. + +```shell +python demo/image_demo.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} [--device ${DEVICE_NAME}] [--palette-thr ${PALETTE}] +``` + +Examples: + +```shell +python demo/image_demo.py demo/demo.jpg configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --palette cityscapes +``` + +A notebook demo can be found in [demo/inference_demo.ipynb](../demo/inference_demo.ipynb). diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..94db9026574e36dbaa668023e9783ccb669b5b3a --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,57 @@ +Welcome to MMSegmenation's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Get Started + + get_started.md + +.. toctree:: + :maxdepth: 1 + :caption: Dataset Preparation + + dataset_prepare.md + +.. toctree:: + :maxdepth: 1 + :caption: Model Zoo + + model_zoo.md + modelzoo_statistics.md + +.. toctree:: + :maxdepth: 2 + :caption: Quick Run + + train.md + inference.md + +.. toctree:: + :maxdepth: 2 + :caption: Tutorials + + tutorials/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: Useful Tools and Scripts + + useful_tools.md + +.. toctree:: + :maxdepth: 2 + :caption: Notes + + changelog.md + +.. toctree:: + :caption: API Reference + + api.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/inference.md b/docs/inference.md new file mode 100644 index 0000000000000000000000000000000000000000..d7bc21b65acb9da4a38ade92be6ccf3c56574982 --- /dev/null +++ b/docs/inference.md @@ -0,0 +1,101 @@ +## Inference with pretrained models + +We provide testing scripts to evaluate a whole dataset (Cityscapes, PASCAL VOC, ADE20k, etc.), +and also some high-level apis for easier integration to other projects. + +### Test a dataset + +- single GPU +- single node multiple GPU +- multiple node + +You can use the following commands to test a dataset. + +```shell +# single-gpu testing +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] [--show] + +# multi-gpu testing +./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] +``` + +Optional arguments: + +- `RESULT_FILE`: Filename of the output results in pickle format. If not specified, the results will not be saved to a file. +- `EVAL_METRICS`: Items to be evaluated on the results. Allowed values depend on the dataset, e.g., `mIoU` is available for all dataset. Cityscapes could be evaluated by `cityscapes` as well as standard `mIoU` metrics. +- `--show`: If specified, segmentation results will be plotted on the images and shown in a new window. It is only applicable to single GPU testing and used for debugging and visualization. Please make sure that GUI is available in your environment, otherwise you may encounter the error like `cannot connect to X server`. +- `--show-dir`: If specified, segmentation results will be plotted on the images and saved to the specified directory. It is only applicable to single GPU testing and used for debugging and visualization. You do NOT need a GUI available in your environment for using this option. +- `--eval-options`: Optional parameters during evaluation. When `efficient_test=True`, it will save intermediate results to local files to save CPU memory. Make sure that you have enough local storage space (more than 20GB). + +Examples: + +Assume that you have already downloaded the checkpoints to the directory `checkpoints/`. + +1. Test PSPNet and visualize the results. Press any key for the next image. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + --show + ``` + +2. Test PSPNet and save the painted images for latter visualization. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + --show-dir psp_r50_512x1024_40ki_cityscapes_results + ``` + +3. Test PSPNet on PASCAL VOC (without saving the test results) and evaluate the mIoU. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_20k_voc12aug.py \ + checkpoints/pspnet_r50-d8_512x1024_20k_voc12aug_20200605_003338-c57ef100.pth \ + --eval mAP + ``` + +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 \ + 4 --out results.pkl --eval mIoU cityscapes + ``` + + Note: There is some gap (~0.1%) between cityscapes mIoU and our mIoU. The reason is that cityscapes average each class with class size by default. + We use the simple version without average for all datasets. + +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 \ + 4 --format-only --eval-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/). + +6. CPU memory efficient test DeeplabV3+ on Cityscapes (without saving the test results) and evaluate the mIoU. + + ```shell + python tools/test.py \ + configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py \ + deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth \ + --eval-options efficient_test=True \ + --eval mIoU + ``` + + Using ```pmap``` to view CPU memory footprint, it used 2.25GB CPU memory with ```efficient_test=True``` and 11.06GB CPU memory with ```efficient_test=False``` . This optional parameter can save a lot of memory. diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000000000000000000000000000000000..922152e96a04a242e6fc40f124261d74890617d8 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/model_zoo.md b/docs/model_zoo.md new file mode 100644 index 0000000000000000000000000000000000000000..2d4c1c2ac999c771e7048c36bd94d316457f0e50 --- /dev/null +++ b/docs/model_zoo.md @@ -0,0 +1,163 @@ +# Benchmark and Model Zoo + +## Common settings + +* We use distributed training with 4 GPUs by default. +* All pytorch-style pretrained backbones on ImageNet are train by ourselves, with the same procedure in the [paper](https://arxiv.org/pdf/1812.01187.pdf). + Our ResNet style backbone are based on ResNetV1c variant, where the 7x7 conv in the input stem is replaced with three 3x3 convs. +* For the consistency across different hardwares, we report the GPU memory as the maximum value of `torch.cuda.max_memory_allocated()` for all 4 GPUs with `torch.backends.cudnn.benchmark=False`. + Note that this value is usually less than what `nvidia-smi` shows. +* We report the inference time as the total time of network forwarding and post-processing, excluding the data loading time. + Results are obtained with the script `tools/benchmark.py` which computes the average time on 200 images with `torch.backends.cudnn.benchmark=False`. +* There are two inference modes in this framework. + + * `slide` mode: The `test_cfg` will be like `dict(mode='slide', crop_size=(769, 769), stride=(513, 513))`. + + In this mode, multiple patches will be cropped from input image, passed into network individually. + The crop size and stride between patches are specified by `crop_size` and `stride`. + The overlapping area will be merged by average + + * `whole` mode: The `test_cfg` will be like `dict(mode='whole')`. + + In this mode, the whole imaged will be passed into network directly. + + By default, we use `slide` inference for 769x769 trained model, `whole` inference for the rest. +* For input size of 8x+1 (e.g. 769), `align_corner=True` is adopted as a traditional practice. + Otherwise, for input size of 8x (e.g. 512, 1024), `align_corner=False` is adopted. + +## Baselines + +### FCN + +Please refer to [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) for details. + +### PSPNet + +Please refer to [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) for details. + +### DeepLabV3 + +Please refer to [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) for details. + +### PSANet + +Please refer to [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) for details. + +### DeepLabV3+ + +Please refer to [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) for details. + +### UPerNet + +Please refer to [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) for details. + +### NonLocal Net + +Please refer to [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nlnet) for details. + +### EncNet + +Please refer to [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) for details. + +### CCNet + +Please refer to [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) for details. + +### DANet + +Please refer to [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) for details. + +### APCNet + +Please refer to [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) for details. + +### HRNet + +Please refer to [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) for details. + +### GCNet + +Please refer to [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) for details. + +### DMNet + +Please refer to [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) for details. + +### ANN + +Please refer to [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) for details. + +### OCRNet + +Please refer to [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) for details. + +### Fast-SCNN + +Please refer to [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) for details. + +### ResNeSt + +Please refer to [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) for details. + +### Semantic FPN + +Please refer to [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/semfpn) for details. + +### PointRend + +Please refer to [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) for details. + +### MobileNetV2 + +Please refer to [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) for details. + +### MobileNetV3 + +Please refer to [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) for details. + +### EMANet + +Please refer to [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) for details. + +### DNLNet + +Please refer to [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) for details. + +### CGNet + +Please refer to [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) for details. + +### Mixed Precision (FP16) Training + +Please refer [Mixed Precision (FP16) Training](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fp16/README.md) for details. + +## Speed benchmark + +### Hardware + +* 8 NVIDIA Tesla V100 (32G) GPUs +* Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### Software environment + +* Python 3.7 +* PyTorch 1.5 +* CUDA 10.1 +* CUDNN 7.6.03 +* NCCL 2.4.08 + +### Training speed + +For fair comparison, we benchmark all implementations with ResNet-101V1c. +The input size is fixed to 1024x512 with batch size 2. + +The training speed is reported as followed, in terms of second per iter (s/iter). The lower, the better. + +| Implementation | PSPNet (s/iter) | DeepLabV3+ (s/iter) | +|----------------|-----------------|---------------------| +| [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) | **0.83** | **0.85** | +| [SegmenTron](https://github.com/LikeLy-Journey/SegmenTron) | 0.84 | 0.85 | +| [CASILVision](https://github.com/CSAILVision/semantic-segmentation-pytorch) | 1.15 | N/A | +| [vedaseg](https://github.com/Media-Smart/vedaseg) | 0.95 | 1.25 | + +Note: The output stride of DeepLabV3+ is 8. diff --git a/docs/stat.py b/docs/stat.py new file mode 100644 index 0000000000000000000000000000000000000000..3aaf0607004e1aa9d92001da78521afe51057034 --- /dev/null +++ b/docs/stat.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + +files = sorted(glob.glob('../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../', url_prefix)) + + with open(f, 'r') as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('#', '').strip() + ckpts = set(x.lower().strip() + for x in re.findall(r'https?://download.*\.pth', content) + if 'mmsegmentation' in x) + if len(ckpts) == 0: + continue + + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = set([(papertype, title)]) + + titles.append(title) + num_ckpts += len(ckpts) + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Statistics + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/train.md b/docs/train.md new file mode 100644 index 0000000000000000000000000000000000000000..1deac95f7d18185ff0586f81095587471eac46c4 --- /dev/null +++ b/docs/train.md @@ -0,0 +1,83 @@ +## Train a model + +MMSegmentation implements distributed training and non-distributed training, +which uses `MMDistributedDataParallel` and `MMDataParallel` respectively. + +All outputs (log files and checkpoints) will be saved to the working directory, +which is specified by `work_dir` in the config file. + +By default we evaluate the model on the validation set after some iterations, you can change the evaluation interval by adding the interval argument in the training config. + +```python +evaluation = dict(interval=4000) # This evaluate the model per 4000 iterations. +``` + +**\*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 + +```shell +python tools/train.py ${CONFIG_FILE} [optional arguments] +``` + +If you want to specify the working directory in the command, you can add an argument `--work-dir ${YOUR_WORK_DIR}`. + +### Train with multiple GPUs + +```shell +./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] +``` + +Optional arguments are: + +- `--no-validate` (**not suggested**): By default, the codebase will perform evaluation at every k iterations during the training. To disable this behavior, use `--no-validate`. +- `--work-dir ${WORK_DIR}`: Override the working directory specified in the config file. +- `--resume-from ${CHECKPOINT_FILE}`: Resume from a previous checkpoint file (to continue the training process). +- `--load-from ${CHECKPOINT_FILE}`: Load weights from a checkpoint file (to start finetuning for another task). + +Difference between `resume-from` and `load-from`: + +- `resume-from` loads both the model weights and optimizer state including the iteration number. +- `load-from` loads only the model weights, starts the training from iteration 0. + +### Train with multiple machines + +If you run MMSegmentation on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_train.sh`. (This script also supports single machine training.) + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} --work-dir ${WORK_DIR} +``` + +Here is an example of using 16 GPUs to train PSPNet on the dev partition. + +```shell +GPUS=16 ./tools/slurm_train.sh dev pspr50 configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py /nfs/xxxx/psp_r50_512x1024_40ki_cityscapes +``` + +You can check [slurm_train.sh](../tools/slurm_train.sh) for full arguments and environment variables. + +If you have just multiple machines connected with ethernet, you can refer to +PyTorch [launch utility](https://pytorch.org/docs/stable/distributed_deprecated.html#launch-utility). +Usually it is slow if you do not have high speed networking like InfiniBand. + +### Launch multiple jobs on a single machine + +If you launch multiple jobs on a single machine, e.g., 2 jobs of 4-GPU training on a machine with 8 GPUs, +you need to specify different ports (29500 by default) for each job to avoid communication conflict. Otherwise, there will be error message saying `RuntimeError: Address already in use`. + +If you use `dist_train.sh` to launch training jobs, you can set the port in commands with environment variable `PORT`. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +If you use `slurm_train.sh` to launch training jobs, you can set the port in commands with environment variable `MASTER_PORT`. + +```shell +MASTER_PORT=29500 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} +MASTER_PORT=29501 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} +``` diff --git a/docs/tutorials/config.md b/docs/tutorials/config.md new file mode 100644 index 0000000000000000000000000000000000000000..b243c06d5b60fc09135b227235241c6583325a6b --- /dev/null +++ b/docs/tutorials/config.md @@ -0,0 +1,381 @@ +# Tutorial 1: Learn about Configs + +We incorporate modular and inheritance design into our config system, which is convenient to conduct various experiments. +If you wish to inspect the config file, you may run `python tools/print_config.py /PATH/TO/CONFIG` to see the complete config. +You may also pass `--options xxx.yyy=zzz` to see updated config. + +## Config File Structure + +There are 4 basic component types under `config/_base_`, dataset, model, schedule, default_runtime. +Many methods could be easily constructed with one of each like DeepLabV3, PSPNet. +The configs that are composed by components from `_base_` are called _primitive_. + +For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should inherit from the _primitive_ config. In this way, the maximum of inheritance level is 3. + +For easy understanding, we recommend contributors to inherit from exiting methods. +For example, if some modification is made base on DeepLabV3, user may first inherit the basic DeepLabV3 structure by specifying `_base_ = ../deeplabv3/deeplabv3_r50_512x1024_40ki_cityscapes.py`, then modify the necessary fields in the config files. + +If you are building an entirely new method that does not share the structure with any of the existing methods, you may create a folder `xxxnet` under `configs`, + +Please refer to [mmcv](https://mmcv.readthedocs.io/en/latest/utils.html#config) for detailed documentation. + +## Config Name Style + +We follow the below style to name config files. Contributors are advised to follow the same style. + +``` +{model}_{backbone}_[misc]_[gpu x batch_per_gpu]_{resolution}_{schedule}_{dataset} +``` + +`{xxx}` is required field and `[yyy]` is optional. + +- `{model}`: model type like `psp`, `deeplabv3`, etc. +- `{backbone}`: backbone type like `r50` (ResNet-50), `x101` (ResNeXt-101). +- `[misc]`: miscellaneous setting/plugins of model, e.g. `dconv`, `gcb`, `attention`, `mstrain`. +- `[gpu x batch_per_gpu]`: GPUs and samples per GPU, `8x2` is used by default. +- `{schedule}`: training schedule, `20ki` means 20k iterations. +- `{dataset}`: dataset like `cityscapes`, `voc12aug`, `ade`. + +## An Example of PSPNet + +To help the users have a basic idea of a complete config and the modules in a modern semantic segmentation system, +we make brief comments on the config of PSPNet using ResNet50V1c as the following. +For more detailed usage and the corresponding alternative for each modules, please refer to the API documentation. + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) # Segmentation usually uses SyncBN +model = dict( + type='EncoderDecoder', # Name of segmentor + pretrained='open-mmlab://resnet50_v1c', # The ImageNet pretrained backbone to be loaded + backbone=dict( + type='ResNetV1c', # The type of backbone. Please refer to mmseg/backbone/resnet.py for details. + depth=50, # Depth of backbone. Normally 50, 101 are used. + num_stages=4, # Number of stages of backbone. + out_indices=(0, 1, 2, 3), # The index of output feature maps produced in each stages. + dilations=(1, 1, 2, 4), # The dilation rate of each layer. + strides=(1, 2, 1, 1), # The stride of each layer. + norm_cfg=dict( # The configuration of norm layer. + type='SyncBN', # Type of norm layer. Usually it is SyncBN. + requires_grad=True), # Whether to train the gamma and beta in norm + norm_eval=False, # Whether to freeze the statistics in BN + style='pytorch', # The style of backbone, 'pytorch' means that stride 2 layers are in 3x3 conv, 'caffe' means stride 2 layers are in 1x1 convs. + contract_dilation=True), # When dilation > 1, whether contract first layer of dilation. + decode_head=dict( + type='PSPHead', # Type of decode head. Please refer to mmseg/models/decode_heads for available options. + in_channels=2048, # Input channel of decode head. + in_index=3, # The index of feature map to select. + channels=512, # The intermediate channels of decode head. + pool_scales=(1, 2, 3, 6), # The avg pooling scales of PSPHead. Please refer to paper for details. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation classs. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=dict(type='SyncBN', requires_grad=True), # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the decode_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=1.0)), # Loss weight of decode head. + auxiliary_head=dict( + type='FCNHead', # Type of auxiliary head. Please refer to mmseg/models/decode_heads for available options. + in_channels=1024, # Input channel of auxiliary head. + in_index=2, # The index of feature map to select. + channels=256, # The intermediate channels of decode head. + num_convs=1, # Number of convs in FCNHead. It is usually 1 in auxiliary head. + concat_input=False, # Whether concat output of convs with input before classification layer. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation classs. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=dict(type='SyncBN', requires_grad=True), # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the decode_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=0.4))) # Loss weight of auxiliary head, which is usually 0.4 of decode head. +train_cfg = dict() # train_cfg is just a place holder for now. +test_cfg = dict(mode='whole') # The test mode, options are 'whole' and 'sliding'. 'whole': whole image fully-convolutional test. 'sliding': sliding crop window on the image. +dataset_type = 'CityscapesDataset' # Dataset type, this will be used to define the dataset. +data_root = 'data/cityscapes/' # Root path of data. +img_norm_cfg = dict( # Image normalization config to normalize the input images. + mean=[123.675, 116.28, 103.53], # Mean values used to pre-training the pre-trained backbone models. + std=[58.395, 57.12, 57.375], # Standard variance used to pre-training the pre-trained backbone models. + to_rgb=True) # The channel orders of image used to pre-training the pre-trained backbone models. +crop_size = (512, 1024) # The crop size during training. +train_pipeline = [ # Training pipeline. + dict(type='LoadImageFromFile'), # First pipeline to load images from file path. + dict(type='LoadAnnotations'), # Second pipeline to load annotations for current image. + dict(type='Resize', # Augmentation pipeline that resize the images and their annotations. + img_scale=(2048, 1024), # The largest scale of image. + ratio_range=(0.5, 2.0)), # The augmented scale range as ratio. + dict(type='RandomCrop', # Augmentation pipeline that randomly crop a patch from current image. + crop_size=(512, 1024), # The crop size of patch. + cat_max_ratio=0.75), # The max area ratio that could be occupied by single category. + dict( + type='RandomFlip', # Augmentation pipeline that flip the images and their annotations + flip_ratio=0.5), # The ratio or probability to flip + dict(type='PhotoMetricDistortion'), # Augmentation pipeline that distort current image with several photo metric methods. + dict( + type='Normalize', # Augmentation pipeline that normalize the input images + mean=[123.675, 116.28, 103.53], # These keys are the same of img_norm_cfg since the + std=[58.395, 57.12, 57.375], # keys of img_norm_cfg are used here as arguments + to_rgb=True), + dict(type='Pad', # Augmentation pipeline that pad the image to specified size. + size=(512, 1024), # The output size of padding. + pad_val=0, # The padding value for image. + seg_pad_val=255), # The padding value of 'gt_semantic_seg'. + dict(type='DefaultFormatBundle'), # Default format bundle to gather data in the pipeline + dict(type='Collect', # Pipeline that decides which keys in the data should be passed to the segmentor + keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict( + type='MultiScaleFlipAug', # An encapsulation that encapsulates the test time augmentations + img_scale=(2048, 1024), # Decides the largest scale for testing, used for the Resize pipeline + flip=False, # Whether to flip images during testing + transforms=[ + dict(type='Resize', # Use resize augmentation + keep_ratio=True), # Whether to keep the ratio between height and width, the img_scale set here will be supressed by the img_scale set above. + dict(type='RandomFlip'), # Thought RandomFlip is added in pipeline, it is not used when flip=False + dict( + type='Normalize', # Normalization config, the values are from img_norm_cfg + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', # Convert image to tensor + keys=['img']), + dict(type='Collect', # Collect pipeline that collect necessary keys for testing. + keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, # Batch size of a single GPU + workers_per_gpu=2, # Worker to pre-fetch data for each single GPU + train=dict( # Train dataset config + type='CityscapesDataset', # Type of dataset, refer to mmseg/datasets/ for details. + data_root='data/cityscapes/', # The root of dataset. + img_dir='leftImg8bit/train', # The image directory of dataset. + ann_dir='gtFine/train', # The annotation directory of dataset. + pipeline=[ # pipeline, this is passed by the train_pipeline created before. + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size=(512, 1024), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( # Validation dataset config + type='CityscapesDataset', + data_root='data/cityscapes/', + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=[ # Pipeline is passed by test_pipeline created before + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ]), + test=dict( + type='CityscapesDataset', + data_root='data/cityscapes/', + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ])) +log_config = dict( # config to register logger hook + interval=50, # Interval to print the log + hooks=[ + # dict(type='TensorboardLoggerHook') # The Tensorboard logger is also supported + dict(type='TextLoggerHook', by_epoch=False) + ]) +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 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 `runner.max_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 + lr=0.01, # Learning rate of optimizers, see detail usages of the parameters in the documentation of PyTorch + momentum=0.9, # Momentum + weight_decay=0.0005) # Weight decay of SGD +optimizer_config = dict() # Config used to build the optimizer hook, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8 for implementation details. +lr_config = dict( + policy='poly', # The policy of scheduler, also support Step, CosineAnnealing, Cyclic, etc. Refer to details of supported LrUpdater from https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9. + power=0.9, # The power of polynomial decay. + min_lr=0.0001, # The minimum learning rate to stable the training. + by_epoch=False) # Whethe count by epoch or not. +runner = dict( + type='IterBasedRunner', # Type of runner to use (i.e. IterBasedRunner or EpochBasedRunner) + max_iters=40000) # Total number of iterations. For EpochBasedRunner use `max_epochs` +checkpoint_config = dict( # Config to set the checkpoint hook, Refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py for implementation. + by_epoch=False, # Whethe count by epoch or not. + interval=4000) # The save interval. +evaluation = dict( # The config to build the evaluation hook. Please refer to mmseg/core/evaulation/eval_hook.py for details. + interval=4000, # The interval of evaluation. + metric='mIoU') # The evaluation metric. + + +``` + +## FAQ + +### Ignore some fields in the base configs + +Sometimes, you may set `_delete_=True` to ignore some of fields in base configs. +You may refer to [mmcv](https://mmcv.readthedocs.io/en/latest/utils.html#inherit-from-base-config-with-ignored-fields) for simple inllustration. + +In MMSegmentation, for example, to change the backbone of PSPNet with the following config. + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='MaskRCNN', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict(...), + auxiliary_head=dict(...)) +``` + +`ResNet` and `HRNet` use different keywords to construct. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscpaes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + norm_cfg=norm_cfg, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256)))), + decode_head=dict(...), + auxiliary_head=dict(...)) +``` + +The `_delete_=True` would replace all old keys in `backbone` field with new keys new keys. + +### Use intermediate variables in configs + +Some intermediate variables are used in the configs files, like `train_pipeline`/`test_pipeline` in datasets. +It's worth noting that when modifying intermediate variables in the children configs, user need to pass the intermediate variables into corresponding fields again. +For example, we would like to change multi scale strategy to train/test a PSPNet. `train_pipeline`/`test_pipeline` are intermediate variable we would like modify. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscapes.py' +crop_size = (512, 1024) +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'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(1.0, 2.0)), # change to [1., 2.] + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], # change to multi scale testing + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +We first define the new `train_pipeline`/`test_pipeline` and pass them into `data`. + +Similarly, if we would like to switch from `SyncBN` to `BN` or `MMSyncBN`, we need to substitute every `norm_cfg` in the config. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscpaes.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + decode_head=dict(norm_cfg=norm_cfg), + auxiliary_head=dict(norm_cfg=norm_cfg)) +``` diff --git a/docs/tutorials/customize_datasets.md b/docs/tutorials/customize_datasets.md new file mode 100644 index 0000000000000000000000000000000000000000..020d51316e15a7f6926f49d81dcd2509f5170e07 --- /dev/null +++ b/docs/tutorials/customize_datasets.md @@ -0,0 +1,172 @@ +# Tutorial 2: Customize Datasets + +## Customize datasets by reorganizing data + +The simplest way is to convert your dataset to organize your data into folders. + +An example of file structure is as followed. + +```none +├── data +│ ├── my_dataset +│ │ ├── img_dir +│ │ │ ├── train +│ │ │ │ ├── xxx{img_suffix} +│ │ │ │ ├── yyy{img_suffix} +│ │ │ │ ├── zzz{img_suffix} +│ │ │ ├── val +│ │ ├── ann_dir +│ │ │ ├── train +│ │ │ │ ├── xxx{seg_map_suffix} +│ │ │ │ ├── yyy{seg_map_suffix} +│ │ │ │ ├── zzz{seg_map_suffix} +│ │ │ ├── val + +``` + +A training pair will consist of the files with same suffix in img_dir/ann_dir. + +If `split` argument is given, only part of the files in img_dir/ann_dir will be loaded. +We may specify the prefix of files we would like to be included in the split txt. + +More specifically, for a split txt like following, + +```none +xxx +zzz +``` + +Only +`data/my_dataset/img_dir/train/xxx{img_suffix}`, +`data/my_dataset/img_dir/train/zzz{img_suffix}`, +`data/my_dataset/ann_dir/train/xxx{seg_map_suffix}`, +`data/my_dataset/ann_dir/train/zzz{seg_map_suffix}` will be loaded. + +Note: The annotations are images of shape (H, W), the value pixel should fall in range `[0, num_classes - 1]`. +You may use `'P'` mode of [pillow](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#palette) to create your annotation image with color. + +## Customize datasets by mixing dataset + +MMSegmentation also supports to mix dataset for training. +Currently it supports to concat and repeat datasets. + +### Repeat dataset + +We use `RepeatDataset` as wrapper to repeat the dataset. +For example, suppose the original dataset is `Dataset_A`, to repeat it, the config looks like the following + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +### Concatenate dataset + +There 2 ways to concatenate the dataset. + +1. If the datasets you want to concatenate are in the same type with different annotation files, + you can concatenate the dataset configs like the following. + + 1. You may concatenate two `ann_dir`. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = ['anno_dir_1', 'anno_dir_2'], + pipeline=train_pipeline + ) + ``` + + 2. You may concatenate two `split`. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = 'anno_dir', + split = ['split_1.txt', 'split_2.txt'], + pipeline=train_pipeline + ) + ``` + + 3. You may concatenate two `ann_dir` and `split` simultaneously. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = ['anno_dir_1', 'anno_dir_2'], + split = ['split_1.txt', 'split_2.txt'], + pipeline=train_pipeline + ) + ``` + + In this case, `ann_dir_1` and `ann_dir_2` are corresponding to `split_1.txt` and `split_2.txt`. + +2. In case the dataset you want to concatenate is different, you can concatenate the dataset configs like the following. + + ```python + dataset_A_train = dict() + dataset_B_train = dict() + + data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test + ) + ``` + +A more complex example that repeats `Dataset_A` and `Dataset_B` by N and M times, respectively, and then concatenates the repeated datasets is as the following. + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test +) + +``` diff --git a/docs/tutorials/customize_models.md b/docs/tutorials/customize_models.md new file mode 100644 index 0000000000000000000000000000000000000000..f637fd6f0431ea0de748e39806be51d1b4849c8e --- /dev/null +++ b/docs/tutorials/customize_models.md @@ -0,0 +1,234 @@ +# Tutorial 4: Customize Models + +## Customize optimizer + +Assume you want to add a optimizer named as `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to first implement the new optimizer in a file, e.g., in `mmseg/core/optimizer/my_optimizer.py`: + +```python +from mmcv.runner import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) + +``` + +Then add this module in `mmseg/core/optimizer/__init__.py` thus the registry will +find the new module and add it: + +```python +from .my_optimizer import MyOptimizer +``` + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed as + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +We already support to use all the optimizers implemented by PyTorch, and the only modification is to change the `optimizer` field of config files. +For example, if you want to use `ADAM`, though the performance will drop a lot, the modification could be as the following. + +```python +optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +``` + +The users can directly set arguments following the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +## Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNoarm layers. +The users can do those fine-grained parameter tuning through customizing optimizer constructor. + +``` +from mmcv.utils import build_from_cfg + +from mmcv.runner import OPTIMIZER_BUILDERS +from .cocktail_optimizer import CocktailOptimizer + + +@OPTIMIZER_BUILDERS.register_module +class CocktailOptimizerConstructor(object): + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer + +``` + +## Develop new components + +There are mainly 2 types of components in MMSegmentation. + +- backbone: usually stacks of convolutional network to extract feature maps, e.g., ResNet, HRNet. +- head: the component for semantic segmentation map decoding. + +### Add new backbones + +Here we show how to develop new components with an example of MobileNet. + +1. Create a new file `mmseg/models/backbones/mobilenet.py`. + +```python +import torch.nn as nn + +from ..registry import BACKBONES + + +@BACKBONES.register_module +class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass + + def init_weights(self, pretrained=None): + pass +``` + +2. Import the module in `mmseg/models/backbones/__init__.py`. + +```python +from .mobilenet import MobileNet +``` + +3. Use it in your config file. + +```python +model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... +``` + +### Add new heads + +In MMSegmentation, we provide a base [BaseDecodeHead](https://github.com/open-mmlab/mmsegmentation/blob/master/mmseg/models/decode_heads/decode_head.py) for all segmentation head. +All newly implemented decode heads should be derived from it. +Here we show how to develop a new head with the example of [PSPNet](https://arxiv.org/abs/1612.01105) as the following. + +First, add a new decode head in `mmseg/models/decode_heads/psp_head.py`. +PSPNet implements a decode head for segmentation decode. +To implement a decode head, basically we need to implement three functions of the new module as the following. + +```python +@HEADS.register_module() +class PSPHead(BaseDecodeHead): + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + + def init_weights(self): + + def forward(self, inputs): + +``` + +Next, the users need to add the module in the `mmseg/models/decode_heads/__init__.py` thus the corresponding registry could find and load them. + +To config file of PSPNet is as the following + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrain_model/resnet50_v1c_trick-2cccc1ad.pth', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) + +``` + +### Add new loss + +Assume you want to add a new loss as `MyLoss` for segmentation decode. +To add a new loss function, the users need implement it in `mmseg/models/losses/my_loss.py`. +The decorator `weighted_loss` enable the loss to be weighted for each element. + +```python +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@LOSSES.register_module +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss +``` + +Then the users need to add it in the `mmseg/models/losses/__init__.py`. + +```python +from .my_loss import MyLoss, my_loss + +``` + +To use it, modify the `loss_xxx` field. +Then you need to modify the `loss_decode` field in the head. +`loss_weight` could be used to balance multiple losses. + +```python +loss_decode=dict(type='MyLoss', loss_weight=1.0)) +``` diff --git a/docs/tutorials/customize_runtime.md b/docs/tutorials/customize_runtime.md new file mode 100644 index 0000000000000000000000000000000000000000..dd67ef54f639fa0b3b9a01727d16352752d30899 --- /dev/null +++ b/docs/tutorials/customize_runtime.md @@ -0,0 +1,243 @@ +# Tutorial 6: Customize Runtime Settings + +## Customize optimization settings + +### Customize optimizer supported by Pytorch + +We already support to use all the optimizers implemented by PyTorch, and the only modification is to change the `optimizer` field of config files. +For example, if you want to use `ADAM` (note that the performance could drop a lot), the modification could be as the following. + +```python +optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +``` + +To modify the learning rate of the model, the users only need to modify the `lr` in the config of optimizer. The users can directly set arguments following the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +### Customize self-implemented optimizer + +#### 1. Define a new optimizer + +A customized optimizer could be defined as following. + +Assume you want to add a optimizer named `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to create a new directory named `mmseg/core/optimizer`. +And then implement the new optimizer in a file, e.g., in `mmseg/core/optimizer/my_optimizer.py`: + +```python +from .registry import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) + +``` + +#### 2. Add the optimizer to registry + +To find the above module defined above, this module should be imported into the main namespace at first. There are two options to achieve it. + +- Modify `mmseg/core/optimizer/__init__.py` to import it. + + The newly defined module should be imported in `mmseg/core/optimizer/__init__.py` so that the registry will + find the new module and add it: + +```python +from .my_optimizer import MyOptimizer +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmseg.core.optimizer.my_optimizer'], allow_failed_imports=False) +``` + +The module `mmseg.core.optimizer.my_optimizer` will be imported at the beginning of the program and the class `MyOptimizer` is then automatically registered. +Note that only the package containing the class `MyOptimizer` should be imported. +`mmseg.core.optimizer.my_optimizer.MyOptimizer` **cannot** be imported directly. + +Actually users can use a totally different file directory structure using this importing method, as long as the module root can be located in `PYTHONPATH`. + +#### 3. Specify the optimizer in the config file + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed to + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +### Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNorm layers. +The users can do those fine-grained parameter tuning through customizing optimizer constructor. + +```python +from mmcv.utils import build_from_cfg + +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS +from mmseg.utils import get_root_logger +from .my_optimizer import MyOptimizer + + +@OPTIMIZER_BUILDERS.register_module() +class MyOptimizerConstructor(object): + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer + +``` + +The default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/optimizer/default_constructor.py#L11), which could also serve as a template for new optimizer constructor. + +### Additional settings + +Tricks not implemented by the optimizer should be implemented through optimizer constructor (e.g., set parameter-wise learning rates) or hooks. We list some common settings that could stabilize the training or accelerate the training. Feel free to create PR, issue for more settings. + +- __Use gradient clip to stabilize training__: + Some models need gradient clip to clip the gradients to stabilize the training process. An example is as below: + + ```python + optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + ``` + + If your config inherits the base config which already sets the `optimizer_config`, you might need `_delete_=True` to overide the unnecessary settings. See the [config documenetation](https://mmsegmentation.readthedocs.io/en/latest/config.html) for more details. + +- __Use momentum schedule to accelerate model convergence__: + We support momentum scheduler to modify model's momentum according to learning rate, which could make the model converge in a faster way. + Momentum scheduler is usually used with LR scheduler, for example, the following config is used in 3D detection to accelerate convergence. + For more details, please refer to the implementation of [CyclicLrUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327) and [CyclicMomentumUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130). + + ```python + lr_config = dict( + policy='cyclic', + target_ratio=(10, 1e-4), + cyclic_times=1, + step_ratio_up=0.4, + ) + momentum_config = dict( + policy='cyclic', + target_ratio=(0.85 / 0.95, 1), + cyclic_times=1, + step_ratio_up=0.4, + ) + ``` + +## Customize training schedules + +By default we use step learning rate with 40k/80k schedule, this calls [`PolyLrUpdaterHook`](https://github.com/open-mmlab/mmcv/blob/826d3a7b68596c824fa1e2cb89b6ac274f52179c/mmcv/runner/hooks/lr_updater.py#L196) in MMCV. +We support many other learning rate schedule [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py), such as `CosineAnnealing` and `Poly` schedule. Here are some examples + +- Step schedule: + + ```python + lr_config = dict(policy='step', step=[9, 10]) + ``` + +- ConsineAnnealing schedule: + + ```python + lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 10, + min_lr_ratio=1e-5) + ``` + +## Customize workflow + +Workflow is a list of (phase, epochs) to specify the running order and epochs. +By default it is set to be + +```python +workflow = [('train', 1)] +``` + +which means running 1 epoch for training. +Sometimes user may want to check some metrics (e.g. loss, accuracy) about the model on the validate set. +In such case, we can set the workflow as + +```python +[('train', 1), ('val', 1)] +``` + +so that 1 epoch for training and 1 epoch for validation will be run iteratively. + +**Note**: + +1. The parameters of model will not be updated during val epoch. +2. Keyword `total_epochs` in the config only controls the number of training epochs and will not affect the validation workflow. +3. Workflows `[('train', 1), ('val', 1)]` and `[('train', 1)]` will not change the behavior of `EvalHook` because `EvalHook` is called by `after_train_epoch` and validation workflow only affect hooks that are called through `after_val_epoch`. Therefore, the only difference between `[('train', 1), ('val', 1)]` and `[('train', 1)]` is that the runner will calculate losses on validation set after each training epoch. + +## Customize hooks + +### Use hooks implemented in MMCV + +If the hook is already implemented in MMCV, you can directly modify the config to use the hook as below + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +### Modify default runtime hooks + +There are some common hooks that are not registerd through `custom_hooks`, they are + +- log_config +- checkpoint_config +- evaluation +- lr_config +- optimizer_config +- momentum_config + +In those hooks, only the logger hook has the `VERY_LOW` priority, others' priority are `NORMAL`. +The above-mentioned tutorials already covers how to modify `optimizer_config`, `momentum_config`, and `lr_config`. +Here we reveals how what we can do with `log_config`, `checkpoint_config`, and `evaluation`. + +#### Checkpoint config + +The MMCV runner will use `checkpoint_config` to initialize [`CheckpointHook`](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/hooks/checkpoint.py#L9). + +```python +checkpoint_config = dict(interval=1) +``` + +The users could set `max_keep_ckpts` to only save only small number of checkpoints or decide whether to store state dict of optimizer by `save_optimizer`. More details of the arguments are [here](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.CheckpointHook) + +#### Log config + +The `log_config` wraps multiple logger hooks and enables to set intervals. Now MMCV supports `WandbLoggerHook`, `MlflowLoggerHook`, and `TensorboardLoggerHook`. +The detail usages can be found in the [doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.LoggerHook). + +```python +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook') + ]) +``` + +#### Evaluation config + +The config of `evaluation` will be used to initialize the [`EvalHook`](https://github.com/open-mmlab/mmsegmentation/blob/e3f6f655d69b777341aec2fe8829871cc0beadcb/mmseg/core/evaluation/eval_hooks.py#L7). +Except the key `interval`, other arguments such as `metric` will be passed to the `dataset.evaluate()` + +```python +evaluation = dict(interval=1, metric='mIoU') +``` diff --git a/docs/tutorials/data_pipeline.md b/docs/tutorials/data_pipeline.md new file mode 100644 index 0000000000000000000000000000000000000000..1eecfe91d433ca897ae47a5ae9b8c5f406a3fe2b --- /dev/null +++ b/docs/tutorials/data_pipeline.md @@ -0,0 +1,171 @@ +# Tutorial 3: Customize Data Pipelines + +## Design of Data pipelines + +Following typical conventions, we use `Dataset` and `DataLoader` for data loading +with multiple workers. `Dataset` returns a dict of data items corresponding +the arguments of models' forward method. +Since the data in semantic segmentation may not be the same size, +we introduce a new `DataContainer` type in MMCV to help collect and distribute +data of different size. +See [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py) for more details. + +The data preparation pipeline and the dataset is decomposed. Usually a dataset +defines how to process the annotations and a data pipeline defines all the steps to prepare a data dict. +A pipeline consists of a sequence of operations. Each operation takes a dict as input and also output a dict for the next transform. + +The operations are categorized into data loading, pre-processing, formatting and test-time augmentation. + +Here is an pipeline example for PSPNet. + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +For each operation, we list the related dict fields that are added/updated/removed. + +### Data loading + +`LoadImageFromFile` + +- add: img, img_shape, ori_shape + +`LoadAnnotations` + +- add: gt_semantic_seg, seg_fields + +### Pre-processing + +`Resize` + +- add: scale, scale_idx, pad_shape, scale_factor, keep_ratio +- update: img, img_shape, *seg_fields + +`RandomFlip` + +- add: flip +- update: img, *seg_fields + +`Pad` + +- add: pad_fixed_size, pad_size_divisor +- update: img, pad_shape, *seg_fields + +`RandomCrop` + +- update: img, pad_shape, *seg_fields + +`Normalize` + +- add: img_norm_cfg +- update: img + +`SegRescale` + +- update: gt_semantic_seg + +`PhotoMetricDistortion` + +- update: img + +### Formatting + +`ToTensor` + +- update: specified by `keys`. + +`ImageToTensor` + +- update: specified by `keys`. + +`Transpose` + +- update: specified by `keys`. + +`ToDataContainer` + +- update: specified by `fields`. + +`DefaultFormatBundle` + +- update: img, gt_semantic_seg + +`Collect` + +- add: img_meta (the keys of img_meta is specified by `meta_keys`) +- remove: all other keys except for those specified by `keys` + +### Test time augmentation + +`MultiScaleFlipAug` + +## Extend and use custom pipelines + +1. Write a new pipeline in any file, e.g., `my_pipeline.py`. It takes a dict as input and return a dict. + + ```python + from mmseg.datasets import PIPELINES + + @PIPELINES.register_module() + class MyTransform: + + def __call__(self, results): + results['dummy'] = True + return results + ``` + +2. Import the new class. + + ```python + from .my_pipeline import MyTransform + ``` + +3. Use it in config files. + + ```python + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + crop_size = (512, 1024) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='MyTransform'), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), + ] + ``` diff --git a/docs/tutorials/index.rst b/docs/tutorials/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..e1a67a8b44a9ac3c2bbee59304c2043467ac3f30 --- /dev/null +++ b/docs/tutorials/index.rst @@ -0,0 +1,9 @@ +.. toctree:: + :maxdepth: 2 + + config.md + customize_datasets.md + data_pipeline.md + customize_models.md + training_tricks.md + customize_runtime.md diff --git a/docs/tutorials/training_tricks.md b/docs/tutorials/training_tricks.md new file mode 100644 index 0000000000000000000000000000000000000000..98a201fa649d94525facd8237d32effd6560c658 --- /dev/null +++ b/docs/tutorials/training_tricks.md @@ -0,0 +1,52 @@ +# Tutorial 5: Training Tricks + +MMSegmentation support following training tricks out of box. + +## Different Learning Rate(LR) for Backbone and Heads + +In semantic segmentation, some methods make the LR of heads larger than backbone to achieve better performance or faster convergence. + +In MMSegmentation, you may add following lines to config to make the LR of heads 10 times of backbone. + +```python +optimizer=dict( + paramwise_cfg = dict( + custom_keys={ + 'head': dict(lr_mult=10.)})) +``` + +With this modification, the LR of any parameter group with `'head'` in name will be multiplied by 10. +You may refer to [MMCV doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.DefaultOptimizerConstructor) for further details. + +## Online Hard Example Mining (OHEM) + +We implement pixel sampler [here](https://github.com/open-mmlab/mmsegmentation/tree/master/mmseg/core/seg/sampler) for training sampling. +Here is an example config of training PSPNet with OHEM enabled. + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=100000)) ) +``` + +In this way, only pixels with confidence score under 0.7 are used to train. And we keep at least 100000 pixels during training. If `thresh` is not specified, pixels of top ``min_kept`` loss will be selected. + +## Class Balanced Loss + +For dataset that is not balanced in classes distribution, you may change the loss weight of each class. +Here is an example for cityscapes dataset. + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0, + # DeepLab used this class weight for cityscapes + class_weight=[0.8373, 0.9180, 0.8660, 1.0345, 1.0166, 0.9969, 0.9754, + 1.0489, 0.8786, 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, + 1.0865, 1.0955, 1.0865, 1.1529, 1.0507]))) +``` + +`class_weight` will be passed into `CrossEntropyLoss` as `weight` argument. Please refer to [PyTorch Doc](https://pytorch.org/docs/stable/nn.html?highlight=crossentropy#torch.nn.CrossEntropyLoss) for details. diff --git a/docs/useful_tools.md b/docs/useful_tools.md new file mode 100644 index 0000000000000000000000000000000000000000..514b5680ee4eff351affd3bfa169c11d5dee9b9f --- /dev/null +++ b/docs/useful_tools.md @@ -0,0 +1,64 @@ +Apart from training/testing scripts, We provide lots of useful tools under the + `tools/` directory. + +### Get the FLOPs and params (experimental) + +We provide a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +You will get the result like this. + +```none +============================== +Input shape: (3, 2048, 1024) +Flops: 1429.68 GMac +Params: 48.98 M +============================== +``` + +**Note**: This tool is still experimental and we do not guarantee that the number is correct. You may well use the result for simple comparisons, but double check it before you adopt it in technical reports or papers. + +(1) FLOPs are related to the input shape while parameters are not. The default input shape is (1, 3, 1280, 800). +(2) Some operators are not counted into FLOPs like GN and custom operators. + +### Publish a model + +Before you upload a model to AWS, you may want to +(1) convert model weights to CPU tensors, (2) delete the optimizer states and +(3) compute the hash of the checkpoint file and append the hash id to the filename. + +```shell +python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +E.g., + +```shell +python tools/publish_model.py work_dirs/pspnet/latest.pth psp_r50_hszhao_200ep.pth +``` + +The final output filename will be `psp_r50_512x1024_40ki_cityscapes-{hash id}.pth`. + +### Convert to ONNX (experimental) + +We provide a script to convert model to [ONNX](https://github.com/onnx/onnx) format. The converted model could be visualized by tools like [Netron](https://github.com/lutzroeder/netron). Besides, we also support comparing the output results between Pytorch and ONNX model. + +```shell +python tools/pytorch2onnx.py ${CONFIG_FILE} --checkpoint ${CHECKPOINT_FILE} --output-file ${ONNX_FILE} [--shape ${INPUT_SHAPE} --verify] +``` + +**Note**: This tool is still experimental. Some customized operators are not supported for now. + +## Miscellaneous + +### Print the entire config + +`tools/print_config.py` prints the whole config verbatim, expanding all its + imports. + +```shell +python tools/print_config.py ${CONFIG} [-h] [--options ${OPTIONS [OPTIONS...]}] +``` diff --git a/mmseg/__init__.py b/mmseg/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f301a5dc34eab89c72f89259416f2f1092f46f1e --- /dev/null +++ b/mmseg/__init__.py @@ -0,0 +1,30 @@ +import mmcv + +from .version import __version__, version_info + +MMCV_MIN = '1.1.4' +MMCV_MAX = '1.3.0' + + +def digit_version(version_str): + digit_version = [] + for x in version_str.split('.'): + if x.isdigit(): + digit_version.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + digit_version.append(int(patch_version[0]) - 1) + digit_version.append(int(patch_version[1])) + return digit_version + + +mmcv_min_version = digit_version(MMCV_MIN) +mmcv_max_version = digit_version(MMCV_MAX) +mmcv_version = digit_version(mmcv.__version__) + + +assert (mmcv_min_version <= mmcv_version <= mmcv_max_version), \ + f'MMCV=={mmcv.__version__} is used but incompatible. ' \ + f'Please install mmcv>={mmcv_min_version}, <={mmcv_max_version}.' + +__all__ = ['__version__', 'version_info'] diff --git a/mmseg/apis/__init__.py b/mmseg/apis/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..170724be38de42daf2bc1a1910e181d68818f165 --- /dev/null +++ b/mmseg/apis/__init__.py @@ -0,0 +1,9 @@ +from .inference import inference_segmentor, init_segmentor, show_result_pyplot +from .test import multi_gpu_test, single_gpu_test +from .train import get_root_logger, set_random_seed, train_segmentor + +__all__ = [ + 'get_root_logger', 'set_random_seed', 'train_segmentor', 'init_segmentor', + 'inference_segmentor', 'multi_gpu_test', 'single_gpu_test', + 'show_result_pyplot' +] diff --git a/mmseg/apis/inference.py b/mmseg/apis/inference.py new file mode 100644 index 0000000000000000000000000000000000000000..20c20dccda2837fb54e8ceaa2aa7e74404c085f7 --- /dev/null +++ b/mmseg/apis/inference.py @@ -0,0 +1,118 @@ +import matplotlib.pyplot as plt +import mmcv +import torch +from mmcv.parallel import collate, scatter +from mmcv.runner import load_checkpoint + +from mmseg.datasets.pipelines import Compose +from mmseg.models import build_segmentor + + +def init_segmentor(config, checkpoint=None, device='cuda:0'): + """Initialize a segmentor from config file. + + Args: + config (str or :obj:`mmcv.Config`): Config file path or the config + object. + checkpoint (str, optional): Checkpoint path. If left as None, the model + will not load any weights. + device (str, optional) CPU/CUDA device option. Default 'cuda:0'. + Use 'cpu' for loading model on CPU. + Returns: + nn.Module: The constructed segmentor. + """ + if isinstance(config, str): + config = mmcv.Config.fromfile(config) + elif not isinstance(config, mmcv.Config): + raise TypeError('config must be a filename or Config object, ' + 'but got {}'.format(type(config))) + config.model.pretrained = None + config.model.train_cfg = None + model = build_segmentor(config.model, test_cfg=config.get('test_cfg')) + if checkpoint is not None: + checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') + model.CLASSES = checkpoint['meta']['CLASSES'] + model.PALETTE = checkpoint['meta']['PALETTE'] + model.cfg = config # save the config in the model for convenience + model.to(device) + model.eval() + return model + + +class LoadImage: + """A simple pipeline to load image.""" + + def __call__(self, results): + """Call function to load images into results. + + Args: + results (dict): A result dict contains the file name + of the image to be read. + + Returns: + dict: ``results`` will be returned containing loaded image. + """ + + if isinstance(results['img'], str): + results['filename'] = results['img'] + results['ori_filename'] = results['img'] + else: + results['filename'] = None + results['ori_filename'] = None + img = mmcv.imread(results['img']) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + return results + + +def inference_segmentor(model, img): + """Inference image(s) with the segmentor. + + Args: + model (nn.Module): The loaded segmentor. + imgs (str/ndarray or list[str/ndarray]): Either image files or loaded + images. + + Returns: + (list[Tensor]): The segmentation result. + """ + cfg = model.cfg + device = next(model.parameters()).device # model device + # build the data pipeline + test_pipeline = [LoadImage()] + cfg.data.test.pipeline[1:] + test_pipeline = Compose(test_pipeline) + # prepare data + data = dict(img=img) + data = test_pipeline(data) + data = collate([data], samples_per_gpu=1) + if next(model.parameters()).is_cuda: + # scatter to specified GPU + data = scatter(data, [device])[0] + else: + data['img_metas'] = [i.data[0] for i in data['img_metas']] + + # forward the model + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + return result + + +def show_result_pyplot(model, img, result, palette=None, fig_size=(15, 10)): + """Visualize the segmentation results on the image. + + Args: + model (nn.Module): The loaded segmentor. + img (str or np.ndarray): Image filename or loaded image. + result (list): The segmentation result. + palette (list[list[int]]] | None): The palette of segmentation + map. If None is given, random palette will be generated. + Default: None + fig_size (tuple): Figure size of the pyplot figure. + """ + if hasattr(model, 'module'): + model = model.module + img = model.show_result(img, result, palette=palette, show=False) + plt.figure(figsize=fig_size) + plt.imshow(mmcv.bgr2rgb(img)) + plt.show() diff --git a/mmseg/apis/test.py b/mmseg/apis/test.py new file mode 100644 index 0000000000000000000000000000000000000000..148df7680e6abe1f9bc761bc4616cec1790e7038 --- /dev/null +++ b/mmseg/apis/test.py @@ -0,0 +1,234 @@ +import os.path as osp +import pickle +import shutil +import tempfile + +import mmcv +import numpy as np +import torch +import torch.distributed as dist +from mmcv.image import tensor2imgs +from mmcv.runner import get_dist_info + + +def np2tmp(array, temp_file_name=None): + """Save ndarray to local numpy file. + + Args: + array (ndarray): Ndarray to save. + temp_file_name (str): Numpy file name. If 'temp_file_name=None', this + function will generate a file name with tempfile.NamedTemporaryFile + to save ndarray. Default: None. + + Returns: + str: The numpy file name. + """ + + if temp_file_name is None: + temp_file_name = tempfile.NamedTemporaryFile( + suffix='.npy', delete=False).name + np.save(temp_file_name, array) + return temp_file_name + + +def single_gpu_test(model, + data_loader, + show=False, + out_dir=None, + efficient_test=False): + """Test with single GPU. + + Args: + model (nn.Module): Model to be tested. + data_loader (utils.data.Dataloader): Pytorch data loader. + show (bool): Whether show results during infernece. Default: False. + out_dir (str, optional): If specified, the results will be dumped into + the directory to save output results. + efficient_test (bool): Whether save the results as local numpy files to + save CPU memory during evaluation. Default: False. + + Returns: + list: The prediction results. + """ + + model.eval() + results = [] + dataset = data_loader.dataset + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, **data) + + if show or out_dir: + img_tensor = data['img'][0] + img_metas = data['img_metas'][0].data[0] + imgs = tensor2imgs(img_tensor, **img_metas[0]['img_norm_cfg']) + assert len(imgs) == len(img_metas) + + for img, img_meta in zip(imgs, img_metas): + h, w, _ = img_meta['img_shape'] + img_show = img[:h, :w, :] + + ori_h, ori_w = img_meta['ori_shape'][:-1] + img_show = mmcv.imresize(img_show, (ori_w, ori_h)) + + if out_dir: + out_file = osp.join(out_dir, img_meta['ori_filename']) + else: + out_file = None + + model.module.show_result( + img_show, + result, + palette=dataset.PALETTE, + show=show, + out_file=out_file) + + if isinstance(result, list): + if efficient_test: + result = [np2tmp(_) for _ in result] + results.extend(result) + else: + if efficient_test: + result = np2tmp(result) + results.append(result) + + batch_size = data['img'][0].size(0) + for _ in range(batch_size): + prog_bar.update() + return results + + +def multi_gpu_test(model, + data_loader, + tmpdir=None, + gpu_collect=False, + efficient_test=False): + """Test model with multiple gpus. + + This method tests model with multiple gpus and collects the results + under two different modes: gpu and cpu modes. By setting 'gpu_collect=True' + it encodes results to gpu tensors and use gpu communication for results + collection. On cpu mode it saves the results on different gpus to 'tmpdir' + and collects them by the rank 0 worker. + + Args: + model (nn.Module): Model to be tested. + data_loader (utils.data.Dataloader): Pytorch data loader. + tmpdir (str): Path of directory to save the temporary results from + different gpus under cpu mode. + gpu_collect (bool): Option to use either gpu or cpu to collect results. + efficient_test (bool): Whether save the results as local numpy files to + save CPU memory during evaluation. Default: False. + + Returns: + list: The prediction results. + """ + + model.eval() + results = [] + dataset = data_loader.dataset + rank, world_size = get_dist_info() + if rank == 0: + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + + if isinstance(result, list): + if efficient_test: + result = [np2tmp(_) for _ in result] + results.extend(result) + else: + if efficient_test: + result = np2tmp(result) + results.append(result) + + if rank == 0: + batch_size = data['img'][0].size(0) + for _ in range(batch_size * world_size): + prog_bar.update() + + # collect results from all ranks + if gpu_collect: + results = collect_results_gpu(results, len(dataset)) + else: + results = collect_results_cpu(results, len(dataset), tmpdir) + return results + + +def collect_results_cpu(result_part, size, tmpdir=None): + """Collect results with CPU.""" + rank, world_size = get_dist_info() + # create a tmp dir if it is not specified + if tmpdir is None: + MAX_LEN = 512 + # 32 is whitespace + dir_tensor = torch.full((MAX_LEN, ), + 32, + dtype=torch.uint8, + device='cuda') + if rank == 0: + tmpdir = tempfile.mkdtemp() + tmpdir = torch.tensor( + bytearray(tmpdir.encode()), dtype=torch.uint8, device='cuda') + dir_tensor[:len(tmpdir)] = tmpdir + dist.broadcast(dir_tensor, 0) + tmpdir = dir_tensor.cpu().numpy().tobytes().decode().rstrip() + else: + mmcv.mkdir_or_exist(tmpdir) + # dump the part result to the dir + mmcv.dump(result_part, osp.join(tmpdir, 'part_{}.pkl'.format(rank))) + dist.barrier() + # collect all parts + if rank != 0: + return None + else: + # load results of all parts from tmp dir + part_list = [] + for i in range(world_size): + part_file = osp.join(tmpdir, 'part_{}.pkl'.format(i)) + part_list.append(mmcv.load(part_file)) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + # remove tmp dir + shutil.rmtree(tmpdir) + return ordered_results + + +def collect_results_gpu(result_part, size): + """Collect results with GPU.""" + rank, world_size = get_dist_info() + # dump result part to tensor with pickle + part_tensor = torch.tensor( + bytearray(pickle.dumps(result_part)), dtype=torch.uint8, device='cuda') + # gather all result part tensor shape + shape_tensor = torch.tensor(part_tensor.shape, device='cuda') + shape_list = [shape_tensor.clone() for _ in range(world_size)] + dist.all_gather(shape_list, shape_tensor) + # padding result part tensor to max length + shape_max = torch.tensor(shape_list).max() + part_send = torch.zeros(shape_max, dtype=torch.uint8, device='cuda') + part_send[:shape_tensor[0]] = part_tensor + part_recv_list = [ + part_tensor.new_zeros(shape_max) for _ in range(world_size) + ] + # gather all result part + dist.all_gather(part_recv_list, part_send) + + if rank == 0: + part_list = [] + for recv, shape in zip(part_recv_list, shape_list): + part_list.append( + pickle.loads(recv[:shape[0]].cpu().numpy().tobytes())) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + return ordered_results diff --git a/mmseg/apis/train.py b/mmseg/apis/train.py new file mode 100644 index 0000000000000000000000000000000000000000..5f526df2b0f822a2d94a88265732a153bff4e4a4 --- /dev/null +++ b/mmseg/apis/train.py @@ -0,0 +1,116 @@ +import random +import warnings + +import numpy as np +import torch +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +from mmcv.runner import build_optimizer, build_runner + +from mmseg.core import DistEvalHook, EvalHook +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.utils import get_root_logger + + +def set_random_seed(seed, deterministic=False): + """Set random seed. + + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def train_segmentor(model, + dataset, + cfg, + distributed=False, + validate=False, + timestamp=None, + meta=None): + """Launch segmentor training.""" + logger = get_root_logger(cfg.log_level) + + # prepare data loaders + dataset = dataset if isinstance(dataset, (list, tuple)) else [dataset] + data_loaders = [ + build_dataloader( + ds, + cfg.data.samples_per_gpu, + cfg.data.workers_per_gpu, + # cfg.gpus will be ignored if distributed + len(cfg.gpu_ids), + dist=distributed, + seed=cfg.seed, + drop_last=True) for ds in dataset + ] + + # put model on gpus + if distributed: + find_unused_parameters = cfg.get('find_unused_parameters', False) + # Sets the `find_unused_parameters` parameter in + # torch.nn.parallel.DistributedDataParallel + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False, + find_unused_parameters=find_unused_parameters) + else: + model = MMDataParallel( + model.cuda(cfg.gpu_ids[0]), device_ids=cfg.gpu_ids) + + # build runner + optimizer = build_optimizer(model, cfg.optimizer) + + if cfg.get('runner') is None: + cfg.runner = {'type': 'IterBasedRunner', 'max_iters': cfg.total_iters} + warnings.warn( + 'config is now expected to have a `runner` section, ' + 'please set `runner` in your config.', UserWarning) + + runner = build_runner( + cfg.runner, + default_args=dict( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=cfg.work_dir, + logger=logger, + meta=meta)) + + # register hooks + runner.register_training_hooks(cfg.lr_config, cfg.optimizer_config, + cfg.checkpoint_config, cfg.log_config, + cfg.get('momentum_config', None)) + + # an ugly walkaround to make the .log and .log.json filenames the same + runner.timestamp = timestamp + + # register eval hooks + if validate: + val_dataset = build_dataset(cfg.data.val, dict(test_mode=True)) + val_dataloader = build_dataloader( + val_dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=distributed, + shuffle=False) + eval_cfg = cfg.get('evaluation', {}) + eval_cfg['by_epoch'] = cfg.runner['type'] != 'IterBasedRunner' + eval_hook = DistEvalHook if distributed else EvalHook + runner.register_hook(eval_hook(val_dataloader, **eval_cfg)) + + if cfg.resume_from: + runner.resume(cfg.resume_from) + elif cfg.load_from: + runner.load_checkpoint(cfg.load_from) + runner.run(data_loaders, cfg.workflow) diff --git a/mmseg/core/__init__.py b/mmseg/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..965605587211b7bf0bd6bc3acdbb33dd49cab023 --- /dev/null +++ b/mmseg/core/__init__.py @@ -0,0 +1,3 @@ +from .evaluation import * # noqa: F401, F403 +from .seg import * # noqa: F401, F403 +from .utils import * # noqa: F401, F403 diff --git a/mmseg/core/evaluation/__init__.py b/mmseg/core/evaluation/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c58d926f06b3225f0ac93e10a3766ece6b6a8b2a --- /dev/null +++ b/mmseg/core/evaluation/__init__.py @@ -0,0 +1,8 @@ +from .class_names import get_classes, get_palette +from .eval_hooks import DistEvalHook, EvalHook +from .metrics import eval_metrics, mean_dice, mean_iou + +__all__ = [ + 'EvalHook', 'DistEvalHook', 'mean_dice', 'mean_iou', 'eval_metrics', + 'get_classes', 'get_palette' +] diff --git a/mmseg/core/evaluation/class_names.py b/mmseg/core/evaluation/class_names.py new file mode 100644 index 0000000000000000000000000000000000000000..0d8e66d54b47c200d969ec9fb0bbb642be5d12c3 --- /dev/null +++ b/mmseg/core/evaluation/class_names.py @@ -0,0 +1,152 @@ +import mmcv + + +def cityscapes_classes(): + """Cityscapes class names for external use.""" + return [ + 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle' + ] + + +def ade_classes(): + """ADE20K class names for external use.""" + return [ + 'wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', 'bed ', + 'windowpane', 'grass', 'cabinet', 'sidewalk', 'person', 'earth', + 'door', 'table', 'mountain', 'plant', 'curtain', 'chair', 'car', + 'water', 'painting', 'sofa', 'shelf', 'house', 'sea', 'mirror', 'rug', + 'field', 'armchair', 'seat', 'fence', 'desk', 'rock', 'wardrobe', + 'lamp', 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', 'path', + 'stairs', 'runway', 'case', 'pool table', 'pillow', 'screen door', + 'stairway', 'river', 'bridge', 'bookcase', 'blind', 'coffee table', + 'toilet', 'flower', 'book', 'hill', 'bench', 'countertop', 'stove', + 'palm', 'kitchen island', 'computer', 'swivel chair', 'boat', 'bar', + 'arcade machine', 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', 'television receiver', + 'airplane', 'dirt track', 'apparel', 'pole', 'land', 'bannister', + 'escalator', 'ottoman', 'bottle', 'buffet', 'poster', 'stage', 'van', + 'ship', 'fountain', 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', 'tent', + 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', 'step', 'tank', + 'trade name', 'microwave', 'pot', 'animal', 'bicycle', 'lake', + 'dishwasher', 'screen', 'blanket', 'sculpture', 'hood', 'sconce', + 'vase', 'traffic light', 'tray', 'ashcan', 'fan', 'pier', 'crt screen', + 'plate', 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag' + ] + + +def voc_classes(): + """Pascal VOC class names for external use.""" + return [ + 'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', + 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor' + ] + + +def cityscapes_palette(): + """Cityscapes palette for external use.""" + return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100], + [0, 0, 230], [119, 11, 32]] + + +def ade_palette(): + """ADE20K palette for external use.""" + return [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + + +def voc_palette(): + """Pascal VOC palette for external use.""" + return [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] + + +dataset_aliases = { + 'cityscapes': ['cityscapes'], + 'ade': ['ade', 'ade20k'], + 'voc': ['voc', 'pascal_voc', 'voc12', 'voc12aug'] +} + + +def get_classes(dataset): + """Get class names of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if mmcv.is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_classes()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels + + +def get_palette(dataset): + """Get class palette (RGB) of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if mmcv.is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_palette()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels diff --git a/mmseg/core/evaluation/eval_hooks.py b/mmseg/core/evaluation/eval_hooks.py new file mode 100644 index 0000000000000000000000000000000000000000..09c6265ece2d8a4b9656dc0f07336a059f20729b --- /dev/null +++ b/mmseg/core/evaluation/eval_hooks.py @@ -0,0 +1,107 @@ +import os.path as osp + +from mmcv.runner import Hook +from torch.utils.data import DataLoader + + +class EvalHook(Hook): + """Evaluation hook. + + Attributes: + dataloader (DataLoader): A PyTorch dataloader. + interval (int): Evaluation interval (by epochs). Default: 1. + """ + + def __init__(self, dataloader, interval=1, by_epoch=False, **eval_kwargs): + if not isinstance(dataloader, DataLoader): + raise TypeError('dataloader must be a pytorch DataLoader, but got ' + f'{type(dataloader)}') + self.dataloader = dataloader + self.interval = interval + self.by_epoch = by_epoch + self.eval_kwargs = eval_kwargs + + def after_train_iter(self, runner): + """After train epoch hook.""" + if self.by_epoch or not self.every_n_iters(runner, self.interval): + return + from mmseg.apis import single_gpu_test + runner.log_buffer.clear() + results = single_gpu_test(runner.model, self.dataloader, show=False) + self.evaluate(runner, results) + + def after_train_epoch(self, runner): + """After train epoch hook.""" + if not self.by_epoch or not self.every_n_epochs(runner, self.interval): + return + from mmseg.apis import single_gpu_test + runner.log_buffer.clear() + results = single_gpu_test(runner.model, self.dataloader, show=False) + self.evaluate(runner, results) + + def evaluate(self, runner, results): + """Call evaluate function of dataset.""" + eval_res = self.dataloader.dataset.evaluate( + results, logger=runner.logger, **self.eval_kwargs) + for name, val in eval_res.items(): + runner.log_buffer.output[name] = val + runner.log_buffer.ready = True + + +class DistEvalHook(EvalHook): + """Distributed evaluation hook. + + Attributes: + dataloader (DataLoader): A PyTorch dataloader. + interval (int): Evaluation interval (by epochs). Default: 1. + tmpdir (str | None): Temporary directory to save the results of all + processes. Default: None. + gpu_collect (bool): Whether to use gpu or cpu to collect results. + Default: False. + """ + + def __init__(self, + dataloader, + interval=1, + gpu_collect=False, + by_epoch=False, + **eval_kwargs): + if not isinstance(dataloader, DataLoader): + raise TypeError( + 'dataloader must be a pytorch DataLoader, but got {}'.format( + type(dataloader))) + self.dataloader = dataloader + self.interval = interval + self.gpu_collect = gpu_collect + self.by_epoch = by_epoch + self.eval_kwargs = eval_kwargs + + def after_train_iter(self, runner): + """After train epoch hook.""" + if self.by_epoch or not self.every_n_iters(runner, self.interval): + return + from mmseg.apis import multi_gpu_test + runner.log_buffer.clear() + results = multi_gpu_test( + runner.model, + self.dataloader, + tmpdir=osp.join(runner.work_dir, '.eval_hook'), + gpu_collect=self.gpu_collect) + if runner.rank == 0: + print('\n') + self.evaluate(runner, results) + + def after_train_epoch(self, runner): + """After train epoch hook.""" + if not self.by_epoch or not self.every_n_epochs(runner, self.interval): + return + from mmseg.apis import multi_gpu_test + runner.log_buffer.clear() + results = multi_gpu_test( + runner.model, + self.dataloader, + tmpdir=osp.join(runner.work_dir, '.eval_hook'), + gpu_collect=self.gpu_collect) + if runner.rank == 0: + print('\n') + self.evaluate(runner, results) diff --git a/mmseg/core/evaluation/metrics.py b/mmseg/core/evaluation/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..95b096e7a3d0034c09b9116f7d5614bb4e2601b1 --- /dev/null +++ b/mmseg/core/evaluation/metrics.py @@ -0,0 +1,229 @@ +import mmcv +import numpy as np + + +def intersect_and_union(pred_label, + label, + num_classes, + ignore_index, + label_map=dict(), + reduce_zero_label=False): + """Calculate intersection and Union. + + Args: + pred_label (ndarray): Prediction segmentation map. + label (ndarray): Ground truth segmentation map. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + label_map (dict): Mapping old labels to new labels. The parameter will + work only when label is str. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. The parameter will + work only when label is str. Default: False. + + Returns: + ndarray: The intersection of prediction and ground truth histogram + on all classes. + ndarray: The union of prediction and ground truth histogram on all + classes. + ndarray: The prediction histogram on all classes. + ndarray: The ground truth histogram on all classes. + """ + + if isinstance(pred_label, str): + pred_label = np.load(pred_label) + + if isinstance(label, str): + label = mmcv.imread(label, flag='unchanged', backend='pillow') + # modify if custom classes + if label_map is not None: + for old_id, new_id in label_map.items(): + label[label == old_id] = new_id + if reduce_zero_label: + # avoid using underflow conversion + label[label == 0] = 255 + label = label - 1 + label[label == 254] = 255 + + mask = (label != ignore_index) + pred_label = pred_label[mask] + label = label[mask] + + intersect = pred_label[pred_label == label] + area_intersect, _ = np.histogram( + intersect, bins=np.arange(num_classes + 1)) + area_pred_label, _ = np.histogram( + pred_label, bins=np.arange(num_classes + 1)) + area_label, _ = np.histogram(label, bins=np.arange(num_classes + 1)) + area_union = area_pred_label + area_label - area_intersect + + return area_intersect, area_union, area_pred_label, area_label + + +def total_intersect_and_union(results, + gt_seg_maps, + num_classes, + ignore_index, + label_map=dict(), + reduce_zero_label=False): + """Calculate Total Intersection and Union. + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + ndarray: The intersection of prediction and ground truth histogram + on all classes. + ndarray: The union of prediction and ground truth histogram on all + classes. + ndarray: The prediction histogram on all classes. + ndarray: The ground truth histogram on all classes. + """ + + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_area_intersect = np.zeros((num_classes, ), dtype=np.float) + total_area_union = np.zeros((num_classes, ), dtype=np.float) + total_area_pred_label = np.zeros((num_classes, ), dtype=np.float) + total_area_label = np.zeros((num_classes, ), dtype=np.float) + for i in range(num_imgs): + area_intersect, area_union, area_pred_label, area_label = \ + intersect_and_union(results[i], gt_seg_maps[i], num_classes, + ignore_index, label_map, reduce_zero_label) + total_area_intersect += area_intersect + total_area_union += area_union + total_area_pred_label += area_pred_label + total_area_label += area_label + return total_area_intersect, total_area_union, \ + total_area_pred_label, total_area_label + + +def mean_iou(results, + gt_seg_maps, + num_classes, + ignore_index, + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate Mean Intersection and Union (mIoU) + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category IoU, shape (num_classes, ). + """ + + all_acc, acc, iou = eval_metrics( + results=results, + gt_seg_maps=gt_seg_maps, + num_classes=num_classes, + ignore_index=ignore_index, + metrics=['mIoU'], + nan_to_num=nan_to_num, + label_map=label_map, + reduce_zero_label=reduce_zero_label) + return all_acc, acc, iou + + +def mean_dice(results, + gt_seg_maps, + num_classes, + ignore_index, + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate Mean Dice (mDice) + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category dice, shape (num_classes, ). + """ + + all_acc, acc, dice = eval_metrics( + results=results, + gt_seg_maps=gt_seg_maps, + num_classes=num_classes, + ignore_index=ignore_index, + metrics=['mDice'], + nan_to_num=nan_to_num, + label_map=label_map, + reduce_zero_label=reduce_zero_label) + return all_acc, acc, dice + + +def eval_metrics(results, + gt_seg_maps, + num_classes, + ignore_index, + metrics=['mIoU'], + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate evaluation metrics + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + metrics (list[str] | str): Metrics to be evaluated, 'mIoU' and 'mDice'. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category evalution metrics, shape (num_classes, ). + """ + + if isinstance(metrics, str): + metrics = [metrics] + allowed_metrics = ['mIoU', 'mDice'] + if not set(metrics).issubset(set(allowed_metrics)): + raise KeyError('metrics {} is not supported'.format(metrics)) + total_area_intersect, total_area_union, total_area_pred_label, \ + total_area_label = total_intersect_and_union(results, gt_seg_maps, + num_classes, ignore_index, + label_map, + reduce_zero_label) + all_acc = total_area_intersect.sum() / total_area_label.sum() + acc = total_area_intersect / total_area_label + ret_metrics = [all_acc, acc] + for metric in metrics: + if metric == 'mIoU': + iou = total_area_intersect / total_area_union + ret_metrics.append(iou) + elif metric == 'mDice': + dice = 2 * total_area_intersect / ( + total_area_pred_label + total_area_label) + ret_metrics.append(dice) + if nan_to_num is not None: + ret_metrics = [ + np.nan_to_num(metric, nan=nan_to_num) for metric in ret_metrics + ] + return ret_metrics diff --git a/mmseg/core/seg/__init__.py b/mmseg/core/seg/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..93bc129b685e4a3efca2cc891729981b2865900d --- /dev/null +++ b/mmseg/core/seg/__init__.py @@ -0,0 +1,4 @@ +from .builder import build_pixel_sampler +from .sampler import BasePixelSampler, OHEMPixelSampler + +__all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler'] diff --git a/mmseg/core/seg/builder.py b/mmseg/core/seg/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..f5a117ce7b221f749d9def4b8ed97c07fe90b6e3 --- /dev/null +++ b/mmseg/core/seg/builder.py @@ -0,0 +1,8 @@ +from mmcv.utils import Registry, build_from_cfg + +PIXEL_SAMPLERS = Registry('pixel sampler') + + +def build_pixel_sampler(cfg, **default_args): + """Build pixel sampler for segmentation map.""" + return build_from_cfg(cfg, PIXEL_SAMPLERS, default_args) diff --git a/mmseg/core/seg/sampler/__init__.py b/mmseg/core/seg/sampler/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..332b242c03d1c5e80d4577df442a9a037b1816e1 --- /dev/null +++ b/mmseg/core/seg/sampler/__init__.py @@ -0,0 +1,4 @@ +from .base_pixel_sampler import BasePixelSampler +from .ohem_pixel_sampler import OHEMPixelSampler + +__all__ = ['BasePixelSampler', 'OHEMPixelSampler'] diff --git a/mmseg/core/seg/sampler/base_pixel_sampler.py b/mmseg/core/seg/sampler/base_pixel_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..db322d199ff809ef1c7962a8c979563386201549 --- /dev/null +++ b/mmseg/core/seg/sampler/base_pixel_sampler.py @@ -0,0 +1,13 @@ +from abc import ABCMeta, abstractmethod + + +class BasePixelSampler(metaclass=ABCMeta): + """Base class of pixel sampler.""" + + def __init__(self, **kwargs): + pass + + @abstractmethod + def sample(self, seg_logit, seg_label): + """Placeholder for sample function.""" + pass diff --git a/mmseg/core/seg/sampler/ohem_pixel_sampler.py b/mmseg/core/seg/sampler/ohem_pixel_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..88bb10d44026ba9f21756eaea9e550841cd59b9f --- /dev/null +++ b/mmseg/core/seg/sampler/ohem_pixel_sampler.py @@ -0,0 +1,76 @@ +import torch +import torch.nn.functional as F + +from ..builder import PIXEL_SAMPLERS +from .base_pixel_sampler import BasePixelSampler + + +@PIXEL_SAMPLERS.register_module() +class OHEMPixelSampler(BasePixelSampler): + """Online Hard Example Mining Sampler for segmentation. + + Args: + context (nn.Module): The context of sampler, subclass of + :obj:`BaseDecodeHead`. + thresh (float, optional): The threshold for hard example selection. + Below which, are prediction with low confidence. If not + specified, the hard examples will be pixels of top ``min_kept`` + loss. Default: None. + min_kept (int, optional): The minimum number of predictions to keep. + Default: 100000. + """ + + def __init__(self, context, thresh=None, min_kept=100000): + super(OHEMPixelSampler, self).__init__() + self.context = context + assert min_kept > 1 + self.thresh = thresh + self.min_kept = min_kept + + def sample(self, seg_logit, seg_label): + """Sample pixels that have high loss or with low prediction confidence. + + Args: + seg_logit (torch.Tensor): segmentation logits, shape (N, C, H, W) + seg_label (torch.Tensor): segmentation label, shape (N, 1, H, W) + + Returns: + torch.Tensor: segmentation weight, shape (N, H, W) + """ + with torch.no_grad(): + assert seg_logit.shape[2:] == seg_label.shape[2:] + assert seg_label.shape[1] == 1 + seg_label = seg_label.squeeze(1).long() + batch_kept = self.min_kept * seg_label.size(0) + valid_mask = seg_label != self.context.ignore_index + seg_weight = seg_logit.new_zeros(size=seg_label.size()) + valid_seg_weight = seg_weight[valid_mask] + if self.thresh is not None: + seg_prob = F.softmax(seg_logit, dim=1) + + tmp_seg_label = seg_label.clone().unsqueeze(1) + tmp_seg_label[tmp_seg_label == self.context.ignore_index] = 0 + seg_prob = seg_prob.gather(1, tmp_seg_label).squeeze(1) + sort_prob, sort_indices = seg_prob[valid_mask].sort() + + if sort_prob.numel() > 0: + min_threshold = sort_prob[min(batch_kept, + sort_prob.numel() - 1)] + else: + min_threshold = 0.0 + threshold = max(min_threshold, self.thresh) + valid_seg_weight[seg_prob[valid_mask] < threshold] = 1. + else: + losses = self.context.loss_decode( + seg_logit, + seg_label, + weight=None, + ignore_index=self.context.ignore_index, + reduction_override='none') + # faster than topk according to https://github.com/pytorch/pytorch/issues/22812 # noqa + _, sort_indices = losses[valid_mask].sort(descending=True) + valid_seg_weight[sort_indices[:batch_kept]] = 1. + + seg_weight[valid_mask] = valid_seg_weight + + return seg_weight diff --git a/mmseg/core/utils/__init__.py b/mmseg/core/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f2678b321c295bcceaef945111ac3524be19d6e4 --- /dev/null +++ b/mmseg/core/utils/__init__.py @@ -0,0 +1,3 @@ +from .misc import add_prefix + +__all__ = ['add_prefix'] diff --git a/mmseg/core/utils/misc.py b/mmseg/core/utils/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..eb862a82bd47c8624db3dd5c6fb6ad8a03b62466 --- /dev/null +++ b/mmseg/core/utils/misc.py @@ -0,0 +1,17 @@ +def add_prefix(inputs, prefix): + """Add prefix for dict. + + Args: + inputs (dict): The input dict with str keys. + prefix (str): The prefix to add. + + Returns: + + dict: The dict with keys updated with ``prefix``. + """ + + outputs = dict() + for name, value in inputs.items(): + outputs[f'{prefix}.{name}'] = value + + return outputs diff --git a/mmseg/datasets/__init__.py b/mmseg/datasets/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4f248dc16b970b2e10cbd7f0352c5d648c83f6f7 --- /dev/null +++ b/mmseg/datasets/__init__.py @@ -0,0 +1,18 @@ +from .ade import ADE20KDataset +from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset +from .chase_db1 import ChaseDB1Dataset +from .cityscapes import CityscapesDataset +from .custom import CustomDataset +from .dataset_wrappers import ConcatDataset, RepeatDataset +from .drive import DRIVEDataset +from .hrf import HRFDataset +from .pascal_context import PascalContextDataset +from .stare import STAREDataset +from .voc import PascalVOCDataset + +__all__ = [ + 'CustomDataset', 'build_dataloader', 'ConcatDataset', 'RepeatDataset', + 'DATASETS', 'build_dataset', 'PIPELINES', 'CityscapesDataset', + 'PascalVOCDataset', 'ADE20KDataset', 'PascalContextDataset', + 'ChaseDB1Dataset', 'DRIVEDataset', 'HRFDataset', 'STAREDataset' +] diff --git a/mmseg/datasets/ade.py b/mmseg/datasets/ade.py new file mode 100644 index 0000000000000000000000000000000000000000..5913e43775ed4920b6934c855eb5a37c54218ebf --- /dev/null +++ b/mmseg/datasets/ade.py @@ -0,0 +1,84 @@ +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class ADE20KDataset(CustomDataset): + """ADE20K dataset. + + In segmentation map annotation for ADE20K, 0 stands for background, which + is not included in 150 categories. ``reduce_zero_label`` is fixed to True. + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is fixed to + '.png'. + """ + CLASSES = ( + 'wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', 'bed ', + 'windowpane', 'grass', 'cabinet', 'sidewalk', 'person', 'earth', + 'door', 'table', 'mountain', 'plant', 'curtain', 'chair', 'car', + 'water', 'painting', 'sofa', 'shelf', 'house', 'sea', 'mirror', 'rug', + 'field', 'armchair', 'seat', 'fence', 'desk', 'rock', 'wardrobe', + 'lamp', 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', 'path', + 'stairs', 'runway', 'case', 'pool table', 'pillow', 'screen door', + 'stairway', 'river', 'bridge', 'bookcase', 'blind', 'coffee table', + 'toilet', 'flower', 'book', 'hill', 'bench', 'countertop', 'stove', + 'palm', 'kitchen island', 'computer', 'swivel chair', 'boat', 'bar', + 'arcade machine', 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', 'television receiver', + 'airplane', 'dirt track', 'apparel', 'pole', 'land', 'bannister', + 'escalator', 'ottoman', 'bottle', 'buffet', 'poster', 'stage', 'van', + 'ship', 'fountain', 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', 'tent', + 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', 'step', 'tank', + 'trade name', 'microwave', 'pot', 'animal', 'bicycle', 'lake', + 'dishwasher', 'screen', 'blanket', 'sculpture', 'hood', 'sconce', + 'vase', 'traffic light', 'tray', 'ashcan', 'fan', 'pier', 'crt screen', + 'plate', 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag') + + PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + + def __init__(self, **kwargs): + super(ADE20KDataset, self).__init__( + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) diff --git a/mmseg/datasets/builder.py b/mmseg/datasets/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..f7a9926111cad3c8ab140ab8d289dbc66053517a --- /dev/null +++ b/mmseg/datasets/builder.py @@ -0,0 +1,169 @@ +import copy +import platform +import random +from functools import partial + +import numpy as np +from mmcv.parallel import collate +from mmcv.runner import get_dist_info +from mmcv.utils import Registry, build_from_cfg +from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader +from torch.utils.data import DistributedSampler + +if platform.system() != 'Windows': + # https://github.com/pytorch/pytorch/issues/973 + import resource + rlimit = resource.getrlimit(resource.RLIMIT_NOFILE) + hard_limit = rlimit[1] + soft_limit = min(4096, hard_limit) + resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit)) + +DATASETS = Registry('dataset') +PIPELINES = Registry('pipeline') + + +def _concat_dataset(cfg, default_args=None): + """Build :obj:`ConcatDataset by.""" + from .dataset_wrappers import ConcatDataset + img_dir = cfg['img_dir'] + ann_dir = cfg.get('ann_dir', None) + split = cfg.get('split', None) + num_img_dir = len(img_dir) if isinstance(img_dir, (list, tuple)) else 1 + if ann_dir is not None: + num_ann_dir = len(ann_dir) if isinstance(ann_dir, (list, tuple)) else 1 + else: + num_ann_dir = 0 + if split is not None: + num_split = len(split) if isinstance(split, (list, tuple)) else 1 + else: + num_split = 0 + if num_img_dir > 1: + assert num_img_dir == num_ann_dir or num_ann_dir == 0 + assert num_img_dir == num_split or num_split == 0 + else: + assert num_split == num_ann_dir or num_ann_dir <= 1 + num_dset = max(num_split, num_img_dir) + + datasets = [] + for i in range(num_dset): + data_cfg = copy.deepcopy(cfg) + if isinstance(img_dir, (list, tuple)): + data_cfg['img_dir'] = img_dir[i] + if isinstance(ann_dir, (list, tuple)): + data_cfg['ann_dir'] = ann_dir[i] + if isinstance(split, (list, tuple)): + data_cfg['split'] = split[i] + datasets.append(build_dataset(data_cfg, default_args)) + + return ConcatDataset(datasets) + + +def build_dataset(cfg, default_args=None): + """Build datasets.""" + from .dataset_wrappers import ConcatDataset, RepeatDataset + if isinstance(cfg, (list, tuple)): + dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg]) + elif cfg['type'] == 'RepeatDataset': + dataset = RepeatDataset( + build_dataset(cfg['dataset'], default_args), cfg['times']) + elif isinstance(cfg.get('img_dir'), (list, tuple)) or isinstance( + cfg.get('split', None), (list, tuple)): + dataset = _concat_dataset(cfg, default_args) + else: + dataset = build_from_cfg(cfg, DATASETS, default_args) + + return dataset + + +def build_dataloader(dataset, + samples_per_gpu, + workers_per_gpu, + num_gpus=1, + dist=True, + shuffle=True, + seed=None, + drop_last=False, + pin_memory=True, + dataloader_type='PoolDataLoader', + **kwargs): + """Build PyTorch DataLoader. + + In distributed training, each GPU/process has a dataloader. + In non-distributed training, there is only one dataloader for all GPUs. + + Args: + dataset (Dataset): A PyTorch dataset. + samples_per_gpu (int): Number of training samples on each GPU, i.e., + batch size of each GPU. + workers_per_gpu (int): How many subprocesses to use for data loading + for each GPU. + num_gpus (int): Number of GPUs. Only used in non-distributed training. + dist (bool): Distributed training/test or not. Default: True. + shuffle (bool): Whether to shuffle the data at every epoch. + Default: True. + seed (int | None): Seed to be used. Default: None. + drop_last (bool): Whether to drop the last incomplete batch in epoch. + Default: False + pin_memory (bool): Whether to use pin_memory in DataLoader. + Default: True + dataloader_type (str): Type of dataloader. Default: 'PoolDataLoader' + kwargs: any keyword argument to be used to initialize DataLoader + + Returns: + DataLoader: A PyTorch dataloader. + """ + rank, world_size = get_dist_info() + if dist: + sampler = DistributedSampler( + dataset, world_size, rank, shuffle=shuffle) + shuffle = False + batch_size = samples_per_gpu + num_workers = workers_per_gpu + else: + sampler = None + batch_size = num_gpus * samples_per_gpu + num_workers = num_gpus * workers_per_gpu + + init_fn = partial( + worker_init_fn, num_workers=num_workers, rank=rank, + seed=seed) if seed is not None else None + + assert dataloader_type in ( + 'DataLoader', + 'PoolDataLoader'), f'unsupported dataloader {dataloader_type}' + + if dataloader_type == 'PoolDataLoader': + dataloader = PoolDataLoader + elif dataloader_type == 'DataLoader': + dataloader = DataLoader + + data_loader = dataloader( + dataset, + batch_size=batch_size, + sampler=sampler, + num_workers=num_workers, + collate_fn=partial(collate, samples_per_gpu=samples_per_gpu), + pin_memory=pin_memory, + shuffle=shuffle, + worker_init_fn=init_fn, + drop_last=drop_last, + **kwargs) + + return data_loader + + +def worker_init_fn(worker_id, num_workers, rank, seed): + """Worker init func for dataloader. + + The seed of each worker equals to num_worker * rank + worker_id + user_seed + + Args: + worker_id (int): Worker id. + num_workers (int): Number of workers. + rank (int): The rank of current process. + seed (int): The random seed to use. + """ + + worker_seed = num_workers * rank + worker_id + seed + np.random.seed(worker_seed) + random.seed(worker_seed) diff --git a/mmseg/datasets/chase_db1.py b/mmseg/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..8bc29bea14704a4407f83474610cbc3bef32c708 --- /dev/null +++ b/mmseg/datasets/chase_db1.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class ChaseDB1Dataset(CustomDataset): + """Chase_db1 dataset. + + In segmentation map annotation for Chase_db1, 0 stands for background, + which is included in 2 categories. ``reduce_zero_label`` is fixed to False. + The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_1stHO.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(ChaseDB1Dataset, self).__init__( + img_suffix='.png', + seg_map_suffix='_1stHO.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/cityscapes.py b/mmseg/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fa9958ac1401644420d264c48cf8d807a44d7cf9 --- /dev/null +++ b/mmseg/datasets/cityscapes.py @@ -0,0 +1,217 @@ +import os.path as osp +import tempfile + +import mmcv +import numpy as np +from mmcv.utils import print_log +from PIL import Image + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class CityscapesDataset(CustomDataset): + """Cityscapes dataset. + + The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is + fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset. + """ + + CLASSES = ('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle') + + PALETTE = [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], + [0, 80, 100], [0, 0, 230], [119, 11, 32]] + + def __init__(self, **kwargs): + super(CityscapesDataset, self).__init__( + img_suffix='_leftImg8bit.png', + seg_map_suffix='_gtFine_labelTrainIds.png', + **kwargs) + + @staticmethod + def _convert_to_label_id(result): + """Convert trainId to id for cityscapes.""" + if isinstance(result, str): + result = np.load(result) + import cityscapesscripts.helpers.labels as CSLabels + result_copy = result.copy() + for trainId, label in CSLabels.trainId2label.items(): + result_copy[result == trainId] = label.id + + return result_copy + + def results2img(self, results, imgfile_prefix, to_label_id): + """Write the segmentation results to images. + + Args: + results (list[list | tuple | ndarray]): Testing results of the + dataset. + imgfile_prefix (str): The filename prefix of the png files. + If the prefix is "somepath/xxx", + the png files will be named "somepath/xxx.png". + to_label_id (bool): whether convert output to label_id for + submission + + Returns: + 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)): + result = results[idx] + if to_label_id: + result = self._convert_to_label_id(result) + filename = self.img_infos[idx]['filename'] + basename = osp.splitext(osp.basename(filename))[0] + + png_filename = osp.join(imgfile_prefix, f'{basename}.png') + + output = Image.fromarray(result.astype(np.uint8)).convert('P') + import cityscapesscripts.helpers.labels as CSLabels + palette = np.zeros((len(CSLabels.id2label), 3), dtype=np.uint8) + for label_id, label in CSLabels.id2label.items(): + palette[label_id] = label.color + + output.putpalette(palette) + output.save(png_filename) + result_files.append(png_filename) + prog_bar.update() + + return result_files + + def format_results(self, results, imgfile_prefix=None, to_label_id=True): + """Format the results into dir (standard format for Cityscapes + evaluation). + + Args: + results (list): Testing results of the dataset. + imgfile_prefix (str | None): The prefix of images files. It + includes the file path and the prefix of filename, e.g., + "a/b/prefix". If not specified, a temp file will be created. + Default: None. + to_label_id (bool): whether convert output to label_id for + submission. Default: False + + Returns: + tuple: (result_files, tmp_dir), result_files is a list containing + the image paths, tmp_dir is the temporal directory created + for saving json/png files when img_prefix is not specified. + """ + + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: ' + f'{len(results)} != {len(self)}') + + if imgfile_prefix is None: + tmp_dir = tempfile.TemporaryDirectory() + imgfile_prefix = tmp_dir.name + else: + tmp_dir = None + result_files = self.results2img(results, imgfile_prefix, to_label_id) + + return result_files, tmp_dir + + def evaluate(self, + results, + metric='mIoU', + logger=None, + imgfile_prefix=None, + efficient_test=False): + """Evaluation in Cityscapes/default protocol. + + Args: + results (list): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. + logger (logging.Logger | None | str): Logger used for printing + related information during evaluation. Default: None. + imgfile_prefix (str | None): The prefix of output image file, + for cityscapes evaluation only. It includes the file path and + 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.png", where "xxx" is + the image name of cityscapes. If not specified, a temp file + will be created for evaluation. + Default: None. + + Returns: + dict[str, float]: Cityscapes/default metrics. + """ + + eval_results = dict() + metrics = metric.copy() if isinstance(metric, list) else [metric] + if 'cityscapes' in metrics: + eval_results.update( + self._evaluate_cityscapes(results, logger, imgfile_prefix)) + metrics.remove('cityscapes') + if len(metrics) > 0: + eval_results.update( + super(CityscapesDataset, + self).evaluate(results, metrics, logger, efficient_test)) + + return eval_results + + def _evaluate_cityscapes(self, results, logger, imgfile_prefix): + """Evaluation in Cityscapes protocol. + + Args: + results (list): Testing results of the dataset. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + imgfile_prefix (str | None): The prefix of output image file + + Returns: + dict[str: float]: Cityscapes evaluation results. + """ + try: + import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa + except ImportError: + raise ImportError('Please run "pip install cityscapesscripts" to ' + 'install cityscapesscripts first.') + msg = 'Evaluating in Cityscapes style' + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + result_files, tmp_dir = self.format_results(results, imgfile_prefix) + + if tmp_dir is None: + result_dir = imgfile_prefix + else: + result_dir = tmp_dir.name + + eval_results = dict() + print_log(f'Evaluating results under {result_dir} ...', logger=logger) + + CSEval.args.evalInstLevelScore = True + CSEval.args.predictionPath = osp.abspath(result_dir) + CSEval.args.evalPixelAccuracy = True + CSEval.args.JSONOutput = False + + seg_map_list = [] + pred_list = [] + + # when evaluating with official cityscapesscripts, + # **_gtFine_labelIds.png is used + for seg_map in mmcv.scandir( + self.ann_dir, 'gtFine_labelIds.png', recursive=True): + seg_map_list.append(osp.join(self.ann_dir, seg_map)) + pred_list.append(CSEval.getPrediction(CSEval.args, seg_map)) + + eval_results.update( + CSEval.evaluateImgLists(pred_list, seg_map_list, CSEval.args)) + + if tmp_dir is not None: + tmp_dir.cleanup() + + return eval_results diff --git a/mmseg/datasets/custom.py b/mmseg/datasets/custom.py new file mode 100644 index 0000000000000000000000000000000000000000..c65a3a3e428a3d3ca748e7cf00d186e7e1e26dd3 --- /dev/null +++ b/mmseg/datasets/custom.py @@ -0,0 +1,417 @@ +import os +import os.path as osp +from functools import reduce + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable +from torch.utils.data import Dataset + +from mmseg.core import eval_metrics +from mmseg.utils import get_root_logger +from .builder import DATASETS +from .pipelines import Compose + + +@DATASETS.register_module() +class CustomDataset(Dataset): + """Custom dataset for semantic segmentation. An example of file structure + is as followed. + + .. code-block:: none + + ├── data + │ ├── my_dataset + │ │ ├── img_dir + │ │ │ ├── train + │ │ │ │ ├── xxx{img_suffix} + │ │ │ │ ├── yyy{img_suffix} + │ │ │ │ ├── zzz{img_suffix} + │ │ │ ├── val + │ │ ├── ann_dir + │ │ │ ├── train + │ │ │ │ ├── xxx{seg_map_suffix} + │ │ │ │ ├── yyy{seg_map_suffix} + │ │ │ │ ├── zzz{seg_map_suffix} + │ │ │ ├── val + + The img/gt_semantic_seg pair of CustomDataset should be of the same + except suffix. A valid img/gt_semantic_seg filename pair should be like + ``xxx{img_suffix}`` and ``xxx{seg_map_suffix}`` (extension is also included + in the suffix). If split is given, then ``xxx`` is specified in txt file. + Otherwise, all files in ``img_dir/``and ``ann_dir`` will be loaded. + Please refer to ``docs/tutorials/new_dataset.md`` for more details. + + + Args: + pipeline (list[dict]): Processing pipeline + img_dir (str): Path to image directory + img_suffix (str): Suffix of images. Default: '.jpg' + ann_dir (str, optional): Path to annotation directory. Default: None + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + split (str, optional): Split txt file. If split is specified, only + file with suffix in the splits will be loaded. Otherwise, all + images in img_dir/ann_dir will be loaded. Default: None + data_root (str, optional): Data root for img_dir/ann_dir. Default: + None. + test_mode (bool): If test_mode=True, gt wouldn't be loaded. + ignore_index (int): The label index to be ignored. Default: 255 + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default: False + classes (str | Sequence[str], optional): Specify classes to load. + If is None, ``cls.CLASSES`` will be used. Default: None. + palette (Sequence[Sequence[int]]] | np.ndarray | None): + The palette of segmentation map. If None is given, and + self.PALETTE is None, random palette will be generated. + Default: None + """ + + ''' + CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154) + ''' + CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103) + + + PALETTE = [[0, 0, 0], [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60], + [200, 60, 110], [0, 110, 160], [40, 160, 210], [80, 210, 20], [120, 20, 70], + [160, 70, 120], [200, 120, 170], [0, 170, 220], [40, 220, 30], [80, 30, 80], + [120, 80, 130], [160, 130, 180], [200, 180, 230], [0, 230, 40], [40, 40, 90], + [80, 90, 140], [120, 140, 190], [160, 190, 0], [200, 0, 50], [0, 50, 100], + [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60], [200, 60, 110], + [0, 110, 160], [40, 160, 210], [80, 210, 20], [120, 20, 70], [160, 70, 120], + [200, 120, 170], [0, 170, 220], [40, 220, 30], [80, 30, 80], [120, 80, 130], + [160, 130, 180], [200, 180, 230], [0, 230, 40], [40, 40, 90], [80, 90, 140], + [120, 140, 190], [160, 190, 0], [200, 0, 50], [0, 50, 100], [40, 100, 150], + [80, 150, 200], [120, 200, 10], [160, 10, 60], [200, 60, 110], [0, 110, 160], + [40, 160, 210], [80, 210, 20], [120, 20, 70], [160, 70, 120], [200, 120, 170], + [0, 170, 220], [40, 220, 30], [80, 30, 80], [120, 80, 130], [160, 130, 180], + [200, 180, 230], [0, 230, 40], [40, 40, 90], [80, 90, 140], [120, 140, 190], + [160, 190, 0], [200, 0, 50], [0, 50, 100], [40, 100, 150], [80, 150, 200], + [120, 200, 10], [160, 10, 60], [200, 60, 110], [0, 110, 160], [40, 160, 210], + [80, 210, 20], [120, 20, 70], [160, 70, 120], [200, 120, 170], [0, 170, 220], + [40, 220, 30], [80, 30, 80], [120, 80, 130], [160, 130, 180], [200, 180, 230], + [0, 230, 40], [40, 40, 90], [80, 90, 140], [120, 140, 190], [160, 190, 0], + [200, 0, 50], [0, 50, 100], [40, 100, 150], [80, 150, 200], [120, 200, 10], + [160, 10, 60], [200, 60, 110], [0, 110, 160], [40, 160, 210]] + + def __init__(self, + pipeline, + img_dir, + img_suffix='.jpg', + ann_dir=None, + seg_map_suffix='.png', + split=None, + data_root=None, + test_mode=False, + ignore_index=255, + reduce_zero_label=False, + classes=None, + palette=None): + self.pipeline = Compose(pipeline) + self.img_dir = img_dir + self.img_suffix = img_suffix + self.ann_dir = ann_dir + self.seg_map_suffix = seg_map_suffix + self.split = split + self.data_root = data_root + self.test_mode = test_mode + self.ignore_index = ignore_index + self.reduce_zero_label = reduce_zero_label + self.label_map = None + self.CLASSES, self.PALETTE = self.get_classes_and_palette( + classes, palette) + + # join paths if data_root is specified + if self.data_root is not None: + if not osp.isabs(self.img_dir): + self.img_dir = osp.join(self.data_root, self.img_dir) + if not (self.ann_dir is None or osp.isabs(self.ann_dir)): + self.ann_dir = osp.join(self.data_root, self.ann_dir) + if not (self.split is None or osp.isabs(self.split)): + self.split = osp.join(self.data_root, self.split) + + # load annotations + self.img_infos = self.load_annotations(self.img_dir, self.img_suffix, + self.ann_dir, + self.seg_map_suffix, self.split) + + def __len__(self): + """Total number of samples of data.""" + return len(self.img_infos) + + def load_annotations(self, img_dir, img_suffix, ann_dir, seg_map_suffix, + split): + """Load annotation from directory. + + Args: + img_dir (str): Path to image directory + img_suffix (str): Suffix of images. + ann_dir (str|None): Path to annotation directory. + seg_map_suffix (str|None): Suffix of segmentation maps. + split (str|None): Split txt file. If split is specified, only file + with suffix in the splits will be loaded. Otherwise, all images + in img_dir/ann_dir will be loaded. Default: None + + Returns: + list[dict]: All image info of dataset. + """ + + img_infos = [] + if split is not None: + with open(split) as f: + for line in f: + img_name = line.strip() + img_info = dict(filename=img_name + img_suffix) + if ann_dir is not None: + seg_map = img_name + seg_map_suffix + img_info['ann'] = dict(seg_map=seg_map) + img_infos.append(img_info) + else: + for img in mmcv.scandir(img_dir, img_suffix, recursive=True): + img_info = dict(filename=img) + if ann_dir is not None: + seg_map = img.replace(img_suffix, seg_map_suffix) + img_info['ann'] = dict(seg_map=seg_map) + img_infos.append(img_info) + + print_log(f'Loaded {len(img_infos)} images', logger=get_root_logger()) + return img_infos + + def get_ann_info(self, idx): + """Get annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + return self.img_infos[idx]['ann'] + + def pre_pipeline(self, results): + """Prepare results dict for pipeline.""" + results['seg_fields'] = [] + results['img_prefix'] = self.img_dir + results['seg_prefix'] = self.ann_dir + if self.custom_classes: + results['label_map'] = self.label_map + + def __getitem__(self, idx): + """Get training/test data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training/test data (with annotation if `test_mode` is set + False). + """ + + if self.test_mode: + return self.prepare_test_img(idx) + else: + return self.prepare_train_img(idx) + + def prepare_train_img(self, idx): + """Get training data and annotations after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training data and annotation after pipeline with new keys + introduced by pipeline. + """ + + img_info = self.img_infos[idx] + ann_info = self.get_ann_info(idx) + results = dict(img_info=img_info, ann_info=ann_info) + self.pre_pipeline(results) + return self.pipeline(results) + + def prepare_test_img(self, idx): + """Get testing data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Testing data after pipeline with new keys intorduced by + piepline. + """ + + img_info = self.img_infos[idx] + results = dict(img_info=img_info) + self.pre_pipeline(results) + return self.pipeline(results) + + def format_results(self, results, **kwargs): + """Place holder to format result to dataset specific output.""" + pass + + def get_gt_seg_maps(self, efficient_test=False): + """Get ground truth segmentation maps for evaluation.""" + gt_seg_maps = [] + for img_info in self.img_infos: + seg_map = osp.join(self.ann_dir, img_info['ann']['seg_map']) + if efficient_test: + gt_seg_map = seg_map + else: + gt_seg_map = mmcv.imread( + seg_map, flag='unchanged', backend='pillow') + gt_seg_maps.append(gt_seg_map) + return gt_seg_maps + + def get_classes_and_palette(self, classes=None, palette=None): + """Get class names of current dataset. + + Args: + classes (Sequence[str] | str | None): If classes is None, use + default CLASSES defined by builtin dataset. If classes is a + string, take it as a file name. The file contains the name of + classes where each line contains one class name. If classes is + a tuple or list, override the CLASSES defined by the dataset. + palette (Sequence[Sequence[int]]] | np.ndarray | None): + The palette of segmentation map. If None is given, random + palette will be generated. Default: None + """ + if classes is None: + self.custom_classes = False + return self.CLASSES, self.PALETTE + + self.custom_classes = True + if isinstance(classes, str): + # take it as a file path + class_names = mmcv.list_from_file(classes) + elif isinstance(classes, (tuple, list)): + class_names = classes + else: + raise ValueError(f'Unsupported type {type(classes)} of classes.') + + if self.CLASSES: + if not set(classes).issubset(self.CLASSES): + raise ValueError('classes is not a subset of CLASSES.') + + # dictionary, its keys are the old label ids and its values + # are the new label ids. + # used for changing pixel labels in load_annotations. + self.label_map = {} + for i, c in enumerate(self.CLASSES): + if c not in class_names: + self.label_map[i] = -1 + else: + self.label_map[i] = classes.index(c) + + palette = self.get_palette_for_custom_classes(class_names, palette) + + return class_names, palette + + def get_palette_for_custom_classes(self, class_names, palette=None): + + if self.label_map is not None: + # return subset of palette + palette = [] + for old_id, new_id in sorted( + self.label_map.items(), key=lambda x: x[1]): + if new_id != -1: + palette.append(self.PALETTE[old_id]) + palette = type(self.PALETTE)(palette) + + elif palette is None: + if self.PALETTE is None: + palette = np.random.randint(0, 255, size=(len(class_names), 3)) + else: + palette = self.PALETTE + + return palette + + def evaluate(self, + results, + metric='mIoU', + logger=None, + efficient_test=False, + **kwargs): + """Evaluate the dataset. + + Args: + results (list): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. 'mIoU' and + 'mDice' are supported. + logger (logging.Logger | None | str): Logger used for printing + related information during evaluation. Default: None. + + Returns: + dict[str, float]: Default metrics. + """ + + if isinstance(metric, str): + metric = [metric] + allowed_metrics = ['mIoU', 'mDice'] + if not set(metric).issubset(set(allowed_metrics)): + raise KeyError('metric {} is not supported'.format(metric)) + eval_results = {} + gt_seg_maps = self.get_gt_seg_maps(efficient_test) + if self.CLASSES is None: + num_classes = len( + reduce(np.union1d, [np.unique(_) for _ in gt_seg_maps])) + else: + num_classes = len(self.CLASSES) + ret_metrics = eval_metrics( + results, + gt_seg_maps, + num_classes, + self.ignore_index, + metric, + label_map=self.label_map, + reduce_zero_label=self.reduce_zero_label) + class_table_data = [['Class'] + [m[1:] for m in metric] + ['Acc']] + if self.CLASSES is None: + class_names = tuple(range(num_classes)) + else: + class_names = self.CLASSES + ret_metrics_round = [ + np.round(ret_metric * 100, 2) for ret_metric in ret_metrics + ] + for i in range(num_classes): + class_table_data.append([class_names[i]] + + [m[i] for m in ret_metrics_round[2:]] + + [ret_metrics_round[1][i]]) + summary_table_data = [['Scope'] + + ['m' + head + for head in class_table_data[0][1:]] + ['aAcc']] + ret_metrics_mean = [ + np.round(np.nanmean(ret_metric) * 100, 2) + for ret_metric in ret_metrics + ] + summary_table_data.append(['global'] + ret_metrics_mean[2:] + + [ret_metrics_mean[1]] + + [ret_metrics_mean[0]]) + print_log('per class results:', logger) + table = AsciiTable(class_table_data) + print_log('\n' + table.table, logger=logger) + print_log('Summary:', logger) + table = AsciiTable(summary_table_data) + print_log('\n' + table.table, logger=logger) + + for i in range(1, len(summary_table_data[0])): + eval_results[summary_table_data[0] + [i]] = summary_table_data[1][i] / 100.0 + if mmcv.is_list_of(results, str): + for file_name in results: + os.remove(file_name) + return eval_results diff --git a/mmseg/datasets/dataset_wrappers.py b/mmseg/datasets/dataset_wrappers.py new file mode 100644 index 0000000000000000000000000000000000000000..d6a5e957ec3b44465432617cf6e8f0b86a8a5efa --- /dev/null +++ b/mmseg/datasets/dataset_wrappers.py @@ -0,0 +1,50 @@ +from torch.utils.data.dataset import ConcatDataset as _ConcatDataset + +from .builder import DATASETS + + +@DATASETS.register_module() +class ConcatDataset(_ConcatDataset): + """A wrapper of concatenated dataset. + + Same as :obj:`torch.utils.data.dataset.ConcatDataset`, but + concat the group flag for image aspect ratio. + + Args: + datasets (list[:obj:`Dataset`]): A list of datasets. + """ + + def __init__(self, datasets): + super(ConcatDataset, self).__init__(datasets) + self.CLASSES = datasets[0].CLASSES + self.PALETTE = datasets[0].PALETTE + + +@DATASETS.register_module() +class RepeatDataset(object): + """A wrapper of repeated dataset. + + The length of repeated dataset will be `times` larger than the original + dataset. This is useful when the data loading time is long but the dataset + is small. Using RepeatDataset can reduce the data loading time between + epochs. + + Args: + dataset (:obj:`Dataset`): The dataset to be repeated. + times (int): Repeat times. + """ + + def __init__(self, dataset, times): + self.dataset = dataset + self.times = times + self.CLASSES = dataset.CLASSES + self.PALETTE = dataset.PALETTE + self._ori_len = len(self.dataset) + + def __getitem__(self, idx): + """Get item from original dataset.""" + return self.dataset[idx % self._ori_len] + + def __len__(self): + """The length is multiplied by ``times``""" + return self.times * self._ori_len diff --git a/mmseg/datasets/drive.py b/mmseg/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..3cbfda8ae74bdf26c5aef197ff2866a7c7ad0cfd --- /dev/null +++ b/mmseg/datasets/drive.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class DRIVEDataset(CustomDataset): + """DRIVE dataset. + + In segmentation map annotation for DRIVE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_manual1.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(DRIVEDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='_manual1.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/hrf.py b/mmseg/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..923203b51377f9344277fc561803d7a78bd2c684 --- /dev/null +++ b/mmseg/datasets/hrf.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class HRFDataset(CustomDataset): + """HRF dataset. + + In segmentation map annotation for HRF, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(HRFDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/pascal_context.py b/mmseg/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ab42877f1e0c60099303a05021ea288f9c1c6e15 --- /dev/null +++ b/mmseg/datasets/pascal_context.py @@ -0,0 +1,54 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class PascalContextDataset(CustomDataset): + """PascalContext dataset. + + In segmentation map annotation for PascalContext, 0 stands for background, + which is included in 60 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png'. + + Args: + split (str): Split txt file for PascalContext. + """ + + CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', + 'bus', 'car', 'cat', 'chair', 'cow', 'table', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor', 'bag', 'bed', 'bench', 'book', 'building', + 'cabinet', 'ceiling', 'cloth', 'computer', 'cup', 'door', + 'fence', 'floor', 'flower', 'food', 'grass', 'ground', + 'keyboard', 'light', 'mountain', 'mouse', 'curtain', 'platform', + 'sign', 'plate', 'road', 'rock', 'shelves', 'sidewalk', 'sky', + 'snow', 'bedclothes', 'track', 'tree', 'truck', 'wall', 'water', + 'window', 'wood') + + PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255]] + + def __init__(self, split, **kwargs): + super(PascalContextDataset, self).__init__( + img_suffix='.jpg', + seg_map_suffix='.png', + split=split, + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) and self.split is not None diff --git a/mmseg/datasets/pipelines/__init__.py b/mmseg/datasets/pipelines/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8b9046b07bb4ddea7a707a392b42e72db7c9df67 --- /dev/null +++ b/mmseg/datasets/pipelines/__init__.py @@ -0,0 +1,16 @@ +from .compose import Compose +from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor, + Transpose, to_tensor) +from .loading import LoadAnnotations, LoadImageFromFile +from .test_time_aug import MultiScaleFlipAug +from .transforms import (CLAHE, AdjustGamma, Normalize, Pad, + PhotoMetricDistortion, RandomCrop, RandomFlip, + RandomRotate, Rerange, Resize, RGB2Gray, SegRescale) + +__all__ = [ + 'Compose', 'to_tensor', 'ToTensor', 'ImageToTensor', 'ToDataContainer', + 'Transpose', 'Collect', 'LoadAnnotations', 'LoadImageFromFile', + 'MultiScaleFlipAug', 'Resize', 'RandomFlip', 'Pad', 'RandomCrop', + 'Normalize', 'SegRescale', 'PhotoMetricDistortion', 'RandomRotate', + 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray' +] diff --git a/mmseg/datasets/pipelines/compose.py b/mmseg/datasets/pipelines/compose.py new file mode 100644 index 0000000000000000000000000000000000000000..ca48f1c935755c486edc2744e1713e2b5ba3cdc8 --- /dev/null +++ b/mmseg/datasets/pipelines/compose.py @@ -0,0 +1,51 @@ +import collections + +from mmcv.utils import build_from_cfg + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class Compose(object): + """Compose multiple transforms sequentially. + + Args: + transforms (Sequence[dict | callable]): Sequence of transform object or + config dict to be composed. + """ + + def __init__(self, transforms): + assert isinstance(transforms, collections.abc.Sequence) + self.transforms = [] + for transform in transforms: + if isinstance(transform, dict): + transform = build_from_cfg(transform, PIPELINES) + self.transforms.append(transform) + elif callable(transform): + self.transforms.append(transform) + else: + raise TypeError('transform must be callable or a dict') + + def __call__(self, data): + """Call function to apply transforms sequentially. + + Args: + data (dict): A result dict contains the data to transform. + + Returns: + dict: Transformed data. + """ + + for t in self.transforms: + data = t(data) + if data is None: + return None + return data + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.transforms: + format_string += '\n' + format_string += f' {t}' + format_string += '\n)' + return format_string diff --git a/mmseg/datasets/pipelines/formating.py b/mmseg/datasets/pipelines/formating.py new file mode 100644 index 0000000000000000000000000000000000000000..34061c1dd160d4b00aac8dbdc82dccf5c3883ce8 --- /dev/null +++ b/mmseg/datasets/pipelines/formating.py @@ -0,0 +1,288 @@ +from collections.abc import Sequence + +import mmcv +import numpy as np +import torch +from mmcv.parallel import DataContainer as DC + +from ..builder import PIPELINES + + +def to_tensor(data): + """Convert objects of various python types to :obj:`torch.Tensor`. + + Supported types are: :class:`numpy.ndarray`, :class:`torch.Tensor`, + :class:`Sequence`, :class:`int` and :class:`float`. + + Args: + data (torch.Tensor | numpy.ndarray | Sequence | int | float): Data to + be converted. + """ + + if isinstance(data, torch.Tensor): + return data + elif isinstance(data, np.ndarray): + return torch.from_numpy(data) + elif isinstance(data, Sequence) and not mmcv.is_str(data): + return torch.tensor(data) + elif isinstance(data, int): + return torch.LongTensor([data]) + elif isinstance(data, float): + return torch.FloatTensor([data]) + else: + raise TypeError(f'type {type(data)} cannot be converted to tensor.') + + +@PIPELINES.register_module() +class ToTensor(object): + """Convert some results to :obj:`torch.Tensor` by given keys. + + Args: + keys (Sequence[str]): Keys that need to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert data in results to :obj:`torch.Tensor`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted + to :obj:`torch.Tensor`. + """ + + for key in self.keys: + results[key] = to_tensor(results[key]) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class ImageToTensor(object): + """Convert image to :obj:`torch.Tensor` by given keys. + + The dimension order of input image is (H, W, C). The pipeline will convert + it to (C, H, W). If only 2 dimension (H, W) is given, the output would be + (1, H, W). + + Args: + keys (Sequence[str]): Key of images to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert image in results to :obj:`torch.Tensor` and + transpose the channel order. + + Args: + results (dict): Result dict contains the image data to convert. + + Returns: + dict: The result dict contains the image converted + to :obj:`torch.Tensor` and transposed to (C, H, W) order. + """ + + for key in self.keys: + img = results[key] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + results[key] = to_tensor(img.transpose(2, 0, 1)) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class Transpose(object): + """Transpose some results by given keys. + + Args: + keys (Sequence[str]): Keys of results to be transposed. + order (Sequence[int]): Order of transpose. + """ + + def __init__(self, keys, order): + self.keys = keys + self.order = order + + def __call__(self, results): + """Call function to convert image in results to :obj:`torch.Tensor` and + transpose the channel order. + + Args: + results (dict): Result dict contains the image data to convert. + + Returns: + dict: The result dict contains the image converted + to :obj:`torch.Tensor` and transposed to (C, H, W) order. + """ + + for key in self.keys: + results[key] = results[key].transpose(self.order) + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, order={self.order})' + + +@PIPELINES.register_module() +class ToDataContainer(object): + """Convert results to :obj:`mmcv.DataContainer` by given fields. + + Args: + fields (Sequence[dict]): Each field is a dict like + ``dict(key='xxx', **kwargs)``. The ``key`` in result will + be converted to :obj:`mmcv.DataContainer` with ``**kwargs``. + Default: ``(dict(key='img', stack=True), + dict(key='gt_semantic_seg'))``. + """ + + def __init__(self, + fields=(dict(key='img', + stack=True), dict(key='gt_semantic_seg'))): + self.fields = fields + + def __call__(self, results): + """Call function to convert data in results to + :obj:`mmcv.DataContainer`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted to + :obj:`mmcv.DataContainer`. + """ + + for field in self.fields: + field = field.copy() + key = field.pop('key') + results[key] = DC(results[key], **field) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(fields={self.fields})' + + +@PIPELINES.register_module() +class DefaultFormatBundle(object): + """Default formatting bundle. + + It simplifies the pipeline of formatting common fields, including "img" + and "gt_semantic_seg". These fields are formatted as follows. + + - img: (1)transpose, (2)to tensor, (3)to DataContainer (stack=True) + - gt_semantic_seg: (1)unsqueeze dim-0 (2)to tensor, + (3)to DataContainer (stack=True) + """ + + def __call__(self, results): + """Call function to transform and format common fields in results. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data that is formatted with + default bundle. + """ + + if 'img' in results: + img = results['img'] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + img = np.ascontiguousarray(img.transpose(2, 0, 1)) + results['img'] = DC(to_tensor(img), stack=True) + if 'gt_semantic_seg' in results: + # convert to long + results['gt_semantic_seg'] = DC( + to_tensor(results['gt_semantic_seg'][None, + ...].astype(np.int64)), + stack=True) + return results + + def __repr__(self): + return self.__class__.__name__ + + +@PIPELINES.register_module() +class Collect(object): + """Collect data from the loader relevant to the specific task. + + This is usually the last stage of the data loader pipeline. Typically keys + is set to some subset of "img", "gt_semantic_seg". + + The "img_meta" item is always populated. The contents of the "img_meta" + dictionary depends on "meta_keys". By default this includes: + + - "img_shape": shape of the image input to the network as a tuple + (h, w, c). Note that images may be zero padded on the bottom/right + if the batch tensor is larger than this shape. + + - "scale_factor": a float indicating the preprocessing scale + + - "flip": a boolean indicating if image flip transform was used + + - "filename": path to the image file + + - "ori_shape": original shape of the image as a tuple (h, w, c) + + - "pad_shape": image shape after padding + + - "img_norm_cfg": a dict of normalization information: + - mean - per channel mean subtraction + - std - per channel std divisor + - to_rgb - bool indicating if bgr was converted to rgb + + Args: + keys (Sequence[str]): Keys of results to be collected in ``data``. + meta_keys (Sequence[str], optional): Meta keys to be converted to + ``mmcv.DataContainer`` and collected in ``data[img_metas]``. + Default: ``('filename', 'ori_filename', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'img_norm_cfg')`` + """ + + def __init__(self, + keys, + meta_keys=('filename', 'ori_filename', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'img_norm_cfg')): + self.keys = keys + self.meta_keys = meta_keys + + def __call__(self, results): + """Call function to collect keys in results. The keys in ``meta_keys`` + will be converted to :obj:mmcv.DataContainer. + + Args: + results (dict): Result dict contains the data to collect. + + Returns: + dict: The result dict contains the following keys + - keys in``self.keys`` + - ``img_metas`` + """ + + data = {} + img_meta = {} + for key in self.meta_keys: + img_meta[key] = results[key] + data['img_metas'] = DC(img_meta, cpu_only=True) + for key in self.keys: + data[key] = results[key] + return data + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, meta_keys={self.meta_keys})' diff --git a/mmseg/datasets/pipelines/loading.py b/mmseg/datasets/pipelines/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..fdfc496ba96828a435febbef958fdae499d034f7 --- /dev/null +++ b/mmseg/datasets/pipelines/loading.py @@ -0,0 +1,153 @@ +import os.path as osp + +import mmcv +import numpy as np + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class LoadImageFromFile(object): + """Load an image from file. + + Required keys are "img_prefix" and "img_info" (a dict that must contain the + key "filename"). Added or updated keys are "filename", "img", "img_shape", + "ori_shape" (same as `img_shape`), "pad_shape" (same as `img_shape`), + "scale_factor" (1.0) and "img_norm_cfg" (means=0 and stds=1). + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + color_type (str): The flag argument for :func:`mmcv.imfrombytes`. + Defaults to 'color'. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + imdecode_backend (str): Backend for :func:`mmcv.imdecode`. Default: + 'cv2' + """ + + def __init__(self, + to_float32=False, + color_type='color', + file_client_args=dict(backend='disk'), + imdecode_backend='cv2'): + self.to_float32 = to_float32 + self.color_type = color_type + self.file_client_args = file_client_args.copy() + self.file_client = None + self.imdecode_backend = imdecode_backend + + def __call__(self, results): + """Call functions to load image and get image meta information. + + Args: + results (dict): Result dict from :obj:`mmseg.CustomDataset`. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results.get('img_prefix') is not None: + filename = osp.join(results['img_prefix'], + results['img_info']['filename']) + else: + filename = results['img_info']['filename'] + img_bytes = self.file_client.get(filename) + img = mmcv.imfrombytes( + img_bytes, flag=self.color_type, backend=self.imdecode_backend) + if self.to_float32: + img = img.astype(np.float32) + + results['filename'] = filename + results['ori_filename'] = results['img_info']['filename'] + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + num_channels = 1 if len(img.shape) < 3 else img.shape[2] + results['img_norm_cfg'] = dict( + mean=np.zeros(num_channels, dtype=np.float32), + std=np.ones(num_channels, dtype=np.float32), + to_rgb=False) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(to_float32={self.to_float32},' + repr_str += f"color_type='{self.color_type}'," + repr_str += f"imdecode_backend='{self.imdecode_backend}')" + return repr_str + + +@PIPELINES.register_module() +class LoadAnnotations(object): + """Load annotations for semantic segmentation. + + Args: + reduce_zero_label (bool): Whether reduce all label value by 1. + Usually used for datasets where 0 is background label. + Default: False. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + imdecode_backend (str): Backend for :func:`mmcv.imdecode`. Default: + 'pillow' + """ + + def __init__(self, + reduce_zero_label=False, + file_client_args=dict(backend='disk'), + imdecode_backend='pillow'): + self.reduce_zero_label = reduce_zero_label + self.file_client_args = file_client_args.copy() + self.file_client = None + self.imdecode_backend = imdecode_backend + + def __call__(self, results): + """Call function to load multiple types annotations. + + Args: + results (dict): Result dict from :obj:`mmseg.CustomDataset`. + + Returns: + dict: The dict contains loaded semantic segmentation annotations. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results.get('seg_prefix', None) is not None: + filename = osp.join(results['seg_prefix'], + results['ann_info']['seg_map']) + else: + filename = results['ann_info']['seg_map'] + img_bytes = self.file_client.get(filename) + gt_semantic_seg = mmcv.imfrombytes( + img_bytes, flag='unchanged', + backend=self.imdecode_backend).squeeze().astype(np.uint8) + # modify if custom classes + if results.get('label_map', None) is not None: + for old_id, new_id in results['label_map'].items(): + gt_semantic_seg[gt_semantic_seg == old_id] = new_id + # reduce zero_label + if self.reduce_zero_label: + # avoid using underflow conversion + gt_semantic_seg[gt_semantic_seg == 0] = 255 + gt_semantic_seg = gt_semantic_seg - 1 + gt_semantic_seg[gt_semantic_seg == 254] = 255 + results['gt_semantic_seg'] = gt_semantic_seg + results['seg_fields'].append('gt_semantic_seg') + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(reduce_zero_label={self.reduce_zero_label},' + repr_str += f"imdecode_backend='{self.imdecode_backend}')" + return repr_str diff --git a/mmseg/datasets/pipelines/test_time_aug.py b/mmseg/datasets/pipelines/test_time_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..473a12bc86b57e564c415ff8bdb1e431425370db --- /dev/null +++ b/mmseg/datasets/pipelines/test_time_aug.py @@ -0,0 +1,133 @@ +import warnings + +import mmcv + +from ..builder import PIPELINES +from .compose import Compose + + +@PIPELINES.register_module() +class MultiScaleFlipAug(object): + """Test-time augmentation with multiple scales and flipping. + + An example configuration is as followed: + + .. code-block:: + + img_scale=(2048, 1024), + img_ratios=[0.5, 1.0], + flip=True, + 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']), + ] + + After MultiScaleFLipAug with above configuration, the results are wrapped + into lists of the same length as followed: + + .. code-block:: + + dict( + img=[...], + img_shape=[...], + scale=[(1024, 512), (1024, 512), (2048, 1024), (2048, 1024)] + flip=[False, True, False, True] + ... + ) + + Args: + transforms (list[dict]): Transforms to apply in each augmentation. + img_scale (None | tuple | list[tuple]): Images scales for resizing. + img_ratios (float | list[float]): Image ratios for resizing + flip (bool): Whether apply flip augmentation. Default: False. + flip_direction (str | list[str]): Flip augmentation directions, + options are "horizontal" and "vertical". If flip_direction is list, + multiple flip augmentations will be applied. + It has no effect when flip == False. Default: "horizontal". + """ + + def __init__(self, + transforms, + img_scale, + img_ratios=None, + flip=False, + flip_direction='horizontal'): + self.transforms = Compose(transforms) + if img_ratios is not None: + img_ratios = img_ratios if isinstance(img_ratios, + list) else [img_ratios] + assert mmcv.is_list_of(img_ratios, float) + if img_scale is None: + # mode 1: given img_scale=None and a range of image ratio + self.img_scale = None + assert mmcv.is_list_of(img_ratios, float) + elif isinstance(img_scale, tuple) and mmcv.is_list_of( + img_ratios, float): + assert len(img_scale) == 2 + # mode 2: given a scale and a range of image ratio + self.img_scale = [(int(img_scale[0] * ratio), + int(img_scale[1] * ratio)) + for ratio in img_ratios] + else: + # mode 3: given multiple scales + self.img_scale = img_scale if isinstance(img_scale, + list) else [img_scale] + assert mmcv.is_list_of(self.img_scale, tuple) or self.img_scale is None + self.flip = flip + self.img_ratios = img_ratios + self.flip_direction = flip_direction if isinstance( + flip_direction, list) else [flip_direction] + assert mmcv.is_list_of(self.flip_direction, str) + if not self.flip and self.flip_direction != ['horizontal']: + warnings.warn( + 'flip_direction has no effect when flip is set to False') + if (self.flip + and not any([t['type'] == 'RandomFlip' for t in transforms])): + warnings.warn( + 'flip has no effect when RandomFlip is not in transforms') + + def __call__(self, results): + """Call function to apply test time augment transforms on results. + + Args: + results (dict): Result dict contains the data to transform. + + Returns: + dict[str: list]: The augmented data, where each value is wrapped + into a list. + """ + + aug_data = [] + if self.img_scale is None and mmcv.is_list_of(self.img_ratios, float): + h, w = results['img'].shape[:2] + img_scale = [(int(w * ratio), int(h * ratio)) + for ratio in self.img_ratios] + else: + img_scale = self.img_scale + flip_aug = [False, True] if self.flip else [False] + for scale in img_scale: + for flip in flip_aug: + for direction in self.flip_direction: + _results = results.copy() + _results['scale'] = scale + _results['flip'] = flip + _results['flip_direction'] = direction + data = self.transforms(_results) + aug_data.append(data) + # list of dict to dict of list + aug_data_dict = {key: [] for key in aug_data[0]} + for data in aug_data: + for key, val in data.items(): + aug_data_dict[key].append(val) + return aug_data_dict + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(transforms={self.transforms}, ' + repr_str += f'img_scale={self.img_scale}, flip={self.flip})' + repr_str += f'flip_direction={self.flip_direction}' + return repr_str diff --git a/mmseg/datasets/pipelines/transforms.py b/mmseg/datasets/pipelines/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..e168280adcb47724263ae9a164953b057e470724 --- /dev/null +++ b/mmseg/datasets/pipelines/transforms.py @@ -0,0 +1,890 @@ +import mmcv +import numpy as np +from mmcv.utils import deprecated_api_warning, is_tuple_of +from numpy import random + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class Resize(object): + """Resize images & seg. + + This transform resizes the input image to some scale. If the input dict + contains the key "scale", then the scale in the input dict is used, + otherwise the specified scale in the init method is used. + + ``img_scale`` can be Nong, a tuple (single-scale) or a list of tuple + (multi-scale). There are 4 multiscale modes: + + - ``ratio_range is not None``: + 1. When img_scale is None, img_scale is the shape of image in results + (img_scale = results['img'].shape[:2]) and the image is resized based + on the original size. (mode 1) + 2. When img_scale is a tuple (single-scale), randomly sample a ratio from + the ratio range and multiply it with the image scale. (mode 2) + + - ``ratio_range is None and multiscale_mode == "range"``: randomly sample a + scale from the a range. (mode 3) + + - ``ratio_range is None and multiscale_mode == "value"``: randomly sample a + scale from multiple scales. (mode 4) + + Args: + img_scale (tuple or list[tuple]): Images scales for resizing. + multiscale_mode (str): Either "range" or "value". + ratio_range (tuple[float]): (min_ratio, max_ratio) + keep_ratio (bool): Whether to keep the aspect ratio when resizing the + image. + """ + + def __init__(self, + img_scale=None, + multiscale_mode='range', + ratio_range=None, + keep_ratio=True): + if img_scale is None: + self.img_scale = None + else: + if isinstance(img_scale, list): + self.img_scale = img_scale + else: + self.img_scale = [img_scale] + assert mmcv.is_list_of(self.img_scale, tuple) + + if ratio_range is not None: + # mode 1: given img_scale=None and a range of image ratio + # mode 2: given a scale and a range of image ratio + assert self.img_scale is None or len(self.img_scale) == 1 + else: + # mode 3 and 4: given multiple scales or a range of scales + assert multiscale_mode in ['value', 'range'] + + self.multiscale_mode = multiscale_mode + self.ratio_range = ratio_range + self.keep_ratio = keep_ratio + + @staticmethod + def random_select(img_scales): + """Randomly select an img_scale from given candidates. + + Args: + img_scales (list[tuple]): Images scales for selection. + + Returns: + (tuple, int): Returns a tuple ``(img_scale, scale_dix)``, + where ``img_scale`` is the selected image scale and + ``scale_idx`` is the selected index in the given candidates. + """ + + assert mmcv.is_list_of(img_scales, tuple) + scale_idx = np.random.randint(len(img_scales)) + img_scale = img_scales[scale_idx] + return img_scale, scale_idx + + @staticmethod + def random_sample(img_scales): + """Randomly sample an img_scale when ``multiscale_mode=='range'``. + + Args: + img_scales (list[tuple]): Images scale range for sampling. + There must be two tuples in img_scales, which specify the lower + and uper bound of image scales. + + Returns: + (tuple, None): Returns a tuple ``(img_scale, None)``, where + ``img_scale`` is sampled scale and None is just a placeholder + to be consistent with :func:`random_select`. + """ + + assert mmcv.is_list_of(img_scales, tuple) and len(img_scales) == 2 + img_scale_long = [max(s) for s in img_scales] + img_scale_short = [min(s) for s in img_scales] + long_edge = np.random.randint( + min(img_scale_long), + max(img_scale_long) + 1) + short_edge = np.random.randint( + min(img_scale_short), + max(img_scale_short) + 1) + img_scale = (long_edge, short_edge) + return img_scale, None + + @staticmethod + def random_sample_ratio(img_scale, ratio_range): + """Randomly sample an img_scale when ``ratio_range`` is specified. + + A ratio will be randomly sampled from the range specified by + ``ratio_range``. Then it would be multiplied with ``img_scale`` to + generate sampled scale. + + Args: + img_scale (tuple): Images scale base to multiply with ratio. + ratio_range (tuple[float]): The minimum and maximum ratio to scale + the ``img_scale``. + + Returns: + (tuple, None): Returns a tuple ``(scale, None)``, where + ``scale`` is sampled ratio multiplied with ``img_scale`` and + None is just a placeholder to be consistent with + :func:`random_select`. + """ + + assert isinstance(img_scale, tuple) and len(img_scale) == 2 + min_ratio, max_ratio = ratio_range + assert min_ratio <= max_ratio + ratio = np.random.random_sample() * (max_ratio - min_ratio) + min_ratio + scale = int(img_scale[0] * ratio), int(img_scale[1] * ratio) + return scale, None + + def _random_scale(self, results): + """Randomly sample an img_scale according to ``ratio_range`` and + ``multiscale_mode``. + + If ``ratio_range`` is specified, a ratio will be sampled and be + multiplied with ``img_scale``. + If multiple scales are specified by ``img_scale``, a scale will be + sampled according to ``multiscale_mode``. + Otherwise, single scale will be used. + + Args: + results (dict): Result dict from :obj:`dataset`. + + Returns: + dict: Two new keys 'scale` and 'scale_idx` are added into + ``results``, which would be used by subsequent pipelines. + """ + + if self.ratio_range is not None: + if self.img_scale is None: + h, w = results['img'].shape[:2] + scale, scale_idx = self.random_sample_ratio((w, h), + self.ratio_range) + else: + scale, scale_idx = self.random_sample_ratio( + self.img_scale[0], self.ratio_range) + elif len(self.img_scale) == 1: + scale, scale_idx = self.img_scale[0], 0 + elif self.multiscale_mode == 'range': + scale, scale_idx = self.random_sample(self.img_scale) + elif self.multiscale_mode == 'value': + scale, scale_idx = self.random_select(self.img_scale) + else: + raise NotImplementedError + + results['scale'] = scale + results['scale_idx'] = scale_idx + + def _resize_img(self, results): + """Resize images with ``results['scale']``.""" + if self.keep_ratio: + img, scale_factor = mmcv.imrescale( + results['img'], results['scale'], return_scale=True) + # the w_scale and h_scale has minor difference + # a real fix should be done in the mmcv.imrescale in the future + new_h, new_w = img.shape[:2] + h, w = results['img'].shape[:2] + w_scale = new_w / w + h_scale = new_h / h + else: + img, w_scale, h_scale = mmcv.imresize( + results['img'], results['scale'], return_scale=True) + scale_factor = np.array([w_scale, h_scale, w_scale, h_scale], + dtype=np.float32) + results['img'] = img + results['img_shape'] = img.shape + results['pad_shape'] = img.shape # in case that there is no padding + results['scale_factor'] = scale_factor + results['keep_ratio'] = self.keep_ratio + + def _resize_seg(self, results): + """Resize semantic segmentation map with ``results['scale']``.""" + for key in results.get('seg_fields', []): + if self.keep_ratio: + gt_seg = mmcv.imrescale( + results[key], results['scale'], interpolation='nearest') + else: + gt_seg = mmcv.imresize( + results[key], results['scale'], interpolation='nearest') + results[key] = gt_seg + + def __call__(self, results): + """Call function to resize images, bounding boxes, masks, semantic + segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Resized results, 'img_shape', 'pad_shape', 'scale_factor', + 'keep_ratio' keys are added into result dict. + """ + + if 'scale' not in results: + self._random_scale(results) + self._resize_img(results) + self._resize_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(img_scale={self.img_scale}, ' + f'multiscale_mode={self.multiscale_mode}, ' + f'ratio_range={self.ratio_range}, ' + f'keep_ratio={self.keep_ratio})') + return repr_str + + +@PIPELINES.register_module() +class RandomFlip(object): + """Flip the image & seg. + + If the input dict contains the key "flip", then the flag will be used, + otherwise it will be randomly decided by a ratio specified in the init + method. + + Args: + prob (float, optional): The flipping probability. Default: None. + direction(str, optional): The flipping direction. Options are + 'horizontal' and 'vertical'. Default: 'horizontal'. + """ + + @deprecated_api_warning({'flip_ratio': 'prob'}, cls_name='RandomFlip') + def __init__(self, prob=None, direction='horizontal'): + self.prob = prob + self.direction = direction + if prob is not None: + assert prob >= 0 and prob <= 1 + assert direction in ['horizontal', 'vertical'] + + def __call__(self, results): + """Call function to flip bounding boxes, masks, semantic segmentation + maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Flipped results, 'flip', 'flip_direction' keys are added into + result dict. + """ + + if 'flip' not in results: + flip = True if np.random.rand() < self.prob else False + results['flip'] = flip + if 'flip_direction' not in results: + results['flip_direction'] = self.direction + if results['flip']: + # flip image + results['img'] = mmcv.imflip( + results['img'], direction=results['flip_direction']) + + # flip segs + for key in results.get('seg_fields', []): + # use copy() to make numpy stride positive + results[key] = mmcv.imflip( + results[key], direction=results['flip_direction']).copy() + return results + + def __repr__(self): + return self.__class__.__name__ + f'(prob={self.prob})' + + +@PIPELINES.register_module() +class Pad(object): + """Pad the image & mask. + + There are two padding modes: (1) pad to a fixed size and (2) pad to the + minimum size that is divisible by some number. + Added keys are "pad_shape", "pad_fixed_size", "pad_size_divisor", + + Args: + size (tuple, optional): Fixed padding size. + size_divisor (int, optional): The divisor of padded size. + pad_val (float, optional): Padding value. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + """ + + def __init__(self, + size=None, + size_divisor=None, + pad_val=0, + seg_pad_val=255): + self.size = size + self.size_divisor = size_divisor + self.pad_val = pad_val + self.seg_pad_val = seg_pad_val + # only one of size and size_divisor should be valid + assert size is not None or size_divisor is not None + assert size is None or size_divisor is None + + def _pad_img(self, results): + """Pad images according to ``self.size``.""" + if self.size is not None: + padded_img = mmcv.impad( + results['img'], shape=self.size, pad_val=self.pad_val) + elif self.size_divisor is not None: + padded_img = mmcv.impad_to_multiple( + results['img'], self.size_divisor, pad_val=self.pad_val) + results['img'] = padded_img + results['pad_shape'] = padded_img.shape + results['pad_fixed_size'] = self.size + results['pad_size_divisor'] = self.size_divisor + + def _pad_seg(self, results): + """Pad masks according to ``results['pad_shape']``.""" + for key in results.get('seg_fields', []): + results[key] = mmcv.impad( + results[key], + shape=results['pad_shape'][:2], + pad_val=self.seg_pad_val) + + def __call__(self, results): + """Call function to pad images, masks, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Updated result dict. + """ + + self._pad_img(results) + self._pad_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(size={self.size}, size_divisor={self.size_divisor}, ' \ + f'pad_val={self.pad_val})' + return repr_str + + +@PIPELINES.register_module() +class Normalize(object): + """Normalize the image. + + Added key is "img_norm_cfg". + + Args: + mean (sequence): Mean values of 3 channels. + std (sequence): Std values of 3 channels. + to_rgb (bool): Whether to convert the image from BGR to RGB, + default is true. + """ + + def __init__(self, mean, std, to_rgb=True): + self.mean = np.array(mean, dtype=np.float32) + self.std = np.array(std, dtype=np.float32) + self.to_rgb = to_rgb + + def __call__(self, results): + """Call function to normalize images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Normalized results, 'img_norm_cfg' key is added into + result dict. + """ + + results['img'] = mmcv.imnormalize(results['img'], self.mean, self.std, + self.to_rgb) + results['img_norm_cfg'] = dict( + mean=self.mean, std=self.std, to_rgb=self.to_rgb) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(mean={self.mean}, std={self.std}, to_rgb=' \ + f'{self.to_rgb})' + return repr_str + + +@PIPELINES.register_module() +class Rerange(object): + """Rerange the image pixel value. + + Args: + min_value (float or int): Minimum value of the reranged image. + Default: 0. + max_value (float or int): Maximum value of the reranged image. + Default: 255. + """ + + def __init__(self, min_value=0, max_value=255): + assert isinstance(min_value, float) or isinstance(min_value, int) + assert isinstance(max_value, float) or isinstance(max_value, int) + assert min_value < max_value + self.min_value = min_value + self.max_value = max_value + + def __call__(self, results): + """Call function to rerange images. + + Args: + results (dict): Result dict from loading pipeline. + Returns: + dict: Reranged results. + """ + + img = results['img'] + img_min_value = np.min(img) + img_max_value = np.max(img) + + assert img_min_value < img_max_value + # rerange to [0, 1] + img = (img - img_min_value) / (img_max_value - img_min_value) + # rerange to [min_value, max_value] + img = img * (self.max_value - self.min_value) + self.min_value + results['img'] = img + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(min_value={self.min_value}, max_value={self.max_value})' + return repr_str + + +@PIPELINES.register_module() +class CLAHE(object): + """Use CLAHE method to process the image. + + See `ZUIDERVELD,K. Contrast Limited Adaptive Histogram Equalization[J]. + Graphics Gems, 1994:474-485.` for more information. + + Args: + clip_limit (float): Threshold for contrast limiting. Default: 40.0. + tile_grid_size (tuple[int]): Size of grid for histogram equalization. + Input image will be divided into equally sized rectangular tiles. + It defines the number of tiles in row and column. Default: (8, 8). + """ + + def __init__(self, clip_limit=40.0, tile_grid_size=(8, 8)): + assert isinstance(clip_limit, (float, int)) + self.clip_limit = clip_limit + assert is_tuple_of(tile_grid_size, int) + assert len(tile_grid_size) == 2 + self.tile_grid_size = tile_grid_size + + def __call__(self, results): + """Call function to Use CLAHE method process images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + for i in range(results['img'].shape[2]): + results['img'][:, :, i] = mmcv.clahe( + np.array(results['img'][:, :, i], dtype=np.uint8), + self.clip_limit, self.tile_grid_size) + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(clip_limit={self.clip_limit}, '\ + f'tile_grid_size={self.tile_grid_size})' + return repr_str + + +@PIPELINES.register_module() +class RandomCrop(object): + """Random crop the image & seg. + + Args: + crop_size (tuple): Expected size after cropping, (h, w). + cat_max_ratio (float): The maximum ratio that single category could + occupy. + """ + + def __init__(self, crop_size, cat_max_ratio=1., ignore_index=255): + assert crop_size[0] > 0 and crop_size[1] > 0 + self.crop_size = crop_size + self.cat_max_ratio = cat_max_ratio + self.ignore_index = ignore_index + + def get_crop_bbox(self, img): + """Randomly get a crop bounding box.""" + margin_h = max(img.shape[0] - self.crop_size[0], 0) + margin_w = max(img.shape[1] - self.crop_size[1], 0) + offset_h = np.random.randint(0, margin_h + 1) + offset_w = np.random.randint(0, margin_w + 1) + crop_y1, crop_y2 = offset_h, offset_h + self.crop_size[0] + crop_x1, crop_x2 = offset_w, offset_w + self.crop_size[1] + + return crop_y1, crop_y2, crop_x1, crop_x2 + + def crop(self, img, crop_bbox): + """Crop from ``img``""" + crop_y1, crop_y2, crop_x1, crop_x2 = crop_bbox + img = img[crop_y1:crop_y2, crop_x1:crop_x2, ...] + return img + + def __call__(self, results): + """Call function to randomly crop images, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + + img = results['img'] + crop_bbox = self.get_crop_bbox(img) + if self.cat_max_ratio < 1.: + # Repeat 10 times + for _ in range(10): + seg_temp = self.crop(results['gt_semantic_seg'], crop_bbox) + labels, cnt = np.unique(seg_temp, return_counts=True) + cnt = cnt[labels != self.ignore_index] + if len(cnt) > 1 and np.max(cnt) / np.sum( + cnt) < self.cat_max_ratio: + break + crop_bbox = self.get_crop_bbox(img) + + # crop the image + img = self.crop(img, crop_bbox) + img_shape = img.shape + results['img'] = img + results['img_shape'] = img_shape + + # crop semantic seg + for key in results.get('seg_fields', []): + results[key] = self.crop(results[key], crop_bbox) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(crop_size={self.crop_size})' + + +@PIPELINES.register_module() +class RandomRotate(object): + """Rotate the image & seg. + + Args: + prob (float): The rotation probability. + degree (float, tuple[float]): Range of degrees to select from. If + degree is a number instead of tuple like (min, max), + the range of degree will be (``-degree``, ``+degree``) + pad_val (float, optional): Padding value of image. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + center (tuple[float], optional): Center point (w, h) of the rotation in + the source image. If not specified, the center of the image will be + used. Default: None. + auto_bound (bool): Whether to adjust the image size to cover the whole + rotated image. Default: False + """ + + def __init__(self, + prob, + degree, + pad_val=0, + seg_pad_val=255, + center=None, + auto_bound=False): + self.prob = prob + assert prob >= 0 and prob <= 1 + if isinstance(degree, (float, int)): + assert degree > 0, f'degree {degree} should be positive' + self.degree = (-degree, degree) + else: + self.degree = degree + assert len(self.degree) == 2, f'degree {self.degree} should be a ' \ + f'tuple of (min, max)' + self.pal_val = pad_val + self.seg_pad_val = seg_pad_val + self.center = center + self.auto_bound = auto_bound + + def __call__(self, results): + """Call function to rotate image, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Rotated results. + """ + + rotate = True if np.random.rand() < self.prob else False + degree = np.random.uniform(min(*self.degree), max(*self.degree)) + if rotate: + # rotate image + results['img'] = mmcv.imrotate( + results['img'], + angle=degree, + border_value=self.pal_val, + center=self.center, + auto_bound=self.auto_bound) + + # rotate segs + for key in results.get('seg_fields', []): + results[key] = mmcv.imrotate( + results[key], + angle=degree, + border_value=self.seg_pad_val, + center=self.center, + auto_bound=self.auto_bound, + interpolation='nearest') + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' \ + f'degree={self.degree}, ' \ + f'pad_val={self.pal_val}, ' \ + f'seg_pad_val={self.seg_pad_val}, ' \ + f'center={self.center}, ' \ + f'auto_bound={self.auto_bound})' + return repr_str + + +@PIPELINES.register_module() +class RGB2Gray(object): + """Convert RGB image to grayscale image. + + This transform calculate the weighted mean of input image channels with + ``weights`` and then expand the channels to ``out_channels``. When + ``out_channels`` is None, the number of output channels is the same as + input channels. + + Args: + out_channels (int): Expected number of output channels after + transforming. Default: None. + weights (tuple[float]): The weights to calculate the weighted mean. + Default: (0.299, 0.587, 0.114). + """ + + def __init__(self, out_channels=None, weights=(0.299, 0.587, 0.114)): + assert out_channels is None or out_channels > 0 + self.out_channels = out_channels + assert isinstance(weights, tuple) + for item in weights: + assert isinstance(item, (float, int)) + self.weights = weights + + def __call__(self, results): + """Call function to convert RGB image to grayscale image. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with grayscale image. + """ + img = results['img'] + assert len(img.shape) == 3 + assert img.shape[2] == len(self.weights) + weights = np.array(self.weights).reshape((1, 1, -1)) + img = (img * weights).sum(2, keepdims=True) + if self.out_channels is None: + img = img.repeat(weights.shape[2], axis=2) + else: + img = img.repeat(self.out_channels, axis=2) + + results['img'] = img + results['img_shape'] = img.shape + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(out_channels={self.out_channels}, ' \ + f'weights={self.weights})' + return repr_str + + +@PIPELINES.register_module() +class AdjustGamma(object): + """Using gamma correction to process the image. + + Args: + gamma (float or int): Gamma value used in gamma correction. + Default: 1.0. + """ + + def __init__(self, gamma=1.0): + assert isinstance(gamma, float) or isinstance(gamma, int) + assert gamma > 0 + self.gamma = gamma + inv_gamma = 1.0 / gamma + self.table = np.array([(i / 255.0)**inv_gamma * 255 + for i in np.arange(256)]).astype('uint8') + + def __call__(self, results): + """Call function to process the image with gamma correction. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + results['img'] = mmcv.lut_transform( + np.array(results['img'], dtype=np.uint8), self.table) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(gamma={self.gamma})' + + +@PIPELINES.register_module() +class SegRescale(object): + """Rescale semantic segmentation maps. + + Args: + scale_factor (float): The scale factor of the final output. + """ + + def __init__(self, scale_factor=1): + self.scale_factor = scale_factor + + def __call__(self, results): + """Call function to scale the semantic segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with semantic segmentation map scaled. + """ + for key in results.get('seg_fields', []): + if self.scale_factor != 1: + results[key] = mmcv.imrescale( + results[key], self.scale_factor, interpolation='nearest') + return results + + def __repr__(self): + return self.__class__.__name__ + f'(scale_factor={self.scale_factor})' + + +@PIPELINES.register_module() +class PhotoMetricDistortion(object): + """Apply photometric distortion to image sequentially, every transformation + is applied with a probability of 0.5. The position of random contrast is in + second or second to last. + + 1. random brightness + 2. random contrast (mode 0) + 3. convert color from BGR to HSV + 4. random saturation + 5. random hue + 6. convert color from HSV to BGR + 7. random contrast (mode 1) + 8. randomly swap channels + + Args: + brightness_delta (int): delta of brightness. + contrast_range (tuple): range of contrast. + saturation_range (tuple): range of saturation. + hue_delta (int): delta of hue. + """ + + def __init__(self, + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18): + self.brightness_delta = brightness_delta + self.contrast_lower, self.contrast_upper = contrast_range + self.saturation_lower, self.saturation_upper = saturation_range + self.hue_delta = hue_delta + + def convert(self, img, alpha=1, beta=0): + """Multiple with alpha and add beat with clip.""" + img = img.astype(np.float32) * alpha + beta + img = np.clip(img, 0, 255) + return img.astype(np.uint8) + + def brightness(self, img): + """Brightness distortion.""" + if random.randint(2): + return self.convert( + img, + beta=random.uniform(-self.brightness_delta, + self.brightness_delta)) + return img + + def contrast(self, img): + """Contrast distortion.""" + if random.randint(2): + return self.convert( + img, + alpha=random.uniform(self.contrast_lower, self.contrast_upper)) + return img + + def saturation(self, img): + """Saturation distortion.""" + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, 1] = self.convert( + img[:, :, 1], + alpha=random.uniform(self.saturation_lower, + self.saturation_upper)) + img = mmcv.hsv2bgr(img) + return img + + def hue(self, img): + """Hue distortion.""" + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, + 0] = (img[:, :, 0].astype(int) + + random.randint(-self.hue_delta, self.hue_delta)) % 180 + img = mmcv.hsv2bgr(img) + return img + + def __call__(self, results): + """Call function to perform photometric distortion on images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images distorted. + """ + + img = results['img'] + # random brightness + img = self.brightness(img) + + # mode == 0 --> do random contrast first + # mode == 1 --> do random contrast last + mode = random.randint(2) + if mode == 1: + img = self.contrast(img) + + # random saturation + img = self.saturation(img) + + # random hue + img = self.hue(img) + + # random contrast + if mode == 0: + img = self.contrast(img) + + results['img'] = img + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(brightness_delta={self.brightness_delta}, ' + f'contrast_range=({self.contrast_lower}, ' + f'{self.contrast_upper}), ' + f'saturation_range=({self.saturation_lower}, ' + f'{self.saturation_upper}), ' + f'hue_delta={self.hue_delta})') + return repr_str diff --git a/mmseg/datasets/stare.py b/mmseg/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..cbd14e0920e7f6a73baff1432e5a32ccfdb0dfae --- /dev/null +++ b/mmseg/datasets/stare.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class STAREDataset(CustomDataset): + """STARE dataset. + + In segmentation map annotation for STARE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.ah.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(STAREDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='.ah.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/voc.py b/mmseg/datasets/voc.py new file mode 100644 index 0000000000000000000000000000000000000000..a8855203b14ee0dc4da9099a2945d4aedcffbcd6 --- /dev/null +++ b/mmseg/datasets/voc.py @@ -0,0 +1,29 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class PascalVOCDataset(CustomDataset): + """Pascal VOC dataset. + + Args: + split (str): Split txt file for Pascal VOC. + """ + + CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', + 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', + 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', + 'train', 'tvmonitor') + + PALETTE = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] + + def __init__(self, split, **kwargs): + super(PascalVOCDataset, self).__init__( + img_suffix='.jpg', seg_map_suffix='.png', split=split, **kwargs) + assert osp.exists(self.img_dir) and self.split is not None diff --git a/mmseg/models/__init__.py b/mmseg/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3cf93f8bec9cf0cef0a3bd76ca3ca92eb188f535 --- /dev/null +++ b/mmseg/models/__init__.py @@ -0,0 +1,12 @@ +from .backbones import * # noqa: F401,F403 +from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone, + build_head, build_loss, build_segmentor) +from .decode_heads import * # noqa: F401,F403 +from .losses import * # noqa: F401,F403 +from .necks import * # noqa: F401,F403 +from .segmentors import * # noqa: F401,F403 + +__all__ = [ + 'BACKBONES', 'HEADS', 'LOSSES', 'SEGMENTORS', 'build_backbone', + 'build_head', 'build_loss', 'build_segmentor' +] diff --git a/mmseg/models/backbones/__init__.py b/mmseg/models/backbones/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3af488d160df596ea0d55a40226603ee660471fb --- /dev/null +++ b/mmseg/models/backbones/__init__.py @@ -0,0 +1,19 @@ +from .cgnet import CGNet +from .fast_scnn import FastSCNN +from .hrnet import HRNet +from .mobilenet_v2 import MobileNetV2 +from .mobilenet_v3 import MobileNetV3 +from .resnest import ResNeSt +from .resnet import ResNet, ResNetV1c, ResNetV1d +from .resnext import ResNeXt +from .unet import UNet +from .pvt import pvt_small, pvt_small_f4, pvt_tiny +from .vit import VisionTransformer +from .vit_mla import VIT_MLA + +__all__ = [ + 'ResNet', 'ResNetV1c', 'ResNetV1d', 'ResNeXt', 'HRNet', 'FastSCNN', + 'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet', 'MobileNetV3', + 'pvt_small', 'pvt_small_f4', 'pvt_tiny', + 'VisionTransformer', 'VIT_MLA' +] diff --git a/mmseg/models/backbones/cgnet.py b/mmseg/models/backbones/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..968d171cd4b28b4670ef3cd01a6a407875ee478e --- /dev/null +++ b/mmseg/models/backbones/cgnet.py @@ -0,0 +1,367 @@ +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer, + constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES + + +class GlobalContextExtractor(nn.Module): + """Global Context Extractor for CGNet. + + This class is employed to refine the joFint feature of both local feature + and surrounding context. + + Args: + channel (int): Number of input feature channels. + reduction (int): Reductions for global context extractor. Default: 16. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, channel, reduction=16, with_cp=False): + super(GlobalContextExtractor, self).__init__() + self.channel = channel + self.reduction = reduction + assert reduction >= 1 and channel >= reduction + self.with_cp = with_cp + self.avg_pool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Sequential( + nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), + nn.Linear(channel // reduction, channel), nn.Sigmoid()) + + def forward(self, x): + + def _inner_forward(x): + num_batch, num_channel = x.size()[:2] + y = self.avg_pool(x).view(num_batch, num_channel) + y = self.fc(y).view(num_batch, num_channel, 1, 1) + return x * y + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class ContextGuidedBlock(nn.Module): + """Context Guided Block for CGNet. + + This class consists of four components: local feature extractor, + surrounding feature extractor, joint feature extractor and global + context extractor. + + Args: + in_channels (int): Number of input feature channels. + out_channels (int): Number of output feature channels. + dilation (int): Dilation rate for surrounding context extractor. + Default: 2. + reduction (int): Reduction for global context extractor. Default: 16. + skip_connect (bool): Add input to output or not. Default: True. + downsample (bool): Downsample the input to 1/2 or not. Default: False. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels, + out_channels, + dilation=2, + reduction=16, + skip_connect=True, + downsample=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + with_cp=False): + super(ContextGuidedBlock, self).__init__() + self.with_cp = with_cp + self.downsample = downsample + + channels = out_channels if downsample else out_channels // 2 + if 'type' in act_cfg and act_cfg['type'] == 'PReLU': + act_cfg['num_parameters'] = channels + kernel_size = 3 if downsample else 1 + stride = 2 if downsample else 1 + padding = (kernel_size - 1) // 2 + + self.conv1x1 = ConvModule( + in_channels, + channels, + kernel_size, + stride, + padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.f_loc = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=1, + groups=channels, + bias=False) + self.f_sur = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=dilation, + groups=channels, + dilation=dilation, + bias=False) + + self.bn = build_norm_layer(norm_cfg, 2 * channels)[1] + self.activate = nn.PReLU(2 * channels) + + if downsample: + self.bottleneck = build_conv_layer( + conv_cfg, + 2 * channels, + out_channels, + kernel_size=1, + bias=False) + + self.skip_connect = skip_connect and not downsample + self.f_glo = GlobalContextExtractor(out_channels, reduction, with_cp) + + def forward(self, x): + + def _inner_forward(x): + out = self.conv1x1(x) + loc = self.f_loc(out) + sur = self.f_sur(out) + + joi_feat = torch.cat([loc, sur], 1) # the joint feature + joi_feat = self.bn(joi_feat) + joi_feat = self.activate(joi_feat) + if self.downsample: + joi_feat = self.bottleneck(joi_feat) # channel = out_channels + # f_glo is employed to refine the joint feature + out = self.f_glo(joi_feat) + + if self.skip_connect: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InputInjection(nn.Module): + """Downsampling module for CGNet.""" + + def __init__(self, num_downsampling): + super(InputInjection, self).__init__() + self.pool = nn.ModuleList() + for i in range(num_downsampling): + self.pool.append(nn.AvgPool2d(3, stride=2, padding=1)) + + def forward(self, x): + for pool in self.pool: + x = pool(x) + return x + + +@BACKBONES.register_module() +class CGNet(nn.Module): + """CGNet backbone. + + A Light-weight Context Guided Network for Semantic Segmentation + arXiv: https://arxiv.org/abs/1811.08201 + + Args: + in_channels (int): Number of input image channels. Normally 3. + num_channels (tuple[int]): Numbers of feature channels at each stages. + Default: (32, 64, 128). + num_blocks (tuple[int]): Numbers of CG blocks at stage 1 and stage 2. + Default: (3, 21). + dilations (tuple[int]): Dilation rate for surrounding context + extractors at stage 1 and stage 2. Default: (2, 4). + reductions (tuple[int]): Reductions for global context extractors at + stage 1 and stage 2. Default: (8, 16). + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16), + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + norm_eval=False, + with_cp=False): + + super(CGNet, self).__init__() + self.in_channels = in_channels + self.num_channels = num_channels + assert isinstance(self.num_channels, tuple) and len( + self.num_channels) == 3 + self.num_blocks = num_blocks + assert isinstance(self.num_blocks, tuple) and len(self.num_blocks) == 2 + self.dilations = dilations + assert isinstance(self.dilations, tuple) and len(self.dilations) == 2 + self.reductions = reductions + assert isinstance(self.reductions, tuple) and len(self.reductions) == 2 + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + if 'type' in self.act_cfg and self.act_cfg['type'] == 'PReLU': + self.act_cfg['num_parameters'] = num_channels[0] + self.norm_eval = norm_eval + self.with_cp = with_cp + + cur_channels = in_channels + self.stem = nn.ModuleList() + for i in range(3): + self.stem.append( + ConvModule( + cur_channels, + num_channels[0], + 3, + 2 if i == 0 else 1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + cur_channels = num_channels[0] + + self.inject_2x = InputInjection(1) # down-sample for Input, factor=2 + self.inject_4x = InputInjection(2) # down-sample for Input, factor=4 + + cur_channels += in_channels + self.norm_prelu_0 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 1 + self.level1 = nn.ModuleList() + for i in range(num_blocks[0]): + self.level1.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[1], + num_channels[1], + dilations[0], + reductions[0], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[1] + in_channels + self.norm_prelu_1 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 2 + self.level2 = nn.ModuleList() + for i in range(num_blocks[1]): + self.level2.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[2], + num_channels[2], + dilations[1], + reductions[1], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[2] + self.norm_prelu_2 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + def forward(self, x): + output = [] + + # stage 0 + inp_2x = self.inject_2x(x) + inp_4x = self.inject_4x(x) + for layer in self.stem: + x = layer(x) + x = self.norm_prelu_0(torch.cat([x, inp_2x], 1)) + output.append(x) + + # stage 1 + for i, layer in enumerate(self.level1): + x = layer(x) + if i == 0: + down1 = x + x = self.norm_prelu_1(torch.cat([x, down1, inp_4x], 1)) + output.append(x) + + # stage 2 + for i, layer in enumerate(self.level2): + x = layer(x) + if i == 0: + down2 = x + x = self.norm_prelu_2(torch.cat([down2, x], 1)) + output.append(x) + + return output + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, (nn.Conv2d, nn.Linear)): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + elif isinstance(m, nn.PReLU): + constant_init(m, 0) + else: + raise TypeError('pretrained must be a str or None') + + def train(self, mode=True): + """Convert the model into training mode whill keeping the normalization + layer freezed.""" + super(CGNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/fast_scnn.py b/mmseg/models/backbones/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..ee115ffda1b32d9ab2181541f54489168cf6a3ec --- /dev/null +++ b/mmseg/models/backbones/fast_scnn.py @@ -0,0 +1,375 @@ +import torch +import torch.nn as nn +from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init, + kaiming_init) +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.models.decode_heads.psp_head import PPM +from mmseg.ops import resize +from ..builder import BACKBONES +from ..utils.inverted_residual import InvertedResidual + + +class LearningToDownsample(nn.Module): + """Learning to downsample module. + + Args: + in_channels (int): Number of input channels. + dw_channels (tuple[int]): Number of output channels of the first and + the second depthwise conv (dwconv) layers. + out_channels (int): Number of output channels of the whole + 'learning to downsample' module. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + """ + + def __init__(self, + in_channels, + dw_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU')): + super(LearningToDownsample, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + dw_channels1 = dw_channels[0] + dw_channels2 = dw_channels[1] + + self.conv = ConvModule( + in_channels, + dw_channels1, + 3, + stride=2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.dsconv1 = DepthwiseSeparableConvModule( + dw_channels1, + dw_channels2, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg) + self.dsconv2 = DepthwiseSeparableConvModule( + dw_channels2, + out_channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg) + + def forward(self, x): + x = self.conv(x) + x = self.dsconv1(x) + x = self.dsconv2(x) + return x + + +class GlobalFeatureExtractor(nn.Module): + """Global feature extractor module. + + Args: + in_channels (int): Number of input channels of the GFE module. + Default: 64 + block_channels (tuple[int]): Tuple of ints. Each int specifies the + number of output channels of each Inverted Residual module. + Default: (64, 96, 128) + out_channels(int): Number of output channels of the GFE module. + Default: 128 + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + Default: 6 + num_blocks (tuple[int]): Tuple of ints. Each int specifies the + number of times each Inverted Residual module is repeated. + The repeated Inverted Residual modules are called a 'group'. + Default: (3, 3, 3) + strides (tuple[int]): Tuple of ints. Each int specifies + the downsampling factor of each 'group'. + Default: (2, 2, 1) + pool_scales (tuple[int]): Tuple of ints. Each int specifies + the parameter required in 'global average pooling' within PPM. + Default: (1, 2, 3, 6) + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + in_channels=64, + block_channels=(64, 96, 128), + out_channels=128, + expand_ratio=6, + num_blocks=(3, 3, 3), + strides=(2, 2, 1), + pool_scales=(1, 2, 3, 6), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + super(GlobalFeatureExtractor, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + assert len(block_channels) == len(num_blocks) == 3 + self.bottleneck1 = self._make_layer(in_channels, block_channels[0], + num_blocks[0], strides[0], + expand_ratio) + self.bottleneck2 = self._make_layer(block_channels[0], + block_channels[1], num_blocks[1], + strides[1], expand_ratio) + self.bottleneck3 = self._make_layer(block_channels[1], + block_channels[2], num_blocks[2], + strides[2], expand_ratio) + self.ppm = PPM( + pool_scales, + block_channels[2], + block_channels[2] // 4, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=align_corners) + self.out = ConvModule( + block_channels[2] * 2, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _make_layer(self, + in_channels, + out_channels, + blocks, + stride=1, + expand_ratio=6): + layers = [ + InvertedResidual( + in_channels, + out_channels, + stride, + expand_ratio, + norm_cfg=self.norm_cfg) + ] + for i in range(1, blocks): + layers.append( + InvertedResidual( + out_channels, + out_channels, + 1, + expand_ratio, + norm_cfg=self.norm_cfg)) + return nn.Sequential(*layers) + + def forward(self, x): + x = self.bottleneck1(x) + x = self.bottleneck2(x) + x = self.bottleneck3(x) + x = torch.cat([x, *self.ppm(x)], dim=1) + x = self.out(x) + return x + + +class FeatureFusionModule(nn.Module): + """Feature fusion module. + + Args: + higher_in_channels (int): Number of input channels of the + higher-resolution branch. + lower_in_channels (int): Number of input channels of the + lower-resolution branch. + out_channels (int): Number of output channels. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + higher_in_channels, + lower_in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + super(FeatureFusionModule, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.dwconv = ConvModule( + lower_in_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.conv_lower_res = ConvModule( + out_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.conv_higher_res = ConvModule( + higher_in_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.relu = nn.ReLU(True) + + def forward(self, higher_res_feature, lower_res_feature): + lower_res_feature = resize( + lower_res_feature, + size=higher_res_feature.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + lower_res_feature = self.dwconv(lower_res_feature) + lower_res_feature = self.conv_lower_res(lower_res_feature) + + higher_res_feature = self.conv_higher_res(higher_res_feature) + out = higher_res_feature + lower_res_feature + return self.relu(out) + + +@BACKBONES.register_module() +class FastSCNN(nn.Module): + """Fast-SCNN Backbone. + + Args: + in_channels (int): Number of input image channels. Default: 3. + downsample_dw_channels (tuple[int]): Number of output channels after + the first conv layer & the second conv layer in + Learning-To-Downsample (LTD) module. + Default: (32, 48). + global_in_channels (int): Number of input channels of + Global Feature Extractor(GFE). + Equal to number of output channels of LTD. + Default: 64. + global_block_channels (tuple[int]): Tuple of integers that describe + the output channels for each of the MobileNet-v2 bottleneck + residual blocks in GFE. + Default: (64, 96, 128). + global_block_strides (tuple[int]): Tuple of integers + that describe the strides (downsampling factors) for each of the + MobileNet-v2 bottleneck residual blocks in GFE. + Default: (2, 2, 1). + global_out_channels (int): Number of output channels of GFE. + Default: 128. + higher_in_channels (int): Number of input channels of the higher + resolution branch in FFM. + Equal to global_in_channels. + Default: 64. + lower_in_channels (int): Number of input channels of the lower + resolution branch in FFM. + Equal to global_out_channels. + Default: 128. + fusion_out_channels (int): Number of output channels of FFM. + Default: 128. + out_indices (tuple): Tuple of indices of list + [higher_res_features, lower_res_features, fusion_output]. + Often set to (0,1,2) to enable aux. heads. + Default: (0, 1, 2). + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + in_channels=3, + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + + super(FastSCNN, self).__init__() + if global_in_channels != higher_in_channels: + raise AssertionError('Global Input Channels must be the same \ + with Higher Input Channels!') + elif global_out_channels != lower_in_channels: + raise AssertionError('Global Output Channels must be the same \ + with Lower Input Channels!') + + self.in_channels = in_channels + self.downsample_dw_channels1 = downsample_dw_channels[0] + self.downsample_dw_channels2 = downsample_dw_channels[1] + self.global_in_channels = global_in_channels + self.global_block_channels = global_block_channels + self.global_block_strides = global_block_strides + self.global_out_channels = global_out_channels + self.higher_in_channels = higher_in_channels + self.lower_in_channels = lower_in_channels + self.fusion_out_channels = fusion_out_channels + self.out_indices = out_indices + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.learning_to_downsample = LearningToDownsample( + in_channels, + downsample_dw_channels, + global_in_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.global_feature_extractor = GlobalFeatureExtractor( + global_in_channels, + global_block_channels, + global_out_channels, + strides=self.global_block_strides, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.feature_fusion = FeatureFusionModule( + higher_in_channels, + lower_in_channels, + fusion_out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + + def init_weights(self, pretrained=None): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + def forward(self, x): + higher_res_features = self.learning_to_downsample(x) + lower_res_features = self.global_feature_extractor(higher_res_features) + fusion_output = self.feature_fusion(higher_res_features, + lower_res_features) + + outs = [higher_res_features, lower_res_features, fusion_output] + outs = [outs[i] for i in self.out_indices] + return tuple(outs) diff --git a/mmseg/models/backbones/helpers.py b/mmseg/models/backbones/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..3687f281bd6bbe5bedb58f3bdcb1bfec0b366a30 --- /dev/null +++ b/mmseg/models/backbones/helpers.py @@ -0,0 +1,137 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +import math +import logging +import warnings +import errno +import os +import sys +import re +import zipfile +from urllib.parse import urlparse # noqa: F401 + +HASH_REGEX = re.compile(r'-([a-f0-9]*)\.') +_logger = logging.getLogger(__name__) + + +def load_state_dict_from_url(url, model_dir=None, file_name=None, check_hash=False, progress=True, map_location=None): + # Issue warning to move data if old env is set + if os.getenv('TORCH_MODEL_ZOO'): + warnings.warn('TORCH_MODEL_ZOO is deprecated, please use env TORCH_HOME instead') + + if model_dir is None: + hub_dir = torch.hub.get_dir() + model_dir = os.path.join(hub_dir, 'checkpoints') + try: + os.makedirs(model_dir) + except OSError as e: + if e.errno == errno.EEXIST: + # Directory already exists, ignore. + pass + else: + # Unexpected OSError, re-raise. + raise + parts = urlparse(url) + filename = os.path.basename(parts.path) + if file_name is not None: + filename = file_name + cached_file = os.path.join(model_dir, filename) + if not os.path.exists(cached_file): + sys.stderr.write('Downloading: "{}" to {}\n'.format(url, cached_file)) + hash_prefix = HASH_REGEX.search(filename).group(1) if check_hash else None + torch.hub.download_url_to_file(url, cached_file, hash_prefix, progress=progress) + if zipfile.is_zipfile(cached_file): + state_dict = torch.load(cached_file, map_location=map_location)['model'] + else: + state_dict = torch.load(cached_file, map_location=map_location) + return state_dict + + +def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False): + if cfg is None: + cfg = getattr(model, 'default_cfg') + if cfg is None or 'url' not in cfg or not cfg['url']: + _logger.warning("Pretrained model URL is invalid, using random initialization.") + return + + if 'pretrained_finetune' in cfg and cfg['pretrained_finetune']: + state_dict = torch.load(cfg['pretrained_finetune']) + print('load pre-trained weight from ' + cfg['pretrained_finetune']) + else: + state_dict = load_state_dict_from_url(cfg['url'], progress=False, map_location='cpu') + print('load pre-trained weight from imagenet21k') + + + if filter_fn is not None: + state_dict = filter_fn(state_dict) + + if in_chans == 1: + conv1_name = cfg['first_conv'] + _logger.info('Converting first conv (%s) pretrained weights from 3 to 1 channel' % conv1_name) + conv1_weight = state_dict[conv1_name + '.weight'] + # Some weights are in torch.half, ensure it's float for sum on CPU + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I > 3: + assert conv1_weight.shape[1] % 3 == 0 + # For models with space2depth stems + conv1_weight = conv1_weight.reshape(O, I // 3, 3, J, K) + conv1_weight = conv1_weight.sum(dim=2, keepdim=False) + else: + conv1_weight = conv1_weight.sum(dim=1, keepdim=True) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + elif in_chans != 3: + conv1_name = cfg['first_conv'] + conv1_weight = state_dict[conv1_name + '.weight'] + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I == 3: + _logger.warning('Deleting first conv (%s) from pretrained weights.' % conv1_name) + del state_dict[conv1_name + '.weight'] + strict = False + else: + # NOTE this strategy should be better than random init, but there could be other combinations of + # the original RGB input layer weights that'd work better for specific cases. + _logger.info('Repeating first conv (%s) weights in channel dim.' % conv1_name) + repeat = int(math.ceil(in_chans / 3)) + conv1_weight = conv1_weight.repeat(1, repeat, 1, 1)[:, :in_chans, :, :] + conv1_weight *= (3 / float(in_chans)) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + + classifier_name = cfg['classifier'] + if num_classes == 1000 and cfg['num_classes'] == 1001: + # special case for imagenet trained models with extra background class in pretrained weights + classifier_weight = state_dict[classifier_name + '.weight'] + state_dict[classifier_name + '.weight'] = classifier_weight[1:] + classifier_bias = state_dict[classifier_name + '.bias'] + state_dict[classifier_name + '.bias'] = classifier_bias[1:] + elif num_classes != cfg['num_classes']: + # completely discard fully connected for all other differences between pretrained and created model + del state_dict[classifier_name + '.weight'] + del state_dict[classifier_name + '.bias'] + strict = False + + + if pos_embed_interp: + n, c, hw = state_dict['pos_embed'].transpose(1, 2).shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = state_dict['pos_embed'][:, (-h * w):] + pos_embed_weight = pos_embed_weight.transpose(1,2) + n, c, hw = pos_embed_weight.shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = pos_embed_weight.view(n,c,h,w) + + pos_embed_weight = F.interpolate(pos_embed_weight, size=int(math.sqrt(num_patches)), mode='bilinear', align_corners=align_corners) + pos_embed_weight = pos_embed_weight.view(n,c,-1).transpose(1,2) + + cls_token_weight = state_dict['pos_embed'][:,0].unsqueeze(1) + + state_dict['pos_embed'] = torch.cat((cls_token_weight, pos_embed_weight), dim=1) + + model.load_state_dict(state_dict, strict=strict) diff --git a/mmseg/models/backbones/hrnet.py b/mmseg/models/backbones/hrnet.py new file mode 100644 index 0000000000000000000000000000000000000000..33f3ba86d884bc53d1e27dc491604dd30d317161 --- /dev/null +++ b/mmseg/models/backbones/hrnet.py @@ -0,0 +1,555 @@ +import torch.nn as nn +from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init, + kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.ops import Upsample, resize +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from .resnet import BasicBlock, Bottleneck + + +class HRModule(nn.Module): + """High-Resolution Module for HRNet. + + In this module, every branch has 4 BasicBlocks/Bottlenecks. Fusion/Exchange + is in this module. + """ + + def __init__(self, + num_branches, + blocks, + num_blocks, + in_channels, + num_channels, + multiscale_output=True, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True)): + super(HRModule, self).__init__() + self._check_branches(num_branches, num_blocks, in_channels, + num_channels) + + self.in_channels = in_channels + self.num_branches = num_branches + + self.multiscale_output = multiscale_output + self.norm_cfg = norm_cfg + self.conv_cfg = conv_cfg + self.with_cp = with_cp + self.branches = self._make_branches(num_branches, blocks, num_blocks, + num_channels) + self.fuse_layers = self._make_fuse_layers() + self.relu = nn.ReLU(inplace=False) + + def _check_branches(self, num_branches, num_blocks, in_channels, + num_channels): + """Check branches configuration.""" + if num_branches != len(num_blocks): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_BLOCKS(' \ + f'{len(num_blocks)})' + raise ValueError(error_msg) + + if num_branches != len(num_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_CHANNELS(' \ + f'{len(num_channels)})' + raise ValueError(error_msg) + + if num_branches != len(in_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_INCHANNELS(' \ + f'{len(in_channels)})' + raise ValueError(error_msg) + + def _make_one_branch(self, + branch_index, + block, + num_blocks, + num_channels, + stride=1): + """Build one branch.""" + downsample = None + if stride != 1 or \ + self.in_channels[branch_index] != \ + num_channels[branch_index] * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + self.in_channels[branch_index], + num_channels[branch_index] * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, num_channels[branch_index] * + block.expansion)[1]) + + layers = [] + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + self.in_channels[branch_index] = \ + num_channels[branch_index] * block.expansion + for i in range(1, num_blocks[branch_index]): + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*layers) + + def _make_branches(self, num_branches, block, num_blocks, num_channels): + """Build multiple branch.""" + branches = [] + + for i in range(num_branches): + branches.append( + self._make_one_branch(i, block, num_blocks, num_channels)) + + return nn.ModuleList(branches) + + def _make_fuse_layers(self): + """Build fuse layer.""" + if self.num_branches == 1: + return None + + num_branches = self.num_branches + in_channels = self.in_channels + fuse_layers = [] + num_out_branches = num_branches if self.multiscale_output else 1 + for i in range(num_out_branches): + fuse_layer = [] + for j in range(num_branches): + if j > i: + fuse_layer.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=1, + stride=1, + padding=0, + bias=False), + build_norm_layer(self.norm_cfg, in_channels[i])[1], + # we set align_corners=False for HRNet + Upsample( + scale_factor=2**(j - i), + mode='bilinear', + align_corners=False))) + elif j == i: + fuse_layer.append(None) + else: + conv_downsamples = [] + for k in range(i - j): + if k == i - j - 1: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[i])[1])) + else: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[j], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[j])[1], + nn.ReLU(inplace=False))) + fuse_layer.append(nn.Sequential(*conv_downsamples)) + fuse_layers.append(nn.ModuleList(fuse_layer)) + + return nn.ModuleList(fuse_layers) + + def forward(self, x): + """Forward function.""" + if self.num_branches == 1: + return [self.branches[0](x[0])] + + for i in range(self.num_branches): + x[i] = self.branches[i](x[i]) + + x_fuse = [] + for i in range(len(self.fuse_layers)): + y = 0 + for j in range(self.num_branches): + if i == j: + y += x[j] + elif j > i: + y = y + resize( + self.fuse_layers[i][j](x[j]), + size=x[i].shape[2:], + mode='bilinear', + align_corners=False) + else: + y += self.fuse_layers[i][j](x[j]) + x_fuse.append(self.relu(y)) + return x_fuse + + +@BACKBONES.register_module() +class HRNet(nn.Module): + """HRNet backbone. + + High-Resolution Representations for Labeling Pixels and Regions + arXiv: https://arxiv.org/abs/1904.04514 + + Args: + extra (dict): detailed configuration for each stage of HRNet. + in_channels (int): Number of input image channels. Normally 3. + conv_cfg (dict): dictionary to construct and config conv layer. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import HRNet + >>> import torch + >>> extra = dict( + >>> stage1=dict( + >>> num_modules=1, + >>> num_branches=1, + >>> block='BOTTLENECK', + >>> num_blocks=(4, ), + >>> num_channels=(64, )), + >>> stage2=dict( + >>> num_modules=1, + >>> num_branches=2, + >>> block='BASIC', + >>> num_blocks=(4, 4), + >>> num_channels=(32, 64)), + >>> stage3=dict( + >>> num_modules=4, + >>> num_branches=3, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4), + >>> num_channels=(32, 64, 128)), + >>> stage4=dict( + >>> num_modules=3, + >>> num_branches=4, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4, 4), + >>> num_channels=(32, 64, 128, 256))) + >>> self = HRNet(extra, in_channels=1) + >>> self.eval() + >>> inputs = torch.rand(1, 1, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 32, 8, 8) + (1, 64, 4, 4) + (1, 128, 2, 2) + (1, 256, 1, 1) + """ + + blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck} + + def __init__(self, + extra, + in_channels=3, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + with_cp=False, + zero_init_residual=False): + super(HRNet, self).__init__() + self.extra = extra + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + self.zero_init_residual = zero_init_residual + + # stem net + self.norm1_name, norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1) + self.norm2_name, norm2 = build_norm_layer(self.norm_cfg, 64, postfix=2) + + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + self.conv_cfg, + 64, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.relu = nn.ReLU(inplace=True) + + # stage 1 + self.stage1_cfg = self.extra['stage1'] + num_channels = self.stage1_cfg['num_channels'][0] + block_type = self.stage1_cfg['block'] + num_blocks = self.stage1_cfg['num_blocks'][0] + + block = self.blocks_dict[block_type] + stage1_out_channels = num_channels * block.expansion + self.layer1 = self._make_layer(block, 64, num_channels, num_blocks) + + # stage 2 + self.stage2_cfg = self.extra['stage2'] + num_channels = self.stage2_cfg['num_channels'] + block_type = self.stage2_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition1 = self._make_transition_layer([stage1_out_channels], + num_channels) + self.stage2, pre_stage_channels = self._make_stage( + self.stage2_cfg, num_channels) + + # stage 3 + self.stage3_cfg = self.extra['stage3'] + num_channels = self.stage3_cfg['num_channels'] + block_type = self.stage3_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition2 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage3, pre_stage_channels = self._make_stage( + self.stage3_cfg, num_channels) + + # stage 4 + self.stage4_cfg = self.extra['stage4'] + num_channels = self.stage4_cfg['num_channels'] + block_type = self.stage4_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition3 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage4, pre_stage_channels = self._make_stage( + self.stage4_cfg, num_channels) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: the normalization layer named "norm2" """ + return getattr(self, self.norm2_name) + + def _make_transition_layer(self, num_channels_pre_layer, + num_channels_cur_layer): + """Make transition layer.""" + num_branches_cur = len(num_channels_cur_layer) + num_branches_pre = len(num_channels_pre_layer) + + transition_layers = [] + for i in range(num_branches_cur): + if i < num_branches_pre: + if num_channels_cur_layer[i] != num_channels_pre_layer[i]: + transition_layers.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + num_channels_pre_layer[i], + num_channels_cur_layer[i], + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + num_channels_cur_layer[i])[1], + nn.ReLU(inplace=True))) + else: + transition_layers.append(None) + else: + conv_downsamples = [] + for j in range(i + 1 - num_branches_pre): + in_channels = num_channels_pre_layer[-1] + out_channels = num_channels_cur_layer[i] \ + if j == i - num_branches_pre else in_channels + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + out_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, out_channels)[1], + nn.ReLU(inplace=True))) + transition_layers.append(nn.Sequential(*conv_downsamples)) + + return nn.ModuleList(transition_layers) + + def _make_layer(self, block, inplanes, planes, blocks, stride=1): + """Make each layer.""" + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, planes * block.expansion)[1]) + + layers = [] + layers.append( + block( + inplanes, + planes, + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append( + block( + inplanes, + planes, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*layers) + + def _make_stage(self, layer_config, in_channels, multiscale_output=True): + """Make each stage.""" + num_modules = layer_config['num_modules'] + num_branches = layer_config['num_branches'] + num_blocks = layer_config['num_blocks'] + num_channels = layer_config['num_channels'] + block = self.blocks_dict[layer_config['block']] + + hr_modules = [] + for i in range(num_modules): + # multi_scale_output is only used for the last module + if not multiscale_output and i == num_modules - 1: + reset_multiscale_output = False + else: + reset_multiscale_output = True + + hr_modules.append( + HRModule( + num_branches, + block, + num_blocks, + in_channels, + num_channels, + reset_multiscale_output, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*hr_modules), in_channels + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + if self.zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + constant_init(m.norm3, 0) + elif isinstance(m, BasicBlock): + constant_init(m.norm2, 0) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + """Forward function.""" + + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.conv2(x) + x = self.norm2(x) + x = self.relu(x) + x = self.layer1(x) + + x_list = [] + for i in range(self.stage2_cfg['num_branches']): + if self.transition1[i] is not None: + x_list.append(self.transition1[i](x)) + else: + x_list.append(x) + y_list = self.stage2(x_list) + + x_list = [] + for i in range(self.stage3_cfg['num_branches']): + if self.transition2[i] is not None: + x_list.append(self.transition2[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage3(x_list) + + x_list = [] + for i in range(self.stage4_cfg['num_branches']): + if self.transition3[i] is not None: + x_list.append(self.transition3[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage4(x_list) + + return y_list + + def train(self, mode=True): + """Convert the model into training mode whill keeping the normalization + layer freezed.""" + super(HRNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/layers/__init__.py b/mmseg/models/backbones/layers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..afd5f348b48afa6da4570255c269c73c3c73157e --- /dev/null +++ b/mmseg/models/backbones/layers/__init__.py @@ -0,0 +1,3 @@ +from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple +from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path +from .weight_init import trunc_normal_ \ No newline at end of file diff --git a/mmseg/models/backbones/layers/drop.py b/mmseg/models/backbones/layers/drop.py new file mode 100644 index 0000000000000000000000000000000000000000..6de9e3f729f7f1ca29d4511f6c64733d3169fbec --- /dev/null +++ b/mmseg/models/backbones/layers/drop.py @@ -0,0 +1,168 @@ +""" DropBlock, DropPath + +PyTorch implementations of DropBlock and DropPath (Stochastic Depth) regularization layers. + +Papers: +DropBlock: A regularization method for convolutional networks (https://arxiv.org/abs/1810.12890) + +Deep Networks with Stochastic Depth (https://arxiv.org/abs/1603.09382) + +Code: +DropBlock impl inspired by two Tensorflow impl that I liked: + - https://github.com/tensorflow/tpu/blob/master/models/official/resnet/resnet_model.py#L74 + - https://github.com/clovaai/assembled-cnn/blob/master/nets/blocks.py + +Hacked together by / Copyright 2020 Ross Wightman +""" +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def drop_block_2d( + x, drop_prob: float = 0.1, block_size: int = 7, gamma_scale: float = 1.0, + with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. This layer has been tested on a few training + runs with success, but needs further validation and possibly optimization for lower runtime impact. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + # seed_drop_rate, the gamma parameter + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + # Forces the block to be inside the feature map. + w_i, h_i = torch.meshgrid(torch.arange(W).to(x.device), torch.arange(H).to(x.device)) + valid_block = ((w_i >= clipped_block_size // 2) & (w_i < W - (clipped_block_size - 1) // 2)) & \ + ((h_i >= clipped_block_size // 2) & (h_i < H - (clipped_block_size - 1) // 2)) + valid_block = torch.reshape(valid_block, (1, 1, H, W)).to(dtype=x.dtype) + + if batchwise: + # one mask for whole batch, quite a bit faster + uniform_noise = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) + else: + uniform_noise = torch.rand_like(x) + block_mask = ((2 - gamma - valid_block + uniform_noise) >= 1).to(dtype=x.dtype) + block_mask = -F.max_pool2d( + -block_mask, + kernel_size=clipped_block_size, # block_size, + stride=1, + padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(block_mask).add_(normal_noise * (1 - block_mask)) + else: + x = x * block_mask + normal_noise * (1 - block_mask) + else: + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +def drop_block_fast_2d( + x: torch.Tensor, drop_prob: float = 0.1, block_size: int = 7, + gamma_scale: float = 1.0, with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. Simplied from above without concern for valid + block mask at edges. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + if batchwise: + # one mask for whole batch, quite a bit faster + block_mask = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) < gamma + else: + # mask per batch element + block_mask = torch.rand_like(x) < gamma + block_mask = F.max_pool2d( + block_mask.to(x.dtype), kernel_size=clipped_block_size, stride=1, padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(1. - block_mask).add_(normal_noise * block_mask) + else: + x = x * (1. - block_mask) + normal_noise * block_mask + else: + block_mask = 1 - block_mask + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(dtype=x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +class DropBlock2d(nn.Module): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + """ + def __init__(self, + drop_prob=0.1, + block_size=7, + gamma_scale=1.0, + with_noise=False, + inplace=False, + batchwise=False, + fast=True): + super(DropBlock2d, self).__init__() + self.drop_prob = drop_prob + self.gamma_scale = gamma_scale + self.block_size = block_size + self.with_noise = with_noise + self.inplace = inplace + self.batchwise = batchwise + self.fast = fast # FIXME finish comparisons of fast vs not + + def forward(self, x): + if not self.training or not self.drop_prob: + return x + if self.fast: + return drop_block_fast_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + else: + return drop_block_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + + +def drop_path(x, drop_prob: float = 0., training: bool = False): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets + random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device) + random_tensor.floor_() # binarize + output = x.div(keep_prob) * random_tensor + return output + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + """ + def __init__(self, drop_prob=None): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training) diff --git a/mmseg/models/backbones/layers/helpers.py b/mmseg/models/backbones/layers/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..65521132c6a8d911e51e8f95abfeeba2f20843b1 --- /dev/null +++ b/mmseg/models/backbones/layers/helpers.py @@ -0,0 +1,26 @@ +""" Layer/Module Helpers + +Hacked together by / Copyright 2020 Ross Wightman +""" +from itertools import repeat +from torch._six import container_abcs + + +# From PyTorch internals +def _ntuple(n): + def parse(x): + if isinstance(x, container_abcs.Iterable): + return x + return tuple(repeat(x, n)) + return parse + + +to_1tuple = _ntuple(1) +to_2tuple = _ntuple(2) +to_3tuple = _ntuple(3) +to_4tuple = _ntuple(4) +to_ntuple = _ntuple + + + + diff --git a/mmseg/models/backbones/layers/weight_init.py b/mmseg/models/backbones/layers/weight_init.py new file mode 100644 index 0000000000000000000000000000000000000000..d731029ff1708776758d9af60e5b205818940a6d --- /dev/null +++ b/mmseg/models/backbones/layers/weight_init.py @@ -0,0 +1,60 @@ +import torch +import math +import warnings + + +def _no_grad_trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1. + math.erf(x / math.sqrt(2.))) / 2. + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn("mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2) + + with torch.no_grad(): + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.): + # type: (Tensor, float, float, float, float) -> Tensor + r"""Fills the input Tensor with values drawn from a truncated + normal distribution. The values are effectively drawn from the + normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + return _no_grad_trunc_normal_(tensor, mean, std, a, b) diff --git a/mmseg/models/backbones/mobilenet_v2.py b/mmseg/models/backbones/mobilenet_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..5820b4b13c0019d67801c5f924650e928acca72e --- /dev/null +++ b/mmseg/models/backbones/mobilenet_v2.py @@ -0,0 +1,180 @@ +import logging + +import torch.nn as nn +from mmcv.cnn import ConvModule, constant_init, kaiming_init +from mmcv.runner import load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import InvertedResidual, make_divisible + + +@BACKBONES.register_module() +class MobileNetV2(nn.Module): + """MobileNetV2 backbone. + + Args: + widen_factor (float): Width multiplier, multiply number of + channels in each layer by this amount. Default: 1.0. + strides (Sequence[int], optional): Strides of the first block of each + layer. If not specified, default config in ``arch_setting`` will + be used. + dilations (Sequence[int]): Dilation of each layer. + out_indices (None or Sequence[int]): Output from which stages. + Default: (7, ). + frozen_stages (int): Stages to be frozen (all param fixed). + Default: -1, which means not freezing any parameters. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + # Parameters to build layers. 3 parameters are needed to construct a + # layer, from left to right: expand_ratio, channel, num_blocks. + arch_settings = [[1, 16, 1], [6, 24, 2], [6, 32, 3], [6, 64, 4], + [6, 96, 3], [6, 160, 3], [6, 320, 1]] + + def __init__(self, + widen_factor=1., + strides=(1, 2, 2, 2, 1, 2, 1), + dilations=(1, 1, 1, 1, 1, 1, 1), + out_indices=(1, 2, 4, 6), + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + norm_eval=False, + with_cp=False): + super(MobileNetV2, self).__init__() + self.widen_factor = widen_factor + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == len(self.arch_settings) + self.out_indices = out_indices + for index in out_indices: + if index not in range(0, 7): + raise ValueError('the item in out_indices must in ' + f'range(0, 8). But received {index}') + + if frozen_stages not in range(-1, 7): + raise ValueError('frozen_stages must be in range(-1, 7). ' + f'But received {frozen_stages}') + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + + self.in_channels = make_divisible(32 * widen_factor, 8) + + self.conv1 = ConvModule( + in_channels=3, + out_channels=self.in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.layers = [] + + for i, layer_cfg in enumerate(self.arch_settings): + expand_ratio, channel, num_blocks = layer_cfg + stride = self.strides[i] + dilation = self.dilations[i] + out_channels = make_divisible(channel * widen_factor, 8) + inverted_res_layer = self.make_layer( + out_channels=out_channels, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + expand_ratio=expand_ratio) + layer_name = f'layer{i + 1}' + self.add_module(layer_name, inverted_res_layer) + self.layers.append(layer_name) + + def make_layer(self, out_channels, num_blocks, stride, dilation, + expand_ratio): + """Stack InvertedResidual blocks to build a layer for MobileNetV2. + + Args: + out_channels (int): out_channels of block. + num_blocks (int): Number of blocks. + stride (int): Stride of the first block. + dilation (int): Dilation of the first block. + expand_ratio (int): Expand the number of channels of the + hidden layer in InvertedResidual by this ratio. + """ + layers = [] + for i in range(num_blocks): + layers.append( + InvertedResidual( + self.in_channels, + out_channels, + stride if i == 0 else 1, + expand_ratio=expand_ratio, + dilation=dilation if i == 0 else 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + with_cp=self.with_cp)) + self.in_channels = out_channels + + return nn.Sequential(*layers) + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = logging.getLogger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + x = self.conv1(x) + + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for param in self.conv1.parameters(): + param.requires_grad = False + for i in range(1, self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(MobileNetV2, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/mobilenet_v3.py b/mmseg/models/backbones/mobilenet_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..104d8328af1536632770faa9e3d1827b1a364d5f --- /dev/null +++ b/mmseg/models/backbones/mobilenet_v3.py @@ -0,0 +1,255 @@ +import logging + +import mmcv +import torch.nn as nn +from mmcv.cnn import ConvModule, constant_init, kaiming_init +from mmcv.cnn.bricks import Conv2dAdaptivePadding +from mmcv.runner import load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import InvertedResidualV3 as InvertedResidual + + +@BACKBONES.register_module() +class MobileNetV3(nn.Module): + """MobileNetV3 backbone. + + This backbone is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + arch (str): Architechture of mobilnetv3, from {'small', 'large'}. + Default: 'small'. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + out_indices (tuple[int]): Output from which layer. + Default: (0, 1, 12). + frozen_stages (int): Stages to be frozen (all param fixed). + Defualt: -1, which means not freezing any parameters. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. + Defualt: False. + """ + # Parameters to build each block: + # [kernel size, mid channels, out channels, with_se, act type, stride] + arch_settings = { + 'small': [[3, 16, 16, True, 'ReLU', 2], # block0 layer1 os=4 + [3, 72, 24, False, 'ReLU', 2], # block1 layer2 os=8 + [3, 88, 24, False, 'ReLU', 1], + [5, 96, 40, True, 'HSwish', 2], # block2 layer4 os=16 + [5, 240, 40, True, 'HSwish', 1], + [5, 240, 40, True, 'HSwish', 1], + [5, 120, 48, True, 'HSwish', 1], # block3 layer7 os=16 + [5, 144, 48, True, 'HSwish', 1], + [5, 288, 96, True, 'HSwish', 2], # block4 layer9 os=32 + [5, 576, 96, True, 'HSwish', 1], + [5, 576, 96, True, 'HSwish', 1]], + 'large': [[3, 16, 16, False, 'ReLU', 1], # block0 layer1 os=2 + [3, 64, 24, False, 'ReLU', 2], # block1 layer2 os=4 + [3, 72, 24, False, 'ReLU', 1], + [5, 72, 40, True, 'ReLU', 2], # block2 layer4 os=8 + [5, 120, 40, True, 'ReLU', 1], + [5, 120, 40, True, 'ReLU', 1], + [3, 240, 80, False, 'HSwish', 2], # block3 layer7 os=16 + [3, 200, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 480, 112, True, 'HSwish', 1], # block4 layer11 os=16 + [3, 672, 112, True, 'HSwish', 1], + [5, 672, 160, True, 'HSwish', 2], # block5 layer13 os=32 + [5, 960, 160, True, 'HSwish', 1], + [5, 960, 160, True, 'HSwish', 1]] + } # yapf: disable + + def __init__(self, + arch='small', + conv_cfg=None, + norm_cfg=dict(type='BN'), + out_indices=(0, 1, 12), + frozen_stages=-1, + reduction_factor=1, + norm_eval=False, + with_cp=False): + super(MobileNetV3, self).__init__() + assert arch in self.arch_settings + assert isinstance(reduction_factor, int) and reduction_factor > 0 + assert mmcv.is_tuple_of(out_indices, int) + for index in out_indices: + if index not in range(0, len(self.arch_settings[arch]) + 2): + raise ValueError( + 'the item in out_indices must in ' + f'range(0, {len(self.arch_settings[arch])+2}). ' + f'But received {index}') + + if frozen_stages not in range(-1, len(self.arch_settings[arch]) + 2): + raise ValueError('frozen_stages must be in range(-1, ' + f'{len(self.arch_settings[arch])+2}). ' + f'But received {frozen_stages}') + self.arch = arch + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.reduction_factor = reduction_factor + self.norm_eval = norm_eval + self.with_cp = with_cp + self.layers = self._make_layer() + + def _make_layer(self): + layers = [] + + # build the first layer (layer0) + in_channels = 16 + layer = ConvModule( + in_channels=3, + out_channels=in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=dict(type='Conv2dAdaptivePadding'), + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + self.add_module('layer0', layer) + layers.append('layer0') + + layer_setting = self.arch_settings[self.arch] + for i, params in enumerate(layer_setting): + (kernel_size, mid_channels, out_channels, with_se, act, + stride) = params + + if self.arch == 'large' and i >= 12 or self.arch == 'small' and \ + i >= 8: + mid_channels = mid_channels // self.reduction_factor + out_channels = out_channels // self.reduction_factor + + if with_se: + se_cfg = dict( + channels=mid_channels, + ratio=4, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))) + else: + se_cfg = None + + layer = InvertedResidual( + in_channels=in_channels, + out_channels=out_channels, + mid_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + se_cfg=se_cfg, + with_expand_conv=(in_channels != mid_channels), + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type=act), + with_cp=self.with_cp) + in_channels = out_channels + layer_name = 'layer{}'.format(i + 1) + self.add_module(layer_name, layer) + layers.append(layer_name) + + # build the last layer + # block5 layer12 os=32 for small model + # block6 layer16 os=32 for large model + layer = ConvModule( + in_channels=in_channels, + out_channels=576 if self.arch == 'small' else 960, + kernel_size=1, + stride=1, + dilation=4, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + layer_name = 'layer{}'.format(len(layer_setting) + 1) + self.add_module(layer_name, layer) + layers.append(layer_name) + + # next, convert backbone MobileNetV3 to a semantic segmentation version + if self.arch == 'small': + self.layer4.depthwise_conv.conv.stride = (1, 1) + self.layer9.depthwise_conv.conv.stride = (1, 1) + for i in range(4, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 9: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + else: + self.layer7.depthwise_conv.conv.stride = (1, 1) + self.layer13.depthwise_conv.conv.stride = (1, 1) + for i in range(7, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 13: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + + return layers + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = logging.getLogger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, nn.BatchNorm2d): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + return outs + + def _freeze_stages(self): + for i in range(self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(MobileNetV3, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/pvt.py b/mmseg/models/backbones/pvt.py new file mode 100644 index 0000000000000000000000000000000000000000..cc4ac2909decc7cf9fcd7f72ffa02a83d0ead75d --- /dev/null +++ b/mmseg/models/backbones/pvt.py @@ -0,0 +1,336 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial + +from timm.models.layers import DropPath, to_2tuple, trunc_normal_ +from timm.models.registry import register_model +from timm.models.vision_transformer import _cfg +from ..builder import BACKBONES +from mmseg.utils import get_root_logger +from mmcv.runner import load_checkpoint + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1): + super().__init__() + assert dim % num_heads == 0, f"dim {dim} should be divided by num_heads {num_heads}." + + self.dim = dim + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + self.q = nn.Linear(dim, dim, bias=qkv_bias) + self.kv = nn.Linear(dim, dim * 2, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + self.sr_ratio = sr_ratio + if sr_ratio > 1: + self.sr = nn.Conv2d(dim, dim, kernel_size=sr_ratio, stride=sr_ratio) + self.norm = nn.LayerNorm(dim) + + def forward(self, x, H, W): + B, N, C = x.shape + q = self.q(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + + if self.sr_ratio > 1: + x_ = x.permute(0, 2, 1).reshape(B, C, H, W) + x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1) + x_ = self.norm(x_) + kv = self.kv(x_).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + else: + kv = self.kv(x).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + k, v = kv[0], kv[1] + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, sr_ratio=1): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, + num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, + attn_drop=attn_drop, proj_drop=drop, sr_ratio=sr_ratio) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x, H, W): + x = x + self.drop_path(self.attn(self.norm1(x), H, W)) + x = x + self.drop_path(self.mlp(self.norm2(x))) + + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + + self.img_size = img_size + self.patch_size = patch_size + assert img_size[0] % patch_size[0] == 0 and img_size[1] % patch_size[1] == 0, \ + f"img_size {img_size} should be divided by patch_size {patch_size}." + self.H, self.W = img_size[0] // patch_size[0], img_size[1] // patch_size[1] + self.num_patches = self.H * self.W + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + self.norm = nn.LayerNorm(embed_dim) + + def forward(self, x): + B, C, H, W = x.shape + + x = self.proj(x).flatten(2).transpose(1, 2) + x = self.norm(x) + H, W = H // self.patch_size[0], W // self.patch_size[1] + + return x, (H, W) + + +class PyramidVisionTransformer(nn.Module): + def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512], + num_heads=[1, 2, 4, 8], mlp_ratios=[4, 4, 4, 4], qkv_bias=False, qk_scale=None, drop_rate=0., + attn_drop_rate=0., drop_path_rate=0., norm_layer=nn.LayerNorm, + depths=[3, 4, 6, 3], sr_ratios=[8, 4, 2, 1], F4=False): + super().__init__() + self.num_classes = num_classes + self.depths = depths + self.F4 = F4 + + # patch_embed + self.patch_embed1 = PatchEmbed(img_size=img_size, patch_size=patch_size, in_chans=in_chans, + embed_dim=embed_dims[0]) + self.patch_embed2 = PatchEmbed(img_size=img_size // 4, patch_size=2, in_chans=embed_dims[0], + embed_dim=embed_dims[1]) + self.patch_embed3 = PatchEmbed(img_size=img_size // 8, patch_size=2, in_chans=embed_dims[1], + embed_dim=embed_dims[2]) + self.patch_embed4 = PatchEmbed(img_size=img_size // 16, patch_size=2, in_chans=embed_dims[2], + embed_dim=embed_dims[3]) + + # pos_embed + self.pos_embed1 = nn.Parameter(torch.zeros(1, self.patch_embed1.num_patches, embed_dims[0])) + self.pos_drop1 = nn.Dropout(p=drop_rate) + self.pos_embed2 = nn.Parameter(torch.zeros(1, self.patch_embed2.num_patches, embed_dims[1])) + self.pos_drop2 = nn.Dropout(p=drop_rate) + self.pos_embed3 = nn.Parameter(torch.zeros(1, self.patch_embed3.num_patches, embed_dims[2])) + self.pos_drop3 = nn.Dropout(p=drop_rate) + self.pos_embed4 = nn.Parameter(torch.zeros(1, self.patch_embed4.num_patches + 1, embed_dims[3])) + self.pos_drop4 = nn.Dropout(p=drop_rate) + + # transformer encoder + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule + cur = 0 + self.block1 = nn.ModuleList([Block( + dim=embed_dims[0], num_heads=num_heads[0], mlp_ratio=mlp_ratios[0], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[0]) + for i in range(depths[0])]) + + cur += depths[0] + self.block2 = nn.ModuleList([Block( + dim=embed_dims[1], num_heads=num_heads[1], mlp_ratio=mlp_ratios[1], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[1]) + for i in range(depths[1])]) + + cur += depths[1] + self.block3 = nn.ModuleList([Block( + dim=embed_dims[2], num_heads=num_heads[2], mlp_ratio=mlp_ratios[2], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[2]) + for i in range(depths[2])]) + + cur += depths[2] + self.block4 = nn.ModuleList([Block( + dim=embed_dims[3], num_heads=num_heads[3], mlp_ratio=mlp_ratios[3], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[3]) + for i in range(depths[3])]) + + # init weights + trunc_normal_(self.pos_embed1, std=.02) + trunc_normal_(self.pos_embed2, std=.02) + trunc_normal_(self.pos_embed3, std=.02) + trunc_normal_(self.pos_embed4, std=.02) + self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, map_location='cpu', strict=False, logger=logger) + + def reset_drop_path(self, drop_path_rate): + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(self.depths))] + cur = 0 + for i in range(self.depths[0]): + self.block1[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[0] + for i in range(self.depths[1]): + self.block2[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[1] + for i in range(self.depths[2]): + self.block3[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[2] + for i in range(self.depths[3]): + self.block4[i].drop_path.drop_prob = dpr[cur + i] + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + def _get_pos_embed(self, pos_embed, patch_embed, H, W): + if H * W == self.patch_embed1.num_patches: + return pos_embed + else: + return F.interpolate( + pos_embed.reshape(1, patch_embed.H, patch_embed.W, -1).permute(0, 3, 1, 2), + size=(H, W), mode="bilinear").reshape(1, -1, H * W).permute(0, 2, 1) + + def forward_features(self, x): + outs = [] + + B = x.shape[0] + + # stage 1 + x, (H, W) = self.patch_embed1(x) + pos_embed1 = self._get_pos_embed(self.pos_embed1, self.patch_embed1, H, W) + x = x + pos_embed1 + x = self.pos_drop1(x) + for blk in self.block1: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 2 + x, (H, W) = self.patch_embed2(x) + pos_embed2 = self._get_pos_embed(self.pos_embed2, self.patch_embed2, H, W) + x = x + pos_embed2 + x = self.pos_drop2(x) + for blk in self.block2: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 3 + x, (H, W) = self.patch_embed3(x) + pos_embed3 = self._get_pos_embed(self.pos_embed3, self.patch_embed3, H, W) + x = x + pos_embed3 + x = self.pos_drop3(x) + for blk in self.block3: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 4 + x, (H, W) = self.patch_embed4(x) + pos_embed4 = self._get_pos_embed(self.pos_embed4[:, 1:], self.patch_embed4, H, W) + x = x + pos_embed4 + x = self.pos_drop4(x) + for blk in self.block4: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + return outs + + def forward(self, x): + x = self.forward_features(x) + + if self.F4: + x = x[3:4] + + return x + + +def _conv_filter(state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + + return out_dict + + +@BACKBONES.register_module() +class pvt_tiny(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_tiny, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[2, 2, 2, 2], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) + + +@BACKBONES.register_module() +class pvt_small(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_small, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) + + +@BACKBONES.register_module() +class pvt_small_f4(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_small_f4, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2, F4=True) + + +@BACKBONES.register_module() +class pvt_large(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_large, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 8, 27, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) diff --git a/mmseg/models/backbones/resnest.py b/mmseg/models/backbones/resnest.py new file mode 100644 index 0000000000000000000000000000000000000000..8931decb876e4d46407fd177a5248fe2554e4062 --- /dev/null +++ b/mmseg/models/backbones/resnest.py @@ -0,0 +1,314 @@ +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNetV1d + + +class RSoftmax(nn.Module): + """Radix Softmax module in ``SplitAttentionConv2d``. + + Args: + radix (int): Radix of input. + groups (int): Groups of input. + """ + + def __init__(self, radix, groups): + super().__init__() + self.radix = radix + self.groups = groups + + def forward(self, x): + batch = x.size(0) + if self.radix > 1: + x = x.view(batch, self.groups, self.radix, -1).transpose(1, 2) + x = F.softmax(x, dim=1) + x = x.reshape(batch, -1) + else: + x = torch.sigmoid(x) + return x + + +class SplitAttentionConv2d(nn.Module): + """Split-Attention Conv2d in ResNeSt. + + Args: + in_channels (int): Same as nn.Conv2d. + out_channels (int): Same as nn.Conv2d. + kernel_size (int | tuple[int]): Same as nn.Conv2d. + stride (int | tuple[int]): Same as nn.Conv2d. + padding (int | tuple[int]): Same as nn.Conv2d. + dilation (int | tuple[int]): Same as nn.Conv2d. + groups (int): Same as nn.Conv2d. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels. Default: 4. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + dcn (dict): Config dict for DCN. Default: None. + """ + + def __init__(self, + in_channels, + channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + radix=2, + reduction_factor=4, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None): + super(SplitAttentionConv2d, self).__init__() + inter_channels = max(in_channels * radix // reduction_factor, 32) + self.radix = radix + self.groups = groups + self.channels = channels + self.with_dcn = dcn is not None + self.dcn = dcn + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if self.with_dcn and not fallback_on_stride: + assert conv_cfg is None, 'conv_cfg must be None for DCN' + conv_cfg = dcn + self.conv = build_conv_layer( + conv_cfg, + in_channels, + channels * radix, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups * radix, + bias=False) + self.norm0_name, norm0 = build_norm_layer( + norm_cfg, channels * radix, postfix=0) + self.add_module(self.norm0_name, norm0) + self.relu = nn.ReLU(inplace=True) + self.fc1 = build_conv_layer( + None, channels, inter_channels, 1, groups=self.groups) + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, inter_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.fc2 = build_conv_layer( + None, inter_channels, channels * radix, 1, groups=self.groups) + self.rsoftmax = RSoftmax(radix, groups) + + @property + def norm0(self): + """nn.Module: the normalization layer named "norm0" """ + return getattr(self, self.norm0_name) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def forward(self, x): + x = self.conv(x) + x = self.norm0(x) + x = self.relu(x) + + batch, rchannel = x.shape[:2] + batch = x.size(0) + if self.radix > 1: + splits = x.view(batch, self.radix, -1, *x.shape[2:]) + gap = splits.sum(dim=1) + else: + gap = x + gap = F.adaptive_avg_pool2d(gap, 1) + gap = self.fc1(gap) + + gap = self.norm1(gap) + gap = self.relu(gap) + + atten = self.fc2(gap) + atten = self.rsoftmax(atten).view(batch, -1, 1, 1) + + if self.radix > 1: + attens = atten.view(batch, self.radix, -1, *atten.shape[2:]) + out = torch.sum(attens * splits, dim=1) + else: + out = atten * x + return out.contiguous() + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeSt. + + Args: + inplane (int): Input planes of this block. + planes (int): Middle planes of this block. + groups (int): Groups of conv2. + width_per_group (int): Width per group of conv2. 64x4d indicates + ``groups=64, width_per_group=4`` and 32x8d indicates + ``groups=32, width_per_group=8``. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Key word arguments for base class. + """ + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + """Bottleneck block for ResNeSt.""" + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.avg_down_stride = avg_down_stride and self.conv2_stride > 1 + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + self.with_modulated_dcn = False + self.conv2 = SplitAttentionConv2d( + width, + width, + kernel_size=3, + stride=1 if self.avg_down_stride else self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + radix=radix, + reduction_factor=reduction_factor, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=self.dcn) + delattr(self, self.norm2_name) + + if self.avg_down_stride: + self.avd_layer = nn.AvgPool2d(3, self.conv2_stride, padding=1) + + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + def forward(self, x): + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + + if self.avg_down_stride: + out = self.avd_layer(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNeSt(ResNetV1d): + """ResNeSt backbone. + + Args: + groups (int): Number of groups of Bottleneck. Default: 1 + base_width (int): Base width of Bottleneck. Default: 4 + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Keyword arguments for ResNet. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)), + 200: (Bottleneck, (3, 24, 36, 3)) + } + + def __init__(self, + groups=1, + base_width=4, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + self.groups = groups + self.base_width = base_width + self.radix = radix + self.reduction_factor = reduction_factor + self.avg_down_stride = avg_down_stride + super(ResNeSt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + radix=self.radix, + reduction_factor=self.reduction_factor, + avg_down_stride=self.avg_down_stride, + **kwargs) diff --git a/mmseg/models/backbones/resnet.py b/mmseg/models/backbones/resnet.py new file mode 100644 index 0000000000000000000000000000000000000000..f6c4c08d4789163edc6c5e78aa8306e006fdd25e --- /dev/null +++ b/mmseg/models/backbones/resnet.py @@ -0,0 +1,688 @@ +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer, + constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from ..utils import ResLayer + + +class BasicBlock(nn.Module): + """Basic block for ResNet.""" + + expansion = 1 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None): + super(BasicBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=False) + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + conv_cfg, planes, planes, 3, padding=1, bias=False) + self.add_module(self.norm2_name, norm2) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.norm2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + """Bottleneck block for ResNet. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + expansion = 4 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None): + super(Bottleneck, self).__init__() + assert style in ['pytorch', 'caffe'] + assert dcn is None or isinstance(dcn, dict) + assert plugins is None or isinstance(plugins, list) + if plugins is not None: + allowed_position = ['after_conv1', 'after_conv2', 'after_conv3'] + assert all(p['position'] in allowed_position for p in plugins) + + self.inplanes = inplanes + self.planes = planes + self.stride = stride + self.dilation = dilation + self.style = style + self.with_cp = with_cp + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.dcn = dcn + self.with_dcn = dcn is not None + self.plugins = plugins + self.with_plugins = plugins is not None + + if self.with_plugins: + # collect plugins for conv1/conv2/conv3 + self.after_conv1_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv1' + ] + self.after_conv2_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv2' + ] + self.after_conv3_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv3' + ] + + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + norm_cfg, planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + conv_cfg, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + dcn, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + conv_cfg, + planes, + planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + + if self.with_plugins: + self.after_conv1_plugin_names = self.make_block_plugins( + planes, self.after_conv1_plugins) + self.after_conv2_plugin_names = self.make_block_plugins( + planes, self.after_conv2_plugins) + self.after_conv3_plugin_names = self.make_block_plugins( + planes * self.expansion, self.after_conv3_plugins) + + def make_block_plugins(self, in_channels, plugins): + """make plugins for block. + + Args: + in_channels (int): Input channels of plugin. + plugins (list[dict]): List of plugins cfg to build. + + Returns: + list[str]: List of the names of plugin. + """ + assert isinstance(plugins, list) + plugin_names = [] + for plugin in plugins: + plugin = plugin.copy() + name, layer = build_plugin_layer( + plugin, + in_channels=in_channels, + postfix=plugin.pop('postfix', '')) + assert not hasattr(self, name), f'duplicate plugin {name}' + self.add_module(name, layer) + plugin_names.append(name) + return plugin_names + + def forward_plugin(self, x, plugin_names): + """Forward function for plugins.""" + out = x + for name in plugin_names: + out = getattr(self, name)(x) + return out + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + @property + def norm3(self): + """nn.Module: normalization layer after the third convolution layer""" + return getattr(self, self.norm3_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + out = self.norm2(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNet(nn.Module): + """ResNet backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Default" 3. + stem_channels (int): Number of stem channels. Default: 64. + base_channels (int): Number of base channels of res layer. Default: 64. + num_stages (int): Resnet stages, normally 4. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. + norm_cfg (dict): Dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + plugins (list[dict]): List of plugins for stages, each dict contains: + + - cfg (dict, required): Cfg dict to build plugin. + + - position (str, required): Position inside block to insert plugin, + options: 'after_conv1', 'after_conv2', 'after_conv3'. + + - stages (tuple[bool], optional): Stages to apply plugin, length + should be same as 'num_stages' + multi_grid (Sequence[int]|None): Multi grid dilation rates of last + stage. Default: None + contract_dilation (bool): Whether contract first dilation of each layer + Default: False + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import ResNet + >>> import torch + >>> self = ResNet(depth=18) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 64, 8, 8) + (1, 128, 4, 4) + (1, 256, 2, 2) + (1, 512, 1, 1) + """ + + arch_settings = { + 18: (BasicBlock, (2, 2, 2, 2)), + 34: (BasicBlock, (3, 4, 6, 3)), + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, + depth, + in_channels=3, + stem_channels=64, + base_channels=64, + num_stages=4, + strides=(1, 2, 2, 2), + dilations=(1, 1, 1, 1), + out_indices=(0, 1, 2, 3), + style='pytorch', + deep_stem=False, + avg_down=False, + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + dcn=None, + stage_with_dcn=(False, False, False, False), + plugins=None, + multi_grid=None, + contract_dilation=False, + with_cp=False, + zero_init_residual=True): + super(ResNet, self).__init__() + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for resnet') + self.depth = depth + self.stem_channels = stem_channels + self.base_channels = base_channels + self.num_stages = num_stages + assert num_stages >= 1 and num_stages <= 4 + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == num_stages + self.out_indices = out_indices + assert max(out_indices) < num_stages + self.style = style + self.deep_stem = deep_stem + self.avg_down = avg_down + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.with_cp = with_cp + self.norm_eval = norm_eval + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + if dcn is not None: + assert len(stage_with_dcn) == num_stages + self.plugins = plugins + self.multi_grid = multi_grid + self.contract_dilation = contract_dilation + self.zero_init_residual = zero_init_residual + self.block, stage_blocks = self.arch_settings[depth] + self.stage_blocks = stage_blocks[:num_stages] + self.inplanes = stem_channels + + self._make_stem_layer(in_channels, stem_channels) + + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = strides[i] + dilation = dilations[i] + dcn = self.dcn if self.stage_with_dcn[i] else None + if plugins is not None: + stage_plugins = self.make_stage_plugins(plugins, i) + else: + stage_plugins = None + # multi grid is applied to last layer only + stage_multi_grid = multi_grid if i == len( + self.stage_blocks) - 1 else None + planes = base_channels * 2**i + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=planes, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + dcn=dcn, + plugins=stage_plugins, + multi_grid=stage_multi_grid, + contract_dilation=contract_dilation) + self.inplanes = planes * self.block.expansion + layer_name = f'layer{i+1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + self.feat_dim = self.block.expansion * base_channels * 2**( + len(self.stage_blocks) - 1) + + def make_stage_plugins(self, plugins, stage_idx): + """make plugins for ResNet 'stage_idx'th stage . + + Currently we support to insert 'context_block', + 'empirical_attention_block', 'nonlocal_block' into the backbone like + ResNet/ResNeXt. They could be inserted after conv1/conv2/conv3 of + Bottleneck. + + An example of plugins format could be : + >>> plugins=[ + ... dict(cfg=dict(type='xxx', arg1='xxx'), + ... stages=(False, True, True, True), + ... position='after_conv2'), + ... dict(cfg=dict(type='yyy'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='1'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='2'), + ... stages=(True, True, True, True), + ... position='after_conv3') + ... ] + >>> self = ResNet(depth=18) + >>> stage_plugins = self.make_stage_plugins(plugins, 0) + >>> assert len(stage_plugins) == 3 + + Suppose 'stage_idx=0', the structure of blocks in the stage would be: + conv1-> conv2->conv3->yyy->zzz1->zzz2 + Suppose 'stage_idx=1', the structure of blocks in the stage would be: + conv1-> conv2->xxx->conv3->yyy->zzz1->zzz2 + + If stages is missing, the plugin would be applied to all stages. + + Args: + plugins (list[dict]): List of plugins cfg to build. The postfix is + required if multiple same type plugins are inserted. + stage_idx (int): Index of stage to build + + Returns: + list[dict]: Plugins for current stage + """ + stage_plugins = [] + for plugin in plugins: + plugin = plugin.copy() + stages = plugin.pop('stages', None) + assert stages is None or len(stages) == self.num_stages + # whether to insert plugin into current stage + if stages is None or stages[stage_idx]: + stage_plugins.append(plugin) + + return stage_plugins + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer(**kwargs) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def _make_stem_layer(self, in_channels, stem_channels): + """Make stem layer for ResNet.""" + if self.deep_stem: + self.stem = nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels // 2, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels // 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels)[1], + nn.ReLU(inplace=True)) + else: + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels, + kernel_size=7, + stride=2, + padding=3, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, stem_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + def _freeze_stages(self): + """Freeze stages param and norm stats.""" + if self.frozen_stages >= 0: + if self.deep_stem: + self.stem.eval() + for param in self.stem.parameters(): + param.requires_grad = False + else: + self.norm1.eval() + for m in [self.conv1, self.norm1]: + for param in m.parameters(): + param.requires_grad = False + + for i in range(1, self.frozen_stages + 1): + m = getattr(self, f'layer{i}') + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + if self.dcn is not None: + for m in self.modules(): + if isinstance(m, Bottleneck) and hasattr( + m, 'conv2_offset'): + constant_init(m.conv2_offset, 0) + + if self.zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + constant_init(m.norm3, 0) + elif isinstance(m, BasicBlock): + constant_init(m.norm2, 0) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + """Forward function.""" + if self.deep_stem: + x = self.stem(x) + else: + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.maxpool(x) + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + x = res_layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super(ResNet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + +@BACKBONES.register_module() +class ResNetV1c(ResNet): + """ResNetV1c variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1c replaces the 7x7 conv + in the input stem with three 3x3 convs. + + References: + .. [1] https://arxiv.org/pdf/1812.01187.pdf + """ + + def __init__(self, **kwargs): + super(ResNetV1c, self).__init__( + deep_stem=True, avg_down=False, **kwargs) + + +@BACKBONES.register_module() +class ResNetV1d(ResNet): + """ResNetV1d variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1d replaces the 7x7 conv in + the input stem with three 3x3 convs. And in the downsampling block, a 2x2 + avg_pool with stride 2 is added before conv, whose stride is changed to 1. + """ + + def __init__(self, **kwargs): + super(ResNetV1d, self).__init__( + deep_stem=True, avg_down=True, **kwargs) diff --git a/mmseg/models/backbones/resnext.py b/mmseg/models/backbones/resnext.py new file mode 100644 index 0000000000000000000000000000000000000000..fa8149ce2fcbf67703248621c4f5dfb90a852379 --- /dev/null +++ b/mmseg/models/backbones/resnext.py @@ -0,0 +1,145 @@ +import math + +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeXt. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + **kwargs): + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm2_name, norm2 = build_norm_layer( + self.norm_cfg, width, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + +@BACKBONES.register_module() +class ResNeXt(ResNet): + """ResNeXt backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Normally 3. + num_stages (int): Resnet stages, normally 4. + groups (int): Group of resnext. + base_width (int): Base width of resnext. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import ResNeXt + >>> import torch + >>> self = ResNeXt(depth=50) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 256, 8, 8) + (1, 512, 4, 4) + (1, 1024, 2, 2) + (1, 2048, 1, 1) + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, groups=1, base_width=4, **kwargs): + self.groups = groups + self.base_width = base_width + super(ResNeXt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmseg/models/backbones/unet.py b/mmseg/models/backbones/unet.py new file mode 100644 index 0000000000000000000000000000000000000000..0e1b001c82174b9bdb53a1fa9f6bb8a869172a86 --- /dev/null +++ b/mmseg/models/backbones/unet.py @@ -0,0 +1,428 @@ +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer, + build_norm_layer, constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from ..utils import UpConvBlock + + +class BasicConvBlock(nn.Module): + """Basic convolutional block for UNet. + + This module consists of several plain convolutional layers. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers. Default: 2. + stride (int): Whether use stride convolution to downsample + the input feature map. If stride=2, it only uses stride convolution + in the first convolutional layer to downsample the input feature + map. Options are 1 or 2. Default: 1. + dilation (int): Whether use dilated convolution to expand the + receptive field. Set dilation rate of each convolutional layer and + the dilation rate of the first convolutional layer is always 1. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + dcn=None, + plugins=None): + super(BasicConvBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.with_cp = with_cp + convs = [] + for i in range(num_convs): + convs.append( + ConvModule( + in_channels=in_channels if i == 0 else out_channels, + out_channels=out_channels, + kernel_size=3, + stride=stride if i == 0 else 1, + dilation=1 if i == 0 else dilation, + padding=1 if i == 0 else dilation, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + self.convs = nn.Sequential(*convs) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.convs, x) + else: + out = self.convs(x) + return out + + +@UPSAMPLE_LAYERS.register_module() +class DeconvModule(nn.Module): + """Deconvolution upsample module in decoder for UNet (2X upsample). + + This module uses deconvolution to upsample feature map in the decoder + of UNet. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + kernel_size (int): Kernel size of the convolutional layer. Default: 4. + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + kernel_size=4, + scale_factor=2): + super(DeconvModule, self).__init__() + + assert (kernel_size - scale_factor >= 0) and\ + (kernel_size - scale_factor) % 2 == 0,\ + f'kernel_size should be greater than or equal to scale_factor '\ + f'and (kernel_size - scale_factor) should be even numbers, '\ + f'while the kernel size is {kernel_size} and scale_factor is '\ + f'{scale_factor}.' + + stride = scale_factor + padding = (kernel_size - scale_factor) // 2 + self.with_cp = with_cp + deconv = nn.ConvTranspose2d( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding) + + norm_name, norm = build_norm_layer(norm_cfg, out_channels) + activate = build_activation_layer(act_cfg) + self.deconv_upsamping = nn.Sequential(deconv, norm, activate) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.deconv_upsamping, x) + else: + out = self.deconv_upsamping(x) + return out + + +@UPSAMPLE_LAYERS.register_module() +class InterpConv(nn.Module): + """Interpolation upsample module in decoder for UNet. + + This module uses interpolation to upsample feature map in the decoder + of UNet. It consists of one interpolation upsample layer and one + convolutional layer. It can be one interpolation upsample layer followed + by one convolutional layer (conv_first=False) or one convolutional layer + followed by one interpolation upsample layer (conv_first=True). + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + conv_first (bool): Whether convolutional layer or interpolation + upsample layer first. Default: False. It means interpolation + upsample layer followed by one convolutional layer. + kernel_size (int): Kernel size of the convolutional layer. Default: 1. + stride (int): Stride of the convolutional layer. Default: 1. + padding (int): Padding of the convolutional layer. Default: 1. + upsampe_cfg (dict): Interpolation config of the upsample layer. + Default: dict( + scale_factor=2, mode='bilinear', align_corners=False). + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + conv_cfg=None, + conv_first=False, + kernel_size=1, + stride=1, + padding=0, + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False)): + super(InterpConv, self).__init__() + + self.with_cp = with_cp + conv = ConvModule( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + upsample = nn.Upsample(**upsampe_cfg) + if conv_first: + self.interp_upsample = nn.Sequential(conv, upsample) + else: + self.interp_upsample = nn.Sequential(upsample, conv) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.interp_upsample, x) + else: + out = self.interp_upsample(x) + return out + + +@BACKBONES.register_module() +class UNet(nn.Module): + """UNet backbone. + U-Net: Convolutional Networks for Biomedical Image Segmentation. + https://arxiv.org/pdf/1505.04597.pdf + + Args: + in_channels (int): Number of input image channels. Default" 3. + base_channels (int): Number of base channels of each stage. + The output channels of the first stage. Default: 64. + num_stages (int): Number of stages in encoder, normally 5. Default: 5. + strides (Sequence[int 1 | 2]): Strides of each stage in encoder. + len(strides) is equal to num_stages. Normally the stride of the + first stage in encoder is 1. If strides[i]=2, it uses stride + convolution to downsample in the correspondance encoder stage. + Default: (1, 1, 1, 1, 1). + enc_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondance encoder stage. + Default: (2, 2, 2, 2, 2). + dec_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondance decoder stage. + Default: (2, 2, 2, 2). + downsamples (Sequence[int]): Whether use MaxPool to downsample the + feature map after the first stage of encoder + (stages: [1, num_stages)). If the correspondance encoder stage use + stride convolution (strides[i]=2), it will never use MaxPool to + downsample, even downsamples[i-1]=True. + Default: (True, True, True, True). + enc_dilations (Sequence[int]): Dilation rate of each stage in encoder. + Default: (1, 1, 1, 1, 1). + dec_dilations (Sequence[int]): Dilation rate of each stage in decoder. + Default: (1, 1, 1, 1). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + + Notice: + The input image size should be devisible by the whole downsample rate + of the encoder. More detail of the whole downsample rate can be found + in UNet._check_input_devisible. + + """ + + def __init__(self, + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False, + dcn=None, + plugins=None): + super(UNet, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + assert len(strides) == num_stages, \ + 'The length of strides should be equal to num_stages, '\ + f'while the strides is {strides}, the length of '\ + f'strides is {len(strides)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_num_convs) == num_stages, \ + 'The length of enc_num_convs should be equal to num_stages, '\ + f'while the enc_num_convs is {enc_num_convs}, the length of '\ + f'enc_num_convs is {len(enc_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_num_convs) == (num_stages-1), \ + 'The length of dec_num_convs should be equal to (num_stages-1), '\ + f'while the dec_num_convs is {dec_num_convs}, the length of '\ + f'dec_num_convs is {len(dec_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(downsamples) == (num_stages-1), \ + 'The length of downsamples should be equal to (num_stages-1), '\ + f'while the downsamples is {downsamples}, the length of '\ + f'downsamples is {len(downsamples)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_dilations) == num_stages, \ + 'The length of enc_dilations should be equal to num_stages, '\ + f'while the enc_dilations is {enc_dilations}, the length of '\ + f'enc_dilations is {len(enc_dilations)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_dilations) == (num_stages-1), \ + 'The length of dec_dilations should be equal to (num_stages-1), '\ + f'while the dec_dilations is {dec_dilations}, the length of '\ + f'dec_dilations is {len(dec_dilations)}, and the num_stages is '\ + f'{num_stages}.' + self.num_stages = num_stages + self.strides = strides + self.downsamples = downsamples + self.norm_eval = norm_eval + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + for i in range(num_stages): + enc_conv_block = [] + if i != 0: + if strides[i] == 1 and downsamples[i - 1]: + enc_conv_block.append(nn.MaxPool2d(kernel_size=2)) + upsample = (strides[i] != 1 or downsamples[i - 1]) + self.decoder.append( + UpConvBlock( + conv_block=BasicConvBlock, + in_channels=base_channels * 2**i, + skip_channels=base_channels * 2**(i - 1), + out_channels=base_channels * 2**(i - 1), + num_convs=dec_num_convs[i - 1], + stride=1, + dilation=dec_dilations[i - 1], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + upsample_cfg=upsample_cfg if upsample else None, + dcn=None, + plugins=None)) + + enc_conv_block.append( + BasicConvBlock( + in_channels=in_channels, + out_channels=base_channels * 2**i, + num_convs=enc_num_convs[i], + stride=strides[i], + dilation=enc_dilations[i], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None)) + self.encoder.append((nn.Sequential(*enc_conv_block))) + in_channels = base_channels * 2**i + + def forward(self, x): + self._check_input_devisible(x) + enc_outs = [] + for enc in self.encoder: + x = enc(x) + enc_outs.append(x) + dec_outs = [x] + for i in reversed(range(len(self.decoder))): + x = self.decoder[i](enc_outs[i], x) + dec_outs.append(x) + + return dec_outs + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super(UNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + def _check_input_devisible(self, x): + h, w = x.shape[-2:] + whole_downsample_rate = 1 + for i in range(1, self.num_stages): + if self.strides[i] == 2 or self.downsamples[i - 1]: + whole_downsample_rate *= 2 + assert (h % whole_downsample_rate == 0) \ + and (w % whole_downsample_rate == 0),\ + f'The input image size {(h, w)} should be devisible by the whole '\ + f'downsample rate {whole_downsample_rate}, when num_stages is '\ + f'{self.num_stages}, strides is {self.strides}, and downsamples '\ + f'is {self.downsamples}.' + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') diff --git a/mmseg/models/backbones/vit.py b/mmseg/models/backbones/vit.py new file mode 100644 index 0000000000000000000000000000000000000000..892bd850cd832f6f78ae11465c2033a9a643ea58 --- /dev/null +++ b/mmseg/models/backbones/vit.py @@ -0,0 +1,319 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import BACKBONES + +from mmcv.cnn import build_norm_layer + + +def _cfg(url='', **kwargs): + return { + 'url': url, + 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': None, + 'crop_pct': .9, 'interpolation': 'bicubic', + 'mean': (0.485, 0.456, 0.406), 'std': (0.229, 0.224, 0.225), + 'first_conv': '', 'classifier': 'head', + **kwargs + } + + +default_cfgs = { + # patch models + 'vit_small_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/vit_small_p16_224-15ec54c9.pth', + ), + 'vit_base_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth', + mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), + #pretrained_finetune='pretrain/VIT_base_224_ReLeM.pth' + ), + 'vit_base_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_384-83fb41ba.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p32_384-830016f5.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_224': _cfg(), + 'vit_large_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_384-b3be5167.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, + ), + 'vit_large_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p32_384-9b920ba8.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_huge_patch16_224': _cfg(), + 'vit_huge_patch32_384': _cfg(input_size=(3, 384, 384)), + # hybrid models + 'vit_small_resnet26d_224': _cfg(), + 'vit_small_resnet50d_s3_224': _cfg(), + 'vit_base_resnet26d_224': _cfg(), + 'vit_base_resnet50d_224': _cfg(), + 'deit_base_distilled_path16_384': _cfg( + url='https://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_384-d0272ac0.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, checkpoint=True, + ), +} + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + q, k, v = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) + self.img_size = img_size + self.patch_size = patch_size + self.num_patches = num_patches + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + + def forward(self, x): + B, C, H, W = x.shape + # FIXME look at relaxing size constraints + assert H == self.img_size[0] and W == self.img_size[1], \ + f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." + + # x = F.interpolate(x, size=2*x.shape[-1], mode='bilinear', align_corners=True) + x = self.proj(x) + return x + + +class HybridEmbed(nn.Module): + """ CNN Feature Map Embedding + Extract feature map from CNN, flatten, project to embedding dim. + """ + def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768): + super().__init__() + assert isinstance(backbone, nn.Module) + img_size = to_2tuple(img_size) + self.img_size = img_size + self.backbone = backbone + if feature_size is None: + with torch.no_grad(): + # FIXME this is hacky, but most reliable way of determining the exact dim of the output feature + # map for all networks, the feature metadata has reliable channel and stride info, but using + # stride to calc feature dim requires info about padding of each stage that isn't captured. + training = backbone.training + if training: + backbone.eval() + o = self.backbone(torch.zeros(1, in_chans, img_size[0], img_size[1]))[-1] + feature_size = o.shape[-2:] + feature_dim = o.shape[1] + backbone.train(training) + else: + feature_size = to_2tuple(feature_size) + feature_dim = self.backbone.feature_info.channels()[-1] + self.num_patches = feature_size[0] * feature_size[1] + self.proj = nn.Linear(feature_dim, embed_dim) + + def forward(self, x): + x = self.backbone(x)[-1] + x = x.flatten(2).transpose(1, 2) + x = self.proj(x) + return x + + +@BACKBONES.register_module() +class VisionTransformer(nn.Module): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24, + num_heads=16, num_classes=19, mlp_ratio=4., qkv_bias=True, qk_scale=None, drop_rate=0.1, attn_drop_rate=0., + drop_path_rate=0., hybrid_backbone=None, norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + pos_embed_interp=False, random_init=False, align_corners=False, pretrain_weights=None, **kwargs): + super(VisionTransformer, self).__init__(**kwargs) + self.model_name = model_name + self.img_size = img_size + self.patch_size = patch_size + self.in_chans = in_chans + self.embed_dim = embed_dim + self.depth = depth + self.num_heads = num_heads + self.num_classes = num_classes + self.mlp_ratio = mlp_ratio + self.qkv_bias = qkv_bias + self.qk_scale = qk_scale + self.drop_rate = drop_rate + self.attn_drop_rate = attn_drop_rate + self.drop_path_rate = drop_path_rate + self.hybrid_backbone = hybrid_backbone + self.norm_layer = norm_layer + self.norm_cfg = norm_cfg + self.pos_embed_interp = pos_embed_interp + self.random_init = random_init + self.align_corners = align_corners + self.pretrain_weights = pretrain_weights + + self.num_stages = self.depth + self.out_indices= tuple(range(self.num_stages)) + + if self.hybrid_backbone is not None: + self.patch_embed = HybridEmbed( + self.hybrid_backbone, img_size=self.img_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + else: + self.patch_embed = PatchEmbed( + img_size=self.img_size, patch_size=self.patch_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + self.num_patches = self.patch_embed.num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.embed_dim)) + self.pos_embed = nn.Parameter(torch.zeros(1, self.num_patches + 1, self.embed_dim)) + self.pos_drop = nn.Dropout(p=self.drop_rate) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] # stochastic depth decay rule + self.blocks = nn.ModuleList([ + Block( + dim=self.embed_dim, num_heads=self.num_heads, mlp_ratio=self.mlp_ratio, qkv_bias=self.qkv_bias, qk_scale=self.qk_scale, + drop=self.drop_rate, attn_drop=self.attn_drop_rate, drop_path=dpr[i], norm_layer=self.norm_layer) + for i in range(self.depth)]) + + # NOTE as per official impl, we could have a pre-logits representation dense layer + tanh here + #self.repr = nn.Linear(embed_dim, representation_size) + #self.repr_act = nn.Tanh() + + trunc_normal_(self.pos_embed, std=.02) + trunc_normal_(self.cls_token, std=.02) + # self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + # nn.init.normal_(self.pos_embed, std=0.02) + # nn.init.zeros_(self.cls_token) + + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + if self.random_init == False: + self.default_cfg = default_cfgs[self.model_name] + + if not self.pretrain_weights == None: + self.default_cfg['pretrained_finetune'] = self.pretrain_weights + + if self.model_name in ['vit_small_patch16_224', 'vit_base_patch16_224']: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners, filter_fn=self._conv_filter) + else: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners) + else: + print('Initialize weight randomly') + + @property + def no_weight_decay(self): + return {'pos_embed', 'cls_token'} + + def _conv_filter(self, state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + return out_dict + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def to_1D(self, x): + n, c, h, w = x.shape + x = x.reshape(n,c,-1).transpose(1,2) + return x + + def forward(self, x): + B = x.shape[0] + x = self.patch_embed(x) + + x = x.flatten(2).transpose(1, 2) + + cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + x = self.pos_drop(x) + + outs = [] + for i, blk in enumerate(self.blocks): + x = blk(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + diff --git a/mmseg/models/backbones/vit_mla.py b/mmseg/models/backbones/vit_mla.py new file mode 100644 index 0000000000000000000000000000000000000000..b6b52b17d4e97e94a6aceb7cea3b4efdce3af4df --- /dev/null +++ b/mmseg/models/backbones/vit_mla.py @@ -0,0 +1,371 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import BACKBONES + +from mmcv.cnn import build_norm_layer + + +def _cfg(url='', **kwargs): + return { + 'url': url, + 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': None, + 'crop_pct': .9, 'interpolation': 'bicubic', + 'mean': (0.485, 0.456, 0.406), 'std': (0.229, 0.224, 0.225), + 'first_conv': '', 'classifier': 'head', + **kwargs + } + + +default_cfgs = { + # patch models + 'vit_small_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/vit_small_p16_224-15ec54c9.pth', + ), + 'vit_base_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth', + mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), + #pretrained_finetune='pretrain/VIT_base_224_ReLeM.pth' + ), + 'vit_base_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_384-83fb41ba.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p32_384-830016f5.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_224-4ee7a4dc.pth', + input_size=(3, 224, 224), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_384-b3be5167.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p32_384-9b920ba8.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch16_224_in21k': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_patch16_224_in21k-e5005f0a.pth', + num_classes=21843, mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)), + 'vit_huge_patch16_224': _cfg(), + 'vit_huge_patch32_384': _cfg(input_size=(3, 384, 384)), + # hybrid models + 'vit_small_resnet26d_224': _cfg(), + 'vit_small_resnet50d_s3_224': _cfg(), + 'vit_base_resnet26d_224': _cfg(), + 'vit_base_resnet50d_224': _cfg(), + 'deit_base_distilled_path16_384': _cfg( + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, + pretrained_finetune='pretrained_model/deit_base_distilled_patch16_384.pth' + ) +} + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + q, k, v = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) + self.img_size = img_size + self.patch_size = patch_size + self.num_patches = num_patches + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + + def forward(self, x): + B, C, H, W = x.shape + # FIXME look at relaxing size constraints + assert H == self.img_size[0] and W == self.img_size[1], \ + f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." + + # x = F.interpolate(x, size=2*x.shape[-1], mode='bilinear', align_corners=True) + x = self.proj(x) + return x + + +class HybridEmbed(nn.Module): + """ CNN Feature Map Embedding + Extract feature map from CNN, flatten, project to embedding dim. + """ + def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768): + super().__init__() + assert isinstance(backbone, nn.Module) + img_size = to_2tuple(img_size) + self.img_size = img_size + self.backbone = backbone + if feature_size is None: + with torch.no_grad(): + # FIXME this is hacky, but most reliable way of determining the exact dim of the output feature + # map for all networks, the feature metadata has reliable channel and stride info, but using + # stride to calc feature dim requires info about padding of each stage that isn't captured. + training = backbone.training + if training: + backbone.eval() + o = self.backbone(torch.zeros(1, in_chans, img_size[0], img_size[1]))[-1] + feature_size = o.shape[-2:] + feature_dim = o.shape[1] + backbone.train(training) + else: + feature_size = to_2tuple(feature_size) + feature_dim = self.backbone.feature_info.channels()[-1] + self.num_patches = feature_size[0] * feature_size[1] + self.proj = nn.Linear(feature_dim, embed_dim) + + def forward(self, x): + x = self.backbone(x)[-1] + x = x.flatten(2).transpose(1, 2) + x = self.proj(x) + return x + + +class Conv_MLA(nn.Module): + def __init__(self, in_channels=1024, mla_channels=256, norm_cfg=None): + super(Conv_MLA, self).__init__() + self.mla_p2_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p3_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p4_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p5_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p2 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p3 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p4 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p5 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def forward(self, res2, res3, res4, res5): + + res2 = self.to_2D(res2) + res3 = self.to_2D(res3) + res4 = self.to_2D(res4) + res5 = self.to_2D(res5) + + mla_p5_1x1 = self.mla_p5_1x1(res5) + mla_p4_1x1 = self.mla_p4_1x1(res4) + mla_p3_1x1 = self.mla_p3_1x1(res3) + mla_p2_1x1 = self.mla_p2_1x1(res2) + + mla_p4_plus = mla_p5_1x1 + mla_p4_1x1 + mla_p3_plus = mla_p4_plus + mla_p3_1x1 + mla_p2_plus = mla_p3_plus + mla_p2_1x1 + + mla_p5 = self.mla_p5(mla_p5_1x1) + mla_p4 = self.mla_p4(mla_p4_plus) + mla_p3 = self.mla_p3(mla_p3_plus) + mla_p2 = self.mla_p2(mla_p2_plus) + + return mla_p2, mla_p3, mla_p4, mla_p5 + + +@BACKBONES.register_module() +class VIT_MLA(nn.Module): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24, + num_heads=16, num_classes=19, mlp_ratio=4., qkv_bias=True, qk_scale=None, drop_rate=0.1, attn_drop_rate=0., + drop_path_rate=0., hybrid_backbone=None, norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + pos_embed_interp=False, random_init=False, align_corners=False, mla_channels=256, + mla_index=(5,11,17,23), pretrain_weights=None, **kwargs): + super(VIT_MLA, self).__init__(**kwargs) + self.model_name = model_name + self.img_size = img_size + self.patch_size = patch_size + self.in_chans = in_chans + self.embed_dim = embed_dim + self.depth = depth + self.num_heads = num_heads + self.num_classes = num_classes + self.mlp_ratio = mlp_ratio + self.qkv_bias = qkv_bias + self.qk_scale = qk_scale + self.drop_rate = drop_rate + self.attn_drop_rate = attn_drop_rate + self.drop_path_rate = drop_path_rate + self.hybrid_backbone = hybrid_backbone + self.norm_layer = norm_layer + self.norm_cfg = norm_cfg + self.pos_embed_interp = pos_embed_interp + self.random_init = random_init + self.align_corners = align_corners + self.mla_channels = mla_channels + self.mla_index = mla_index + self.pretrain_weights = pretrain_weights + + self.num_stages = self.depth + self.out_indices= tuple(range(self.num_stages)) + + if self.hybrid_backbone is not None: + self.patch_embed = HybridEmbed( + self.hybrid_backbone, img_size=self.img_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + else: + self.patch_embed = PatchEmbed( + img_size=self.img_size, patch_size=self.patch_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + self.num_patches = self.patch_embed.num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.embed_dim)) + self.pos_embed = nn.Parameter(torch.zeros(1, self.num_patches + 1, self.embed_dim)) + self.pos_drop = nn.Dropout(p=self.drop_rate) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] # stochastic depth decay rule + self.blocks = nn.ModuleList([ + Block( + dim=self.embed_dim, num_heads=self.num_heads, mlp_ratio=self.mlp_ratio, qkv_bias=self.qkv_bias, qk_scale=self.qk_scale, + drop=self.drop_rate, attn_drop=self.attn_drop_rate, drop_path=dpr[i], norm_layer=self.norm_layer) + for i in range(self.depth)]) + + self.mla = Conv_MLA(in_channels=self.embed_dim, mla_channels=self.mla_channels, norm_cfg=self.norm_cfg) + + self.norm_0 = norm_layer(self.embed_dim) + self.norm_1 = norm_layer(self.embed_dim) + self.norm_2 = norm_layer(self.embed_dim) + self.norm_3 = norm_layer(self.embed_dim) + + # NOTE as per official impl, we could have a pre-logits representation dense layer + tanh here + #self.repr = nn.Linear(embed_dim, representation_size) + #self.repr_act = nn.Tanh() + + trunc_normal_(self.pos_embed, std=.02) + trunc_normal_(self.cls_token, std=.02) + # self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + # nn.init.normal_(self.pos_embed, std=0.02) + # nn.init.zeros_(self.cls_token) + + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + if self.random_init == False: + self.default_cfg = default_cfgs[self.model_name] + + if not self.pretrain_weights == None: + self.default_cfg['pretrained_finetune'] = self.pretrain_weights + + if self.model_name in ['vit_small_patch16_224', 'vit_base_patch16_224']: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners, filter_fn=self._conv_filter) + else: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners) + else: + print('Initialize weight randomly') + + @property + def no_weight_decay(self): + return {'pos_embed', 'cls_token'} + + def _conv_filter(self, state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + return out_dict + + def forward(self, x): + B = x.shape[0] + x = self.patch_embed(x) + x = x.flatten(2).transpose(1, 2) + + cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + x = x[:,1:] + x = self.pos_drop(x) + + outs = [] + for i, blk in enumerate(self.blocks): + x = blk(x) + if i in self.out_indices: + outs.append(x) + + c6 = self.norm_0(outs[self.mla_index[0]]) + c12 = self.norm_1(outs[self.mla_index[1]]) + c18 = self.norm_2(outs[self.mla_index[2]]) + c24 = self.norm_3(outs[self.mla_index[3]]) + + p6, p12, p18, p24 = self.mla(c6, c12, c18, c24) + + return (p6, p12, p18, p24) + diff --git a/mmseg/models/builder.py b/mmseg/models/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..c487dcdd32bb1c62630f6d8f75e5fa981aba3ba8 --- /dev/null +++ b/mmseg/models/builder.py @@ -0,0 +1,66 @@ +import warnings + +from mmcv.utils import Registry, build_from_cfg +from torch import nn + +BACKBONES = Registry('backbone') +NECKS = Registry('neck') +HEADS = Registry('head') +LOSSES = Registry('loss') +SEGMENTORS = Registry('segmentor') + + +def build(cfg, registry, default_args=None): + """Build a module. + + Args: + cfg (dict, list[dict]): The config of modules, is is either a dict + or a list of configs. + registry (:obj:`Registry`): A registry the module belongs to. + default_args (dict, optional): Default arguments to build the module. + Defaults to None. + + Returns: + nn.Module: A built nn module. + """ + + if isinstance(cfg, list): + modules = [ + build_from_cfg(cfg_, registry, default_args) for cfg_ in cfg + ] + return nn.Sequential(*modules) + else: + return build_from_cfg(cfg, registry, default_args) + + +def build_backbone(cfg): + """Build backbone.""" + return build(cfg, BACKBONES) + + +def build_neck(cfg): + """Build neck.""" + return build(cfg, NECKS) + + +def build_head(cfg): + """Build head.""" + return build(cfg, HEADS) + + +def build_loss(cfg): + """Build loss.""" + return build(cfg, LOSSES) + + +def build_segmentor(cfg, train_cfg=None, test_cfg=None): + """Build segmentor.""" + if train_cfg is not None or test_cfg is not None: + warnings.warn( + 'train_cfg and test_cfg is deprecated, ' + 'please specify them in model', UserWarning) + assert cfg.get('train_cfg') is None or train_cfg is None, \ + 'train_cfg specified in both outer field and model field ' + assert cfg.get('test_cfg') is None or test_cfg is None, \ + 'test_cfg specified in both outer field and model field ' + return build(cfg, SEGMENTORS, dict(train_cfg=train_cfg, test_cfg=test_cfg)) diff --git a/mmseg/models/decode_heads/__init__.py b/mmseg/models/decode_heads/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7063ecdcca5cbb27a9d4c586a26b4882c25a0810 --- /dev/null +++ b/mmseg/models/decode_heads/__init__.py @@ -0,0 +1,32 @@ +from .ann_head import ANNHead +from .apc_head import APCHead +from .aspp_head import ASPPHead +from .cc_head import CCHead +from .da_head import DAHead +from .dm_head import DMHead +from .dnl_head import DNLHead +from .ema_head import EMAHead +from .enc_head import EncHead +from .fcn_head import FCNHead +from .fpn_head import FPNHead +from .gc_head import GCHead +from .lraspp_head import LRASPPHead +from .nl_head import NLHead +from .ocr_head import OCRHead +from .point_head import PointHead +from .psa_head import PSAHead +from .psp_head import PSPHead +from .sep_aspp_head import DepthwiseSeparableASPPHead +from .sep_fcn_head import DepthwiseSeparableFCNHead +from .uper_head import UPerHead +from .vit_up_head import VisionTransformerUpHead +from .vit_mla_head import VIT_MLAHead +from .vit_mla_auxi_head import VIT_MLA_AUXIHead + +__all__ = [ + 'FCNHead', 'PSPHead', 'ASPPHead', 'PSAHead', 'NLHead', 'GCHead', 'CCHead', + 'UPerHead', 'DepthwiseSeparableASPPHead', 'ANNHead', 'DAHead', 'OCRHead', + 'EncHead', 'DepthwiseSeparableFCNHead', 'FPNHead', 'EMAHead', 'DNLHead', + 'PointHead', 'APCHead', 'DMHead', 'LRASPPHead', + 'VisionTransformerUpHead', 'VIT_MLAHead', 'VIT_MLA_AUXIHead' +] diff --git a/mmseg/models/decode_heads/ann_head.py b/mmseg/models/decode_heads/ann_head.py new file mode 100644 index 0000000000000000000000000000000000000000..396c54e1505b3e1750abb715769c6d9c040d9906 --- /dev/null +++ b/mmseg/models/decode_heads/ann_head.py @@ -0,0 +1,245 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PPMConcat(nn.ModuleList): + """Pyramid Pooling Module that only concat the features of each layer. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + """ + + def __init__(self, pool_scales=(1, 3, 6, 8)): + super(PPMConcat, self).__init__( + [nn.AdaptiveAvgPool2d(pool_scale) for pool_scale in pool_scales]) + + def forward(self, feats): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(feats) + ppm_outs.append(ppm_out.view(*feats.shape[:2], -1)) + concat_outs = torch.cat(ppm_outs, dim=2) + return concat_outs + + +class SelfAttentionBlock(_SelfAttentionBlock): + """Make a ANN used SelfAttentionBlock. + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_scale (int): The scale of query feature map. + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, share_key_query, query_scale, key_pool_scales, + conv_cfg, norm_cfg, act_cfg): + key_psp = PPMConcat(key_pool_scales) + if query_scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=query_scale) + else: + query_downsample = None + super(SelfAttentionBlock, self).__init__( + key_in_channels=low_in_channels, + query_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=share_key_query, + query_downsample=query_downsample, + key_downsample=key_psp, + key_query_num_convs=1, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + +class AFNB(nn.Module): + """Asymmetric Fusion Non-local Block(AFNB) + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + and query projection. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, query_scales, key_pool_scales, conv_cfg, + norm_cfg, act_cfg): + super(AFNB, self).__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=False, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + out_channels + high_in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, low_feats, high_feats): + """Forward function.""" + priors = [stage(high_feats, low_feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, high_feats], 1)) + return output + + +class APNB(nn.Module): + """Asymmetric Pyramid Non-local Block (APNB) + + Args: + in_channels (int): Input channels of key/query feature, + which is the key feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, in_channels, channels, out_channels, query_scales, + key_pool_scales, conv_cfg, norm_cfg, act_cfg): + super(APNB, self).__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=in_channels, + high_in_channels=in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=True, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + 2 * in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, feats): + """Forward function.""" + priors = [stage(feats, feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, feats], 1)) + return output + + +@HEADS.register_module() +class ANNHead(BaseDecodeHead): + """Asymmetric Non-local Neural Networks for Semantic Segmentation. + + This head is the implementation of `ANNNet + `_. + + Args: + project_channels (int): Projection channels for Nonlocal. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): The pooling scales of key feature map. + Default: (1, 3, 6, 8). + """ + + def __init__(self, + project_channels, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + **kwargs): + super(ANNHead, self).__init__( + input_transform='multiple_select', **kwargs) + assert len(self.in_channels) == 2 + low_in_channels, high_in_channels = self.in_channels + self.project_channels = project_channels + self.fusion = AFNB( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + out_channels=high_in_channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + high_in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.context = APNB( + in_channels=self.channels, + out_channels=self.channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + low_feats, high_feats = self._transform_inputs(inputs) + output = self.fusion(low_feats, high_feats) + output = self.dropout(output) + output = self.bottleneck(output) + output = self.context(output) + output = self.cls_seg(output) + + return output diff --git a/mmseg/models/decode_heads/apc_head.py b/mmseg/models/decode_heads/apc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..b453db3943b6ba853f85fa804d3675c4244d460e --- /dev/null +++ b/mmseg/models/decode_heads/apc_head.py @@ -0,0 +1,158 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class ACM(nn.Module): + """Adaptive Context Module used in APCNet. + + Args: + pool_scale (int): Pooling scale used in Adaptive Context + Module to extract region fetures. + fusion (bool): Add one conv to fuse residual feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, pool_scale, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super(ACM, self).__init__() + self.pool_scale = pool_scale + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.pooled_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.global_info = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.gla = nn.Conv2d(self.channels, self.pool_scale**2, 1, 1, 0) + + self.residual_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + pooled_x = F.adaptive_avg_pool2d(x, self.pool_scale) + # [batch_size, channels, h, w] + x = self.input_redu_conv(x) + # [batch_size, channels, pool_scale, pool_scale] + pooled_x = self.pooled_redu_conv(pooled_x) + batch_size = x.size(0) + # [batch_size, pool_scale * pool_scale, channels] + pooled_x = pooled_x.view(batch_size, self.channels, + -1).permute(0, 2, 1).contiguous() + # [batch_size, h * w, pool_scale * pool_scale] + affinity_matrix = self.gla(x + resize( + self.global_info(F.adaptive_avg_pool2d(x, 1)), size=x.shape[2:]) + ).permute(0, 2, 3, 1).reshape( + batch_size, -1, self.pool_scale**2) + affinity_matrix = F.sigmoid(affinity_matrix) + # [batch_size, h * w, channels] + z_out = torch.matmul(affinity_matrix, pooled_x) + # [batch_size, channels, h * w] + z_out = z_out.permute(0, 2, 1).contiguous() + # [batch_size, channels, h, w] + z_out = z_out.view(batch_size, self.channels, x.size(2), x.size(3)) + z_out = self.residual_conv(z_out) + z_out = F.relu(z_out + x) + if self.fusion: + z_out = self.fusion_conv(z_out) + + return z_out + + +@HEADS.register_module() +class APCHead(BaseDecodeHead): + """Adaptive Pyramid Context Network for Semantic Segmentation. + + This head is the implementation of + `APCNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Adaptive Context + Module. Default: (1, 2, 3, 6). + fusion (bool): Add one conv to fuse residual feature. + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), fusion=True, **kwargs): + super(APCHead, self).__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.fusion = fusion + acm_modules = [] + for pool_scale in self.pool_scales: + acm_modules.append( + ACM(pool_scale, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.acm_modules = nn.ModuleList(acm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + acm_outs = [x] + for acm_module in self.acm_modules: + acm_outs.append(acm_module(x)) + acm_outs = torch.cat(acm_outs, dim=1) + output = self.bottleneck(acm_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/aspp_head.py b/mmseg/models/decode_heads/aspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..6332ab120ceb040f18ab962c74a97dd23bb17caa --- /dev/null +++ b/mmseg/models/decode_heads/aspp_head.py @@ -0,0 +1,107 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class ASPPModule(nn.ModuleList): + """Atrous Spatial Pyramid Pooling (ASPP) Module. + + Args: + dilations (tuple[int]): Dilation rate of each layer. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, dilations, in_channels, channels, conv_cfg, norm_cfg, + act_cfg): + super(ASPPModule, self).__init__() + self.dilations = dilations + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for dilation in dilations: + self.append( + ConvModule( + self.in_channels, + self.channels, + 1 if dilation == 1 else 3, + dilation=dilation, + padding=0 if dilation == 1 else dilation, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, x): + """Forward function.""" + aspp_outs = [] + for aspp_module in self: + aspp_outs.append(aspp_module(x)) + + return aspp_outs + + +@HEADS.register_module() +class ASPPHead(BaseDecodeHead): + """Rethinking Atrous Convolution for Semantic Image Segmentation. + + This head is the implementation of `DeepLabV3 + `_. + + Args: + dilations (tuple[int]): Dilation rates for ASPP module. + Default: (1, 6, 12, 18). + """ + + def __init__(self, dilations=(1, 6, 12, 18), **kwargs): + super(ASPPHead, self).__init__(**kwargs) + assert isinstance(dilations, (list, tuple)) + self.dilations = dilations + self.image_pool = nn.Sequential( + nn.AdaptiveAvgPool2d(1), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.aspp_modules = ASPPModule( + dilations, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + (len(dilations) + 1) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + output = self.bottleneck(aspp_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/cascade_decode_head.py b/mmseg/models/decode_heads/cascade_decode_head.py new file mode 100644 index 0000000000000000000000000000000000000000..d02122ca0e68743b1bf7a893afae96042f23838c --- /dev/null +++ b/mmseg/models/decode_heads/cascade_decode_head.py @@ -0,0 +1,57 @@ +from abc import ABCMeta, abstractmethod + +from .decode_head import BaseDecodeHead + + +class BaseCascadeDecodeHead(BaseDecodeHead, metaclass=ABCMeta): + """Base class for cascade decode head used in + :class:`CascadeEncoderDecoder.""" + + def __init__(self, *args, **kwargs): + super(BaseCascadeDecodeHead, self).__init__(*args, **kwargs) + + @abstractmethod + def forward(self, inputs, prev_output): + """Placeholder of forward function.""" + pass + + def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg, + train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs, prev_output) + losses = self.losses(seg_logits, gt_semantic_seg) + + return losses + + def forward_test(self, inputs, prev_output, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + return self.forward(inputs, prev_output) diff --git a/mmseg/models/decode_heads/cc_head.py b/mmseg/models/decode_heads/cc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..95c2706a5d4d7877895146c5ebf4396a78d29a8d --- /dev/null +++ b/mmseg/models/decode_heads/cc_head.py @@ -0,0 +1,42 @@ +import torch + +from ..builder import HEADS +from .fcn_head import FCNHead + +try: + from mmcv.ops import CrissCrossAttention +except ModuleNotFoundError: + CrissCrossAttention = None + + +@HEADS.register_module() +class CCHead(FCNHead): + """CCNet: Criss-Cross Attention for Semantic Segmentation. + + This head is the implementation of `CCNet + `_. + + Args: + recurrence (int): Number of recurrence of Criss Cross Attention + module. Default: 2. + """ + + def __init__(self, recurrence=2, **kwargs): + if CrissCrossAttention is None: + raise RuntimeError('Please install mmcv-full for ' + 'CrissCrossAttention ops') + super(CCHead, self).__init__(num_convs=2, **kwargs) + self.recurrence = recurrence + self.cca = CrissCrossAttention(self.channels) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + for _ in range(self.recurrence): + output = self.cca(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/da_head.py b/mmseg/models/decode_heads/da_head.py new file mode 100644 index 0000000000000000000000000000000000000000..8ee0e08c3d69ee4392aa550072a043548c377571 --- /dev/null +++ b/mmseg/models/decode_heads/da_head.py @@ -0,0 +1,178 @@ +import torch +import torch.nn.functional as F +from mmcv.cnn import ConvModule, Scale +from torch import nn + +from mmseg.core import add_prefix +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PAM(_SelfAttentionBlock): + """Position Attention Module (PAM) + + Args: + in_channels (int): Input channels of key/query feature. + channels (int): Output channels of key/query transform. + """ + + def __init__(self, in_channels, channels): + super(PAM, self).__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=1, + key_query_norm=False, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=False, + with_out=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None) + + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + out = super(PAM, self).forward(x, x) + + out = self.gamma(out) + x + return out + + +class CAM(nn.Module): + """Channel Attention Module (CAM)""" + + def __init__(self): + super(CAM, self).__init__() + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + batch_size, channels, height, width = x.size() + proj_query = x.view(batch_size, channels, -1) + proj_key = x.view(batch_size, channels, -1).permute(0, 2, 1) + energy = torch.bmm(proj_query, proj_key) + energy_new = torch.max( + energy, -1, keepdim=True)[0].expand_as(energy) - energy + attention = F.softmax(energy_new, dim=-1) + proj_value = x.view(batch_size, channels, -1) + + out = torch.bmm(attention, proj_value) + out = out.view(batch_size, channels, height, width) + + out = self.gamma(out) + x + return out + + +@HEADS.register_module() +class DAHead(BaseDecodeHead): + """Dual Attention Network for Scene Segmentation. + + This head is the implementation of `DANet + `_. + + Args: + pam_channels (int): The channels of Position Attention Module(PAM). + """ + + def __init__(self, pam_channels, **kwargs): + super(DAHead, self).__init__(**kwargs) + self.pam_channels = pam_channels + self.pam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam = PAM(self.channels, pam_channels) + self.pam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + self.cam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam = CAM() + self.cam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + def pam_cls_seg(self, feat): + """PAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.pam_conv_seg(feat) + return output + + def cam_cls_seg(self, feat): + """CAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.cam_conv_seg(feat) + return output + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + pam_feat = self.pam_in_conv(x) + pam_feat = self.pam(pam_feat) + pam_feat = self.pam_out_conv(pam_feat) + pam_out = self.pam_cls_seg(pam_feat) + + cam_feat = self.cam_in_conv(x) + cam_feat = self.cam(cam_feat) + cam_feat = self.cam_out_conv(cam_feat) + cam_out = self.cam_cls_seg(cam_feat) + + feat_sum = pam_feat + cam_feat + pam_cam_out = self.cls_seg(feat_sum) + + return pam_cam_out, pam_out, cam_out + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing, only ``pam_cam`` is used.""" + return self.forward(inputs)[0] + + def losses(self, seg_logit, seg_label): + """Compute ``pam_cam``, ``pam``, ``cam`` loss.""" + pam_cam_seg_logit, pam_seg_logit, cam_seg_logit = seg_logit + loss = dict() + loss.update( + add_prefix( + super(DAHead, self).losses(pam_cam_seg_logit, seg_label), + 'pam_cam')) + loss.update( + add_prefix( + super(DAHead, self).losses(pam_seg_logit, seg_label), 'pam')) + loss.update( + add_prefix( + super(DAHead, self).losses(cam_seg_logit, seg_label), 'cam')) + return loss diff --git a/mmseg/models/decode_heads/decode_head.py b/mmseg/models/decode_heads/decode_head.py new file mode 100644 index 0000000000000000000000000000000000000000..86b9b63f43818c4b842a25d143060b07c2b401e1 --- /dev/null +++ b/mmseg/models/decode_heads/decode_head.py @@ -0,0 +1,234 @@ +from abc import ABCMeta, abstractmethod + +import torch +import torch.nn as nn +from mmcv.cnn import normal_init +from mmcv.runner import auto_fp16, force_fp32 + +from mmseg.core import build_pixel_sampler +from mmseg.ops import resize +from ..builder import build_loss +from ..losses import accuracy + + +class BaseDecodeHead(nn.Module, metaclass=ABCMeta): + """Base class for BaseDecodeHead. + + Args: + in_channels (int|Sequence[int]): Input channels. + channels (int): Channels after modules, before conv_seg. + num_classes (int): Number of classes. + 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. + Default: dict(type='ReLU') + in_index (int|Sequence[int]): Input feature index. Default: -1 + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + Default: None. + loss_decode (dict): Config of decode loss. + Default: dict(type='CrossEntropyLoss'). + ignore_index (int | None): The label index to be ignored. When using + masked BCE loss, ignore_index should be set to None. Default: 255 + sampler (dict|None): The config of segmentation map sampler. + Default: None. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + """ + + def __init__(self, + in_channels, + channels, + *, + num_classes, + dropout_ratio=0.1, + conv_cfg=None, + norm_cfg=None, + act_cfg=dict(type='ReLU'), + in_index=-1, + input_transform=None, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + ignore_index=255, + sampler=None, + align_corners=False): + super(BaseDecodeHead, self).__init__() + self._init_inputs(in_channels, in_index, input_transform) + self.channels = channels + self.num_classes = num_classes + self.dropout_ratio = dropout_ratio + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.in_index = in_index + self.loss_decode = build_loss(loss_decode) + self.ignore_index = ignore_index + self.align_corners = align_corners + if sampler is not None: + self.sampler = build_pixel_sampler(sampler, context=self) + else: + self.sampler = None + + self.conv_seg = nn.Conv2d(channels, num_classes, kernel_size=1) + if dropout_ratio > 0: + self.dropout = nn.Dropout2d(dropout_ratio) + else: + self.dropout = None + self.fp16_enabled = False + + def extra_repr(self): + """Extra repr.""" + s = f'input_transform={self.input_transform}, ' \ + f'ignore_index={self.ignore_index}, ' \ + f'align_corners={self.align_corners}' + return s + + def _init_inputs(self, in_channels, in_index, input_transform): + """Check and initialize input transforms. + + The in_channels, in_index and input_transform must match. + Specifically, when input_transform is None, only single feature map + will be selected. So in_channels and in_index must be of type int. + When input_transform + + Args: + in_channels (int|Sequence[int]): Input channels. + in_index (int|Sequence[int]): Input feature index. + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + """ + + if input_transform is not None: + assert input_transform in ['resize_concat', 'multiple_select'] + self.input_transform = input_transform + self.in_index = in_index + if input_transform is not None: + assert isinstance(in_channels, (list, tuple)) + assert isinstance(in_index, (list, tuple)) + assert len(in_channels) == len(in_index) + if input_transform == 'resize_concat': + self.in_channels = sum(in_channels) + else: + self.in_channels = in_channels + else: + assert isinstance(in_channels, int) + assert isinstance(in_index, int) + self.in_channels = in_channels + + def init_weights(self): + """Initialize weights of classification layer.""" + normal_init(self.conv_seg, mean=0, std=0.01) + + def _transform_inputs(self, inputs): + """Transform inputs for decoder. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + Tensor: The transformed inputs + """ + + if self.input_transform == 'resize_concat': + inputs = [inputs[i] for i in self.in_index] + upsampled_inputs = [ + resize( + input=x, + size=inputs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) for x in inputs + ] + inputs = torch.cat(upsampled_inputs, dim=1) + elif self.input_transform == 'multiple_select': + inputs = [inputs[i] for i in self.in_index] + else: + inputs = inputs[self.in_index] + + return inputs + + @auto_fp16() + @abstractmethod + def forward(self, inputs): + """Placeholder of forward function.""" + pass + + def forward_train(self, inputs, img_metas, gt_semantic_seg, train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs) + losses = self.losses(seg_logits, gt_semantic_seg) + return losses + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + return self.forward(inputs) + + def cls_seg(self, feat): + """Classify each pixel.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.conv_seg(feat) + return output + + @force_fp32(apply_to=('seg_logit', )) + def losses(self, seg_logit, seg_label): + """Compute segmentation loss.""" + loss = dict() + seg_logit = resize( + input=seg_logit, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logit, seg_label) + else: + seg_weight = None + seg_label = seg_label.squeeze(1) + loss['loss_seg'] = self.loss_decode( + seg_logit, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index) + loss['acc_seg'] = accuracy(seg_logit, seg_label) + return loss diff --git a/mmseg/models/decode_heads/dm_head.py b/mmseg/models/decode_heads/dm_head.py new file mode 100644 index 0000000000000000000000000000000000000000..1c918fc35d1477f7a961e3c8185f451583e3e8d8 --- /dev/null +++ b/mmseg/models/decode_heads/dm_head.py @@ -0,0 +1,140 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class DCM(nn.Module): + """Dynamic Convolutional Module used in DMNet. + + Args: + filter_size (int): The filter size of generated convolution kernel + used in Dynamic Convolutional Module. + fusion (bool): Add one conv to fuse DCM output feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, filter_size, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super(DCM, self).__init__() + self.filter_size = filter_size + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.filter_gen_conv = nn.Conv2d(self.in_channels, self.channels, 1, 1, + 0) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.norm_cfg is not None: + self.norm = build_norm_layer(self.norm_cfg, self.channels)[1] + else: + self.norm = None + self.activate = build_activation_layer(self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + generted_filter = self.filter_gen_conv( + F.adaptive_avg_pool2d(x, self.filter_size)) + x = self.input_redu_conv(x) + b, c, h, w = x.shape + # [1, b * c, h, w], c = self.channels + x = x.view(1, b * c, h, w) + # [b * c, 1, filter_size, filter_size] + generted_filter = generted_filter.view(b * c, 1, self.filter_size, + self.filter_size) + pad = (self.filter_size - 1) // 2 + if (self.filter_size - 1) % 2 == 0: + p2d = (pad, pad, pad, pad) + else: + p2d = (pad + 1, pad, pad + 1, pad) + x = F.pad(input=x, pad=p2d, mode='constant', value=0) + # [1, b * c, h, w] + output = F.conv2d(input=x, weight=generted_filter, groups=b * c) + # [b, c, h, w] + output = output.view(b, c, h, w) + if self.norm is not None: + output = self.norm(output) + output = self.activate(output) + + if self.fusion: + output = self.fusion_conv(output) + + return output + + +@HEADS.register_module() +class DMHead(BaseDecodeHead): + """Dynamic Multi-scale Filters for Semantic Segmentation. + + This head is the implementation of + `DMNet `_. + + Args: + filter_sizes (tuple[int]): The size of generated convolutional filters + used in Dynamic Convolutional Module. Default: (1, 3, 5, 7). + fusion (bool): Add one conv to fuse DCM output feature. + """ + + def __init__(self, filter_sizes=(1, 3, 5, 7), fusion=False, **kwargs): + super(DMHead, self).__init__(**kwargs) + assert isinstance(filter_sizes, (list, tuple)) + self.filter_sizes = filter_sizes + self.fusion = fusion + dcm_modules = [] + for filter_size in self.filter_sizes: + dcm_modules.append( + DCM(filter_size, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.dcm_modules = nn.ModuleList(dcm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(filter_sizes) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + dcm_outs = [x] + for dcm_module in self.dcm_modules: + dcm_outs.append(dcm_module(x)) + dcm_outs = torch.cat(dcm_outs, dim=1) + output = self.bottleneck(dcm_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/dnl_head.py b/mmseg/models/decode_heads/dnl_head.py new file mode 100644 index 0000000000000000000000000000000000000000..52a662ccb6ae8ff00930eb54ed71113724b6494e --- /dev/null +++ b/mmseg/models/decode_heads/dnl_head.py @@ -0,0 +1,131 @@ +import torch +from mmcv.cnn import NonLocal2d +from torch import nn + +from ..builder import HEADS +from .fcn_head import FCNHead + + +class DisentangledNonLocal2d(NonLocal2d): + """Disentangled Non-Local Blocks. + + Args: + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, *arg, temperature, **kwargs): + super().__init__(*arg, **kwargs) + self.temperature = temperature + self.conv_mask = nn.Conv2d(self.in_channels, 1, kernel_size=1) + + def embedded_gaussian(self, theta_x, phi_x): + """Embedded gaussian with temperature.""" + + # NonLocal2d pairwise_weight: [N, HxW, HxW] + pairwise_weight = torch.matmul(theta_x, phi_x) + if self.use_scale: + # theta_x.shape[-1] is `self.inter_channels` + pairwise_weight /= theta_x.shape[-1]**0.5 + pairwise_weight /= self.temperature + pairwise_weight = pairwise_weight.softmax(dim=-1) + return pairwise_weight + + def forward(self, x): + # x: [N, C, H, W] + n = x.size(0) + + # g_x: [N, HxW, C] + g_x = self.g(x).view(n, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + # theta_x: [N, HxW, C], phi_x: [N, C, HxW] + if self.mode == 'gaussian': + theta_x = x.view(n, self.in_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + if self.sub_sample: + phi_x = self.phi(x).view(n, self.in_channels, -1) + else: + phi_x = x.view(n, self.in_channels, -1) + elif self.mode == 'concatenation': + theta_x = self.theta(x).view(n, self.inter_channels, -1, 1) + phi_x = self.phi(x).view(n, self.inter_channels, 1, -1) + else: + theta_x = self.theta(x).view(n, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x).view(n, self.inter_channels, -1) + + # subtract mean + theta_x -= theta_x.mean(dim=-2, keepdim=True) + phi_x -= phi_x.mean(dim=-1, keepdim=True) + + pairwise_func = getattr(self, self.mode) + # pairwise_weight: [N, HxW, HxW] + pairwise_weight = pairwise_func(theta_x, phi_x) + + # y: [N, HxW, C] + y = torch.matmul(pairwise_weight, g_x) + # y: [N, C, H, W] + y = y.permute(0, 2, 1).contiguous().reshape(n, self.inter_channels, + *x.size()[2:]) + + # unary_mask: [N, 1, HxW] + unary_mask = self.conv_mask(x) + unary_mask = unary_mask.view(n, 1, -1) + unary_mask = unary_mask.softmax(dim=-1) + # unary_x: [N, 1, C] + unary_x = torch.matmul(unary_mask, g_x) + # unary_x: [N, C, 1, 1] + unary_x = unary_x.permute(0, 2, 1).contiguous().reshape( + n, self.inter_channels, 1, 1) + + output = x + self.conv_out(y + unary_x) + + return output + + +@HEADS.register_module() +class DNLHead(FCNHead): + """Disentangled Non-Local Neural Networks. + + This head is the implementation of `DNLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: False. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + temperature=0.05, + **kwargs): + super(DNLHead, self).__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.temperature = temperature + self.dnl_block = DisentangledNonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode, + temperature=self.temperature) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.dnl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/ema_head.py b/mmseg/models/decode_heads/ema_head.py new file mode 100644 index 0000000000000000000000000000000000000000..619d757046a61e2dd1ad4b88a8b85f4688f35492 --- /dev/null +++ b/mmseg/models/decode_heads/ema_head.py @@ -0,0 +1,168 @@ +import math + +import torch +import torch.distributed as dist +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +def reduce_mean(tensor): + """Reduce mean when distributed training.""" + if not (dist.is_available() and dist.is_initialized()): + return tensor + tensor = tensor.clone() + dist.all_reduce(tensor.div_(dist.get_world_size()), op=dist.ReduceOp.SUM) + return tensor + + +class EMAModule(nn.Module): + """Expectation Maximization Attention Module used in EMANet. + + Args: + channels (int): Channels of the whole module. + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + """ + + def __init__(self, channels, num_bases, num_stages, momentum): + super(EMAModule, self).__init__() + assert num_stages >= 1, 'num_stages must be at least 1!' + self.num_bases = num_bases + self.num_stages = num_stages + self.momentum = momentum + + bases = torch.zeros(1, channels, self.num_bases) + bases.normal_(0, math.sqrt(2. / self.num_bases)) + # [1, channels, num_bases] + bases = F.normalize(bases, dim=1, p=2) + self.register_buffer('bases', bases) + + def forward(self, feats): + """Forward function.""" + batch_size, channels, height, width = feats.size() + # [batch_size, channels, height*width] + feats = feats.view(batch_size, channels, height * width) + # [batch_size, channels, num_bases] + bases = self.bases.repeat(batch_size, 1, 1) + + with torch.no_grad(): + for i in range(self.num_stages): + # [batch_size, height*width, num_bases] + attention = torch.einsum('bcn,bck->bnk', feats, bases) + attention = F.softmax(attention, dim=2) + # l1 norm + attention_normed = F.normalize(attention, dim=1, p=1) + # [batch_size, channels, num_bases] + bases = torch.einsum('bcn,bnk->bck', feats, attention_normed) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + + feats_recon = torch.einsum('bck,bnk->bcn', bases, attention) + feats_recon = feats_recon.view(batch_size, channels, height, width) + + if self.training: + bases = bases.mean(dim=0, keepdim=True) + bases = reduce_mean(bases) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + self.bases = (1 - + self.momentum) * self.bases + self.momentum * bases + + return feats_recon + + +@HEADS.register_module() +class EMAHead(BaseDecodeHead): + """Expectation Maximization Attention Networks for Semantic Segmentation. + + This head is the implementation of `EMANet + `_. + + Args: + ema_channels (int): EMA module channels + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + concat_input (bool): Whether concat the input and output of convs + before classification layer. Default: True + momentum (float): Momentum to update the base. Default: 0.1. + """ + + def __init__(self, + ema_channels, + num_bases, + num_stages, + concat_input=True, + momentum=0.1, + **kwargs): + super(EMAHead, self).__init__(**kwargs) + self.ema_channels = ema_channels + self.num_bases = num_bases + self.num_stages = num_stages + self.concat_input = concat_input + self.momentum = momentum + self.ema_module = EMAModule(self.ema_channels, self.num_bases, + self.num_stages, self.momentum) + + self.ema_in_conv = ConvModule( + self.in_channels, + self.ema_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # project (0, inf) -> (-inf, inf) + self.ema_mid_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=None, + act_cfg=None) + for param in self.ema_mid_conv.parameters(): + param.requires_grad = False + + self.ema_out_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.bottleneck = ConvModule( + self.ema_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.ema_in_conv(x) + identity = feats + feats = self.ema_mid_conv(feats) + recon = self.ema_module(feats) + recon = F.relu(recon, inplace=True) + recon = self.ema_out_conv(recon) + output = F.relu(identity + recon, inplace=True) + output = self.bottleneck(output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/enc_head.py b/mmseg/models/decode_heads/enc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..0c11994cf6272bd52ed3576486f4b8d7366af940 --- /dev/null +++ b/mmseg/models/decode_heads/enc_head.py @@ -0,0 +1,187 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_norm_layer + +from mmseg.ops import Encoding, resize +from ..builder import HEADS, build_loss +from .decode_head import BaseDecodeHead + + +class EncModule(nn.Module): + """Encoding Module used in EncNet. + + Args: + in_channels (int): Input channels. + num_codes (int): Number of code words. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, in_channels, num_codes, conv_cfg, norm_cfg, act_cfg): + super(EncModule, self).__init__() + self.encoding_project = ConvModule( + in_channels, + in_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + # TODO: resolve this hack + # change to 1d + if norm_cfg is not None: + encoding_norm_cfg = norm_cfg.copy() + if encoding_norm_cfg['type'] in ['BN', 'IN']: + encoding_norm_cfg['type'] += '1d' + else: + encoding_norm_cfg['type'] = encoding_norm_cfg['type'].replace( + '2d', '1d') + else: + # fallback to BN1d + encoding_norm_cfg = dict(type='BN1d') + self.encoding = nn.Sequential( + Encoding(channels=in_channels, num_codes=num_codes), + build_norm_layer(encoding_norm_cfg, num_codes)[1], + nn.ReLU(inplace=True)) + self.fc = nn.Sequential( + nn.Linear(in_channels, in_channels), nn.Sigmoid()) + + def forward(self, x): + """Forward function.""" + encoding_projection = self.encoding_project(x) + encoding_feat = self.encoding(encoding_projection).mean(dim=1) + batch_size, channels, _, _ = x.size() + gamma = self.fc(encoding_feat) + y = gamma.view(batch_size, channels, 1, 1) + output = F.relu_(x + x * y) + return encoding_feat, output + + +@HEADS.register_module() +class EncHead(BaseDecodeHead): + """Context Encoding for Semantic Segmentation. + + This head is the implementation of `EncNet + `_. + + Args: + num_codes (int): Number of code words. Default: 32. + use_se_loss (bool): Whether use Semantic Encoding Loss (SE-loss) to + regularize the training. Default: True. + add_lateral (bool): Whether use lateral connection to fuse features. + Default: False. + loss_se_decode (dict): Config of decode loss. + Default: dict(type='CrossEntropyLoss', use_sigmoid=True). + """ + + def __init__(self, + num_codes=32, + use_se_loss=True, + add_lateral=False, + loss_se_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=0.2), + **kwargs): + super(EncHead, self).__init__( + input_transform='multiple_select', **kwargs) + self.use_se_loss = use_se_loss + self.add_lateral = add_lateral + self.num_codes = num_codes + self.bottleneck = ConvModule( + self.in_channels[-1], + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if add_lateral: + self.lateral_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the last one + self.lateral_convs.append( + ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.fusion = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.enc_module = EncModule( + self.channels, + num_codes=num_codes, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.use_se_loss: + self.loss_se_decode = build_loss(loss_se_decode) + self.se_layer = nn.Linear(self.channels, self.num_classes) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + feat = self.bottleneck(inputs[-1]) + if self.add_lateral: + laterals = [ + resize( + lateral_conv(inputs[i]), + size=feat.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + feat = self.fusion(torch.cat([feat, *laterals], 1)) + encode_feat, output = self.enc_module(feat) + output = self.cls_seg(output) + if self.use_se_loss: + se_output = self.se_layer(encode_feat) + return output, se_output + else: + return output + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing, ignore se_loss.""" + if self.use_se_loss: + return self.forward(inputs)[0] + else: + return self.forward(inputs) + + @staticmethod + def _convert_to_onehot_labels(seg_label, num_classes): + """Convert segmentation label to onehot. + + Args: + seg_label (Tensor): Segmentation label of shape (N, H, W). + num_classes (int): Number of classes. + + Returns: + Tensor: Onehot labels of shape (N, num_classes). + """ + + batch_size = seg_label.size(0) + onehot_labels = seg_label.new_zeros((batch_size, num_classes)) + for i in range(batch_size): + hist = seg_label[i].float().histc( + bins=num_classes, min=0, max=num_classes - 1) + onehot_labels[i] = hist > 0 + return onehot_labels + + def losses(self, seg_logit, seg_label): + """Compute segmentation and semantic encoding loss.""" + seg_logit, se_seg_logit = seg_logit + loss = dict() + loss.update(super(EncHead, self).losses(seg_logit, seg_label)) + se_loss = self.loss_se_decode( + se_seg_logit, + self._convert_to_onehot_labels(seg_label, self.num_classes)) + loss['loss_se'] = se_loss + return loss diff --git a/mmseg/models/decode_heads/fcn_head.py b/mmseg/models/decode_heads/fcn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..d660847f8919c3d53d0e41358962fedab5a25044 --- /dev/null +++ b/mmseg/models/decode_heads/fcn_head.py @@ -0,0 +1,76 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class FCNHead(BaseDecodeHead): + """Fully Convolution Networks for Semantic Segmentation. + + This head is implemented of `FCNNet `_. + + Args: + num_convs (int): Number of convs in the head. Default: 2. + kernel_size (int): The kernel size for convs in the head. Default: 3. + concat_input (bool): Whether concat the input and output of convs + before classification layer. + """ + + def __init__(self, + num_convs=2, + kernel_size=3, + concat_input=True, + **kwargs): + assert num_convs >= 0 + self.num_convs = num_convs + self.concat_input = concat_input + self.kernel_size = kernel_size + super(FCNHead, self).__init__(**kwargs) + if num_convs == 0: + assert self.in_channels == self.channels + + convs = [] + convs.append( + ConvModule( + self.in_channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + for i in range(num_convs - 1): + convs.append( + ConvModule( + self.channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if num_convs == 0: + self.convs = nn.Identity() + else: + self.convs = nn.Sequential(*convs) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs(x) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/fpn_head.py b/mmseg/models/decode_heads/fpn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..9b6ada005995cc7e7f0b0cd66f4880d6a2bd665b --- /dev/null +++ b/mmseg/models/decode_heads/fpn_head.py @@ -0,0 +1,68 @@ +import numpy as np +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class FPNHead(BaseDecodeHead): + """Panoptic Feature Pyramid Networks. + + This head is the implementation of `Semantic FPN + `_. + + Args: + feature_strides (tuple[int]): The strides for input feature maps. + stack_lateral. All strides suppose to be power of 2. The first + one is of largest resolution. + """ + + def __init__(self, feature_strides, **kwargs): + super(FPNHead, self).__init__( + input_transform='multiple_select', **kwargs) + assert len(feature_strides) == len(self.in_channels) + assert min(feature_strides) == feature_strides[0] + self.feature_strides = feature_strides + + self.scale_heads = nn.ModuleList() + for i in range(len(feature_strides)): + head_length = max( + 1, + int(np.log2(feature_strides[i]) - np.log2(feature_strides[0]))) + scale_head = [] + for k in range(head_length): + scale_head.append( + ConvModule( + self.in_channels[i] if k == 0 else self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if feature_strides[i] != feature_strides[0]: + scale_head.append( + nn.Upsample( + scale_factor=2, + mode='bilinear', + align_corners=self.align_corners)) + self.scale_heads.append(nn.Sequential(*scale_head)) + + def forward(self, inputs): + + x = self._transform_inputs(inputs) + + output = self.scale_heads[0](x[0]) + for i in range(1, len(self.feature_strides)): + # non inplace + output = output + resize( + self.scale_heads[i](x[i]), + size=output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/gc_head.py b/mmseg/models/decode_heads/gc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..336866375002c84206bec0d8c8e06518abefac6f --- /dev/null +++ b/mmseg/models/decode_heads/gc_head.py @@ -0,0 +1,47 @@ +import torch +from mmcv.cnn import ContextBlock + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class GCHead(FCNHead): + """GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond. + + This head is the implementation of `GCNet + `_. + + Args: + ratio (float): Multiplier of channels ratio. Default: 1/4. + pooling_type (str): The pooling type of context aggregation. + Options are 'att', 'avg'. Default: 'avg'. + fusion_types (tuple[str]): The fusion type for feature fusion. + Options are 'channel_add', 'channel_mul'. Defautl: ('channel_add',) + """ + + def __init__(self, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + **kwargs): + super(GCHead, self).__init__(num_convs=2, **kwargs) + self.ratio = ratio + self.pooling_type = pooling_type + self.fusion_types = fusion_types + self.gc_block = ContextBlock( + in_channels=self.channels, + ratio=self.ratio, + pooling_type=self.pooling_type, + fusion_types=self.fusion_types) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.gc_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/helpers.py b/mmseg/models/decode_heads/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..6813f73575dabe89d415cee0d55cb17b056b88de --- /dev/null +++ b/mmseg/models/decode_heads/helpers.py @@ -0,0 +1,93 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +import math +import logging + +_logger = logging.getLogger(__name__) + +def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False): + if cfg is None: + cfg = getattr(model, 'default_cfg') + if cfg is None or 'url' not in cfg or not cfg['url']: + _logger.warning("Pretrained model URL is invalid, using random initialization.") + return + + if 'pretrained_finetune' in cfg and cfg['pretrained_finetune']: + state_dict = torch.load(cfg['pretrained_finetune']) + print('load pre-trained weight from ' + cfg['pretrained_finetune']) + else: + state_dict = model_zoo.load_url(cfg['url'], progress=False, map_location='cpu') + print('load pre-trained weight from imagenet21k') + + + if filter_fn is not None: + state_dict = filter_fn(state_dict) + + if in_chans == 1: + conv1_name = cfg['first_conv'] + _logger.info('Converting first conv (%s) pretrained weights from 3 to 1 channel' % conv1_name) + conv1_weight = state_dict[conv1_name + '.weight'] + # Some weights are in torch.half, ensure it's float for sum on CPU + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I > 3: + assert conv1_weight.shape[1] % 3 == 0 + # For models with space2depth stems + conv1_weight = conv1_weight.reshape(O, I // 3, 3, J, K) + conv1_weight = conv1_weight.sum(dim=2, keepdim=False) + else: + conv1_weight = conv1_weight.sum(dim=1, keepdim=True) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + elif in_chans != 3: + conv1_name = cfg['first_conv'] + conv1_weight = state_dict[conv1_name + '.weight'] + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I == 3: + _logger.warning('Deleting first conv (%s) from pretrained weights.' % conv1_name) + del state_dict[conv1_name + '.weight'] + strict = False + else: + # NOTE this strategy should be better than random init, but there could be other combinations of + # the original RGB input layer weights that'd work better for specific cases. + _logger.info('Repeating first conv (%s) weights in channel dim.' % conv1_name) + repeat = int(math.ceil(in_chans / 3)) + conv1_weight = conv1_weight.repeat(1, repeat, 1, 1)[:, :in_chans, :, :] + conv1_weight *= (3 / float(in_chans)) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + + classifier_name = cfg['classifier'] + if num_classes == 1000 and cfg['num_classes'] == 1001: + # special case for imagenet trained models with extra background class in pretrained weights + classifier_weight = state_dict[classifier_name + '.weight'] + state_dict[classifier_name + '.weight'] = classifier_weight[1:] + classifier_bias = state_dict[classifier_name + '.bias'] + state_dict[classifier_name + '.bias'] = classifier_bias[1:] + elif num_classes != cfg['num_classes']: + # completely discard fully connected for all other differences between pretrained and created model + del state_dict[classifier_name + '.weight'] + del state_dict[classifier_name + '.bias'] + strict = False + + + if pos_embed_interp: + pos_embed_weight = state_dict['pos_embed'][:,1:] + pos_embed_weight = pos_embed_weight.transpose(1,2) + n, c, hw = pos_embed_weight.shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = pos_embed_weight.view(n,c,h,w) + + pos_embed_weight = F.interpolate(pos_embed_weight, size=int(math.sqrt(num_patches)), mode='bilinear', align_corners=align_corners) + pos_embed_weight = pos_embed_weight.view(n,c,-1).transpose(1,2) + + cls_token_weight = state_dict['pos_embed'][:,0].unsqueeze(1) + + state_dict['pos_embed'] = torch.cat((cls_token_weight, pos_embed_weight), dim=1) + + model.load_state_dict(state_dict, strict=strict) diff --git a/mmseg/models/decode_heads/layers/__init__.py b/mmseg/models/decode_heads/layers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..afd5f348b48afa6da4570255c269c73c3c73157e --- /dev/null +++ b/mmseg/models/decode_heads/layers/__init__.py @@ -0,0 +1,3 @@ +from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple +from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path +from .weight_init import trunc_normal_ \ No newline at end of file diff --git a/mmseg/models/decode_heads/layers/drop.py b/mmseg/models/decode_heads/layers/drop.py new file mode 100644 index 0000000000000000000000000000000000000000..6de9e3f729f7f1ca29d4511f6c64733d3169fbec --- /dev/null +++ b/mmseg/models/decode_heads/layers/drop.py @@ -0,0 +1,168 @@ +""" DropBlock, DropPath + +PyTorch implementations of DropBlock and DropPath (Stochastic Depth) regularization layers. + +Papers: +DropBlock: A regularization method for convolutional networks (https://arxiv.org/abs/1810.12890) + +Deep Networks with Stochastic Depth (https://arxiv.org/abs/1603.09382) + +Code: +DropBlock impl inspired by two Tensorflow impl that I liked: + - https://github.com/tensorflow/tpu/blob/master/models/official/resnet/resnet_model.py#L74 + - https://github.com/clovaai/assembled-cnn/blob/master/nets/blocks.py + +Hacked together by / Copyright 2020 Ross Wightman +""" +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def drop_block_2d( + x, drop_prob: float = 0.1, block_size: int = 7, gamma_scale: float = 1.0, + with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. This layer has been tested on a few training + runs with success, but needs further validation and possibly optimization for lower runtime impact. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + # seed_drop_rate, the gamma parameter + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + # Forces the block to be inside the feature map. + w_i, h_i = torch.meshgrid(torch.arange(W).to(x.device), torch.arange(H).to(x.device)) + valid_block = ((w_i >= clipped_block_size // 2) & (w_i < W - (clipped_block_size - 1) // 2)) & \ + ((h_i >= clipped_block_size // 2) & (h_i < H - (clipped_block_size - 1) // 2)) + valid_block = torch.reshape(valid_block, (1, 1, H, W)).to(dtype=x.dtype) + + if batchwise: + # one mask for whole batch, quite a bit faster + uniform_noise = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) + else: + uniform_noise = torch.rand_like(x) + block_mask = ((2 - gamma - valid_block + uniform_noise) >= 1).to(dtype=x.dtype) + block_mask = -F.max_pool2d( + -block_mask, + kernel_size=clipped_block_size, # block_size, + stride=1, + padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(block_mask).add_(normal_noise * (1 - block_mask)) + else: + x = x * block_mask + normal_noise * (1 - block_mask) + else: + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +def drop_block_fast_2d( + x: torch.Tensor, drop_prob: float = 0.1, block_size: int = 7, + gamma_scale: float = 1.0, with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. Simplied from above without concern for valid + block mask at edges. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + if batchwise: + # one mask for whole batch, quite a bit faster + block_mask = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) < gamma + else: + # mask per batch element + block_mask = torch.rand_like(x) < gamma + block_mask = F.max_pool2d( + block_mask.to(x.dtype), kernel_size=clipped_block_size, stride=1, padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(1. - block_mask).add_(normal_noise * block_mask) + else: + x = x * (1. - block_mask) + normal_noise * block_mask + else: + block_mask = 1 - block_mask + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(dtype=x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +class DropBlock2d(nn.Module): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + """ + def __init__(self, + drop_prob=0.1, + block_size=7, + gamma_scale=1.0, + with_noise=False, + inplace=False, + batchwise=False, + fast=True): + super(DropBlock2d, self).__init__() + self.drop_prob = drop_prob + self.gamma_scale = gamma_scale + self.block_size = block_size + self.with_noise = with_noise + self.inplace = inplace + self.batchwise = batchwise + self.fast = fast # FIXME finish comparisons of fast vs not + + def forward(self, x): + if not self.training or not self.drop_prob: + return x + if self.fast: + return drop_block_fast_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + else: + return drop_block_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + + +def drop_path(x, drop_prob: float = 0., training: bool = False): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets + random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device) + random_tensor.floor_() # binarize + output = x.div(keep_prob) * random_tensor + return output + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + """ + def __init__(self, drop_prob=None): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training) diff --git a/mmseg/models/decode_heads/layers/helpers.py b/mmseg/models/decode_heads/layers/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..65521132c6a8d911e51e8f95abfeeba2f20843b1 --- /dev/null +++ b/mmseg/models/decode_heads/layers/helpers.py @@ -0,0 +1,26 @@ +""" Layer/Module Helpers + +Hacked together by / Copyright 2020 Ross Wightman +""" +from itertools import repeat +from torch._six import container_abcs + + +# From PyTorch internals +def _ntuple(n): + def parse(x): + if isinstance(x, container_abcs.Iterable): + return x + return tuple(repeat(x, n)) + return parse + + +to_1tuple = _ntuple(1) +to_2tuple = _ntuple(2) +to_3tuple = _ntuple(3) +to_4tuple = _ntuple(4) +to_ntuple = _ntuple + + + + diff --git a/mmseg/models/decode_heads/layers/weight_init.py b/mmseg/models/decode_heads/layers/weight_init.py new file mode 100644 index 0000000000000000000000000000000000000000..d731029ff1708776758d9af60e5b205818940a6d --- /dev/null +++ b/mmseg/models/decode_heads/layers/weight_init.py @@ -0,0 +1,60 @@ +import torch +import math +import warnings + + +def _no_grad_trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1. + math.erf(x / math.sqrt(2.))) / 2. + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn("mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2) + + with torch.no_grad(): + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.): + # type: (Tensor, float, float, float, float) -> Tensor + r"""Fills the input Tensor with values drawn from a truncated + normal distribution. The values are effectively drawn from the + normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + return _no_grad_trunc_normal_(tensor, mean, std, a, b) diff --git a/mmseg/models/decode_heads/lraspp_head.py b/mmseg/models/decode_heads/lraspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..32a093caded74a97e991ca61d45bec888396c9f2 --- /dev/null +++ b/mmseg/models/decode_heads/lraspp_head.py @@ -0,0 +1,90 @@ +import torch +import torch.nn as nn +from mmcv import is_tuple_of +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class LRASPPHead(BaseDecodeHead): + """Lite R-ASPP (LRASPP) head is proposed in Searching for MobileNetV3. + + This head is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + branch_channels (tuple[int]): The number of output channels in every + each branch. Default: (32, 64). + """ + + def __init__(self, branch_channels=(32, 64), **kwargs): + super(LRASPPHead, self).__init__(**kwargs) + if self.input_transform != 'multiple_select': + raise ValueError('in Lite R-ASPP (LRASPP) head, input_transform ' + f'must be \'multiple_select\'. But received ' + f'\'{self.input_transform}\'') + assert is_tuple_of(branch_channels, int) + assert len(branch_channels) == len(self.in_channels) - 1 + self.branch_channels = branch_channels + + self.convs = nn.Sequential() + self.conv_ups = nn.Sequential() + for i in range(len(branch_channels)): + self.convs.add_module( + f'conv{i}', + nn.Conv2d( + self.in_channels[i], branch_channels[i], 1, bias=False)) + self.conv_ups.add_module( + f'conv_up{i}', + ConvModule( + self.channels + branch_channels[i], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False)) + + self.conv_up_input = nn.Conv2d(self.channels, self.channels, 1) + + self.aspp_conv = ConvModule( + self.in_channels[-1], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False) + self.image_pool = nn.Sequential( + nn.AvgPool2d(kernel_size=49, stride=(16, 20)), + ConvModule( + self.in_channels[2], + self.channels, + 1, + act_cfg=dict(type='Sigmoid'), + bias=False)) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + + x = inputs[-1] + + x = self.aspp_conv(x) * resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = self.conv_up_input(x) + + for i in range(len(self.branch_channels) - 1, -1, -1): + x = resize( + x, + size=inputs[i].size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = torch.cat([x, self.convs[i](inputs[i])], 1) + x = self.conv_ups[i](x) + + return self.cls_seg(x) diff --git a/mmseg/models/decode_heads/nl_head.py b/mmseg/models/decode_heads/nl_head.py new file mode 100644 index 0000000000000000000000000000000000000000..31658755a6599bc9f52bd59767ef60452d5b9fbb --- /dev/null +++ b/mmseg/models/decode_heads/nl_head.py @@ -0,0 +1,49 @@ +import torch +from mmcv.cnn import NonLocal2d + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class NLHead(FCNHead): + """Non-local Neural Networks. + + This head is the implementation of `NLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: True. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + **kwargs): + super(NLHead, self).__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.nl_block = NonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.nl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/ocr_head.py b/mmseg/models/decode_heads/ocr_head.py new file mode 100644 index 0000000000000000000000000000000000000000..e180e10276e9a4d794501d0f399740c189775673 --- /dev/null +++ b/mmseg/models/decode_heads/ocr_head.py @@ -0,0 +1,127 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .cascade_decode_head import BaseCascadeDecodeHead + + +class SpatialGatherModule(nn.Module): + """Aggregate the context features according to the initial predicted + probability distribution. + + Employ the soft-weighted method to aggregate the context. + """ + + def __init__(self, scale): + super(SpatialGatherModule, self).__init__() + self.scale = scale + + def forward(self, feats, probs): + """Forward function.""" + batch_size, num_classes, height, width = probs.size() + channels = feats.size(1) + probs = probs.view(batch_size, num_classes, -1) + feats = feats.view(batch_size, channels, -1) + # [batch_size, height*width, num_classes] + feats = feats.permute(0, 2, 1) + # [batch_size, channels, height*width] + probs = F.softmax(self.scale * probs, dim=2) + # [batch_size, channels, num_classes] + ocr_context = torch.matmul(probs, feats) + ocr_context = ocr_context.permute(0, 2, 1).contiguous().unsqueeze(3) + return ocr_context + + +class ObjectAttentionBlock(_SelfAttentionBlock): + """Make a OCR used SelfAttentionBlock.""" + + def __init__(self, in_channels, channels, scale, conv_cfg, norm_cfg, + act_cfg): + if scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=scale) + else: + query_downsample = None + super(ObjectAttentionBlock, self).__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=query_downsample, + key_downsample=None, + key_query_num_convs=2, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=True, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.bottleneck = ConvModule( + in_channels * 2, + in_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, query_feats, key_feats): + """Forward function.""" + context = super(ObjectAttentionBlock, + self).forward(query_feats, key_feats) + output = self.bottleneck(torch.cat([context, query_feats], dim=1)) + if self.query_downsample is not None: + output = resize(query_feats) + + return output + + +@HEADS.register_module() +class OCRHead(BaseCascadeDecodeHead): + """Object-Contextual Representations for Semantic Segmentation. + + This head is the implementation of `OCRNet + `_. + + Args: + ocr_channels (int): The intermediate channels of OCR block. + scale (int): The scale of probability map in SpatialGatherModule in + Default: 1. + """ + + def __init__(self, ocr_channels, scale=1, **kwargs): + super(OCRHead, self).__init__(**kwargs) + self.ocr_channels = ocr_channels + self.scale = scale + self.object_context_block = ObjectAttentionBlock( + self.channels, + self.ocr_channels, + self.scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.spatial_gather_module = SpatialGatherModule(self.scale) + + self.bottleneck = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs, prev_output): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.bottleneck(x) + context = self.spatial_gather_module(feats, prev_output) + object_context = self.object_context_block(feats, context) + output = self.cls_seg(object_context) + + return output diff --git a/mmseg/models/decode_heads/point_head.py b/mmseg/models/decode_heads/point_head.py new file mode 100644 index 0000000000000000000000000000000000000000..90a23635d935abf1179f181f04ab0f4265c6a1c7 --- /dev/null +++ b/mmseg/models/decode_heads/point_head.py @@ -0,0 +1,349 @@ +# Modified from https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend/point_head/point_head.py # noqa + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, normal_init +from mmcv.ops import point_sample + +from mmseg.models.builder import HEADS +from mmseg.ops import resize +from ..losses import accuracy +from .cascade_decode_head import BaseCascadeDecodeHead + + +def calculate_uncertainty(seg_logits): + """Estimate uncertainty based on seg logits. + + For each location of the prediction ``seg_logits`` we estimate + uncertainty as the difference between top first and top second + predicted logits. + + Args: + seg_logits (Tensor): Semantic segmentation logits, + shape (batch_size, num_classes, height, width). + + Returns: + scores (Tensor): T uncertainty scores with the most uncertain + locations having the highest uncertainty score, shape ( + batch_size, 1, height, width) + """ + top2_scores = torch.topk(seg_logits, k=2, dim=1)[0] + return (top2_scores[:, 1] - top2_scores[:, 0]).unsqueeze(1) + + +@HEADS.register_module() +class PointHead(BaseCascadeDecodeHead): + """A mask point head use in PointRend. + + ``PointHead`` use shared multi-layer perceptron (equivalent to + nn.Conv1d) to predict the logit of input points. The fine-grained feature + and coarse feature will be concatenate together for predication. + + Args: + num_fcs (int): Number of fc layers in the head. Default: 3. + in_channels (int): Number of input channels. Default: 256. + fc_channels (int): Number of fc channels. Default: 256. + num_classes (int): Number of classes for logits. Default: 80. + class_agnostic (bool): Whether use class agnostic classification. + If so, the output channels of logits will be 1. Default: False. + coarse_pred_each_layer (bool): Whether concatenate coarse feature with + the output of each fc layer. Default: True. + conv_cfg (dict|None): Dictionary to construct and config conv layer. + Default: dict(type='Conv1d')) + norm_cfg (dict|None): Dictionary to construct and config norm layer. + Default: None. + loss_point (dict): Dictionary to construct and config loss layer of + point head. Default: dict(type='CrossEntropyLoss', use_mask=True, + loss_weight=1.0). + """ + + def __init__(self, + num_fcs=3, + coarse_pred_each_layer=True, + conv_cfg=dict(type='Conv1d'), + norm_cfg=None, + act_cfg=dict(type='ReLU', inplace=False), + **kwargs): + super(PointHead, self).__init__( + input_transform='multiple_select', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs) + + self.num_fcs = num_fcs + self.coarse_pred_each_layer = coarse_pred_each_layer + + fc_in_channels = sum(self.in_channels) + self.num_classes + fc_channels = self.channels + self.fcs = nn.ModuleList() + for k in range(num_fcs): + fc = ConvModule( + fc_in_channels, + fc_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.fcs.append(fc) + fc_in_channels = fc_channels + fc_in_channels += self.num_classes if self.coarse_pred_each_layer \ + else 0 + self.fc_seg = nn.Conv1d( + fc_in_channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0) + if self.dropout_ratio > 0: + self.dropout = nn.Dropout(self.dropout_ratio) + delattr(self, 'conv_seg') + + def init_weights(self): + """Initialize weights of classification layer.""" + normal_init(self.fc_seg, std=0.001) + + def cls_seg(self, feat): + """Classify each pixel with fc.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.fc_seg(feat) + return output + + def forward(self, fine_grained_point_feats, coarse_point_feats): + x = torch.cat([fine_grained_point_feats, coarse_point_feats], dim=1) + for fc in self.fcs: + x = fc(x) + if self.coarse_pred_each_layer: + x = torch.cat((x, coarse_point_feats), dim=1) + return self.cls_seg(x) + + def _get_fine_grained_point_feats(self, x, points): + """Sample from fine grained features. + + Args: + x (list[Tensor]): Feature pyramid from by neck or backbone. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + fine_grained_feats (Tensor): Sampled fine grained feature, + shape (batch_size, sum(channels of x), num_points). + """ + + fine_grained_feats_list = [ + point_sample(_, points, align_corners=self.align_corners) + for _ in x + ] + if len(fine_grained_feats_list) > 1: + fine_grained_feats = torch.cat(fine_grained_feats_list, dim=1) + else: + fine_grained_feats = fine_grained_feats_list[0] + + return fine_grained_feats + + def _get_coarse_point_feats(self, prev_output, points): + """Sample from fine grained features. + + Args: + prev_output (list[Tensor]): Prediction of previous decode head. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + coarse_feats (Tensor): Sampled coarse feature, shape (batch_size, + num_classes, num_points). + """ + + coarse_feats = point_sample( + prev_output, points, align_corners=self.align_corners) + + return coarse_feats + + def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg, + train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + x = self._transform_inputs(inputs) + with torch.no_grad(): + points = self.get_points_train( + prev_output, calculate_uncertainty, cfg=train_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats(prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + point_label = point_sample( + gt_semantic_seg.float(), + points, + mode='nearest', + align_corners=self.align_corners) + point_label = point_label.squeeze(1).long() + + losses = self.losses(point_logits, point_label) + + return losses + + def forward_test(self, inputs, prev_output, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + + x = self._transform_inputs(inputs) + refined_seg_logits = prev_output.clone() + for _ in range(test_cfg.subdivision_steps): + refined_seg_logits = resize( + refined_seg_logits, + scale_factor=test_cfg.scale_factor, + mode='bilinear', + align_corners=self.align_corners) + batch_size, channels, height, width = refined_seg_logits.shape + point_indices, points = self.get_points_test( + refined_seg_logits, calculate_uncertainty, cfg=test_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats( + prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + + point_indices = point_indices.unsqueeze(1).expand(-1, channels, -1) + refined_seg_logits = refined_seg_logits.reshape( + batch_size, channels, height * width) + refined_seg_logits = refined_seg_logits.scatter_( + 2, point_indices, point_logits) + refined_seg_logits = refined_seg_logits.view( + batch_size, channels, height, width) + + return refined_seg_logits + + def losses(self, point_logits, point_label): + """Compute segmentation loss.""" + loss = dict() + loss['loss_point'] = self.loss_decode( + point_logits, point_label, ignore_index=self.ignore_index) + loss['acc_point'] = accuracy(point_logits, point_label) + return loss + + def get_points_train(self, seg_logits, uncertainty_func, cfg): + """Sample points for training. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + 'uncertainty_func' function that takes point's logit prediction as + input. + + Args: + seg_logits (Tensor): Semantic segmentation logits, shape ( + batch_size, num_classes, height, width). + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Training config of point head. + + Returns: + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains the coordinates of ``num_points`` sampled + points. + """ + num_points = cfg.num_points + oversample_ratio = cfg.oversample_ratio + importance_sample_ratio = cfg.importance_sample_ratio + assert oversample_ratio >= 1 + assert 0 <= importance_sample_ratio <= 1 + batch_size = seg_logits.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand( + batch_size, num_sampled, 2, device=seg_logits.device) + point_logits = point_sample(seg_logits, point_coords) + # It is crucial to calculate uncertainty based on the sampled + # prediction value for the points. Calculating uncertainties of the + # coarse predictions first and sampling them for points leads to + # incorrect results. To illustrate this: assume uncertainty func( + # logits)=-abs(logits), a sampled point between two coarse + # predictions with -1 and 1 logits has 0 logits, and therefore 0 + # uncertainty value. However, if we calculate uncertainties for the + # coarse predictions first, both will have -1 uncertainty, + # and sampled point will get -1 uncertainty. + point_uncertainties = uncertainty_func(point_logits) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk( + point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange( + batch_size, dtype=torch.long, device=seg_logits.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + batch_size, num_uncertain_points, 2) + if num_random_points > 0: + rand_point_coords = torch.rand( + batch_size, num_random_points, 2, device=seg_logits.device) + point_coords = torch.cat((point_coords, rand_point_coords), dim=1) + return point_coords + + def get_points_test(self, seg_logits, uncertainty_func, cfg): + """Sample points for testing. + + Find ``num_points`` most uncertain points from ``uncertainty_map``. + + Args: + seg_logits (Tensor): A tensor of shape (batch_size, num_classes, + height, width) for class-specific or class-agnostic prediction. + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Testing config of point head. + + Returns: + point_indices (Tensor): A tensor of shape (batch_size, num_points) + that contains indices from [0, height x width) of the most + uncertain points. + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the ``height x width`` grid . + """ + + num_points = cfg.subdivision_num_points + uncertainty_map = uncertainty_func(seg_logits) + batch_size, _, height, width = uncertainty_map.shape + h_step = 1.0 / height + w_step = 1.0 / width + + uncertainty_map = uncertainty_map.view(batch_size, height * width) + num_points = min(height * width, num_points) + point_indices = uncertainty_map.topk(num_points, dim=1)[1] + point_coords = torch.zeros( + batch_size, + num_points, + 2, + dtype=torch.float, + device=seg_logits.device) + point_coords[:, :, 0] = w_step / 2.0 + (point_indices % + width).float() * w_step + point_coords[:, :, 1] = h_step / 2.0 + (point_indices // + width).float() * h_step + return point_indices, point_coords diff --git a/mmseg/models/decode_heads/psa_head.py b/mmseg/models/decode_heads/psa_head.py new file mode 100644 index 0000000000000000000000000000000000000000..8d915e57f4d22bd723da23b6f03f245476649846 --- /dev/null +++ b/mmseg/models/decode_heads/psa_head.py @@ -0,0 +1,196 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + +try: + from mmcv.ops import PSAMask +except ModuleNotFoundError: + PSAMask = None + + +@HEADS.register_module() +class PSAHead(BaseDecodeHead): + """Point-wise Spatial Attention Network for Scene Parsing. + + This head is the implementation of `PSANet + `_. + + Args: + mask_size (tuple[int]): The PSA mask size. It usually equals input + size. + psa_type (str): The type of psa module. Options are 'collect', + 'distribute', 'bi-direction'. Default: 'bi-direction' + compact (bool): Whether use compact map for 'collect' mode. + Default: True. + shrink_factor (int): The downsample factors of psa mask. Default: 2. + normalization_factor (float): The normalize factor of attention. + psa_softmax (bool): Whether use softmax for attention. + """ + + def __init__(self, + mask_size, + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + **kwargs): + if PSAMask is None: + raise RuntimeError('Please install mmcv-full for PSAMask ops') + super(PSAHead, self).__init__(**kwargs) + assert psa_type in ['collect', 'distribute', 'bi-direction'] + self.psa_type = psa_type + self.compact = compact + self.shrink_factor = shrink_factor + self.mask_size = mask_size + mask_h, mask_w = mask_size + self.psa_softmax = psa_softmax + if normalization_factor is None: + normalization_factor = mask_h * mask_w + self.normalization_factor = normalization_factor + + self.reduce = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + if psa_type == 'bi-direction': + self.reduce_p = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention_p = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + self.psamask_collect = PSAMask('collect', mask_size) + self.psamask_distribute = PSAMask('distribute', mask_size) + else: + self.psamask = PSAMask(psa_type, mask_size) + self.proj = ConvModule( + self.channels * (2 if psa_type == 'bi-direction' else 1), + self.in_channels, + kernel_size=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + self.in_channels * 2, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + identity = x + align_corners = self.align_corners + if self.psa_type in ['collect', 'distribute']: + out = self.reduce(x) + n, c, h, w = out.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + out = resize( + out, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y = self.attention(out) + if self.compact: + if self.psa_type == 'collect': + y = y.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y = self.psamask(y) + if self.psa_softmax: + y = F.softmax(y, dim=1) + out = torch.bmm( + out.view(n, c, h * w), y.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + else: + x_col = self.reduce(x) + x_dis = self.reduce_p(x) + n, c, h, w = x_col.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + x_col = resize( + x_col, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + x_dis = resize( + x_dis, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y_col = self.attention(x_col) + y_dis = self.attention_p(x_dis) + if self.compact: + y_dis = y_dis.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y_col = self.psamask_collect(y_col) + y_dis = self.psamask_distribute(y_dis) + if self.psa_softmax: + y_col = F.softmax(y_col, dim=1) + y_dis = F.softmax(y_dis, dim=1) + x_col = torch.bmm( + x_col.view(n, c, h * w), y_col.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + x_dis = torch.bmm( + x_dis.view(n, c, h * w), y_dis.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + out = torch.cat([x_col, x_dis], 1) + out = self.proj(out) + out = resize( + out, + size=identity.shape[2:], + mode='bilinear', + align_corners=align_corners) + out = self.bottleneck(torch.cat((identity, out), dim=1)) + out = self.cls_seg(out) + return out diff --git a/mmseg/models/decode_heads/psp_head.py b/mmseg/models/decode_heads/psp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bdbe2c8ac8dc2d21dd3e21aa5ed9f74504545c62 --- /dev/null +++ b/mmseg/models/decode_heads/psp_head.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class PPM(nn.ModuleList): + """Pooling Pyramid Module used in PSPNet. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + align_corners (bool): align_corners argument of F.interpolate. + """ + + def __init__(self, pool_scales, in_channels, channels, conv_cfg, norm_cfg, + act_cfg, align_corners): + super(PPM, self).__init__() + self.pool_scales = pool_scales + self.align_corners = align_corners + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for pool_scale in pool_scales: + self.append( + nn.Sequential( + nn.AdaptiveAvgPool2d(pool_scale), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg))) + + def forward(self, x): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(x) + upsampled_ppm_out = resize( + ppm_out, + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ppm_outs.append(upsampled_ppm_out) + return ppm_outs + + +@HEADS.register_module() +class PSPHead(BaseDecodeHead): + """Pyramid Scene Parsing Network. + + This head is the implementation of + `PSPNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.psp_modules = PPM( + self.pool_scales, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + output = self.bottleneck(psp_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/sep_aspp_head.py b/mmseg/models/decode_heads/sep_aspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..50bd52bcff62d0f791c42731bdf05a64276f50b9 --- /dev/null +++ b/mmseg/models/decode_heads/sep_aspp_head.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .aspp_head import ASPPHead, ASPPModule + + +class DepthwiseSeparableASPPModule(ASPPModule): + """Atrous Spatial Pyramid Pooling (ASPP) Module with depthwise separable + conv.""" + + def __init__(self, **kwargs): + super(DepthwiseSeparableASPPModule, self).__init__(**kwargs) + for i, dilation in enumerate(self.dilations): + if dilation > 1: + self[i] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + 3, + dilation=dilation, + padding=dilation, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + +@HEADS.register_module() +class DepthwiseSeparableASPPHead(ASPPHead): + """Encoder-Decoder with Atrous Separable Convolution for Semantic Image + Segmentation. + + This head is the implementation of `DeepLabV3+ + `_. + + Args: + c1_in_channels (int): The input channels of c1 decoder. If is 0, + the no decoder will be used. + c1_channels (int): The intermediate channels of c1 decoder. + """ + + def __init__(self, c1_in_channels, c1_channels, **kwargs): + super(DepthwiseSeparableASPPHead, self).__init__(**kwargs) + assert c1_in_channels >= 0 + self.aspp_modules = DepthwiseSeparableASPPModule( + dilations=self.dilations, + in_channels=self.in_channels, + channels=self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if c1_in_channels > 0: + self.c1_bottleneck = ConvModule( + c1_in_channels, + c1_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + else: + self.c1_bottleneck = None + self.sep_bottleneck = nn.Sequential( + DepthwiseSeparableConvModule( + self.channels + c1_channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + DepthwiseSeparableConvModule( + self.channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + output = self.bottleneck(aspp_outs) + if self.c1_bottleneck is not None: + c1_output = self.c1_bottleneck(inputs[0]) + output = resize( + input=output, + size=c1_output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + output = torch.cat([output, c1_output], dim=1) + output = self.sep_bottleneck(output) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/sep_fcn_head.py b/mmseg/models/decode_heads/sep_fcn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..a636f702e72d12fd6ff2821fd10923f682f805f1 --- /dev/null +++ b/mmseg/models/decode_heads/sep_fcn_head.py @@ -0,0 +1,51 @@ +from mmcv.cnn import DepthwiseSeparableConvModule + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class DepthwiseSeparableFCNHead(FCNHead): + """Depthwise-Separable Fully Convolutional Network for Semantic + Segmentation. + + This head is implemented according to Fast-SCNN paper. + Args: + in_channels(int): Number of output channels of FFM. + channels(int): Number of middle-stage channels in the decode head. + concat_input(bool): Whether to concatenate original decode input into + the result of several consecutive convolution layers. + Default: True. + num_classes(int): Used to determine the dimension of + final prediction tensor. + in_index(int): Correspond with 'out_indices' in FastSCNN backbone. + norm_cfg (dict | None): Config of norm layers. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + loss_decode(dict): Config of loss type and some + relevant additional options. + """ + + def __init__(self, **kwargs): + super(DepthwiseSeparableFCNHead, self).__init__(**kwargs) + self.convs[0] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) + for i in range(1, self.num_convs): + self.convs[i] = DepthwiseSeparableConvModule( + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) + + if self.concat_input: + self.conv_cat = DepthwiseSeparableConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) diff --git a/mmseg/models/decode_heads/uper_head.py b/mmseg/models/decode_heads/uper_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bb617f6b13a1b359b0fa932300161e0d405d046d --- /dev/null +++ b/mmseg/models/decode_heads/uper_head.py @@ -0,0 +1,126 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from .psp_head import PPM + + +@HEADS.register_module() +class UPerHead(BaseDecodeHead): + """Unified Perceptual Parsing for Scene Understanding. + + This head is the implementation of `UPerNet + `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module applied on the last feature. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(UPerHead, self).__init__( + input_transform='multiple_select', **kwargs) + # PSP Module + self.psp_modules = PPM( + pool_scales, + self.in_channels[-1], + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels[-1] + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # FPN Module + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the top layer + l_conv = ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + fpn_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + self.fpn_bottleneck = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def psp_forward(self, inputs): + """Forward function of PSP module.""" + x = inputs[-1] + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + output = self.bottleneck(psp_outs) + + return output + + def forward(self, inputs): + """Forward function.""" + + inputs = self._transform_inputs(inputs) + + # build laterals + laterals = [ + lateral_conv(inputs[i]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + laterals.append(self.psp_forward(inputs)) + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] += resize( + laterals[i], + size=prev_shape, + mode='bilinear', + align_corners=self.align_corners) + + # build outputs + fpn_outs = [ + self.fpn_convs[i](laterals[i]) + for i in range(used_backbone_levels - 1) + ] + # append psp feature + fpn_outs.append(laterals[-1]) + + for i in range(used_backbone_levels - 1, 0, -1): + fpn_outs[i] = resize( + fpn_outs[i], + size=fpn_outs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) + fpn_outs = torch.cat(fpn_outs, dim=1) + output = self.fpn_bottleneck(fpn_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/vit_mla_auxi_head.py b/mmseg/models/decode_heads/vit_mla_auxi_head.py new file mode 100644 index 0000000000000000000000000000000000000000..5f19351726f040a89c5faf0d4316b66c6d9feb99 --- /dev/null +++ b/mmseg/models/decode_heads/vit_mla_auxi_head.py @@ -0,0 +1,48 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +@HEADS.register_module() +class VIT_MLA_AUXIHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, **kwargs): + super(VIT_MLA_AUXIHead, self).__init__(**kwargs) + self.img_size = img_size + if self.in_channels==1024: + self.aux_0 = nn.Conv2d(self.in_channels, 256, kernel_size=1, bias=False) + self.aux_1 = nn.Conv2d(256, self.num_classes, kernel_size=1, bias=False) + elif self.in_channels==256: + self.aux = nn.Conv2d(self.in_channels, self.num_classes, kernel_size=1, bias=False) + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def forward(self, x): + x = self._transform_inputs(x) + if x.dim()==3: + x = x[:,1:] + x = self.to_2D(x) + + if self.in_channels==1024: + x = self.aux_0(x) + x = self.aux_1(x) + elif self.in_channels==256: + x = self.aux(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + return x diff --git a/mmseg/models/decode_heads/vit_mla_head.py b/mmseg/models/decode_heads/vit_mla_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bbfde133fbd8b4b1cdd08867456bc005e29c3b10 --- /dev/null +++ b/mmseg/models/decode_heads/vit_mla_head.py @@ -0,0 +1,67 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +class MLAHead(nn.Module): + def __init__(self, mla_channels=256, mlahead_channels=128, norm_cfg=None): + super(MLAHead, self).__init__() + self.head2 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head3 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head4 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head5 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + + def forward(self, mla_p2, mla_p3, mla_p4, mla_p5): + # head2 = self.head2(mla_p2) + head2 = F.interpolate(self.head2(mla_p2), 4*mla_p2.shape[-1], mode='bilinear', align_corners=True) + head3 = F.interpolate(self.head3(mla_p3), 4*mla_p3.shape[-1], mode='bilinear', align_corners=True) + head4 = F.interpolate(self.head4(mla_p4), 4*mla_p4.shape[-1], mode='bilinear', align_corners=True) + head5 = F.interpolate(self.head5(mla_p5), 4*mla_p5.shape[-1], mode='bilinear', align_corners=True) + return torch.cat([head2, head3, head4, head5], dim=1) + + + +@HEADS.register_module() +class VIT_MLAHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, mla_channels=256, mlahead_channels=128, + norm_layer=nn.BatchNorm2d, norm_cfg=None, **kwargs): + super(VIT_MLAHead, self).__init__(**kwargs) + self.img_size = img_size + self.norm_cfg = norm_cfg + self.mla_channels = mla_channels + self.BatchNorm = norm_layer + self.mlahead_channels = mlahead_channels + + self.mlahead = MLAHead(mla_channels=self.mla_channels, mlahead_channels=self.mlahead_channels, norm_cfg=self.norm_cfg) + self.cls = nn.Conv2d(4 * self.mlahead_channels, self.num_classes, 3, padding=1) + + def forward(self, inputs): + x = self.mlahead(inputs[0], inputs[1], inputs[2], inputs[3]) + x = self.cls(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + return x diff --git a/mmseg/models/decode_heads/vit_up_head.py b/mmseg/models/decode_heads/vit_up_head.py new file mode 100644 index 0000000000000000000000000000000000000000..3c08c5a57dee6d8099effdd3634e9cf7f4ed3245 --- /dev/null +++ b/mmseg/models/decode_heads/vit_up_head.py @@ -0,0 +1,111 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +@HEADS.register_module() +class VisionTransformerUpHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, embed_dim=1024, + norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + num_conv=1, upsampling_method='bilinear', num_upsampe_layer=1, **kwargs): + super(VisionTransformerUpHead, self).__init__(**kwargs) + self.img_size = img_size + self.norm_cfg = norm_cfg + self.num_conv = num_conv + self.norm = norm_layer(embed_dim) + self.upsampling_method = upsampling_method + self.num_upsampe_layer = num_upsampe_layer + + out_channel=self.num_classes + + if self.num_conv==2: + self.conv_0 = nn.Conv2d(embed_dim, 256, kernel_size=3, stride=1, padding=1) + self.conv_1 = nn.Conv2d(256, out_channel, 1, 1) + _, self.syncbn_fc_0 = build_norm_layer(self.norm_cfg, 256) + + elif self.num_conv==4: + self.conv_0 = nn.Conv2d(embed_dim, 256, kernel_size=3, stride=1, padding=1) + self.conv_1 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_2 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_4 = nn.Conv2d(256, out_channel, kernel_size=1, stride=1) + + _, self.syncbn_fc_0 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_1 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_2 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_3 = build_norm_layer(self.norm_cfg, 256) + + # Segmentation head + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + def forward(self, x): + x = self._transform_inputs(x) + if x.dim()==3: + if x.shape[1] % 48 !=0: + x = x[:,1:] + x = self.norm(x) + + if self.upsampling_method=='bilinear': + if x.dim()==3: + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + + if self.num_conv==2: + if self.num_upsampe_layer==2: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*4, mode='bilinear', align_corners=self.align_corners) + x = self.conv_1(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + elif self.num_upsampe_layer==1: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = self.conv_1(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + elif self.num_conv==4: + if self.num_upsampe_layer==4: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_1(x) + x = self.syncbn_fc_1(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_2(x) + x = self.syncbn_fc_2(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_3(x) + x = self.syncbn_fc_3(x) + x = F.relu(x,inplace=True) + x = self.conv_4(x) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + + return x + diff --git a/mmseg/models/losses/__init__.py b/mmseg/models/losses/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d623887760654c5c07fbdb2c76012baa2f9a4b52 --- /dev/null +++ b/mmseg/models/losses/__init__.py @@ -0,0 +1,11 @@ +from .accuracy import Accuracy, accuracy +from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy, + cross_entropy, mask_cross_entropy) +from .lovasz_loss import LovaszLoss +from .utils import reduce_loss, weight_reduce_loss, weighted_loss + +__all__ = [ + 'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy', + 'mask_cross_entropy', 'CrossEntropyLoss', 'reduce_loss', + 'weight_reduce_loss', 'weighted_loss', 'LovaszLoss' +] diff --git a/mmseg/models/losses/accuracy.py b/mmseg/models/losses/accuracy.py new file mode 100644 index 0000000000000000000000000000000000000000..e45f9ec485737ef1f6717eaf3b6ddc572a169932 --- /dev/null +++ b/mmseg/models/losses/accuracy.py @@ -0,0 +1,78 @@ +import torch.nn as nn + + +def accuracy(pred, target, topk=1, thresh=None): + """Calculate accuracy according to the prediction and target. + + Args: + pred (torch.Tensor): The model prediction, shape (N, num_class, ...) + target (torch.Tensor): The target of each prediction, shape (N, , ...) + topk (int | tuple[int], optional): If the predictions in ``topk`` + matches the target, the predictions will be regarded as + correct ones. Defaults to 1. + thresh (float, optional): If not None, predictions with scores under + this threshold are considered incorrect. Default to None. + + Returns: + float | tuple[float]: If the input ``topk`` is a single integer, + the function will return a single float as accuracy. If + ``topk`` is a tuple containing multiple integers, the + function will return a tuple containing accuracies of + each ``topk`` number. + """ + assert isinstance(topk, (int, tuple)) + if isinstance(topk, int): + topk = (topk, ) + return_single = True + else: + return_single = False + + maxk = max(topk) + if pred.size(0) == 0: + accu = [pred.new_tensor(0.) for i in range(len(topk))] + return accu[0] if return_single else accu + assert pred.ndim == target.ndim + 1 + assert pred.size(0) == target.size(0) + assert maxk <= pred.size(1), \ + f'maxk {maxk} exceeds pred dimension {pred.size(1)}' + pred_value, pred_label = pred.topk(maxk, dim=1) + # transpose to shape (maxk, N, ...) + pred_label = pred_label.transpose(0, 1) + correct = pred_label.eq(target.unsqueeze(0).expand_as(pred_label)) + if thresh is not None: + # Only prediction values larger than thresh are counted as correct + correct = correct & (pred_value > thresh).t() + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / target.numel())) + return res[0] if return_single else res + + +class Accuracy(nn.Module): + """Accuracy calculation module.""" + + def __init__(self, topk=(1, ), thresh=None): + """Module to calculate the accuracy. + + Args: + topk (tuple, optional): The criterion used to calculate the + accuracy. Defaults to (1,). + thresh (float, optional): If not None, predictions with scores + under this threshold are considered incorrect. Default to None. + """ + super().__init__() + self.topk = topk + self.thresh = thresh + + def forward(self, pred, target): + """Forward function to calculate accuracy. + + Args: + pred (torch.Tensor): Prediction of models. + target (torch.Tensor): Target for each prediction. + + Returns: + tuple[float]: The accuracies under different topk criterions. + """ + return accuracy(pred, target, self.topk, self.thresh) diff --git a/mmseg/models/losses/cross_entropy_loss.py b/mmseg/models/losses/cross_entropy_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..44798421aaced24d0524dbd3618645fd7ebb1e86 --- /dev/null +++ b/mmseg/models/losses/cross_entropy_loss.py @@ -0,0 +1,198 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def cross_entropy(pred, + label, + weight=None, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=-100): + """The wrapper function for :func:`F.cross_entropy`""" + # class_weight is a manual rescaling weight given to each class. + # If given, has to be a Tensor of size C element-wise losses + loss = F.cross_entropy( + pred, + label, + weight=class_weight, + reduction='none', + ignore_index=ignore_index) + + # apply weights and do the reduction + if weight is not None: + weight = weight.float() + loss = weight_reduce_loss( + loss, weight=weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def _expand_onehot_labels(labels, label_weights, target_shape, ignore_index): + """Expand onehot labels to match the size of prediction.""" + bin_labels = labels.new_zeros(target_shape) + valid_mask = (labels >= 0) & (labels != ignore_index) + inds = torch.nonzero(valid_mask, as_tuple=True) + + if inds[0].numel() > 0: + if labels.dim() == 3: + bin_labels[inds[0], labels[valid_mask], inds[1], inds[2]] = 1 + else: + bin_labels[inds[0], labels[valid_mask]] = 1 + + valid_mask = valid_mask.unsqueeze(1).expand(target_shape).float() + if label_weights is None: + bin_label_weights = valid_mask + else: + bin_label_weights = label_weights.unsqueeze(1).expand(target_shape) + bin_label_weights *= valid_mask + + return bin_labels, bin_label_weights + + +def binary_cross_entropy(pred, + label, + weight=None, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=255): + """Calculate the binary CrossEntropy loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, 1). + label (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (int | None): The label index to be ignored. Default: 255 + + Returns: + torch.Tensor: The calculated loss + """ + if pred.dim() != label.dim(): + assert (pred.dim() == 2 and label.dim() == 1) or ( + pred.dim() == 4 and label.dim() == 3), \ + 'Only pred shape [N, C], label shape [N] or pred shape [N, C, ' \ + 'H, W], label shape [N, H, W] are supported' + label, weight = _expand_onehot_labels(label, weight, pred.shape, + ignore_index) + + # weighted element-wise losses + if weight is not None: + weight = weight.float() + loss = F.binary_cross_entropy_with_logits( + pred, label.float(), pos_weight=class_weight, reduction='none') + # do the reduction for the weighted loss + loss = weight_reduce_loss( + loss, weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def mask_cross_entropy(pred, + target, + label, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=None): + """Calculate the CrossEntropy loss for masks. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + target (torch.Tensor): The learning label of the prediction. + label (torch.Tensor): ``label`` indicates the class label of the mask' + corresponding object. This will be used to select the mask in the + of the class which the object belongs to when the mask prediction + if not class-agnostic. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (None): Placeholder, to be consistent with other loss. + Default: None. + + Returns: + torch.Tensor: The calculated loss + """ + assert ignore_index is None, 'BCE loss does not support ignore_index' + # TODO: handle these two reserved arguments + assert reduction == 'mean' and avg_factor is None + num_rois = pred.size()[0] + inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device) + pred_slice = pred[inds, label].squeeze(1) + return F.binary_cross_entropy_with_logits( + pred_slice, target, weight=class_weight, reduction='mean')[None] + + +@LOSSES.register_module() +class CrossEntropyLoss(nn.Module): + """CrossEntropyLoss. + + Args: + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Defaults to False. + use_mask (bool, optional): Whether to use mask cross entropy loss. + Defaults to False. + reduction (str, optional): . Defaults to 'mean'. + Options are "none", "mean" and "sum". + class_weight (list[float], optional): Weight of each class. + Defaults to None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + """ + + def __init__(self, + use_sigmoid=False, + use_mask=False, + reduction='mean', + class_weight=None, + loss_weight=1.0): + super(CrossEntropyLoss, self).__init__() + assert (use_sigmoid is False) or (use_mask is False) + self.use_sigmoid = use_sigmoid + self.use_mask = use_mask + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = class_weight + + if self.use_sigmoid: + self.cls_criterion = binary_cross_entropy + elif self.use_mask: + self.cls_criterion = mask_cross_entropy + else: + self.cls_criterion = cross_entropy + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + weight, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_cls diff --git a/mmseg/models/losses/lovasz_loss.py b/mmseg/models/losses/lovasz_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..e6e2450cfdc713ee1ea166886469da4541568329 --- /dev/null +++ b/mmseg/models/losses/lovasz_loss.py @@ -0,0 +1,303 @@ +"""Modified from https://github.com/bermanmaxim/LovaszSoftmax/blob/master/pytor +ch/lovasz_losses.py Lovasz-Softmax and Jaccard hinge loss in PyTorch Maxim +Berman 2018 ESAT-PSI KU Leuven (MIT License)""" + +import mmcv +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def lovasz_grad(gt_sorted): + """Computes gradient of the Lovasz extension w.r.t sorted errors. + + See Alg. 1 in paper. + """ + p = len(gt_sorted) + gts = gt_sorted.sum() + intersection = gts - gt_sorted.float().cumsum(0) + union = gts + (1 - gt_sorted).float().cumsum(0) + jaccard = 1. - intersection / union + if p > 1: # cover 1-pixel case + jaccard[1:p] = jaccard[1:p] - jaccard[0:-1] + return jaccard + + +def flatten_binary_logits(logits, labels, ignore_index=None): + """Flattens predictions in the batch (binary case) Remove labels equal to + 'ignore_index'.""" + logits = logits.view(-1) + labels = labels.view(-1) + if ignore_index is None: + return logits, labels + valid = (labels != ignore_index) + vlogits = logits[valid] + vlabels = labels[valid] + return vlogits, vlabels + + +def flatten_probs(probs, labels, ignore_index=None): + """Flattens predictions in the batch.""" + if probs.dim() == 3: + # assumes output of a sigmoid layer + B, H, W = probs.size() + probs = probs.view(B, 1, H, W) + B, C, H, W = probs.size() + probs = probs.permute(0, 2, 3, 1).contiguous().view(-1, C) # B*H*W, C=P,C + labels = labels.view(-1) + if ignore_index is None: + return probs, labels + valid = (labels != ignore_index) + vprobs = probs[valid.nonzero().squeeze()] + vlabels = labels[valid] + return vprobs, vlabels + + +def lovasz_hinge_flat(logits, labels): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [P], logits at each prediction + (between -infty and +infty). + labels (torch.Tensor): [P], binary ground truth labels (0 or 1). + + Returns: + torch.Tensor: The calculated loss. + """ + if len(labels) == 0: + # only void pixels, the gradients should be 0 + return logits.sum() * 0. + signs = 2. * labels.float() - 1. + errors = (1. - logits * signs) + errors_sorted, perm = torch.sort(errors, dim=0, descending=True) + perm = perm.data + gt_sorted = labels[perm] + grad = lovasz_grad(gt_sorted) + loss = torch.dot(F.relu(errors_sorted), grad) + return loss + + +def lovasz_hinge(logits, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [B, H, W], logits at each pixel + (between -infty and +infty). + labels (torch.Tensor): [B, H, W], binary ground truth masks (0 or 1). + classes (str | list[int], optional): Placeholder, to be consistent with + other loss. Default: None. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): Placeholder, to be consistent + with other loss. Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + if per_image: + loss = [ + lovasz_hinge_flat(*flatten_binary_logits( + logit.unsqueeze(0), label.unsqueeze(0), ignore_index)) + for logit, label in zip(logits, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_hinge_flat( + *flatten_binary_logits(logits, labels, ignore_index)) + return loss + + +def lovasz_softmax_flat(probs, labels, classes='present', class_weight=None): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [P, C], class probabilities at each prediction + (between 0 and 1). + labels (torch.Tensor): [P], ground truth labels (between 0 and C - 1). + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + class_weight (list[float], optional): The weight for each class. + Default: None. + + Returns: + torch.Tensor: The calculated loss. + """ + if probs.numel() == 0: + # only void pixels, the gradients should be 0 + return probs * 0. + C = probs.size(1) + losses = [] + class_to_sum = list(range(C)) if classes in ['all', 'present'] else classes + for c in class_to_sum: + fg = (labels == c).float() # foreground for class c + if (classes == 'present' and fg.sum() == 0): + continue + if C == 1: + if len(classes) > 1: + raise ValueError('Sigmoid output possible only with 1 class') + class_pred = probs[:, 0] + else: + class_pred = probs[:, c] + errors = (fg - class_pred).abs() + errors_sorted, perm = torch.sort(errors, 0, descending=True) + perm = perm.data + fg_sorted = fg[perm] + loss = torch.dot(errors_sorted, lovasz_grad(fg_sorted)) + if class_weight is not None: + loss *= class_weight[c] + losses.append(loss) + return torch.stack(losses).mean() + + +def lovasz_softmax(probs, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [B, C, H, W], class probabilities at each + prediction (between 0 and 1). + labels (torch.Tensor): [B, H, W], ground truth labels (between 0 and + C - 1). + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): The weight for each class. + Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + + if per_image: + loss = [ + lovasz_softmax_flat( + *flatten_probs( + prob.unsqueeze(0), label.unsqueeze(0), ignore_index), + classes=classes, + class_weight=class_weight) + for prob, label in zip(probs, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_softmax_flat( + *flatten_probs(probs, labels, ignore_index), + classes=classes, + class_weight=class_weight) + return loss + + +@LOSSES.register_module() +class LovaszLoss(nn.Module): + """LovaszLoss. + + This loss is proposed in `The Lovasz-Softmax loss: A tractable surrogate + for the optimization of the intersection-over-union measure in neural + networks `_. + + Args: + loss_type (str, optional): Binary or multi-class loss. + Default: 'multi_class'. Options are "binary" and "multi_class". + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + class_weight (list[float], optional): The weight for each class. + Default: None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + """ + + def __init__(self, + loss_type='multi_class', + classes='present', + per_image=False, + reduction='mean', + class_weight=None, + loss_weight=1.0): + super(LovaszLoss, self).__init__() + assert loss_type in ('binary', 'multi_class'), "loss_type should be \ + 'binary' or 'multi_class'." + + if loss_type == 'binary': + self.cls_criterion = lovasz_hinge + else: + self.cls_criterion = lovasz_softmax + assert classes in ('all', 'present') or mmcv.is_list_of(classes, int) + if not per_image: + assert reduction == 'none', "reduction should be 'none' when \ + per_image is False." + + self.classes = classes + self.per_image = per_image + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = class_weight + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + + # if multi-class loss, transform logits to probs + if self.cls_criterion == lovasz_softmax: + cls_score = F.softmax(cls_score, dim=1) + + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + self.classes, + self.per_image, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_cls diff --git a/mmseg/models/losses/utils.py b/mmseg/models/losses/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..a1153fa9f39f1f045def43b52bb55a06f301ff22 --- /dev/null +++ b/mmseg/models/losses/utils.py @@ -0,0 +1,101 @@ +import functools + +import torch.nn.functional as F + + +def reduce_loss(loss, reduction): + """Reduce loss as specified. + + Args: + loss (Tensor): Elementwise loss tensor. + reduction (str): Options are "none", "mean" and "sum". + + Return: + Tensor: Reduced loss tensor. + """ + reduction_enum = F._Reduction.get_enum(reduction) + # none: 0, elementwise_mean:1, sum: 2 + if reduction_enum == 0: + return loss + elif reduction_enum == 1: + return loss.mean() + elif reduction_enum == 2: + return loss.sum() + + +def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None): + """Apply element-wise weight and reduce loss. + + Args: + loss (Tensor): Element-wise loss. + weight (Tensor): Element-wise weights. + reduction (str): Same as built-in losses of PyTorch. + avg_factor (float): Avarage factor when computing the mean of losses. + + Returns: + Tensor: Processed loss values. + """ + # if weight is specified, apply element-wise weight + if weight is not None: + assert weight.dim() == loss.dim() + if weight.dim() > 1: + assert weight.size(1) == 1 or weight.size(1) == loss.size(1) + loss = loss * weight + + # if avg_factor is not specified, just reduce the loss + if avg_factor is None: + loss = reduce_loss(loss, reduction) + else: + # if reduction is mean, then average the loss by avg_factor + if reduction == 'mean': + loss = loss.sum() / avg_factor + # if reduction is 'none', then do nothing, otherwise raise an error + elif reduction != 'none': + raise ValueError('avg_factor can not be used with reduction="sum"') + return loss + + +def weighted_loss(loss_func): + """Create a weighted version of a given loss function. + + To use this decorator, the loss function must have the signature like + `loss_func(pred, target, **kwargs)`. The function only needs to compute + element-wise loss without any reduction. This decorator will add weight + and reduction arguments to the function. The decorated function will have + the signature like `loss_func(pred, target, weight=None, reduction='mean', + avg_factor=None, **kwargs)`. + + :Example: + + >>> import torch + >>> @weighted_loss + >>> def l1_loss(pred, target): + >>> return (pred - target).abs() + + >>> pred = torch.Tensor([0, 2, 3]) + >>> target = torch.Tensor([1, 1, 1]) + >>> weight = torch.Tensor([1, 0, 1]) + + >>> l1_loss(pred, target) + tensor(1.3333) + >>> l1_loss(pred, target, weight) + tensor(1.) + >>> l1_loss(pred, target, reduction='none') + tensor([1., 1., 2.]) + >>> l1_loss(pred, target, weight, avg_factor=2) + tensor(1.5000) + """ + + @functools.wraps(loss_func) + def wrapper(pred, + target, + weight=None, + reduction='mean', + avg_factor=None, + **kwargs): + # get element-wise loss + loss = loss_func(pred, target, **kwargs) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + return wrapper diff --git a/mmseg/models/necks/__init__.py b/mmseg/models/necks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0093021ebac1e46fbb798ed6ee96a192dbd8604c --- /dev/null +++ b/mmseg/models/necks/__init__.py @@ -0,0 +1,3 @@ +from .fpn import FPN + +__all__ = ['FPN'] diff --git a/mmseg/models/necks/fpn.py b/mmseg/models/necks/fpn.py new file mode 100644 index 0000000000000000000000000000000000000000..f43d1e62f62b4cde0f181d3d44cef5383fec78b1 --- /dev/null +++ b/mmseg/models/necks/fpn.py @@ -0,0 +1,212 @@ +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, xavier_init + +from ..builder import NECKS + + +@NECKS.register_module() +class FPN(nn.Module): + """Feature Pyramid Network. + + This is an implementation of - Feature Pyramid Networks for Object + Detection (https://arxiv.org/abs/1612.03144) + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool | str): If bool, it decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + If str, it specifies the source feature map of the extra convs. + Only the following options are allowed + + - 'on_input': Last feat map of neck inputs (i.e. backbone feature). + - 'on_lateral': Last feature map after lateral convs. + - 'on_output': The last output feature map after fpn convs. + extra_convs_on_inputs (bool, deprecated): Whether to apply extra convs + on the original feature from the backbone. If True, + it is equivalent to `add_extra_convs='on_input'`. If False, it is + equivalent to set `add_extra_convs='on_output'`. Default to True. + relu_before_extra_convs (bool): Whether to apply relu before the extra + conv. Default: False. + no_norm_on_lateral (bool): Whether to apply norm on lateral. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (str): Config dict for activation layer in ConvModule. + Default: None. + upsample_cfg (dict): Config dict for interpolate layer. + Default: `dict(mode='nearest')` + + Example: + >>> import torch + >>> in_channels = [2, 3, 5, 7] + >>> scales = [340, 170, 84, 43] + >>> inputs = [torch.rand(1, c, s, s) + ... for c, s in zip(in_channels, scales)] + >>> self = FPN(in_channels, 11, len(in_channels)).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 11, 340, 340]) + outputs[1].shape = torch.Size([1, 11, 170, 170]) + outputs[2].shape = torch.Size([1, 11, 84, 84]) + outputs[3].shape = torch.Size([1, 11, 43, 43]) + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False, + extra_convs_on_inputs=False, + relu_before_extra_convs=False, + no_norm_on_lateral=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + upsample_cfg=dict(mode='nearest')): + super(FPN, self).__init__() + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.relu_before_extra_convs = relu_before_extra_convs + self.no_norm_on_lateral = no_norm_on_lateral + self.fp16_enabled = False + self.upsample_cfg = upsample_cfg.copy() + + if end_level == -1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level < inputs, no extra level is allowed + self.backbone_end_level = end_level + assert end_level <= len(in_channels) + assert num_outs == end_level - start_level + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + assert isinstance(add_extra_convs, (str, bool)) + if isinstance(add_extra_convs, str): + # Extra_convs_source choices: 'on_input', 'on_lateral', 'on_output' + assert add_extra_convs in ('on_input', 'on_lateral', 'on_output') + elif add_extra_convs: # True + if extra_convs_on_inputs: + # For compatibility with previous release + # TODO: deprecate `extra_convs_on_inputs` + self.add_extra_convs = 'on_input' + else: + self.add_extra_convs = 'on_output' + + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg if not self.no_norm_on_lateral else None, + act_cfg=act_cfg, + inplace=False) + fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + # add extra conv layers (e.g., RetinaNet) + extra_levels = num_outs - self.backbone_end_level + self.start_level + if self.add_extra_convs and extra_levels >= 1: + for i in range(extra_levels): + if i == 0 and self.add_extra_convs == 'on_input': + in_channels = self.in_channels[self.backbone_end_level - 1] + else: + in_channels = out_channels + extra_fpn_conv = ConvModule( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + self.fpn_convs.append(extra_fpn_conv) + + # default init_weights for conv(msra) and norm in ConvModule + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + xavier_init(m, distribution='uniform') + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + + # build laterals + laterals = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + # In some cases, fixing `scale factor` (e.g. 2) is preferred, but + # it cannot co-exist with `size` in `F.interpolate`. + if 'scale_factor' in self.upsample_cfg: + laterals[i - 1] += F.interpolate(laterals[i], + **self.upsample_cfg) + else: + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] += F.interpolate( + laterals[i], size=prev_shape, **self.upsample_cfg) + + # build outputs + # part 1: from original levels + outs = [ + self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels) + ] + # part 2: add extra levels + if self.num_outs > len(outs): + # use max pool to get more levels on top of outputs + # (e.g., Faster R-CNN, Mask R-CNN) + if not self.add_extra_convs: + for i in range(self.num_outs - used_backbone_levels): + outs.append(F.max_pool2d(outs[-1], 1, stride=2)) + # add conv layers on top of original feature maps (RetinaNet) + else: + if self.add_extra_convs == 'on_input': + extra_source = inputs[self.backbone_end_level - 1] + elif self.add_extra_convs == 'on_lateral': + extra_source = laterals[-1] + elif self.add_extra_convs == 'on_output': + extra_source = outs[-1] + else: + raise NotImplementedError + outs.append(self.fpn_convs[used_backbone_levels](extra_source)) + for i in range(used_backbone_levels + 1, self.num_outs): + if self.relu_before_extra_convs: + outs.append(self.fpn_convs[i](F.relu(outs[-1]))) + else: + outs.append(self.fpn_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmseg/models/segmentors/__init__.py b/mmseg/models/segmentors/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3f600ecb9fa61be81a74f2c51edf8b6bfdb9b3b5 --- /dev/null +++ b/mmseg/models/segmentors/__init__.py @@ -0,0 +1,4 @@ +from .cascade_encoder_decoder import CascadeEncoderDecoder +from .encoder_decoder import EncoderDecoder + +__all__ = ['EncoderDecoder', 'CascadeEncoderDecoder'] diff --git a/mmseg/models/segmentors/base.py b/mmseg/models/segmentors/base.py new file mode 100644 index 0000000000000000000000000000000000000000..6f59dbc72ed91501aed9cab114cd13ebefea76e2 --- /dev/null +++ b/mmseg/models/segmentors/base.py @@ -0,0 +1,269 @@ +import logging +import warnings +from abc import ABCMeta, abstractmethod +from collections import OrderedDict + +import mmcv +import numpy as np +import torch +import torch.distributed as dist +import torch.nn as nn +from mmcv.runner import auto_fp16 + + +class BaseSegmentor(nn.Module): + """Base class for segmentors.""" + + __metaclass__ = ABCMeta + + def __init__(self): + super(BaseSegmentor, self).__init__() + self.fp16_enabled = False + + @property + def with_neck(self): + """bool: whether the segmentor has neck""" + return hasattr(self, 'neck') and self.neck is not None + + @property + def with_auxiliary_head(self): + """bool: whether the segmentor has auxiliary head""" + return hasattr(self, + 'auxiliary_head') and self.auxiliary_head is not None + + @property + def with_decode_head(self): + """bool: whether the segmentor has decode head""" + return hasattr(self, 'decode_head') and self.decode_head is not None + + @abstractmethod + def extract_feat(self, imgs): + """Placeholder for extract features from images.""" + pass + + @abstractmethod + def encode_decode(self, img, img_metas): + """Placeholder for encode images with backbone and decode into a + semantic segmentation map of the same size as input.""" + pass + + @abstractmethod + def forward_train(self, imgs, img_metas, **kwargs): + """Placeholder for Forward function for training.""" + pass + + @abstractmethod + def simple_test(self, img, img_meta, **kwargs): + """Placeholder for single image test.""" + pass + + @abstractmethod + def aug_test(self, imgs, img_metas, **kwargs): + """Placeholder for augmentation test.""" + pass + + def init_weights(self, pretrained=None): + """Initialize the weights in segmentor. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if pretrained is not None: + logger = logging.getLogger() + logger.info(f'load model from: {pretrained}') + + def forward_test(self, imgs, img_metas, **kwargs): + """ + Args: + imgs (List[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains all images in the batch. + img_metas (List[List[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. + """ + for var, name in [(imgs, 'imgs'), (img_metas, 'img_metas')]: + if not isinstance(var, list): + raise TypeError(f'{name} must be a list, but got ' + f'{type(var)}') + + num_augs = len(imgs) + if num_augs != len(img_metas): + raise ValueError(f'num of augmentations ({len(imgs)}) != ' + f'num of image meta ({len(img_metas)})') + # all images in the same aug batch all of the same ori_shape and pad + # shape + for img_meta in img_metas: + ori_shapes = [_['ori_shape'] for _ in img_meta] + assert all(shape == ori_shapes[0] for shape in ori_shapes) + img_shapes = [_['img_shape'] for _ in img_meta] + assert all(shape == img_shapes[0] for shape in img_shapes) + pad_shapes = [_['pad_shape'] for _ in img_meta] + assert all(shape == pad_shapes[0] for shape in pad_shapes) + + if num_augs == 1: + return self.simple_test(imgs[0], img_metas[0], **kwargs) + else: + return self.aug_test(imgs, img_metas, **kwargs) + + @auto_fp16(apply_to=('img', )) + def forward(self, img, img_metas, return_loss=True, **kwargs): + """Calls either :func:`forward_train` or :func:`forward_test` depending + on whether ``return_loss`` is ``True``. + + Note this setting will change the expected inputs. When + ``return_loss=True``, img and img_meta are single-nested (i.e. Tensor + and List[dict]), and when ``resturn_loss=False``, img and img_meta + should be double nested (i.e. List[Tensor], List[List[dict]]), with + the outer list indicating test time augmentations. + """ + if return_loss: + return self.forward_train(img, img_metas, **kwargs) + else: + return self.forward_test(img, img_metas, **kwargs) + + def train_step(self, data_batch, optimizer, **kwargs): + """The iteration step during training. + + This method defines an iteration step during training, except for the + back propagation and optimizer updating, which are done in an optimizer + hook. Note that in some complicated cases or models, the whole process + including back propagation and optimizer updating is also defined in + this method, such as GAN. + + Args: + data (dict): The output of dataloader. + optimizer (:obj:`torch.optim.Optimizer` | dict): The optimizer of + runner is passed to ``train_step()``. This argument is unused + and reserved. + + Returns: + dict: It should contain at least 3 keys: ``loss``, ``log_vars``, + ``num_samples``. + ``loss`` is a tensor for back propagation, which can be a + weighted sum of multiple losses. + ``log_vars`` contains all the variables to be sent to the + logger. + ``num_samples`` indicates the batch size (when the model is + DDP, it means the batch size on each GPU), which is used for + averaging the logs. + """ + losses = self(**data_batch) + loss, log_vars = self._parse_losses(losses) + + outputs = dict( + loss=loss, + log_vars=log_vars, + num_samples=len(data_batch['img'].data)) + + return outputs + + def val_step(self, data_batch, **kwargs): + """The iteration step during validation. + + This method shares the same signature as :func:`train_step`, but used + during val epochs. Note that the evaluation after training epochs is + not implemented with this method, but an evaluation hook. + """ + output = self(**data_batch, **kwargs) + return output + + @staticmethod + def _parse_losses(losses): + """Parse the raw outputs (losses) of the network. + + Args: + losses (dict): Raw output of the network, which usually contain + losses and other necessary information. + + Returns: + tuple[Tensor, dict]: (loss, log_vars), loss is the loss tensor + which may be a weighted sum of all losses, log_vars contains + all the variables to be sent to the logger. + """ + log_vars = OrderedDict() + for loss_name, loss_value in losses.items(): + if isinstance(loss_value, torch.Tensor): + log_vars[loss_name] = loss_value.mean() + elif isinstance(loss_value, list): + log_vars[loss_name] = sum(_loss.mean() for _loss in loss_value) + else: + raise TypeError( + f'{loss_name} is not a tensor or list of tensors') + + loss = sum(_value for _key, _value in log_vars.items() + if 'loss' in _key) + + log_vars['loss'] = loss + for loss_name, loss_value in log_vars.items(): + # reduce loss when distributed training + if dist.is_available() and dist.is_initialized(): + loss_value = loss_value.data.clone() + dist.all_reduce(loss_value.div_(dist.get_world_size())) + log_vars[loss_name] = loss_value.item() + + return loss, log_vars + + def show_result(self, + img, + result, + palette=None, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (Tensor): The semantic segmentation results to draw over + `img`. + palette (list[list[int]]] | np.ndarray | None): The palette of + segmentation map. If None is given, random palette will be + generated. Default: None + win_name (str): The window name. + wait_time (int): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file` + """ + img = mmcv.imread(img) + img = img.copy() + seg = result[0] + if palette is None: + if self.PALETTE is None: + palette = np.random.randint( + 0, 255, size=(len(self.CLASSES), 3)) + else: + palette = self.PALETTE + palette = np.array(palette) + assert palette.shape[0] == len(self.CLASSES) + assert palette.shape[1] == 3 + assert len(palette.shape) == 2 + color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) + for label, color in enumerate(palette): + color_seg[seg == label, :] = color + # convert to BGR + color_seg = color_seg[..., ::-1] + + img = img * 0.5 + color_seg * 0.5 + img = img.astype(np.uint8) + # if out_file specified, do not show image in window + if out_file is not None: + show = False + + if show: + mmcv.imshow(img, win_name, wait_time) + if out_file is not None: + mmcv.imwrite(img, out_file) + + if not (show or out_file): + warnings.warn('show==False and out_file is not specified, only ' + 'result image will be returned') + return img diff --git a/mmseg/models/segmentors/cascade_encoder_decoder.py b/mmseg/models/segmentors/cascade_encoder_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..220ab2bb365b61885482bdd86606e632f2af74ae --- /dev/null +++ b/mmseg/models/segmentors/cascade_encoder_decoder.py @@ -0,0 +1,98 @@ +from torch import nn + +from mmseg.core import add_prefix +from mmseg.ops import resize +from .. import builder +from ..builder import SEGMENTORS +from .encoder_decoder import EncoderDecoder + + +@SEGMENTORS.register_module() +class CascadeEncoderDecoder(EncoderDecoder): + """Cascade Encoder Decoder segmentors. + + CascadeEncoderDecoder almost the same as EncoderDecoder, while decoders of + CascadeEncoderDecoder are cascaded. The output of previous decoder_head + will be the input of next decoder_head. + """ + + def __init__(self, + num_stages, + backbone, + decode_head, + neck=None, + auxiliary_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None): + self.num_stages = num_stages + super(CascadeEncoderDecoder, self).__init__( + backbone=backbone, + decode_head=decode_head, + neck=neck, + auxiliary_head=auxiliary_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained) + + def _init_decode_head(self, decode_head): + """Initialize ``decode_head``""" + assert isinstance(decode_head, list) + assert len(decode_head) == self.num_stages + self.decode_head = nn.ModuleList() + for i in range(self.num_stages): + self.decode_head.append(builder.build_head(decode_head[i])) + self.align_corners = self.decode_head[-1].align_corners + self.num_classes = self.decode_head[-1].num_classes + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone and heads. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + self.backbone.init_weights(pretrained=pretrained) + for i in range(self.num_stages): + self.decode_head[i].init_weights() + if self.with_auxiliary_head: + if isinstance(self.auxiliary_head, nn.ModuleList): + for aux_head in self.auxiliary_head: + aux_head.init_weights() + else: + self.auxiliary_head.init_weights() + + def encode_decode(self, img, img_metas): + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(img) + out = self.decode_head[0].forward_test(x, img_metas, self.test_cfg) + for i in range(1, self.num_stages): + out = self.decode_head[i].forward_test(x, out, img_metas, + self.test_cfg) + out = resize( + input=out, + size=img.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + return out + + def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + + loss_decode = self.decode_head[0].forward_train( + x, img_metas, gt_semantic_seg, self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode_0')) + + for i in range(1, self.num_stages): + # forward test again, maybe unnecessary for most methods. + prev_outputs = self.decode_head[i - 1].forward_test( + x, img_metas, self.test_cfg) + loss_decode = self.decode_head[i].forward_train( + x, prev_outputs, img_metas, gt_semantic_seg, self.train_cfg) + losses.update(add_prefix(loss_decode, f'decode_{i}')) + + return losses diff --git a/mmseg/models/segmentors/encoder_decoder.py b/mmseg/models/segmentors/encoder_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..c513433ae6edc277e2260fd14875288e0705ee61 --- /dev/null +++ b/mmseg/models/segmentors/encoder_decoder.py @@ -0,0 +1,294 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.core import add_prefix +from mmseg.ops import resize +from .. import builder +from ..builder import SEGMENTORS +from .base import BaseSegmentor + + +@SEGMENTORS.register_module() +class EncoderDecoder(BaseSegmentor): + """Encoder Decoder segmentors. + + EncoderDecoder typically consists of backbone, decode_head, auxiliary_head. + Note that auxiliary_head is only used for deep supervision during training, + which could be dumped during inference. + """ + + def __init__(self, + backbone, + decode_head, + neck=None, + auxiliary_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None): + super(EncoderDecoder, self).__init__() + self.backbone = builder.build_backbone(backbone) + if neck is not None: + self.neck = builder.build_neck(neck) + self._init_decode_head(decode_head) + self._init_auxiliary_head(auxiliary_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + self.init_weights(pretrained=pretrained) + + assert self.with_decode_head + + def _init_decode_head(self, decode_head): + """Initialize ``decode_head``""" + self.decode_head = builder.build_head(decode_head) + self.align_corners = self.decode_head.align_corners + self.num_classes = self.decode_head.num_classes + + def _init_auxiliary_head(self, auxiliary_head): + """Initialize ``auxiliary_head``""" + if auxiliary_head is not None: + if isinstance(auxiliary_head, list): + self.auxiliary_head = nn.ModuleList() + for head_cfg in auxiliary_head: + self.auxiliary_head.append(builder.build_head(head_cfg)) + else: + self.auxiliary_head = builder.build_head(auxiliary_head) + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone and heads. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + + super(EncoderDecoder, self).init_weights(pretrained) + self.backbone.init_weights(pretrained=pretrained) + self.decode_head.init_weights() + if self.with_auxiliary_head: + if isinstance(self.auxiliary_head, nn.ModuleList): + for aux_head in self.auxiliary_head: + aux_head.init_weights() + else: + self.auxiliary_head.init_weights() + + def extract_feat(self, img): + """Extract features from images.""" + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def encode_decode(self, img, img_metas): + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(img) + out = self._decode_head_forward_test(x, img_metas) + out = resize( + input=out, + size=img.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + return out + + def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + loss_decode = self.decode_head.forward_train(x, img_metas, + gt_semantic_seg, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode')) + return losses + + def _decode_head_forward_test(self, x, img_metas): + """Run forward function and calculate loss for decode head in + inference.""" + seg_logits = self.decode_head.forward_test(x, img_metas, self.test_cfg) + return seg_logits + + def _auxiliary_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for auxiliary head in + training.""" + losses = dict() + if isinstance(self.auxiliary_head, nn.ModuleList): + for idx, aux_head in enumerate(self.auxiliary_head): + loss_aux = aux_head.forward_train(x, img_metas, + gt_semantic_seg, + self.train_cfg) + losses.update(add_prefix(loss_aux, f'aux_{idx}')) + else: + loss_aux = self.auxiliary_head.forward_train( + x, img_metas, gt_semantic_seg, self.train_cfg) + losses.update(add_prefix(loss_aux, 'aux')) + + return losses + + def forward_dummy(self, img): + """Dummy forward function.""" + seg_logit = self.encode_decode(img, None) + + return seg_logit + + def forward_train(self, img, img_metas, gt_semantic_seg): + """Forward function for training. + + Args: + img (Tensor): Input images. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + x = self.extract_feat(img) + + losses = dict() + + loss_decode = self._decode_head_forward_train(x, img_metas, + gt_semantic_seg) + losses.update(loss_decode) + + if self.with_auxiliary_head: + loss_aux = self._auxiliary_head_forward_train( + x, img_metas, gt_semantic_seg) + losses.update(loss_aux) + + return losses + + # TODO refactor + def slide_inference(self, img, img_meta, rescale): + """Inference by sliding-window with overlap. + + If h_crop > h_img or w_crop > w_img, the small patch will be used to + decode without padding. + """ + + h_stride, w_stride = self.test_cfg.stride + h_crop, w_crop = self.test_cfg.crop_size + batch_size, _, h_img, w_img = img.size() + #print(img.size()) + num_classes = self.num_classes + h_grids = max(h_img - h_crop + h_stride - 1, 0) // h_stride + 1 + w_grids = max(w_img - w_crop + w_stride - 1, 0) // w_stride + 1 + preds = img.new_zeros((batch_size, num_classes, h_img, w_img)) + count_mat = img.new_zeros((batch_size, 1, h_img, w_img)) + for h_idx in range(h_grids): + for w_idx in range(w_grids): + y1 = h_idx * h_stride + x1 = w_idx * w_stride + y2 = min(y1 + h_crop, h_img) + x2 = min(x1 + w_crop, w_img) + y1 = max(y2 - h_crop, 0) + x1 = max(x2 - w_crop, 0) + crop_img = img[:, :, y1:y2, x1:x2] + crop_seg_logit = self.encode_decode(crop_img, img_meta) + preds += F.pad(crop_seg_logit, + (int(x1), int(preds.shape[3] - x2), int(y1), + int(preds.shape[2] - y2))) + + count_mat[:, :, y1:y2, x1:x2] += 1 + assert (count_mat == 0).sum() == 0 + if torch.onnx.is_in_onnx_export(): + # cast count_mat to constant while exporting to ONNX + count_mat = torch.from_numpy( + count_mat.cpu().detach().numpy()).to(device=img.device) + preds = preds / count_mat + if rescale: + preds = resize( + preds, + size=img_meta[0]['ori_shape'][:2], + mode='bilinear', + align_corners=self.align_corners, + warning=False) + return preds + + def whole_inference(self, img, img_meta, rescale): + """Inference with full image.""" + + seg_logit = self.encode_decode(img, img_meta) + if rescale: + seg_logit = resize( + seg_logit, + size=img_meta[0]['ori_shape'][:2], + mode='bilinear', + align_corners=self.align_corners, + warning=False) + + return seg_logit + + def inference(self, img, img_meta, rescale): + """Inference with slide/whole style. + + Args: + img (Tensor): The input image of shape (N, 3, H, W). + img_meta (dict): Image info dict where each dict has: 'img_shape', + 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + rescale (bool): Whether rescale back to original shape. + + Returns: + Tensor: The output segmentation map. + """ + + assert self.test_cfg.mode in ['slide', 'whole'] + ori_shape = img_meta[0]['ori_shape'] + assert all(_['ori_shape'] == ori_shape for _ in img_meta) + if self.test_cfg.mode == 'slide': + seg_logit = self.slide_inference(img, img_meta, rescale) + else: + seg_logit = self.whole_inference(img, img_meta, rescale) + output = F.softmax(seg_logit, dim=1) + flip = img_meta[0]['flip'] + if flip: + flip_direction = img_meta[0]['flip_direction'] + assert flip_direction in ['horizontal', 'vertical'] + if flip_direction == 'horizontal': + output = output.flip(dims=(3, )) + elif flip_direction == 'vertical': + output = output.flip(dims=(2, )) + + return output + + def simple_test(self, img, img_meta, rescale=True): + """Simple test with single image.""" + seg_logit = self.inference(img, img_meta, rescale) + seg_pred = seg_logit.argmax(dim=1) + if torch.onnx.is_in_onnx_export(): + # our inference backend only support 4D output + seg_pred = seg_pred.unsqueeze(0) + return seg_pred + seg_pred = seg_pred.cpu().numpy() + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred + + def aug_test(self, imgs, img_metas, rescale=True): + """Test with augmentations. + + Only rescale=True is supported. + """ + # aug_test rescale all imgs back to ori_shape for now + assert rescale + # to save memory, we get augmented seg logit inplace + seg_logit = self.inference(imgs[0], img_metas[0], rescale) + for i in range(1, len(imgs)): + cur_seg_logit = self.inference(imgs[i], img_metas[i], rescale) + seg_logit += cur_seg_logit + seg_logit /= len(imgs) + seg_pred = seg_logit.argmax(dim=1) + seg_pred = seg_pred.cpu().numpy() + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred diff --git a/mmseg/models/utils/__init__.py b/mmseg/models/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..413228626e42eccbec6e099fd6490f4aec614394 --- /dev/null +++ b/mmseg/models/utils/__init__.py @@ -0,0 +1,10 @@ +from .inverted_residual import InvertedResidual, InvertedResidualV3 +from .make_divisible import make_divisible +from .res_layer import ResLayer +from .self_attention_block import SelfAttentionBlock +from .up_conv_block import UpConvBlock + +__all__ = [ + 'ResLayer', 'SelfAttentionBlock', 'make_divisible', 'InvertedResidual', + 'UpConvBlock', 'InvertedResidualV3' +] diff --git a/mmseg/models/utils/inverted_residual.py b/mmseg/models/utils/inverted_residual.py new file mode 100644 index 0000000000000000000000000000000000000000..093388f5643a1027095ef62e0158448df725fb82 --- /dev/null +++ b/mmseg/models/utils/inverted_residual.py @@ -0,0 +1,208 @@ +from mmcv.cnn import ConvModule +from torch import nn as nn +from torch.utils import checkpoint as cp + +from .se_layer import SELayer + + +class InvertedResidual(nn.Module): + """InvertedResidual block for MobileNetV2. + + Args: + in_channels (int): The input channels of the InvertedResidual block. + out_channels (int): The output channels of the InvertedResidual block. + stride (int): Stride of the middle (first) 3x3 convolution. + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + dilation (int): Dilation rate of depthwise conv. Default: 1 + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + stride, + expand_ratio, + dilation=1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + with_cp=False): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2], f'stride must in [1, 2]. ' \ + f'But received {stride}.' + self.with_cp = with_cp + self.use_res_connect = self.stride == 1 and in_channels == out_channels + hidden_dim = int(round(in_channels * expand_ratio)) + + layers = [] + if expand_ratio != 1: + layers.append( + ConvModule( + in_channels=in_channels, + out_channels=hidden_dim, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + layers.extend([ + ConvModule( + in_channels=hidden_dim, + out_channels=hidden_dim, + kernel_size=3, + stride=stride, + padding=dilation, + dilation=dilation, + groups=hidden_dim, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=hidden_dim, + out_channels=out_channels, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + + def _inner_forward(x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InvertedResidualV3(nn.Module): + """Inverted Residual Block for MobileNetV3. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + mid_channels (int): The input channels of the depthwise convolution. + kernel_size (int): The kernal size of the depthwise convolution. + Default: 3. + stride (int): The stride of the depthwise convolution. Default: 1. + se_cfg (dict): Config dict for se layer. Defaul: None, which means no + se layer. + with_expand_conv (bool): Use expand conv or not. If set False, + mid_channels must be the same with in_channels. Default: True. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + mid_channels, + kernel_size=3, + stride=1, + se_cfg=None, + with_expand_conv=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + with_cp=False): + super(InvertedResidualV3, self).__init__() + self.with_res_shortcut = (stride == 1 and in_channels == out_channels) + assert stride in [1, 2] + self.with_cp = with_cp + self.with_se = se_cfg is not None + self.with_expand_conv = with_expand_conv + + if self.with_se: + assert isinstance(se_cfg, dict) + if not self.with_expand_conv: + assert mid_channels == in_channels + + if self.with_expand_conv: + self.expand_conv = ConvModule( + in_channels=in_channels, + out_channels=mid_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.depthwise_conv = ConvModule( + in_channels=mid_channels, + out_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + padding=kernel_size // 2, + groups=mid_channels, + conv_cfg=dict( + type='Conv2dAdaptivePadding') if stride == 2 else conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + if self.with_se: + self.se = SELayer(**se_cfg) + + self.linear_conv = ConvModule( + in_channels=mid_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, x): + + def _inner_forward(x): + out = x + + if self.with_expand_conv: + out = self.expand_conv(out) + + out = self.depthwise_conv(out) + + if self.with_se: + out = self.se(out) + + out = self.linear_conv(out) + + if self.with_res_shortcut: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out diff --git a/mmseg/models/utils/make_divisible.py b/mmseg/models/utils/make_divisible.py new file mode 100644 index 0000000000000000000000000000000000000000..75ad756052529f52fe83bb95dd1f0ecfc9a13078 --- /dev/null +++ b/mmseg/models/utils/make_divisible.py @@ -0,0 +1,27 @@ +def make_divisible(value, divisor, min_value=None, min_ratio=0.9): + """Make divisible function. + + This function rounds the channel number to the nearest value that can be + divisible by the divisor. It is taken from the original tf repo. It ensures + that all layers have a channel number that is divisible by divisor. It can + be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py # noqa + + Args: + value (int): The original channel number. + divisor (int): The divisor to fully divide the channel number. + min_value (int): The minimum value of the output channel. + Default: None, means that the minimum value equal to the divisor. + min_ratio (float): The minimum ratio of the rounded channel number to + the original channel number. Default: 0.9. + + Returns: + int: The modified output channel number. + """ + + if min_value is None: + min_value = divisor + new_value = max(min_value, int(value + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than (1-min_ratio). + if new_value < min_ratio * value: + new_value += divisor + return new_value diff --git a/mmseg/models/utils/res_layer.py b/mmseg/models/utils/res_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..2585ab551aea79252ef6b34b5faef476e9e1abaa --- /dev/null +++ b/mmseg/models/utils/res_layer.py @@ -0,0 +1,94 @@ +from mmcv.cnn import build_conv_layer, build_norm_layer +from torch import nn as nn + + +class ResLayer(nn.Sequential): + """ResLayer to build ResNet style backbone. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + multi_grid (int | None): Multi grid dilation rates of last + stage. Default: None + contract_dilation (bool): Whether contract first dilation of each layer + Default: False + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + dilation=1, + avg_down=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + multi_grid=None, + contract_dilation=False, + **kwargs): + self.block = block + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + if avg_down: + conv_stride = 1 + downsample.append( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False)) + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + if multi_grid is None: + if dilation > 1 and contract_dilation: + first_dilation = dilation // 2 + else: + first_dilation = dilation + else: + first_dilation = multi_grid[0] + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + dilation=first_dilation, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + inplanes = planes * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + dilation=dilation if multi_grid is None else multi_grid[i], + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + super(ResLayer, self).__init__(*layers) diff --git a/mmseg/models/utils/se_layer.py b/mmseg/models/utils/se_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..d75e712cb467eab3e099e900cb3c7a2911a337d5 --- /dev/null +++ b/mmseg/models/utils/se_layer.py @@ -0,0 +1,57 @@ +import mmcv +import torch.nn as nn +from mmcv.cnn import ConvModule + +from .make_divisible import make_divisible + + +class SELayer(nn.Module): + """Squeeze-and-Excitation Module. + + Args: + channels (int): The input (and output) channels of the SE layer. + ratio (int): Squeeze ratio in SELayer, the intermediate channel will be + ``int(channels/ratio)``. Default: 16. + conv_cfg (None or dict): Config dict for convolution layer. + Default: None, which means using conv2d. + act_cfg (dict or Sequence[dict]): Config dict for activation layer. + If act_cfg is a dict, two activation layers will be configurated + by this dict. If act_cfg is a sequence of dicts, the first + activation layer will be configurated by the first dict and the + second activation layer will be configurated by the second dict. + Default: (dict(type='ReLU'), dict(type='HSigmoid', bias=3.0, + divisor=6.0)). + """ + + def __init__(self, + channels, + ratio=16, + conv_cfg=None, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))): + super(SELayer, self).__init__() + if isinstance(act_cfg, dict): + act_cfg = (act_cfg, act_cfg) + assert len(act_cfg) == 2 + assert mmcv.is_tuple_of(act_cfg, dict) + self.global_avgpool = nn.AdaptiveAvgPool2d(1) + self.conv1 = ConvModule( + in_channels=channels, + out_channels=make_divisible(channels // ratio, 8), + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[0]) + self.conv2 = ConvModule( + in_channels=make_divisible(channels // ratio, 8), + out_channels=channels, + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[1]) + + def forward(self, x): + out = self.global_avgpool(x) + out = self.conv1(out) + out = self.conv2(out) + return x * out diff --git a/mmseg/models/utils/self_attention_block.py b/mmseg/models/utils/self_attention_block.py new file mode 100644 index 0000000000000000000000000000000000000000..372fad2e000a157c7ef283a82388a7fea0158ee0 --- /dev/null +++ b/mmseg/models/utils/self_attention_block.py @@ -0,0 +1,159 @@ +import torch +from mmcv.cnn import ConvModule, constant_init +from torch import nn as nn +from torch.nn import functional as F + + +class SelfAttentionBlock(nn.Module): + """General self-attention block/non-local block. + + Please refer to https://arxiv.org/abs/1706.03762 for details about key, + query and value. + + Args: + key_in_channels (int): Input channels of key feature. + query_in_channels (int): Input channels of query feature. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_downsample (nn.Module): Query downsample module. + key_downsample (nn.Module): Key downsample module. + key_query_num_convs (int): Number of convs for key/query projection. + value_num_convs (int): Number of convs for value projection. + matmul_norm (bool): Whether normalize attention map with sqrt of + channels + with_out (bool): Whether use out projection. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, key_in_channels, query_in_channels, channels, + out_channels, share_key_query, query_downsample, + key_downsample, key_query_num_convs, value_out_num_convs, + key_query_norm, value_out_norm, matmul_norm, with_out, + conv_cfg, norm_cfg, act_cfg): + super(SelfAttentionBlock, self).__init__() + if share_key_query: + assert key_in_channels == query_in_channels + self.key_in_channels = key_in_channels + self.query_in_channels = query_in_channels + self.out_channels = out_channels + self.channels = channels + self.share_key_query = share_key_query + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.key_project = self.build_project( + key_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if share_key_query: + self.query_project = self.key_project + else: + self.query_project = self.build_project( + query_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.value_project = self.build_project( + key_in_channels, + channels if with_out else out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if with_out: + self.out_project = self.build_project( + channels, + out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.out_project = None + + self.query_downsample = query_downsample + self.key_downsample = key_downsample + self.matmul_norm = matmul_norm + + self.init_weights() + + def init_weights(self): + """Initialize weight of later layer.""" + if self.out_project is not None: + if not isinstance(self.out_project, ConvModule): + constant_init(self.out_project, 0) + + def build_project(self, in_channels, channels, num_convs, use_conv_module, + conv_cfg, norm_cfg, act_cfg): + """Build projection layer for key/query/value/out.""" + if use_conv_module: + convs = [ + ConvModule( + in_channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + ] + for _ in range(num_convs - 1): + convs.append( + ConvModule( + channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + else: + convs = [nn.Conv2d(in_channels, channels, 1)] + for _ in range(num_convs - 1): + convs.append(nn.Conv2d(channels, channels, 1)) + if len(convs) > 1: + convs = nn.Sequential(*convs) + else: + convs = convs[0] + return convs + + def forward(self, query_feats, key_feats): + """Forward function.""" + batch_size = query_feats.size(0) + query = self.query_project(query_feats) + if self.query_downsample is not None: + query = self.query_downsample(query) + query = query.reshape(*query.shape[:2], -1) + query = query.permute(0, 2, 1).contiguous() + + key = self.key_project(key_feats) + value = self.value_project(key_feats) + if self.key_downsample is not None: + key = self.key_downsample(key) + value = self.key_downsample(value) + key = key.reshape(*key.shape[:2], -1) + value = value.reshape(*value.shape[:2], -1) + value = value.permute(0, 2, 1).contiguous() + + sim_map = torch.matmul(query, key) + if self.matmul_norm: + sim_map = (self.channels**-.5) * sim_map + sim_map = F.softmax(sim_map, dim=-1) + + context = torch.matmul(sim_map, value) + context = context.permute(0, 2, 1).contiguous() + context = context.reshape(batch_size, -1, *query_feats.shape[2:]) + if self.out_project is not None: + context = self.out_project(context) + return context diff --git a/mmseg/models/utils/up_conv_block.py b/mmseg/models/utils/up_conv_block.py new file mode 100644 index 0000000000000000000000000000000000000000..df8a2aa7db31cf80d3c75adc4ca6da3155a75890 --- /dev/null +++ b/mmseg/models/utils/up_conv_block.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, build_upsample_layer + + +class UpConvBlock(nn.Module): + """Upsample convolution block in decoder for UNet. + + This upsample convolution block consists of one upsample module + followed by one convolution block. The upsample module expands the + high-level low-resolution feature map and the convolution block fuses + the upsampled high-level low-resolution feature map and the low-level + high-resolution feature map from encoder. + + Args: + conv_block (nn.Sequential): Sequential of convolutional layers. + in_channels (int): Number of input channels of the high-level + skip_channels (int): Number of input channels of the low-level + high-resolution feature map from encoder. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers in the conv_block. + Default: 2. + stride (int): Stride of convolutional layer in conv_block. Default: 1. + dilation (int): Dilation rate of convolutional layer in conv_block. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). If the size of + high-level feature map is the same as that of skip feature map + (low-level feature map from encoder), it does not need upsample the + high-level feature map and the upsample_cfg is None. + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + conv_block, + in_channels, + skip_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + dcn=None, + plugins=None): + super(UpConvBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.conv_block = conv_block( + in_channels=2 * skip_channels, + out_channels=out_channels, + num_convs=num_convs, + stride=stride, + dilation=dilation, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None) + if upsample_cfg is not None: + self.upsample = build_upsample_layer( + cfg=upsample_cfg, + in_channels=in_channels, + out_channels=skip_channels, + with_cp=with_cp, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.upsample = ConvModule( + in_channels, + skip_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, skip, x): + """Forward function.""" + + x = self.upsample(x) + out = torch.cat([skip, x], dim=1) + out = self.conv_block(out) + + return out diff --git a/mmseg/ops/__init__.py b/mmseg/ops/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bec51c75b9363a9a19e9fb5c35f4e7dbd6f7751c --- /dev/null +++ b/mmseg/ops/__init__.py @@ -0,0 +1,4 @@ +from .encoding import Encoding +from .wrappers import Upsample, resize + +__all__ = ['Upsample', 'resize', 'Encoding'] diff --git a/mmseg/ops/encoding.py b/mmseg/ops/encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..d939189657576b3bb13f6fdb512775aa97737d24 --- /dev/null +++ b/mmseg/ops/encoding.py @@ -0,0 +1,74 @@ +import torch +from torch import nn as nn +from torch.nn import functional as F + + +class Encoding(nn.Module): + """Encoding Layer: a learnable residual encoder. + + Input is of shape (batch_size, channels, height, width). + Output is of shape (batch_size, num_codes, channels). + + Args: + channels: dimension of the features or feature channels + num_codes: number of code words + """ + + def __init__(self, channels, num_codes): + super(Encoding, self).__init__() + # init codewords and smoothing factor + self.channels, self.num_codes = channels, num_codes + std = 1. / ((num_codes * channels)**0.5) + # [num_codes, channels] + self.codewords = nn.Parameter( + torch.empty(num_codes, channels, + dtype=torch.float).uniform_(-std, std), + requires_grad=True) + # [num_codes] + self.scale = nn.Parameter( + torch.empty(num_codes, dtype=torch.float).uniform_(-1, 0), + requires_grad=True) + + @staticmethod + def scaled_l2(x, codewords, scale): + num_codes, channels = codewords.size() + batch_size = x.size(0) + reshaped_scale = scale.view((1, 1, num_codes)) + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + + scaled_l2_norm = reshaped_scale * ( + expanded_x - reshaped_codewords).pow(2).sum(dim=3) + return scaled_l2_norm + + @staticmethod + def aggregate(assigment_weights, x, codewords): + num_codes, channels = codewords.size() + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + batch_size = x.size(0) + + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + encoded_feat = (assigment_weights.unsqueeze(3) * + (expanded_x - reshaped_codewords)).sum(dim=1) + return encoded_feat + + def forward(self, x): + assert x.dim() == 4 and x.size(1) == self.channels + # [batch_size, channels, height, width] + batch_size = x.size(0) + # [batch_size, height x width, channels] + x = x.view(batch_size, self.channels, -1).transpose(1, 2).contiguous() + # assignment_weights: [batch_size, channels, num_codes] + assigment_weights = F.softmax( + self.scaled_l2(x, self.codewords, self.scale), dim=2) + # aggregate + encoded_feat = self.aggregate(assigment_weights, x, self.codewords) + return encoded_feat + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(Nx{self.channels}xHxW =>Nx{self.num_codes}' \ + f'x{self.channels})' + return repr_str diff --git a/mmseg/ops/wrappers.py b/mmseg/ops/wrappers.py new file mode 100644 index 0000000000000000000000000000000000000000..a6d755273df1af99371502186aef27e8e353ec9f --- /dev/null +++ b/mmseg/ops/wrappers.py @@ -0,0 +1,53 @@ +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def resize(input, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None, + warning=True): + if warning: + if size is not None and align_corners: + input_h, input_w = tuple(int(x) for x in input.shape[2:]) + output_h, output_w = tuple(int(x) for x in size) + if output_h > input_h or output_w > output_h: + if ((output_h > 1 and output_w > 1 and input_h > 1 + and input_w > 1) and (output_h - 1) % (input_h - 1) + and (output_w - 1) % (input_w - 1)): + warnings.warn( + f'When align_corners={align_corners}, ' + 'the output would more aligned if ' + f'input size {(input_h, input_w)} is `x+1` and ' + f'out size {(output_h, output_w)} is `nx+1`') + if isinstance(size, torch.Size): + size = tuple(int(x) for x in size) + return F.interpolate(input, size, scale_factor, mode, align_corners) + + +class Upsample(nn.Module): + + def __init__(self, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None): + super(Upsample, self).__init__() + self.size = size + if isinstance(scale_factor, tuple): + self.scale_factor = tuple(float(factor) for factor in scale_factor) + else: + self.scale_factor = float(scale_factor) if scale_factor else None + self.mode = mode + self.align_corners = align_corners + + def forward(self, x): + if not self.size: + size = [int(t * self.scale_factor) for t in x.shape[-2:]] + else: + size = self.size + return resize(x, size, None, self.mode, self.align_corners) diff --git a/mmseg/utils/__init__.py b/mmseg/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ac489e2dbbc0e6fa87f5088b4edcc20f8cadc1a6 --- /dev/null +++ b/mmseg/utils/__init__.py @@ -0,0 +1,4 @@ +from .collect_env import collect_env +from .logger import get_root_logger + +__all__ = ['get_root_logger', 'collect_env'] diff --git a/mmseg/utils/collect_env.py b/mmseg/utils/collect_env.py new file mode 100644 index 0000000000000000000000000000000000000000..8293a05fb3422249485c4d877749fc9c92a51e36 --- /dev/null +++ b/mmseg/utils/collect_env.py @@ -0,0 +1,17 @@ +from mmcv.utils import collect_env as collect_base_env +from mmcv.utils import get_git_hash + +import mmseg + + +def collect_env(): + """Collect the information of the running environments.""" + env_info = collect_base_env() + env_info['MMSegmentation'] = f'{mmseg.__version__}+{get_git_hash()[:7]}' + + return env_info + + +if __name__ == '__main__': + for name, val in collect_env().items(): + print('{}: {}'.format(name, val)) diff --git a/mmseg/utils/logger.py b/mmseg/utils/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..05d2f13439ff501aa51b248ce7396ea5d41a38fb --- /dev/null +++ b/mmseg/utils/logger.py @@ -0,0 +1,27 @@ +import logging + +from mmcv.utils import get_logger + + +def get_root_logger(log_file=None, log_level=logging.INFO): + """Get the root logger. + + The logger will be initialized if it has not been initialized. By default a + StreamHandler will be added. If `log_file` is specified, a FileHandler will + also be added. The name of the root logger is the top-level package name, + e.g., "mmseg". + + Args: + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the root logger. + log_level (int): The root logger level. Note that only the process of + rank 0 is affected, while other processes will set the level to + "Error" and be silent most of the time. + + Returns: + logging.Logger: The root logger. + """ + + logger = get_logger(name='mmseg', log_file=log_file, log_level=log_level) + + return logger diff --git a/mmseg/version.py b/mmseg/version.py new file mode 100644 index 0000000000000000000000000000000000000000..41a08cf155f9b938972b331c216349ef848840a5 --- /dev/null +++ b/mmseg/version.py @@ -0,0 +1,18 @@ +# Copyright (c) Open-MMLab. All rights reserved. + +__version__ = '0.11.0' + + +def parse_version_info(version_str): + version_info = [] + for x in version_str.split('.'): + if x.isdigit(): + version_info.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + version_info.append(int(patch_version[0])) + version_info.append(f'rc{patch_version[1]}') + return tuple(version_info) + + +version_info = parse_version_info(__version__) diff --git a/pretrain b/pretrain new file mode 100644 index 0000000000000000000000000000000000000000..8f2a0bc25e45d37d2d54b1d7e22e03f8ceb06096 --- /dev/null +++ b/pretrain @@ -0,0 +1 @@ +pretrained_model \ No newline at end of file diff --git a/pretrained_model b/pretrained_model new file mode 100644 index 0000000000000000000000000000000000000000..78752e1288b1d64ed31208b594b171f2e7031a8a --- /dev/null +++ b/pretrained_model @@ -0,0 +1 @@ +../pretrained_model/ \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..9796e871e70c7c67345b1d6bcf708c0c82377a98 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --xdoctest --xdoctest-style=auto +norecursedirs = .git ignore build __pycache__ data docker docs .eggs + +filterwarnings= default + ignore:.*No cfgstr given in Cacher constructor or call.*:Warning + ignore:.*Define the __nice__ method for.*:Warning diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..6da5adea757ffc79ac35e544d4afe85c5f44a90d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +-r requirements/optional.txt +-r requirements/runtime.txt +-r requirements/tests.txt diff --git a/requirements/docs.txt b/requirements/docs.txt new file mode 100644 index 0000000000000000000000000000000000000000..89fbf86c01cb29f10f7e99c910248c4d5229da58 --- /dev/null +++ b/requirements/docs.txt @@ -0,0 +1,4 @@ +recommonmark +sphinx +sphinx_markdown_tables +sphinx_rtd_theme diff --git a/requirements/optional.txt b/requirements/optional.txt new file mode 100644 index 0000000000000000000000000000000000000000..47fa5933159eb068640f6b45281d36ab4af294cb --- /dev/null +++ b/requirements/optional.txt @@ -0,0 +1 @@ +cityscapesscripts diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt new file mode 100644 index 0000000000000000000000000000000000000000..0542bfce6dff3b002a1d33e53c0be975e7feed4a --- /dev/null +++ b/requirements/readthedocs.txt @@ -0,0 +1,3 @@ +mmcv +torch +torchvision diff --git a/requirements/runtime.txt b/requirements/runtime.txt new file mode 100644 index 0000000000000000000000000000000000000000..a8347b9c0c067c6ebeec91d7c235d8e15ee65536 --- /dev/null +++ b/requirements/runtime.txt @@ -0,0 +1,3 @@ +matplotlib +numpy +terminaltables diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 0000000000000000000000000000000000000000..991fd711d4eed749f8f3440f9c4b448e3973575f --- /dev/null +++ b/requirements/tests.txt @@ -0,0 +1,7 @@ +codecov +flake8 +interrogate +isort==4.3.21 +pytest +xdoctest>=0.10.0 +yapf diff --git a/resources/foodseg103.png b/resources/foodseg103.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f4f673e6d6a694083351a72d9c16e42dabd35d Binary files /dev/null and b/resources/foodseg103.png differ diff --git a/resources/mmseg-logo.png b/resources/mmseg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..009083a9e80599a1893591ff362da377c94a0975 Binary files /dev/null and b/resources/mmseg-logo.png differ diff --git a/resources/seg_demo.gif b/resources/seg_demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f0760fe7a86912c07f9873eec3909ad41fe2acb Binary files /dev/null and b/resources/seg_demo.gif differ diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..708fb4ce33fcf55bd448bc2234f38c1891ae0356 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,13 @@ +[yapf] +based_on_style = pep8 +blank_line_before_nested_class_or_def = true +split_before_expression_after_opening_paren = true + +[isort] +line_length = 79 +multi_line_output = 0 +known_standard_library = setuptools +known_first_party = mmseg +known_third_party = PIL,cityscapesscripts,cv2,detail,matplotlib,mmcv,numpy,onnxruntime,oss2,pytest,scipy,terminaltables,torch +no_lines_before = STDLIB,LOCALFOLDER +default_section = THIRDPARTY diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..4b2e1483dbffd7ae39ac1a9563058307bbf8e0a2 --- /dev/null +++ b/setup.py @@ -0,0 +1,125 @@ +from setuptools import find_packages, setup + +def readme(): + with open('README.md', encoding='utf-8') as f: + content = f.read() + return content + + +version_file = 'mmseg/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +def parse_requirements(fname='requirements.txt', with_version=True): + """Parse the package dependencies listed in a requirements file but strips + specific versioning information. + + Args: + fname (str): path to requirements file + with_version (bool, default=False): if True include version specs + + Returns: + List[str]: list of requirements items + + CommandLine: + python -c "import setup; print(setup.parse_requirements())" + """ + import sys + from os.path import exists + import re + require_fpath = fname + + def parse_line(line): + """Parse information from a line in a requirements text file.""" + if line.startswith('-r '): + # Allow specifying requirements in other files + target = line.split(' ')[1] + for info in parse_require_file(target): + yield info + else: + info = {'line': line} + if line.startswith('-e '): + info['package'] = line.split('#egg=')[1] + else: + # Remove versioning from the package + pat = '(' + '|'.join(['>=', '==', '>']) + ')' + parts = re.split(pat, line, maxsplit=1) + parts = [p.strip() for p in parts] + + info['package'] = parts[0] + if len(parts) > 1: + op, rest = parts[1:] + if ';' in rest: + # Handle platform specific dependencies + # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies + version, platform_deps = map(str.strip, + rest.split(';')) + info['platform_deps'] = platform_deps + else: + version = rest # NOQA + info['version'] = (op, version) + yield info + + def parse_require_file(fpath): + with open(fpath, 'r') as f: + for line in f.readlines(): + line = line.strip() + if line and not line.startswith('#'): + for info in parse_line(line): + yield info + + def gen_packages_items(): + if exists(require_fpath): + for info in parse_require_file(require_fpath): + parts = [info['package']] + if with_version and 'version' in info: + parts.extend(info['version']) + if not sys.version.startswith('3.4'): + # apparently package_deps are broken in 3.4 + platform_deps = info.get('platform_deps') + if platform_deps is not None: + parts.append(';' + platform_deps) + item = ''.join(parts) + yield item + + packages = list(gen_packages_items()) + return packages + + +if __name__ == '__main__': + setup( + name='mmsegmentation', + version=get_version(), + description='Open MMLab Semantic Segmentation Toolbox and Benchmark', + long_description=readme(), + long_description_content_type='text/markdown', + author='MMSegmentation Authors', + author_email='openmmlab@gmail.com', + keywords='computer vision, semantic segmentation', + url='http://github.com/open-mmlab/mmsegmentation', + packages=find_packages(exclude=('configs', 'tools', 'demo')), + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], + license='Apache License 2.0', + setup_requires=parse_requirements('requirements/build.txt'), + tests_require=parse_requirements('requirements/tests.txt'), + install_requires=parse_requirements('requirements/runtime.txt'), + extras_require={ + 'all': parse_requirements('requirements.txt'), + 'tests': parse_requirements('requirements/tests.txt'), + 'build': parse_requirements('requirements/build.txt'), + 'optional': parse_requirements('requirements/optional.txt'), + }, + ext_modules=[], + zip_safe=False) diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000000000000000000000000000000000000..b991fbfd31233b113a92e927ca6072b54457f73e --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,160 @@ +import glob +import os +from os.path import dirname, exists, isdir, join, relpath + +from mmcv import Config +from torch import nn + +from mmseg.models import build_segmentor + + +def _get_config_directory(): + """Find the predefined segmentor config directory.""" + try: + # Assume we are running in the source mmsegmentation repo + repo_dpath = dirname(dirname(__file__)) + except NameError: + # For IPython development when this __file__ is not defined + import mmseg + repo_dpath = dirname(dirname(mmseg.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def test_config_build_segmentor(): + """Test that all segmentation models defined in the configs can be + initialized.""" + config_dpath = _get_config_directory() + print('Found config_dpath = {!r}'.format(config_dpath)) + + config_fpaths = [] + # one config each sub folder + for sub_folder in os.listdir(config_dpath): + if isdir(sub_folder): + config_fpaths.append( + list(glob.glob(join(config_dpath, sub_folder, '*.py')))[0]) + config_fpaths = [p for p in config_fpaths if p.find('_base_') == -1] + config_names = [relpath(p, config_dpath) for p in config_fpaths] + + print('Using {} config files'.format(len(config_names))) + + for config_fname in config_names: + config_fpath = join(config_dpath, config_fname) + config_mod = Config.fromfile(config_fpath) + + config_mod.model + print('Building segmentor, config_fpath = {!r}'.format(config_fpath)) + + # Remove pretrained keys to allow for testing in an offline environment + if 'pretrained' in config_mod.model: + config_mod.model['pretrained'] = None + + print('building {}'.format(config_fname)) + segmentor = build_segmentor(config_mod.model) + assert segmentor is not None + + head_config = config_mod.model['decode_head'] + _check_decode_head(head_config, segmentor.decode_head) + + +def test_config_data_pipeline(): + """Test whether the data pipeline is valid and can process corner cases. + + CommandLine: + xdoctest -m tests/test_config.py test_config_build_data_pipeline + """ + from mmcv import Config + from mmseg.datasets.pipelines import Compose + import numpy as np + + config_dpath = _get_config_directory() + print('Found config_dpath = {!r}'.format(config_dpath)) + + import glob + config_fpaths = list(glob.glob(join(config_dpath, '**', '*.py'))) + config_fpaths = [p for p in config_fpaths if p.find('_base_') == -1] + config_names = [relpath(p, config_dpath) for p in config_fpaths] + + print('Using {} config files'.format(len(config_names))) + + for config_fname in config_names: + config_fpath = join(config_dpath, config_fname) + print( + 'Building data pipeline, config_fpath = {!r}'.format(config_fpath)) + config_mod = Config.fromfile(config_fpath) + + # remove loading pipeline + load_img_pipeline = config_mod.train_pipeline.pop(0) + to_float32 = load_img_pipeline.get('to_float32', False) + config_mod.train_pipeline.pop(0) + config_mod.test_pipeline.pop(0) + + train_pipeline = Compose(config_mod.train_pipeline) + test_pipeline = Compose(config_mod.test_pipeline) + + img = np.random.randint(0, 255, size=(1024, 2048, 3), dtype=np.uint8) + if to_float32: + img = img.astype(np.float32) + seg = np.random.randint(0, 255, size=(1024, 2048, 1), dtype=np.uint8) + + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_semantic_seg=seg) + results['seg_fields'] = ['gt_semantic_seg'] + + print('Test training data pipeline: \n{!r}'.format(train_pipeline)) + output_results = train_pipeline(results) + assert output_results is not None + + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + ) + print('Test testing data pipeline: \n{!r}'.format(test_pipeline)) + output_results = test_pipeline(results) + assert output_results is not None + + +def _check_decode_head(decode_head_cfg, decode_head): + if isinstance(decode_head_cfg, list): + assert isinstance(decode_head, nn.ModuleList) + assert len(decode_head_cfg) == len(decode_head) + num_heads = len(decode_head) + for i in range(num_heads): + _check_decode_head(decode_head_cfg[i], decode_head[i]) + return + # check consistency between head_config and roi_head + assert decode_head_cfg['type'] == decode_head.__class__.__name__ + + assert decode_head_cfg['type'] == decode_head.__class__.__name__ + + in_channels = decode_head_cfg.in_channels + input_transform = decode_head.input_transform + assert input_transform in ['resize_concat', 'multiple_select', None] + if input_transform is not None: + assert isinstance(in_channels, (list, tuple)) + assert isinstance(decode_head.in_index, (list, tuple)) + assert len(in_channels) == len(decode_head.in_index) + elif input_transform == 'resize_concat': + assert sum(in_channels) == decode_head.in_channels + else: + assert isinstance(in_channels, int) + assert in_channels == decode_head.in_channels + assert isinstance(decode_head.in_index, int) + + if decode_head_cfg['type'] == 'PointHead': + assert decode_head_cfg.channels+decode_head_cfg.num_classes == \ + decode_head.fc_seg.in_channels + assert decode_head.fc_seg.out_channels == decode_head_cfg.num_classes + else: + assert decode_head_cfg.channels == decode_head.conv_seg.in_channels + assert decode_head.conv_seg.out_channels == decode_head_cfg.num_classes diff --git a/tests/test_data/test_dataset.py b/tests/test_data/test_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..2e19c30f084aefd5a7567f3b05aa3a64e25db4bf --- /dev/null +++ b/tests/test_data/test_dataset.py @@ -0,0 +1,291 @@ +import os.path as osp +from unittest.mock import MagicMock, patch + +import numpy as np +import pytest + +from mmseg.core.evaluation import get_classes, get_palette +from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset, + ConcatDataset, CustomDataset, PascalVOCDataset, + RepeatDataset) + + +def test_classes(): + assert list(CityscapesDataset.CLASSES) == get_classes('cityscapes') + assert list(PascalVOCDataset.CLASSES) == get_classes('voc') == get_classes( + 'pascal_voc') + assert list( + ADE20KDataset.CLASSES) == get_classes('ade') == get_classes('ade20k') + + with pytest.raises(ValueError): + get_classes('unsupported') + + +def test_palette(): + assert CityscapesDataset.PALETTE == get_palette('cityscapes') + assert PascalVOCDataset.PALETTE == get_palette('voc') == get_palette( + 'pascal_voc') + assert ADE20KDataset.PALETTE == get_palette('ade') == get_palette('ade20k') + + with pytest.raises(ValueError): + get_palette('unsupported') + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_dataset_wrapper(): + # CustomDataset.load_annotations = MagicMock() + # CustomDataset.__getitem__ = MagicMock(side_effect=lambda idx: idx) + dataset_a = CustomDataset(img_dir=MagicMock(), pipeline=[]) + len_a = 10 + dataset_a.img_infos = MagicMock() + dataset_a.img_infos.__len__.return_value = len_a + dataset_b = CustomDataset(img_dir=MagicMock(), pipeline=[]) + len_b = 20 + dataset_b.img_infos = MagicMock() + dataset_b.img_infos.__len__.return_value = len_b + + concat_dataset = ConcatDataset([dataset_a, dataset_b]) + assert concat_dataset[5] == 5 + assert concat_dataset[25] == 15 + assert len(concat_dataset) == len(dataset_a) + len(dataset_b) + + repeat_dataset = RepeatDataset(dataset_a, 10) + assert repeat_dataset[5] == 5 + assert repeat_dataset[15] == 5 + assert repeat_dataset[27] == 7 + assert len(repeat_dataset) == 10 * len(dataset_a) + + +def test_custom_dataset(): + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + crop_size = (512, 1024) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(128, 256), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), + ] + test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(128, 256), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + + # with img_dir and ann_dir + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir='imgs/', + ann_dir='gts/', + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # with img_dir, ann_dir, split + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir='imgs/', + ann_dir='gts/', + img_suffix='img.jpg', + seg_map_suffix='gt.png', + split='splits/train.txt') + assert len(train_dataset) == 4 + + # no data_root + train_dataset = CustomDataset( + train_pipeline, + img_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs'), + ann_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/gts'), + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # with data_root but img_dir/ann_dir are abs path + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir=osp.abspath( + osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs')), + ann_dir=osp.abspath( + osp.join(osp.dirname(__file__), '../data/pseudo_dataset/gts')), + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # test_mode=True + test_dataset = CustomDataset( + test_pipeline, + img_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs'), + img_suffix='img.jpg', + test_mode=True) + assert len(test_dataset) == 5 + + # training data get + train_data = train_dataset[0] + assert isinstance(train_data, dict) + + # test data get + test_data = test_dataset[0] + assert isinstance(test_data, dict) + + # get gt seg map + gt_seg_maps = train_dataset.get_gt_seg_maps() + assert len(gt_seg_maps) == 5 + + # evaluation + pseudo_results = [] + for gt_seg_map in gt_seg_maps: + h, w = gt_seg_map.shape + pseudo_results.append(np.random.randint(low=0, high=7, size=(h, w))) + eval_results = train_dataset.evaluate(pseudo_results, metric='mIoU') + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate(pseudo_results, metric='mDice') + assert isinstance(eval_results, dict) + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate( + pseudo_results, metric=['mDice', 'mIoU']) + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + # evaluation with CLASSES + train_dataset.CLASSES = tuple(['a'] * 7) + eval_results = train_dataset.evaluate(pseudo_results, metric='mIoU') + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate(pseudo_results, metric='mDice') + assert isinstance(eval_results, dict) + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate( + pseudo_results, metric=['mIoU', 'mDice']) + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +@pytest.mark.parametrize('dataset, classes', [ + ('ADE20KDataset', ('wall', 'building')), + ('CityscapesDataset', ('road', 'sidewalk')), + ('CustomDataset', ('bus', 'car')), + ('PascalVOCDataset', ('aeroplane', 'bicycle')), +]) +def test_custom_classes_override_default(dataset, classes): + + dataset_class = DATASETS.get(dataset) + + original_classes = dataset_class.CLASSES + + # Test setting classes as a tuple + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=classes, + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == classes + + # Test setting classes as a list + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=list(classes), + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == list(classes) + + # Test overriding not a subset + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=[classes[0]], + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == [classes[0]] + + # Test default behavior + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=None, + test_mode=True) + + assert custom_dataset.CLASSES == original_classes + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_custom_dataset_random_palette_is_generated(): + dataset = CustomDataset( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=('bus', 'car'), + test_mode=True) + assert len(dataset.PALETTE) == 2 + for class_color in dataset.PALETTE: + assert len(class_color) == 3 + assert all(x >= 0 and x <= 255 for x in class_color) + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_custom_dataset_custom_palette(): + dataset = CustomDataset( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=('bus', 'car'), + palette=[[100, 100, 100], [200, 200, 200]], + test_mode=True) + assert tuple(dataset.PALETTE) == tuple([[100, 100, 100], [200, 200, 200]]) diff --git a/tests/test_data/test_dataset_builder.py b/tests/test_data/test_dataset_builder.py new file mode 100644 index 0000000000000000000000000000000000000000..c6827e4d1758aa43716aceab793bb33da85a2398 --- /dev/null +++ b/tests/test_data/test_dataset_builder.py @@ -0,0 +1,192 @@ +import math +import os.path as osp + +import pytest +from torch.utils.data import (DistributedSampler, RandomSampler, + SequentialSampler) + +from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader, + build_dataset) + + +@DATASETS.register_module() +class ToyDataset(object): + + def __init__(self, cnt=0): + self.cnt = cnt + + def __item__(self, idx): + return idx + + def __len__(self): + return 100 + + +def test_build_dataset(): + cfg = dict(type='ToyDataset') + dataset = build_dataset(cfg) + assert isinstance(dataset, ToyDataset) + assert dataset.cnt == 0 + dataset = build_dataset(cfg, default_args=dict(cnt=1)) + assert isinstance(dataset, ToyDataset) + assert dataset.cnt == 1 + + data_root = osp.join(osp.dirname(__file__), '../data/pseudo_dataset') + img_dir = 'imgs/' + ann_dir = 'gts/' + + # We use same dir twice for simplicity + # with ann_dir + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + ann_dir=[ann_dir, ann_dir]) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 10 + + # with ann_dir, split + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=ann_dir, + split=['splits/train.txt', 'splits/val.txt']) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 5 + + # with ann_dir, split + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=[ann_dir, ann_dir], + split=['splits/train.txt', 'splits/val.txt']) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 5 + + # test mode + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + test_mode=True) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 10 + + # test mode with splits + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + split=['splits/val.txt', 'splits/val.txt'], + test_mode=True) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 2 + + # len(ann_dir) should be zero or len(img_dir) when len(img_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + ann_dir=[ann_dir, ann_dir, ann_dir]) + build_dataset(cfg) + + # len(splits) should be zero or len(img_dir) when len(img_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + split=['splits/val.txt', 'splits/val.txt', 'splits/val.txt']) + build_dataset(cfg) + + # len(splits) == len(ann_dir) when only len(img_dir) == 1 and len( + # ann_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=[ann_dir, ann_dir], + split=['splits/val.txt', 'splits/val.txt', 'splits/val.txt']) + build_dataset(cfg) + + +def test_build_dataloader(): + dataset = ToyDataset() + samples_per_gpu = 3 + # dist=True, shuffle=True, 1GPU + dataloader = build_dataloader( + dataset, samples_per_gpu=samples_per_gpu, workers_per_gpu=2) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, DistributedSampler) + assert dataloader.sampler.shuffle + + # dist=True, shuffle=False, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + shuffle=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, DistributedSampler) + assert not dataloader.sampler.shuffle + + # dist=True, shuffle=True, 8GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + num_gpus=8) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=True, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + dist=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, RandomSampler) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=False, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=3, + workers_per_gpu=2, + shuffle=False, + dist=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, SequentialSampler) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=True, 8GPU + dataloader = build_dataloader( + dataset, samples_per_gpu=3, workers_per_gpu=2, num_gpus=8, dist=False) + assert dataloader.batch_size == samples_per_gpu * 8 + assert len(dataloader) == int( + math.ceil(len(dataset) / samples_per_gpu / 8)) + assert isinstance(dataloader.sampler, RandomSampler) + assert dataloader.num_workers == 16 diff --git a/tests/test_data/test_loading.py b/tests/test_data/test_loading.py new file mode 100644 index 0000000000000000000000000000000000000000..e8aa5d31301caa9a40dfa8ebd8f39ee72d4f6a8f --- /dev/null +++ b/tests/test_data/test_loading.py @@ -0,0 +1,198 @@ +import copy +import os.path as osp +import tempfile + +import mmcv +import numpy as np + +from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile + + +class TestLoading(object): + + @classmethod + def setup_class(cls): + cls.data_prefix = osp.join(osp.dirname(__file__), '../data') + + def test_load_img(self): + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == osp.join(self.data_prefix, 'color.jpg') + assert results['ori_filename'] == 'color.jpg' + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + assert results['img_shape'] == (288, 512, 3) + assert results['ori_shape'] == (288, 512, 3) + assert results['pad_shape'] == (288, 512, 3) + assert results['scale_factor'] == 1.0 + np.testing.assert_equal(results['img_norm_cfg']['mean'], + np.zeros(3, dtype=np.float32)) + assert repr(transform) == transform.__class__.__name__ + \ + "(to_float32=False,color_type='color',imdecode_backend='cv2')" + + # no img_prefix + results = dict( + img_prefix=None, img_info=dict(filename='tests/data/color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == 'tests/data/color.jpg' + assert results['ori_filename'] == 'tests/data/color.jpg' + assert results['img'].shape == (288, 512, 3) + + # to_float32 + transform = LoadImageFromFile(to_float32=True) + results = transform(copy.deepcopy(results)) + assert results['img'].dtype == np.float32 + + # gray image + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='gray.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + + transform = LoadImageFromFile(color_type='unchanged') + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512) + assert results['img'].dtype == np.uint8 + np.testing.assert_equal(results['img_norm_cfg']['mean'], + np.zeros(1, dtype=np.float32)) + + def test_load_seg(self): + results = dict( + seg_prefix=self.data_prefix, + ann_info=dict(seg_map='seg.png'), + seg_fields=[]) + transform = LoadAnnotations() + results = transform(copy.deepcopy(results)) + assert results['seg_fields'] == ['gt_semantic_seg'] + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + assert repr(transform) == transform.__class__.__name__ + \ + "(reduce_zero_label=False,imdecode_backend='pillow')" + + # no img_prefix + results = dict( + seg_prefix=None, + ann_info=dict(seg_map='tests/data/seg.png'), + seg_fields=[]) + transform = LoadAnnotations() + results = transform(copy.deepcopy(results)) + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + # reduce_zero_label + transform = LoadAnnotations(reduce_zero_label=True) + results = transform(copy.deepcopy(results)) + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + # mmcv backend + results = dict( + seg_prefix=self.data_prefix, + ann_info=dict(seg_map='seg.png'), + seg_fields=[]) + transform = LoadAnnotations(imdecode_backend='pillow') + results = transform(copy.deepcopy(results)) + # this image is saved by PIL + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + def test_load_seg_custom_classes(self): + + test_img = np.random.rand(10, 10) + test_gt = np.zeros_like(test_img) + test_gt[2:4, 2:4] = 1 + test_gt[2:4, 6:8] = 2 + test_gt[6:8, 2:4] = 3 + test_gt[6:8, 6:8] = 4 + + tmp_dir = tempfile.TemporaryDirectory() + img_path = osp.join(tmp_dir.name, 'img.jpg') + gt_path = osp.join(tmp_dir.name, 'gt.png') + + mmcv.imwrite(test_img, img_path) + mmcv.imwrite(test_gt, gt_path) + + # test only train with label with id 3 + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + label_map={ + 0: 0, + 1: 0, + 2: 0, + 3: 1, + 4: 0 + }, + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + true_mask = np.zeros_like(gt_array) + true_mask[6:8, 2:4] = 1 + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, true_mask) + + # test only train with label with id 4 and 3 + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + label_map={ + 0: 0, + 1: 0, + 2: 0, + 3: 2, + 4: 1 + }, + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + true_mask = np.zeros_like(gt_array) + true_mask[6:8, 2:4] = 2 + true_mask[6:8, 6:8] = 1 + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, true_mask) + + # test no custom classes + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, test_gt) + + tmp_dir.cleanup() diff --git a/tests/test_data/test_transform.py b/tests/test_data/test_transform.py new file mode 100644 index 0000000000000000000000000000000000000000..a6417575c39e76607a522b6d1345e5ed2e19999e --- /dev/null +++ b/tests/test_data/test_transform.py @@ -0,0 +1,478 @@ +import copy +import os.path as osp + +import mmcv +import numpy as np +import pytest +from mmcv.utils import build_from_cfg +from PIL import Image + +from mmseg.datasets.builder import PIPELINES + + +def test_resize(): + # test assertion if img_scale is a list + with pytest.raises(AssertionError): + transform = dict(type='Resize', img_scale=[1333, 800], keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion if len(img_scale) while ratio_range is not None + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + ratio_range=(0.9, 1.1), + keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid multiscale_mode + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + keep_ratio=True, + multiscale_mode='2333') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + + results = dict() + # (288, 512, 3) + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] == (750, 1333, 3) + + # test keep_ratio=False + transform = dict( + type='Resize', + img_scale=(1280, 800), + multiscale_mode='value', + keep_ratio=False) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] == (800, 1280, 3) + + # test multiscale_mode='range' + transform = dict( + type='Resize', + img_scale=[(1333, 400), (1333, 1200)], + multiscale_mode='range', + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert max(resized_results['img_shape'][:2]) <= 1333 + assert min(resized_results['img_shape'][:2]) >= 400 + assert min(resized_results['img_shape'][:2]) <= 1200 + + # test multiscale_mode='value' + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 400)], + multiscale_mode='value', + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] in [(750, 1333, 3), (400, 711, 3)] + + # test multiscale_mode='range' + transform = dict( + type='Resize', + img_scale=(1333, 800), + ratio_range=(0.9, 1.1), + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert max(resized_results['img_shape'][:2]) <= 1333 * 1.1 + + # test img_scale=None and ratio_range is tuple. + # img shape: (288, 512, 3) + transform = dict( + type='Resize', img_scale=None, ratio_range=(0.5, 2.0), keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert int(288 * 0.5) <= resized_results['img_shape'][0] <= 288 * 2.0 + assert int(512 * 0.5) <= resized_results['img_shape'][1] <= 512 * 2.0 + + +def test_flip(): + # test assertion for invalid prob + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', prob=1.5) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid direction + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', prob=1, direction='horizonta') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='RandomFlip', prob=1) + flip_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + original_seg = copy.deepcopy(seg) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = flip_module(results) + + flip_module = build_from_cfg(transform, PIPELINES) + results = flip_module(results) + assert np.equal(original_img, results['img']).all() + assert np.equal(original_seg, results['gt_semantic_seg']).all() + + +def test_random_crop(): + # test assertion for invalid random crop + with pytest.raises(AssertionError): + transform = dict(type='RandomCrop', crop_size=(-1, 0)) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + h, w, _ = img.shape + transform = dict(type='RandomCrop', crop_size=(h - 20, w - 20)) + crop_module = build_from_cfg(transform, PIPELINES) + results = crop_module(results) + assert results['img'].shape[:2] == (h - 20, w - 20) + assert results['img_shape'][:2] == (h - 20, w - 20) + assert results['gt_semantic_seg'].shape[:2] == (h - 20, w - 20) + + +def test_pad(): + # test assertion if both size_divisor and size is None + with pytest.raises(AssertionError): + transform = dict(type='Pad') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Pad', size_divisor=32) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + # original img already divisible by 32 + assert np.equal(results['img'], original_img).all() + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + resize_transform = dict( + type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(resize_transform, PIPELINES) + results = resize_module(results) + results = transform(results) + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + +def test_rotate(): + # test assertion degree should be tuple[float] or float + with pytest.raises(AssertionError): + transform = dict(type='RandomRotate', prob=0.5, degree=-10) + build_from_cfg(transform, PIPELINES) + # test assertion degree should be tuple[float] or float + with pytest.raises(AssertionError): + transform = dict(type='RandomRotate', prob=0.5, degree=(10., 20., 30.)) + build_from_cfg(transform, PIPELINES) + + transform = dict(type='RandomRotate', degree=10., prob=1.) + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RandomRotate(' \ + f'prob={1.}, ' \ + f'degree=({-10.}, {10.}), ' \ + f'pad_val={0}, ' \ + f'seg_pad_val={255}, ' \ + f'center={None}, ' \ + f'auto_bound={False})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, _ = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape[:2] == (h, w) + assert results['gt_semantic_seg'].shape[:2] == (h, w) + + +def test_normalize(): + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + transform = dict(type='Normalize', **img_norm_cfg) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + mean = np.array(img_norm_cfg['mean']) + std = np.array(img_norm_cfg['std']) + converted_img = (original_img[..., ::-1] - mean) / std + assert np.allclose(results['img'], converted_img) + + +def test_rgb2gray(): + # test assertion out_channels should be greater than 0 + with pytest.raises(AssertionError): + transform = dict(type='RGB2Gray', out_channels=-1) + build_from_cfg(transform, PIPELINES) + # test assertion weights should be tuple[float] + with pytest.raises(AssertionError): + transform = dict(type='RGB2Gray', out_channels=1, weights=1.1) + build_from_cfg(transform, PIPELINES) + + # test out_channels is None + transform = dict(type='RGB2Gray') + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RGB2Gray(' \ + f'out_channels={None}, ' \ + f'weights={(0.299, 0.587, 0.114)})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, c = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape == (h, w, c) + assert results['img_shape'] == (h, w, c) + assert results['ori_shape'] == (h, w, c) + + # test out_channels = 2 + transform = dict(type='RGB2Gray', out_channels=2) + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RGB2Gray(' \ + f'out_channels={2}, ' \ + f'weights={(0.299, 0.587, 0.114)})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, c = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape == (h, w, 2) + assert results['img_shape'] == (h, w, 2) + assert results['ori_shape'] == (h, w, c) + + +def test_adjust_gamma(): + # test assertion if gamma <= 0 + with pytest.raises(AssertionError): + transform = dict(type='AdjustGamma', gamma=0) + build_from_cfg(transform, PIPELINES) + + # test assertion if gamma is list + with pytest.raises(AssertionError): + transform = dict(type='AdjustGamma', gamma=[1.2]) + build_from_cfg(transform, PIPELINES) + + # test with gamma = 1.2 + transform = dict(type='AdjustGamma', gamma=1.2) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + inv_gamma = 1.0 / 1.2 + table = np.array([((i / 255.0)**inv_gamma) * 255 + for i in np.arange(0, 256)]).astype('uint8') + converted_img = mmcv.lut_transform( + np.array(original_img, dtype=np.uint8), table) + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'AdjustGamma(gamma={1.2})' + + +def test_rerange(): + # test assertion if min_value or max_value is illegal + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=[0], max_value=[255]) + build_from_cfg(transform, PIPELINES) + + # test assertion if min_value >= max_value + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=1, max_value=1) + build_from_cfg(transform, PIPELINES) + + # test assertion if img_min_value == img_max_value + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=0, max_value=1) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + results['img'] = np.array([[1, 1], [1, 1]]) + transform(results) + + img_rerange_cfg = dict() + transform = dict(type='Rerange', **img_rerange_cfg) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + min_value = np.min(original_img) + max_value = np.max(original_img) + converted_img = (original_img - min_value) / (max_value - min_value) * 255 + + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'Rerange(min_value={0}, max_value={255})' + + +def test_CLAHE(): + # test assertion if clip_limit is None + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', clip_limit=None) + build_from_cfg(transform, PIPELINES) + + # test assertion if tile_grid_size is illegal + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', tile_grid_size=(8.0, 8.0)) + build_from_cfg(transform, PIPELINES) + + # test assertion if tile_grid_size is illegal + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', tile_grid_size=(9, 9, 9)) + build_from_cfg(transform, PIPELINES) + + transform = dict(type='CLAHE', clip_limit=2) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + converted_img = np.empty(original_img.shape) + for i in range(original_img.shape[2]): + converted_img[:, :, i] = mmcv.clahe( + np.array(original_img[:, :, i], dtype=np.uint8), 2, (8, 8)) + + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'CLAHE(clip_limit={2}, tile_grid_size={(8, 8)})' + + +def test_seg_rescale(): + results = dict() + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + h, w = seg.shape + + transform = dict(type='SegRescale', scale_factor=1. / 2) + rescale_module = build_from_cfg(transform, PIPELINES) + rescale_results = rescale_module(results.copy()) + assert rescale_results['gt_semantic_seg'].shape == (h // 2, w // 2) + + transform = dict(type='SegRescale', scale_factor=1) + rescale_module = build_from_cfg(transform, PIPELINES) + rescale_results = rescale_module(results.copy()) + assert rescale_results['gt_semantic_seg'].shape == (h, w) diff --git a/tests/test_data/test_tta.py b/tests/test_data/test_tta.py new file mode 100644 index 0000000000000000000000000000000000000000..cc8c71e57c02d45a3f0587cd9e57caa7b467c5ab --- /dev/null +++ b/tests/test_data/test_tta.py @@ -0,0 +1,150 @@ +import os.path as osp + +import mmcv +import pytest +from mmcv.utils import build_from_cfg + +from mmseg.datasets.builder import PIPELINES + + +def test_multi_scale_flip_aug(): + # test assertion if img_scale=None, img_ratios=1 (not float). + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=1, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + # test assertion if img_scale=None, img_ratios=None. + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=None, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + # test assertion if img_scale=(512, 512), img_ratios=1 (not float). + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=[0.5, 1.0, 2.0], + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + + results = dict() + # (288, 512, 3) + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (512, 512), (1024, 1024)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=[0.5, 1.0, 2.0], + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (256, 256), (512, 512), + (512, 512), (1024, 1024), (1024, 1024)] + assert tta_results['flip'] == [False, True, False, True, False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1.0, + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(512, 512)] + assert tta_results['flip'] == [False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1.0, + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(512, 512), (512, 512)] + assert tta_results['flip'] == [False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=[0.5, 1.0, 2.0], + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 144), (512, 288), (1024, 576)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=[0.5, 1.0, 2.0], + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 144), (256, 144), (512, 288), + (512, 288), (1024, 576), (1024, 576)] + assert tta_results['flip'] == [False, True, False, True, False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=[(256, 256), (512, 512), (1024, 1024)], + img_ratios=None, + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (512, 512), (1024, 1024)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=[(256, 256), (512, 512), (1024, 1024)], + img_ratios=None, + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (256, 256), (512, 512), + (512, 512), (1024, 1024), (1024, 1024)] + assert tta_results['flip'] == [False, True, False, True, False, True] diff --git a/tests/test_eval_hook.py b/tests/test_eval_hook.py new file mode 100644 index 0000000000000000000000000000000000000000..a6a1352ea5419c1876551165edaf833f251e7151 --- /dev/null +++ b/tests/test_eval_hook.py @@ -0,0 +1,193 @@ +import logging +import tempfile +from unittest.mock import MagicMock, patch + +import mmcv.runner +import pytest +import torch +import torch.nn as nn +from mmcv.runner import obj_from_dict +from torch.utils.data import DataLoader, Dataset + +from mmseg.apis import single_gpu_test +from mmseg.core import DistEvalHook, EvalHook + + +class ExampleDataset(Dataset): + + def __getitem__(self, idx): + results = dict(img=torch.tensor([1]), img_metas=dict()) + return results + + def __len__(self): + return 1 + + +class ExampleModel(nn.Module): + + def __init__(self): + super(ExampleModel, self).__init__() + self.test_cfg = None + self.conv = nn.Conv2d(3, 3, 3) + + def forward(self, img, img_metas, test_mode=False, **kwargs): + return img + + def train_step(self, data_batch, optimizer): + loss = self.forward(**data_batch) + return dict(loss=loss) + + +def test_iter_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + EvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test EvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = EvalHook(data_loader) + runner = mmcv.runner.IterBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 1) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) + + +def test_epoch_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + EvalHook(data_loader, by_epoch=True) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test EvalHook with interval + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = EvalHook(data_loader, by_epoch=True, interval=2) + runner = mmcv.runner.EpochBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 2) + test_dataset.evaluate.assert_called_once_with([torch.tensor([1])], + logger=runner.logger) + + +def multi_gpu_test(model, data_loader, tmpdir=None, gpu_collect=False): + results = single_gpu_test(model, data_loader) + return results + + +@patch('mmseg.apis.multi_gpu_test', multi_gpu_test) +def test_dist_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + DistEvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test DistEvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = DistEvalHook(data_loader) + runner = mmcv.runner.IterBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 1) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) + + +@patch('mmseg.apis.multi_gpu_test', multi_gpu_test) +def test_dist_eval_hook_epoch(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + DistEvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test DistEvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = DistEvalHook(data_loader, by_epoch=True, interval=2) + runner = mmcv.runner.EpochBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 2) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) diff --git a/tests/test_inference.py b/tests/test_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..046e036281db50ccc66e75d8e78c6eb63618cac7 --- /dev/null +++ b/tests/test_inference.py @@ -0,0 +1,29 @@ +import os.path as osp + +import mmcv + +from mmseg.apis import inference_segmentor, init_segmentor + + +def test_test_time_augmentation_on_cpu(): + config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py' + config = mmcv.Config.fromfile(config_file) + + # Remove pretrain model download for testing + config.model.pretrained = None + # Replace SyncBN with BN to inference on CPU + norm_cfg = dict(type='BN', requires_grad=True) + config.model.backbone.norm_cfg = norm_cfg + config.model.decode_head.norm_cfg = norm_cfg + config.model.auxiliary_head.norm_cfg = norm_cfg + + # Enable test time augmentation + config.data.test.pipeline[1].flip = True + + checkpoint_file = None + model = init_segmentor(config, checkpoint_file, device='cpu') + + img = mmcv.imread( + osp.join(osp.dirname(__file__), 'data/color.jpg'), 'color') + result = inference_segmentor(model, img) + assert result[0].shape == (288, 512) diff --git a/tests/test_metrics.py b/tests/test_metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..023bbb0a5563f36ae1902fab4edb8e5240f4ae02 --- /dev/null +++ b/tests/test_metrics.py @@ -0,0 +1,166 @@ +import numpy as np + +from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou + + +def get_confusion_matrix(pred_label, label, num_classes, ignore_index): + """Intersection over Union + Args: + pred_label (np.ndarray): 2D predict map + label (np.ndarray): label 2D label map + num_classes (int): number of categories + ignore_index (int): index ignore in evaluation + """ + + mask = (label != ignore_index) + pred_label = pred_label[mask] + label = label[mask] + + n = num_classes + inds = n * label + pred_label + + mat = np.bincount(inds, minlength=n**2).reshape(n, n) + + return mat + + +# This func is deprecated since it's not memory efficient +def legacy_mean_iou(results, gt_seg_maps, num_classes, ignore_index): + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_mat = np.zeros((num_classes, num_classes), dtype=np.float) + for i in range(num_imgs): + mat = get_confusion_matrix( + results[i], gt_seg_maps[i], num_classes, ignore_index=ignore_index) + total_mat += mat + all_acc = np.diag(total_mat).sum() / total_mat.sum() + acc = np.diag(total_mat) / total_mat.sum(axis=1) + iou = np.diag(total_mat) / ( + total_mat.sum(axis=1) + total_mat.sum(axis=0) - np.diag(total_mat)) + + return all_acc, acc, iou + + +# This func is deprecated since it's not memory efficient +def legacy_mean_dice(results, gt_seg_maps, num_classes, ignore_index): + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_mat = np.zeros((num_classes, num_classes), dtype=np.float) + for i in range(num_imgs): + mat = get_confusion_matrix( + results[i], gt_seg_maps[i], num_classes, ignore_index=ignore_index) + total_mat += mat + all_acc = np.diag(total_mat).sum() / total_mat.sum() + acc = np.diag(total_mat) / total_mat.sum(axis=1) + dice = 2 * np.diag(total_mat) / ( + total_mat.sum(axis=1) + total_mat.sum(axis=0)) + + return all_acc, acc, dice + + +def test_metrics(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = eval_metrics( + results, label, num_classes, ignore_index, metrics='mIoU') + all_acc_l, acc_l, iou_l = legacy_mean_iou(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + all_acc, acc, dice = eval_metrics( + results, label, num_classes, ignore_index, metrics='mDice') + all_acc_l, acc_l, dice_l = legacy_mean_dice(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(dice, dice_l) + + all_acc, acc, iou, dice = eval_metrics( + results, label, num_classes, ignore_index, metrics=['mIoU', 'mDice']) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + assert np.allclose(dice, dice_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics='mIoU', + nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 + + all_acc, acc, dice = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics='mDice', + nan_to_num=-1) + assert acc[-1] == -1 + assert dice[-1] == -1 + + all_acc, acc, dice, iou = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics=['mDice', 'mIoU'], + nan_to_num=-1) + assert acc[-1] == -1 + assert dice[-1] == -1 + assert iou[-1] == -1 + + +def test_mean_iou(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = mean_iou(results, label, num_classes, ignore_index) + all_acc_l, acc_l, iou_l = legacy_mean_iou(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = mean_iou( + results, label, num_classes, ignore_index=255, nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 + + +def test_mean_dice(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = mean_dice(results, label, num_classes, ignore_index) + all_acc_l, acc_l, iou_l = legacy_mean_dice(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = mean_dice( + results, label, num_classes, ignore_index=255, nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 diff --git a/tests/test_model.py b/tests/test_model.py new file mode 100644 index 0000000000000000000000000000000000000000..79370ca18265ba6f9779a65797b71b011a4c6074 --- /dev/null +++ b/tests/test_model.py @@ -0,0 +1,9 @@ +import torch + +pthfile = r'/SEG/mmsegmentation/pretrained_model/recipe1MP_R50.pth' + + +net=torch.load(pthfile) + +for k in net.keys(): + print(k) \ No newline at end of file diff --git a/tests/test_models/test_backbone.py b/tests/test_models/test_backbone.py new file mode 100644 index 0000000000000000000000000000000000000000..9ed6ce222f0c4135c2227c55f60efa1f05e62cec --- /dev/null +++ b/tests/test_models/test_backbone.py @@ -0,0 +1,939 @@ +import pytest +import torch +from mmcv.ops import DeformConv2dPack +from mmcv.utils.parrots_wrapper import _BatchNorm +from torch.nn.modules import AvgPool2d, GroupNorm + +from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt, + ResNet, ResNetV1d, ResNeXt) +from mmseg.models.backbones.cgnet import (ContextGuidedBlock, + GlobalContextExtractor) +from mmseg.models.backbones.resnest import Bottleneck as BottleneckS +from mmseg.models.backbones.resnet import BasicBlock, Bottleneck +from mmseg.models.backbones.resnext import Bottleneck as BottleneckX +from mmseg.models.utils import ResLayer + + +def is_block(modules): + """Check if is ResNet building block.""" + if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX)): + return True + return False + + +def is_norm(modules): + """Check if is one of the norms.""" + if isinstance(modules, (GroupNorm, _BatchNorm)): + return True + return False + + +def all_zeros(modules): + """Check if the weight(and bias) is all zero.""" + weight_zero = torch.allclose(modules.weight.data, + torch.zeros_like(modules.weight.data)) + if hasattr(modules, 'bias'): + bias_zero = torch.allclose(modules.bias.data, + torch.zeros_like(modules.bias.data)) + else: + bias_zero = True + + return weight_zero and bias_zero + + +def check_norm_state(modules, train_state): + """Check if norm layer is in correct train state.""" + for mod in modules: + if isinstance(mod, _BatchNorm): + if mod.training != train_state: + return False + return True + + +def test_resnet_basic_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + BasicBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + BasicBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + BasicBlock(64, 64, plugins=plugins) + + # Test BasicBlock with checkpoint forward + block = BasicBlock(16, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 56, 56]) + + # test BasicBlock structure and forward + block = BasicBlock(64, 64) + assert block.conv1.in_channels == 64 + assert block.conv1.out_channels == 64 + assert block.conv1.kernel_size == (3, 3) + assert block.conv2.in_channels == 64 + assert block.conv2.out_channels == 64 + assert block.conv2.kernel_size == (3, 3) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + Bottleneck(64, 64, style='tensorflow') + + with pytest.raises(AssertionError): + # Allowed positions are 'after_conv1', 'after_conv2', 'after_conv3' + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv4') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(AssertionError): + # Need to specify different postfix to avoid duplicate plugin name + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(KeyError): + # Plugin type is not supported + plugins = [dict(cfg=dict(type='WrongPlugin'), position='after_conv3')] + Bottleneck(64, 16, plugins=plugins) + + # Test Bottleneck with checkpoint forward + block = Bottleneck(64, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck style + block = Bottleneck(64, 64, stride=2, style='pytorch') + assert block.conv1.stride == (1, 1) + assert block.conv2.stride == (2, 2) + block = Bottleneck(64, 64, stride=2, style='caffe') + assert block.conv1.stride == (2, 2) + assert block.conv2.stride == (1, 1) + + # Test Bottleneck DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + Bottleneck(64, 64, dcn=dcn, conv_cfg=dict(type='Conv')) + block = Bottleneck(64, 64, dcn=dcn) + assert isinstance(block.conv2, DeformConv2dPack) + + # Test Bottleneck forward + block = Bottleneck(64, 16) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2, 1 NonLocal2d + # after conv2, 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + assert block.nonlocal_block.in_channels == 16 + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv2, 2 ContextBlock after + # conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=3), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block1.in_channels == 16 + assert block.context_block2.in_channels == 64 + assert block.context_block3.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_res_layer(): + # Test ResLayer of 3 Bottleneck w\o downsample + layer = ResLayer(Bottleneck, 64, 16, 3) + assert len(layer) == 3 + assert layer[0].conv1.in_channels == 64 + assert layer[0].conv1.out_channels == 16 + for i in range(1, len(layer)): + assert layer[i].conv1.in_channels == 64 + assert layer[i].conv1.out_channels == 16 + for i in range(len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with downsample + layer = ResLayer(Bottleneck, 64, 64, 3) + assert layer[0].downsample[0].out_channels == 256 + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 56, 56]) + + # Test ResLayer of 3 Bottleneck with stride=2 + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2) + assert layer[0].downsample[0].out_channels == 256 + assert layer[0].downsample[0].stride == (2, 2) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 Bottleneck with stride=2 and average downsample + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2, avg_down=True) + assert isinstance(layer[0].downsample[0], AvgPool2d) + assert layer[0].downsample[1].out_channels == 256 + assert layer[0].downsample[1].stride == (1, 1) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 Bottleneck with dilation=2 + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2) + for i in range(len(layer)): + assert layer[i].conv2.dilation == (2, 2) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with dilation=2, contract_dilation=True + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2, contract_dilation=True) + assert layer[0].conv2.dilation == (1, 1) + for i in range(1, len(layer)): + assert layer[i].conv2.dilation == (2, 2) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with dilation=2, multi_grid + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2, multi_grid=(1, 2, 4)) + assert layer[0].conv2.dilation == (1, 1) + assert layer[1].conv2.dilation == (2, 2) + assert layer[2].conv2.dilation == (4, 4) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_backbone(): + """Test resnet backbone.""" + with pytest.raises(KeyError): + # ResNet depth should be in [18, 34, 50, 101, 152] + ResNet(20) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=0) + + with pytest.raises(AssertionError): + # len(stage_with_dcn) == num_stages + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + ResNet(50, dcn=dcn, stage_with_dcn=(True, )) + + with pytest.raises(AssertionError): + # len(stage_with_plugin) == num_stages + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True), + position='after_conv3') + ] + ResNet(50, plugins=plugins) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=5) + + with pytest.raises(AssertionError): + # len(strides) == len(dilations) == num_stages + ResNet(50, strides=(1, ), dilations=(1, 1), num_stages=3) + + with pytest.raises(TypeError): + # pretrained must be a string path + model = ResNet(50) + model.init_weights(pretrained=0) + + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + ResNet(50, style='tensorflow') + + # Test ResNet50 norm_eval=True + model = ResNet(50, norm_eval=True) + model.init_weights() + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with torchvision pretrained weight + model = ResNet(depth=50, norm_eval=True) + model.init_weights('torchvision://resnet50') + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with first stage frozen + frozen_stages = 1 + model = ResNet(50, frozen_stages=frozen_stages) + model.init_weights() + model.train() + assert model.norm1.training is False + for layer in [model.conv1, model.norm1]: + for param in layer.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, 'layer{}'.format(i)) + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet50V1d with first stage frozen + model = ResNetV1d(depth=50, frozen_stages=frozen_stages) + assert len(model.stem) == 9 + model.init_weights() + model.train() + check_norm_state(model.stem, False) + for param in model.stem.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, 'layer{}'.format(i)) + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet18 forward + model = ResNet(18) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 64, 56, 56]) + assert feat[1].shape == torch.Size([1, 128, 28, 28]) + assert feat[2].shape == torch.Size([1, 256, 14, 14]) + assert feat[3].shape == torch.Size([1, 512, 7, 7]) + + # Test ResNet50 with BatchNorm forward + model = ResNet(50) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, _BatchNorm) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with layers 1, 2, 3 out forward + model = ResNet(50, out_indices=(0, 1, 2)) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + + # Test ResNet18 with checkpoint forward + model = ResNet(18, with_cp=True) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 64, 56, 56]) + assert feat[1].shape == torch.Size([1, 128, 28, 28]) + assert feat[2].shape == torch.Size([1, 256, 14, 14]) + assert feat[3].shape == torch.Size([1, 512, 7, 7]) + + # Test ResNet50 with checkpoint forward + model = ResNet(50, with_cp=True) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with GroupNorm forward + model = ResNet( + 50, norm_cfg=dict(type='GN', num_groups=32, requires_grad=True)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, GroupNorm) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with 1 GeneralizedAttention after conv2, 1 NonLocal2d + # after conv2, 1 ContextBlock after conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, True, True, True), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, False), + position='after_conv3') + ] + model = ResNet(50, plugins=plugins) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'gen_attention_block') + assert m.nonlocal_block.in_channels == 64 + for m in model.layer2.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 128 + assert m.gen_attention_block.in_channels == 128 + assert m.context_block.in_channels == 512 + + for m in model.layer3.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 256 + assert m.gen_attention_block.in_channels == 256 + assert m.context_block.in_channels == 1024 + + for m in model.layer4.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 512 + assert m.gen_attention_block.in_channels == 512 + assert not hasattr(m, 'context_block') + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with 1 ContextBlock after conv2, 1 ContextBlock after + # conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + stages=(False, True, True, False), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + stages=(False, True, True, False), + position='after_conv3') + ] + + model = ResNet(50, plugins=plugins) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + for m in model.layer2.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 512 + assert m.context_block2.in_channels == 512 + + for m in model.layer3.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 1024 + assert m.context_block2.in_channels == 1024 + + for m in model.layer4.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 zero initialization of residual + model = ResNet(50, zero_init_residual=True) + model.init_weights() + for m in model.modules(): + if isinstance(m, Bottleneck): + assert all_zeros(m.norm3) + elif isinstance(m, BasicBlock): + assert all_zeros(m.norm2) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNetV1d forward + model = ResNetV1d(depth=50) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + +def test_renext_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckX(64, 64, groups=32, base_width=4, style='tensorflow') + + # Test ResNeXt Bottleneck structure + block = BottleneckX( + 64, 64, groups=32, base_width=4, stride=2, style='pytorch') + assert block.conv2.stride == (2, 2) + assert block.conv2.groups == 32 + assert block.conv2.out_channels == 128 + + # Test ResNeXt Bottleneck with DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + # conv_cfg must be None if dcn is not None + BottleneckX( + 64, + 64, + groups=32, + base_width=4, + dcn=dcn, + conv_cfg=dict(type='Conv')) + BottleneckX(64, 64, dcn=dcn) + + # Test ResNeXt Bottleneck forward + block = BottleneckX(64, 16, groups=32, base_width=4) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnext_backbone(): + with pytest.raises(KeyError): + # ResNeXt depth should be in [50, 101, 152] + ResNeXt(depth=18) + + # Test ResNeXt with group 32, base_width 4 + model = ResNeXt(depth=50, groups=32, base_width=4) + print(model) + for m in model.modules(): + if is_block(m): + assert m.conv2.groups == 32 + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + +def test_fastscnn_backbone(): + with pytest.raises(AssertionError): + # Fast-SCNN channel constraints. + FastSCNN( + 3, (32, 48), + 64, (64, 96, 128), (2, 2, 1), + global_out_channels=127, + higher_in_channels=64, + lower_in_channels=128) + + # Test FastSCNN Standard Forward + model = FastSCNN() + model.init_weights() + model.train() + batch_size = 4 + imgs = torch.randn(batch_size, 3, 512, 1024) + feat = model(imgs) + + assert len(feat) == 3 + # higher-res + assert feat[0].shape == torch.Size([batch_size, 64, 64, 128]) + # lower-res + assert feat[1].shape == torch.Size([batch_size, 128, 16, 32]) + # FFM output + assert feat[2].shape == torch.Size([batch_size, 128, 64, 128]) + + +def test_resnest_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckS(64, 64, radix=2, reduction_factor=4, style='tensorflow') + + # Test ResNeSt Bottleneck structure + block = BottleneckS( + 64, 256, radix=2, reduction_factor=4, stride=2, style='pytorch') + assert block.avd_layer.stride == 2 + assert block.conv2.channels == 256 + + # Test ResNeSt Bottleneck forward + block = BottleneckS(64, 16, radix=2, reduction_factor=4) + x = torch.randn(2, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([2, 64, 56, 56]) + + +def test_resnest_backbone(): + with pytest.raises(KeyError): + # ResNeSt depth should be in [50, 101, 152, 200] + ResNeSt(depth=18) + + # Test ResNeSt with radix 2, reduction_factor 4 + model = ResNeSt( + depth=50, radix=2, reduction_factor=4, out_indices=(0, 1, 2, 3)) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([2, 256, 56, 56]) + assert feat[1].shape == torch.Size([2, 512, 28, 28]) + assert feat[2].shape == torch.Size([2, 1024, 14, 14]) + assert feat[3].shape == torch.Size([2, 2048, 7, 7]) + + +def test_cgnet_GlobalContextExtractor(): + block = GlobalContextExtractor(16, 16, with_cp=True) + x = torch.randn(2, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([2, 16, 64, 64]) + + +def test_cgnet_context_guided_block(): + with pytest.raises(AssertionError): + # cgnet ContextGuidedBlock GlobalContextExtractor channel and reduction + # constraints. + ContextGuidedBlock(8, 8) + + # test cgnet ContextGuidedBlock with checkpoint forward + block = ContextGuidedBlock( + 16, 16, act_cfg=dict(type='PReLU'), with_cp=True) + assert block.with_cp + x = torch.randn(2, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([2, 16, 64, 64]) + + # test cgnet ContextGuidedBlock without checkpoint forward + block = ContextGuidedBlock(32, 32) + assert not block.with_cp + x = torch.randn(3, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([3, 32, 32, 32]) + + # test cgnet ContextGuidedBlock with down sampling + block = ContextGuidedBlock(32, 32, downsample=True) + assert block.conv1x1.conv.in_channels == 32 + assert block.conv1x1.conv.out_channels == 32 + assert block.conv1x1.conv.kernel_size == (3, 3) + assert block.conv1x1.conv.stride == (2, 2) + assert block.conv1x1.conv.padding == (1, 1) + + assert block.f_loc.in_channels == 32 + assert block.f_loc.out_channels == 32 + assert block.f_loc.kernel_size == (3, 3) + assert block.f_loc.stride == (1, 1) + assert block.f_loc.padding == (1, 1) + assert block.f_loc.groups == 32 + assert block.f_loc.dilation == (1, 1) + assert block.f_loc.bias is None + + assert block.f_sur.in_channels == 32 + assert block.f_sur.out_channels == 32 + assert block.f_sur.kernel_size == (3, 3) + assert block.f_sur.stride == (1, 1) + assert block.f_sur.padding == (2, 2) + assert block.f_sur.groups == 32 + assert block.f_sur.dilation == (2, 2) + assert block.f_sur.bias is None + + assert block.bottleneck.in_channels == 64 + assert block.bottleneck.out_channels == 32 + assert block.bottleneck.kernel_size == (1, 1) + assert block.bottleneck.stride == (1, 1) + assert block.bottleneck.bias is None + + x = torch.randn(1, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 16, 16]) + + # test cgnet ContextGuidedBlock without down sampling + block = ContextGuidedBlock(32, 32, downsample=False) + assert block.conv1x1.conv.in_channels == 32 + assert block.conv1x1.conv.out_channels == 16 + assert block.conv1x1.conv.kernel_size == (1, 1) + assert block.conv1x1.conv.stride == (1, 1) + assert block.conv1x1.conv.padding == (0, 0) + + assert block.f_loc.in_channels == 16 + assert block.f_loc.out_channels == 16 + assert block.f_loc.kernel_size == (3, 3) + assert block.f_loc.stride == (1, 1) + assert block.f_loc.padding == (1, 1) + assert block.f_loc.groups == 16 + assert block.f_loc.dilation == (1, 1) + assert block.f_loc.bias is None + + assert block.f_sur.in_channels == 16 + assert block.f_sur.out_channels == 16 + assert block.f_sur.kernel_size == (3, 3) + assert block.f_sur.stride == (1, 1) + assert block.f_sur.padding == (2, 2) + assert block.f_sur.groups == 16 + assert block.f_sur.dilation == (2, 2) + assert block.f_sur.bias is None + + x = torch.randn(1, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 32, 32]) + + +def test_cgnet_backbone(): + with pytest.raises(AssertionError): + # check invalid num_channels + CGNet(num_channels=(32, 64, 128, 256)) + + with pytest.raises(AssertionError): + # check invalid num_blocks + CGNet(num_blocks=(3, 21, 3)) + + with pytest.raises(AssertionError): + # check invalid dilation + CGNet(num_blocks=2) + + with pytest.raises(AssertionError): + # check invalid reduction + CGNet(reductions=16) + + with pytest.raises(AssertionError): + # check invalid num_channels and reduction + CGNet(num_channels=(32, 64, 128), reductions=(64, 129)) + + # Test CGNet with default settings + model = CGNet() + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([2, 35, 112, 112]) + assert feat[1].shape == torch.Size([2, 131, 56, 56]) + assert feat[2].shape == torch.Size([2, 256, 28, 28]) + + # Test CGNet with norm_eval True and with_cp True + model = CGNet(norm_eval=True, with_cp=True) + with pytest.raises(TypeError): + # check invalid pretrained + model.init_weights(pretrained=8) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([2, 35, 112, 112]) + assert feat[1].shape == torch.Size([2, 131, 56, 56]) + assert feat[2].shape == torch.Size([2, 256, 28, 28]) + + +def test_mobilenet_v3(): + with pytest.raises(AssertionError): + # check invalid arch + MobileNetV3('big') + + with pytest.raises(AssertionError): + # check invalid reduction_factor + MobileNetV3(reduction_factor=0) + + with pytest.raises(ValueError): + # check invalid out_indices + MobileNetV3(out_indices=(0, 1, 15)) + + with pytest.raises(ValueError): + # check invalid frozen_stages + MobileNetV3(frozen_stages=15) + + with pytest.raises(TypeError): + # check invalid pretrained + model = MobileNetV3() + model.init_weights(pretrained=8) + + # Test MobileNetV3 with default settings + model = MobileNetV3() + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 16, 56, 56) + assert feat[2].shape == (2, 576, 28, 28) + + # Test MobileNetV3 with arch = 'large' + model = MobileNetV3(arch='large', out_indices=(1, 3, 16)) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 24, 56, 56) + assert feat[2].shape == (2, 960, 28, 28) + + # Test MobileNetV3 with norm_eval True, with_cp True and frozen_stages=5 + model = MobileNetV3(norm_eval=True, with_cp=True, frozen_stages=5) + with pytest.raises(TypeError): + # check invalid pretrained + model.init_weights(pretrained=8) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 16, 56, 56) + assert feat[2].shape == (2, 576, 28, 28) diff --git a/tests/test_models/test_forward.py b/tests/test_models/test_forward.py new file mode 100644 index 0000000000000000000000000000000000000000..ee8036246bd7df90d15158266cb5bdbfa3a5730f --- /dev/null +++ b/tests/test_models/test_forward.py @@ -0,0 +1,250 @@ +"""pytest tests/test_forward.py.""" +import copy +from os.path import dirname, exists, join +from unittest.mock import patch + +import numpy as np +import pytest +import torch +import torch.nn as nn +from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm + + +def _demo_mm_inputs(input_shape=(2, 3, 8, 16), num_classes=10): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + 'flip_direction': 'horizontal' + } for _ in range(N)] + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +def _get_config_directory(): + """Find the predefined segmentor config directory.""" + try: + # Assume we are running in the source mmsegmentation repo + repo_dpath = dirname(dirname(dirname(__file__))) + except NameError: + # For IPython development when this __file__ is not defined + import mmseg + repo_dpath = dirname(dirname(dirname(mmseg.__file__))) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_segmentor_cfg(fname): + """Grab configs necessary to create a segmentor. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +def test_pspnet_forward(): + _test_encoder_decoder_forward( + 'pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_fcn_forward(): + _test_encoder_decoder_forward('fcn/fcn_r50-d8_512x1024_40k_cityscapes.py') + + +def test_deeplabv3_forward(): + _test_encoder_decoder_forward( + 'deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py') + + +def test_deeplabv3plus_forward(): + _test_encoder_decoder_forward( + 'deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py') + + +def test_gcnet_forward(): + _test_encoder_decoder_forward( + 'gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_ann_forward(): + _test_encoder_decoder_forward('ann/ann_r50-d8_512x1024_40k_cityscapes.py') + + +def test_ccnet_forward(): + if not torch.cuda.is_available(): + pytest.skip('CCNet requires CUDA') + _test_encoder_decoder_forward( + 'ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_danet_forward(): + _test_encoder_decoder_forward( + 'danet/danet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_nonlocal_net_forward(): + _test_encoder_decoder_forward( + 'nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py') + + +def test_upernet_forward(): + _test_encoder_decoder_forward( + 'upernet/upernet_r50_512x1024_40k_cityscapes.py') + + +def test_hrnet_forward(): + _test_encoder_decoder_forward('hrnet/fcn_hr18s_512x1024_40k_cityscapes.py') + + +def test_ocrnet_forward(): + _test_encoder_decoder_forward( + 'ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py') + + +def test_psanet_forward(): + _test_encoder_decoder_forward( + 'psanet/psanet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_encnet_forward(): + _test_encoder_decoder_forward( + 'encnet/encnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_sem_fpn_forward(): + _test_encoder_decoder_forward('sem_fpn/fpn_r50_512x1024_80k_cityscapes.py') + + +def test_point_rend_forward(): + _test_encoder_decoder_forward( + 'point_rend/pointrend_r50_512x1024_80k_cityscapes.py') + + +def test_mobilenet_v2_forward(): + _test_encoder_decoder_forward( + 'mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py') + + +def test_dnlnet_forward(): + _test_encoder_decoder_forward( + 'dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py') + + +def test_emanet_forward(): + _test_encoder_decoder_forward( + 'emanet/emanet_r50-d8_512x1024_80k_cityscapes.py') + + +def get_world_size(process_group): + + return 1 + + +def _check_input_dim(self, inputs): + pass + + +def _convert_batchnorm(module): + module_output = module + if isinstance(module, SyncBatchNorm): + # to be consistent with SyncBN, we hack dim check function in BN + module_output = _BatchNorm(module.num_features, module.eps, + module.momentum, module.affine, + module.track_running_stats) + if module.affine: + module_output.weight.data = module.weight.data.clone().detach() + module_output.bias.data = module.bias.data.clone().detach() + # keep requires_grad unchanged + module_output.weight.requires_grad = module.weight.requires_grad + module_output.bias.requires_grad = module.bias.requires_grad + module_output.running_mean = module.running_mean + module_output.running_var = module.running_var + module_output.num_batches_tracked = module.num_batches_tracked + for name, child in module.named_children(): + module_output.add_module(name, _convert_batchnorm(child)) + del module + return module_output + + +@patch('torch.nn.modules.batchnorm._BatchNorm._check_input_dim', + _check_input_dim) +@patch('torch.distributed.get_world_size', get_world_size) +def _test_encoder_decoder_forward(cfg_file): + model = _get_segmentor_cfg(cfg_file) + model['pretrained'] = None + model['test_cfg']['mode'] = 'whole' + + from mmseg.models import build_segmentor + segmentor = build_segmentor(model) + + if isinstance(segmentor.decode_head, nn.ModuleList): + num_classes = segmentor.decode_head[-1].num_classes + else: + num_classes = segmentor.decode_head.num_classes + # batch_size=2 for BatchNorm + input_shape = (2, 3, 32, 32) + mm_inputs = _demo_mm_inputs(input_shape, num_classes=num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_semantic_seg = mm_inputs['gt_semantic_seg'] + + # convert to cuda Tensor if applicable + if torch.cuda.is_available(): + segmentor = segmentor.cuda() + imgs = imgs.cuda() + gt_semantic_seg = gt_semantic_seg.cuda() + else: + segmentor = _convert_batchnorm(segmentor) + + # Test forward train + losses = segmentor.forward( + imgs, img_metas, gt_semantic_seg=gt_semantic_seg, return_loss=True) + assert isinstance(losses, dict) + + # Test forward test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + segmentor.forward(img_list, img_meta_list, return_loss=False) diff --git a/tests/test_models/test_heads.py b/tests/test_models/test_heads.py new file mode 100644 index 0000000000000000000000000000000000000000..e8a8493c160f11c2f51ab6dbca365b5312a6e46d --- /dev/null +++ b/tests/test_models/test_heads.py @@ -0,0 +1,834 @@ +from unittest.mock import patch + +import pytest +import torch +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.utils import ConfigDict +from mmcv.utils.parrots_wrapper import SyncBatchNorm + +from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead, + DAHead, DepthwiseSeparableASPPHead, + DepthwiseSeparableFCNHead, DMHead, + DNLHead, EMAHead, EncHead, FCNHead, + GCHead, LRASPPHead, NLHead, OCRHead, + PointHead, PSAHead, PSPHead, UPerHead) +from mmseg.models.decode_heads.decode_head import BaseDecodeHead + + +def _conv_has_norm(module, sync_bn): + for m in module.modules(): + if isinstance(m, ConvModule): + if not m.with_norm: + return False + if sync_bn: + if not isinstance(m.bn, SyncBatchNorm): + return False + return True + + +def to_cuda(module, data): + module = module.cuda() + if isinstance(data, list): + for i in range(len(data)): + data[i] = data[i].cuda() + return module, data + + +@patch.multiple(BaseDecodeHead, __abstractmethods__=set()) +def test_decode_head(): + + with pytest.raises(AssertionError): + # default input_transform doesn't accept multiple inputs + BaseDecodeHead([32, 16], 16, num_classes=19) + + with pytest.raises(AssertionError): + # default input_transform doesn't accept multiple inputs + BaseDecodeHead(32, 16, num_classes=19, in_index=[-1, -2]) + + with pytest.raises(AssertionError): + # supported mode is resize_concat only + BaseDecodeHead(32, 16, num_classes=19, input_transform='concat') + + with pytest.raises(AssertionError): + # in_channels should be list|tuple + BaseDecodeHead(32, 16, num_classes=19, input_transform='resize_concat') + + with pytest.raises(AssertionError): + # in_index should be list|tuple + BaseDecodeHead([32], + 16, + in_index=-1, + num_classes=19, + input_transform='resize_concat') + + with pytest.raises(AssertionError): + # len(in_index) should equal len(in_channels) + BaseDecodeHead([32, 16], + 16, + num_classes=19, + in_index=[-1], + input_transform='resize_concat') + + # test default dropout + head = BaseDecodeHead(32, 16, num_classes=19) + assert hasattr(head, 'dropout') and head.dropout.p == 0.1 + + # test set dropout + 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 + inputs = [torch.randn(1, 32, 45, 45)] + head = BaseDecodeHead(32, 16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.in_channels == 32 + assert head.input_transform is None + transformed_inputs = head._transform_inputs(inputs) + assert transformed_inputs.shape == (1, 32, 45, 45) + + # test input_transform = resize_concat + inputs = [torch.randn(1, 32, 45, 45), torch.randn(1, 16, 21, 21)] + head = BaseDecodeHead([32, 16], + 16, + num_classes=19, + in_index=[0, 1], + input_transform='resize_concat') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.in_channels == 48 + assert head.input_transform == 'resize_concat' + transformed_inputs = head._transform_inputs(inputs) + assert transformed_inputs.shape == (1, 48, 45, 45) + + +def test_fcn_head(): + + with pytest.raises(AssertionError): + # num_convs must be not less than 0 + FCNHead(num_classes=19, num_convs=-1) + + # test no norm_cfg + head = FCNHead(in_channels=32, channels=16, num_classes=19) + for m in head.modules(): + if isinstance(m, ConvModule): + assert not m.with_norm + + # test with norm_cfg + head = FCNHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + for m in head.modules(): + if isinstance(m, ConvModule): + assert m.with_norm and isinstance(m.bn, SyncBatchNorm) + + # test concat_input=False + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, channels=16, num_classes=19, concat_input=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 2 + assert not head.concat_input and not hasattr(head, 'conv_cat') + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test concat_input=True + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, channels=16, num_classes=19, concat_input=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 2 + assert head.concat_input + assert head.conv_cat.in_channels == 48 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test kernel_size=3 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + for i in range(len(head.convs)): + assert head.convs[i].kernel_size == (3, 3) + assert head.convs[i].padding == 1 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test kernel_size=1 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19, kernel_size=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + for i in range(len(head.convs)): + assert head.convs[i].kernel_size == (1, 1) + assert head.convs[i].padding == 0 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test num_conv + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19, num_convs=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 1 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test num_conv = 0 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, + channels=32, + num_classes=19, + num_convs=0, + concat_input=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert isinstance(head.convs, torch.nn.Identity) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_psp_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + PSPHead(in_channels=32, channels=16, num_classes=19, pool_scales=1) + + # test no norm_cfg + head = PSPHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = PSPHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45)] + head = PSPHead( + in_channels=32, channels=16, num_classes=19, pool_scales=(1, 2, 3)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.psp_modules[0][0].output_size == 1 + assert head.psp_modules[1][0].output_size == 2 + assert head.psp_modules[2][0].output_size == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_apc_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + APCHead(in_channels=32, channels=16, num_classes=19, pool_scales=1) + + # test no norm_cfg + head = APCHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # fusion=True + inputs = [torch.randn(1, 32, 45, 45)] + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + pool_scales=(1, 2, 3), + fusion=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is True + assert head.acm_modules[0].pool_scale == 1 + assert head.acm_modules[1].pool_scale == 2 + assert head.acm_modules[2].pool_scale == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # fusion=False + inputs = [torch.randn(1, 32, 45, 45)] + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + pool_scales=(1, 2, 3), + fusion=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is False + assert head.acm_modules[0].pool_scale == 1 + assert head.acm_modules[1].pool_scale == 2 + assert head.acm_modules[2].pool_scale == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_dm_head(): + + with pytest.raises(AssertionError): + # filter_sizes must be list|tuple + DMHead(in_channels=32, channels=16, num_classes=19, filter_sizes=1) + + # test no norm_cfg + head = DMHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # fusion=True + inputs = [torch.randn(1, 32, 45, 45)] + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + filter_sizes=(1, 3, 5), + fusion=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is True + assert head.dcm_modules[0].filter_size == 1 + assert head.dcm_modules[1].filter_size == 3 + assert head.dcm_modules[2].filter_size == 5 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # fusion=False + inputs = [torch.randn(1, 32, 45, 45)] + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + filter_sizes=(1, 3, 5), + fusion=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is False + assert head.dcm_modules[0].filter_size == 1 + assert head.dcm_modules[1].filter_size == 3 + assert head.dcm_modules[2].filter_size == 5 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_aspp_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + ASPPHead(in_channels=32, channels=16, num_classes=19, dilations=1) + + # test no norm_cfg + head = ASPPHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = ASPPHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45)] + head = ASPPHead( + in_channels=32, channels=16, num_classes=19, dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].conv.dilation == (12, 12) + assert head.aspp_modules[2].conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_psa_head(): + + with pytest.raises(AssertionError): + # psa_type must be in 'bi-direction', 'collect', 'distribute' + PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='gather') + + # test no norm_cfg + head = PSAHead( + in_channels=32, channels=16, num_classes=19, mask_size=(39, 39)) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # test 'bi-direction' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, channels=16, num_classes=19, mask_size=(39, 39)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'bi-direction' psa_type, shrink_factor=1 + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + shrink_factor=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'bi-direction' psa_type with soft_max + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_softmax=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='collect') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type, shrink_factor=1 + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + shrink_factor=1, + psa_type='collect') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type, shrink_factor=1, compact=True + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='collect', + shrink_factor=1, + compact=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'distribute' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='distribute') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + +def test_gc_head(): + head = GCHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'gc_block') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_nl_head(): + head = NLHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'nl_block') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_cc_head(): + head = CCHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'cca') + if not torch.cuda.is_available(): + pytest.skip('CCHead requires CUDA') + inputs = [torch.randn(1, 32, 45, 45)] + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_uper_head(): + + with pytest.raises(AssertionError): + # fpn_in_channels must be list|tuple + UPerHead(in_channels=32, channels=16, num_classes=19) + + # test no norm_cfg + head = UPerHead( + in_channels=[32, 16], channels=16, num_classes=19, in_index=[-2, -1]) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = UPerHead( + in_channels=[32, 16], + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN'), + in_index=[-2, -1]) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45), torch.randn(1, 16, 21, 21)] + head = UPerHead( + in_channels=[32, 16], channels=16, num_classes=19, in_index=[-2, -1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_ann_head(): + + inputs = [torch.randn(1, 16, 45, 45), torch.randn(1, 32, 21, 21)] + head = ANNHead( + in_channels=[16, 32], + channels=16, + num_classes=19, + in_index=[-2, -1], + project_channels=8) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 21, 21) + + +def test_da_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + head = DAHead(in_channels=32, channels=16, num_classes=19, pam_channels=8) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 3 + for output in outputs: + assert output.shape == (1, head.num_classes, 45, 45) + test_output = head.forward_test(inputs, None, None) + assert test_output.shape == (1, head.num_classes, 45, 45) + + +def test_ocr_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + ocr_head = OCRHead( + in_channels=32, channels=16, num_classes=19, ocr_channels=8) + fcn_head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(ocr_head, inputs) + head, inputs = to_cuda(fcn_head, inputs) + prev_output = fcn_head(inputs) + output = ocr_head(inputs, prev_output) + assert output.shape == (1, ocr_head.num_classes, 45, 45) + + +def test_enc_head(): + # with se_loss, w.o. lateral + inputs = [torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[32], channels=16, num_classes=19, in_index=[-1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 2 + assert outputs[0].shape == (1, head.num_classes, 21, 21) + assert outputs[1].shape == (1, head.num_classes) + + # w.o se_loss, w.o. lateral + inputs = [torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[32], + channels=16, + use_se_loss=False, + num_classes=19, + in_index=[-1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 21, 21) + + # with se_loss, with lateral + inputs = [torch.randn(1, 16, 45, 45), torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[16, 32], + channels=16, + add_lateral=True, + num_classes=19, + in_index=[-2, -1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 2 + assert outputs[0].shape == (1, head.num_classes, 21, 21) + assert outputs[1].shape == (1, head.num_classes) + test_output = head.forward_test(inputs, None, None) + assert test_output.shape == (1, head.num_classes, 21, 21) + + +def test_dw_aspp_head(): + + # test w.o. c1 + inputs = [torch.randn(1, 32, 45, 45)] + head = DepthwiseSeparableASPPHead( + c1_in_channels=0, + c1_channels=0, + in_channels=32, + channels=16, + num_classes=19, + dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.c1_bottleneck is None + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].depthwise_conv.dilation == (12, 12) + assert head.aspp_modules[2].depthwise_conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test with c1 + inputs = [torch.randn(1, 8, 45, 45), torch.randn(1, 32, 21, 21)] + head = DepthwiseSeparableASPPHead( + c1_in_channels=8, + c1_channels=4, + in_channels=32, + channels=16, + num_classes=19, + dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.c1_bottleneck.in_channels == 8 + assert head.c1_bottleneck.out_channels == 4 + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].depthwise_conv.dilation == (12, 12) + assert head.aspp_modules[2].depthwise_conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_sep_fcn_head(): + # test sep_fcn_head with concat_input=False + head = DepthwiseSeparableFCNHead( + in_channels=128, + channels=128, + concat_input=False, + num_classes=19, + in_index=-1, + norm_cfg=dict(type='BN', requires_grad=True, momentum=0.01)) + x = [torch.rand(2, 128, 32, 32)] + output = head(x) + assert output.shape == (2, head.num_classes, 32, 32) + assert not head.concat_input + assert isinstance(head.convs[0], DepthwiseSeparableConvModule) + assert isinstance(head.convs[1], DepthwiseSeparableConvModule) + assert head.conv_seg.kernel_size == (1, 1) + + head = DepthwiseSeparableFCNHead( + in_channels=64, + channels=64, + concat_input=True, + num_classes=19, + in_index=-1, + norm_cfg=dict(type='BN', requires_grad=True, momentum=0.01)) + x = [torch.rand(3, 64, 32, 32)] + output = head(x) + assert output.shape == (3, head.num_classes, 32, 32) + assert head.concat_input + assert isinstance(head.convs[0], DepthwiseSeparableConvModule) + assert isinstance(head.convs[1], DepthwiseSeparableConvModule) + + +def test_dnl_head(): + # DNL with 'embedded_gaussian' mode + head = DNLHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'dnl_block') + assert head.dnl_block.temperature == 0.05 + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'dot_product' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='dot_product') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'gaussian' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='gaussian') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'concatenation' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='concatenation') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_emanet_head(): + head = EMAHead( + in_channels=32, + ema_channels=24, + channels=16, + num_stages=3, + num_bases=16, + num_classes=19) + for param in head.ema_mid_conv.parameters(): + assert not param.requires_grad + assert hasattr(head, 'ema_module') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_point_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + point_head = PointHead( + in_channels=[32], in_index=[0], channels=16, num_classes=19) + assert len(point_head.fcs) == 3 + fcn_head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(point_head, inputs) + head, inputs = to_cuda(fcn_head, inputs) + prev_output = fcn_head(inputs) + test_cfg = ConfigDict( + subdivision_steps=2, subdivision_num_points=8196, scale_factor=2) + output = point_head.forward_test(inputs, prev_output, None, test_cfg) + assert output.shape == (1, point_head.num_classes, 180, 180) + + +def test_lraspp_head(): + with pytest.raises(ValueError): + # check invalid input_transform + LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='resize_concat', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + + with pytest.raises(AssertionError): + # check invalid branch_channels + LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + branch_channels=64, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + + # test with default settings + lraspp_head = LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + inputs = [ + torch.randn(2, 16, 45, 45), + torch.randn(2, 16, 28, 28), + torch.randn(2, 576, 14, 14) + ] + with pytest.raises(RuntimeError): + # check invalid inputs + output = lraspp_head(inputs) + + inputs = [ + torch.randn(2, 16, 111, 111), + torch.randn(2, 16, 77, 77), + torch.randn(2, 576, 55, 55) + ] + output = lraspp_head(inputs) + assert output.shape == (2, 19, 111, 111) diff --git a/tests/test_models/test_losses.py b/tests/test_models/test_losses.py new file mode 100644 index 0000000000000000000000000000000000000000..005d9391145dbc18766fb81633fb3eda16b825b0 --- /dev/null +++ b/tests/test_models/test_losses.py @@ -0,0 +1,204 @@ +import numpy as np +import pytest +import torch + +from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss + + +def test_utils(): + loss = torch.rand(1, 3, 4, 4) + weight = torch.zeros(1, 3, 4, 4) + weight[:, :, :2, :2] = 1 + + # test reduce_loss() + reduced = reduce_loss(loss, 'none') + assert reduced is loss + + reduced = reduce_loss(loss, 'mean') + np.testing.assert_almost_equal(reduced.numpy(), loss.mean()) + + reduced = reduce_loss(loss, 'sum') + np.testing.assert_almost_equal(reduced.numpy(), loss.sum()) + + # test weight_reduce_loss() + reduced = weight_reduce_loss(loss, weight=None, reduction='none') + assert reduced is loss + + reduced = weight_reduce_loss(loss, weight=weight, reduction='mean') + target = (loss * weight).mean() + np.testing.assert_almost_equal(reduced.numpy(), target) + + reduced = weight_reduce_loss(loss, weight=weight, reduction='sum') + np.testing.assert_almost_equal(reduced.numpy(), (loss * weight).sum()) + + with pytest.raises(AssertionError): + weight_wrong = weight[0, 0, ...] + weight_reduce_loss(loss, weight=weight_wrong, reduction='mean') + + with pytest.raises(AssertionError): + weight_wrong = weight[:, 0:2, ...] + weight_reduce_loss(loss, weight=weight_wrong, reduction='mean') + + +def test_ce_loss(): + from mmseg.models import build_loss + + # use_mask and use_sigmoid cannot be true at the same time + with pytest.raises(AssertionError): + loss_cfg = dict( + type='CrossEntropyLoss', + use_mask=True, + use_sigmoid=True, + loss_weight=1.0) + build_loss(loss_cfg) + + # test loss with class weights + loss_cls_cfg = dict( + type='CrossEntropyLoss', + use_sigmoid=False, + class_weight=[0.8, 0.2], + loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100, -100]]) + fake_label = torch.Tensor([1]).long() + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(40.)) + + loss_cls_cfg = dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(200.)) + + loss_cls_cfg = dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(100.)) + + fake_pred = torch.full(size=(2, 21, 8, 8), fill_value=0.5) + fake_label = torch.ones(2, 8, 8).long() + assert torch.allclose( + loss_cls(fake_pred, fake_label), torch.tensor(0.9503), atol=1e-4) + fake_label[:, 0, 0] = 255 + assert torch.allclose( + loss_cls(fake_pred, fake_label, ignore_index=255), + torch.tensor(0.9354), + atol=1e-4) + + # TODO test use_mask + + +def test_accuracy(): + # test for empty pred + pred = torch.empty(0, 4) + label = torch.empty(0) + accuracy = Accuracy(topk=1) + acc = accuracy(pred, label) + assert acc.item() == 0 + + pred = torch.Tensor([[0.2, 0.3, 0.6, 0.5], [0.1, 0.1, 0.2, 0.6], + [0.9, 0.0, 0.0, 0.1], [0.4, 0.7, 0.1, 0.1], + [0.0, 0.0, 0.99, 0]]) + # test for top1 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1) + acc = accuracy(pred, true_label) + assert acc.item() == 100 + + # test for top1 with score thresh=0.8 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1, thresh=0.8) + acc = accuracy(pred, true_label) + assert acc.item() == 40 + + # test for top2 + accuracy = Accuracy(topk=2) + label = torch.Tensor([3, 2, 0, 0, 2]).long() + acc = accuracy(pred, label) + assert acc.item() == 100 + + # test for both top1 and top2 + accuracy = Accuracy(topk=(1, 2)) + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + acc = accuracy(pred, true_label) + for a in acc: + assert a.item() == 100 + + # topk is larger than pred class number + with pytest.raises(AssertionError): + accuracy = Accuracy(topk=5) + accuracy(pred, true_label) + + # wrong topk type + with pytest.raises(AssertionError): + accuracy = Accuracy(topk='wrong type') + accuracy(pred, true_label) + + # label size is larger than required + with pytest.raises(AssertionError): + label = torch.Tensor([2, 3, 0, 1, 2, 0]).long() # size mismatch + accuracy = Accuracy() + accuracy(pred, label) + + # wrong pred dimension + with pytest.raises(AssertionError): + accuracy = Accuracy() + accuracy(pred[:, :, None], true_label) + + +def test_lovasz_loss(): + from mmseg.models import build_loss + + # loss_type should be 'binary' or 'multi_class' + with pytest.raises(AssertionError): + loss_cfg = dict( + type='LovaszLoss', + loss_type='Binary', + reduction='none', + loss_weight=1.0) + build_loss(loss_cfg) + + # reduction should be 'none' when per_image is False. + with pytest.raises(AssertionError): + loss_cfg = dict(type='LovaszLoss', loss_type='multi_class') + build_loss(loss_cfg) + + # test lovasz loss with loss_type = 'multi_class' and per_image = False + loss_cfg = dict(type='LovaszLoss', reduction='none', loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(1, 3, 4, 4) + labels = (torch.rand(1, 4, 4) * 2).long() + lovasz_loss(logits, labels) + + # test lovasz loss with loss_type = 'multi_class' and per_image = True + loss_cfg = dict( + type='LovaszLoss', + per_image=True, + reduction='mean', + class_weight=[1.0, 2.0, 3.0], + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(1, 3, 4, 4) + labels = (torch.rand(1, 4, 4) * 2).long() + lovasz_loss(logits, labels, ignore_index=None) + + # test lovasz loss with loss_type = 'binary' and per_image = False + loss_cfg = dict( + type='LovaszLoss', + loss_type='binary', + reduction='none', + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(2, 4, 4) + labels = (torch.rand(2, 4, 4)).long() + lovasz_loss(logits, labels) + + # test lovasz loss with loss_type = 'binary' and per_image = True + loss_cfg = dict( + type='LovaszLoss', + loss_type='binary', + per_image=True, + reduction='mean', + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(2, 4, 4) + labels = (torch.rand(2, 4, 4)).long() + lovasz_loss(logits, labels, ignore_index=None) diff --git a/tests/test_models/test_necks.py b/tests/test_models/test_necks.py new file mode 100644 index 0000000000000000000000000000000000000000..8fc968450f5e66c804bc7a4ac1cf28a0d635739c --- /dev/null +++ b/tests/test_models/test_necks.py @@ -0,0 +1,18 @@ +import torch + +from mmseg.models import FPN + + +def test_fpn(): + in_channels = [256, 512, 1024, 2048] + inputs = [ + torch.randn(1, c, 56 // 2**i, 56 // 2**i) + for i, c in enumerate(in_channels) + ] + + fpn = FPN(in_channels, 256, len(in_channels)) + outputs = fpn(inputs) + assert outputs[0].shape == torch.Size([1, 256, 56, 56]) + assert outputs[1].shape == torch.Size([1, 256, 28, 28]) + assert outputs[2].shape == torch.Size([1, 256, 14, 14]) + assert outputs[3].shape == torch.Size([1, 256, 7, 7]) diff --git a/tests/test_models/test_segmentor.py b/tests/test_models/test_segmentor.py new file mode 100644 index 0000000000000000000000000000000000000000..90d3bf6314f03e11d9728890adc532732b05d14c --- /dev/null +++ b/tests/test_models/test_segmentor.py @@ -0,0 +1,214 @@ +import numpy as np +import torch +from mmcv import ConfigDict +from torch import nn + +from mmseg.models import BACKBONES, HEADS, build_segmentor +from mmseg.models.decode_heads.cascade_decode_head import BaseCascadeDecodeHead +from mmseg.models.decode_heads.decode_head import BaseDecodeHead + + +def _demo_mm_inputs(input_shape=(1, 3, 8, 16), num_classes=10): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + 'flip_direction': 'horizontal' + } for _ in range(N)] + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +@BACKBONES.register_module() +class ExampleBackbone(nn.Module): + + def __init__(self): + super(ExampleBackbone, self).__init__() + self.conv = nn.Conv2d(3, 3, 3) + + def init_weights(self, pretrained=None): + pass + + def forward(self, x): + return [self.conv(x)] + + +@HEADS.register_module() +class ExampleDecodeHead(BaseDecodeHead): + + def __init__(self): + super(ExampleDecodeHead, self).__init__(3, 3, num_classes=19) + + def forward(self, inputs): + return self.cls_seg(inputs[0]) + + +@HEADS.register_module() +class ExampleCascadeDecodeHead(BaseCascadeDecodeHead): + + def __init__(self): + super(ExampleCascadeDecodeHead, self).__init__(3, 3, num_classes=19) + + def forward(self, inputs, prev_out): + return self.cls_seg(inputs[0]) + + +def _segmentor_forward_train_test(segmentor): + if isinstance(segmentor.decode_head, nn.ModuleList): + num_classes = segmentor.decode_head[-1].num_classes + else: + num_classes = segmentor.decode_head.num_classes + # batch_size=2 for BatchNorm + mm_inputs = _demo_mm_inputs(num_classes=num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_semantic_seg = mm_inputs['gt_semantic_seg'] + + # convert to cuda Tensor if applicable + if torch.cuda.is_available(): + segmentor = segmentor.cuda() + imgs = imgs.cuda() + gt_semantic_seg = gt_semantic_seg.cuda() + + # Test forward train + losses = segmentor.forward( + imgs, img_metas, gt_semantic_seg=gt_semantic_seg, return_loss=True) + assert isinstance(losses, dict) + + # Test forward simple test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + segmentor.forward(img_list, img_meta_list, return_loss=False) + + # Test forward aug test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_list = img_list + img_list + img_meta_list = [[img_meta] for img_meta in img_metas] + img_meta_list = img_meta_list + img_meta_list + segmentor.forward(img_list, img_meta_list, return_loss=False) + + +def test_encoder_decoder(): + + # test 1 decode head, w.o. aux head + + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + train_cfg=None, + test_cfg=dict(mode='whole')) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test slide mode + cfg.test_cfg = ConfigDict(mode='slide', crop_size=(3, 3), stride=(2, 2)) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 1 aux head + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + auxiliary_head=dict(type='ExampleDecodeHead')) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 2 aux head + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + auxiliary_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + +def test_cascade_encoder_decoder(): + + # test 1 decode head, w.o. aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test slide mode + cfg.test_cfg = ConfigDict(mode='slide', crop_size=(3, 3), stride=(2, 2)) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 1 aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ], + auxiliary_head=dict(type='ExampleDecodeHead')) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 2 aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ], + auxiliary_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) diff --git a/tests/test_models/test_unet.py b/tests/test_models/test_unet.py new file mode 100644 index 0000000000000000000000000000000000000000..febe4f0c970c3bc44bd9e8170c706df32122b9b4 --- /dev/null +++ b/tests/test_models/test_unet.py @@ -0,0 +1,833 @@ +import pytest +import torch +from mmcv.cnn import ConvModule +from mmcv.utils.parrots_wrapper import _BatchNorm +from torch import nn + +from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule, + InterpConv, UNet, UpConvBlock) + + +def check_norm_state(modules, train_state): + """Check if norm layer is in correct train state.""" + for mod in modules: + if isinstance(mod, _BatchNorm): + if mod.training != train_state: + return False + return True + + +def test_unet_basic_conv_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + BasicConvBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + BasicConvBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + BasicConvBlock(64, 64, plugins=plugins) + + # test BasicConvBlock with checkpoint forward + block = BasicConvBlock(16, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 64, 64]) + + block = BasicConvBlock(16, 16, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 16, 64, 64) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 64, 64]) + + # test BasicConvBlock with stride convolution to downsample + block = BasicConvBlock(16, 16, stride=2) + x = torch.randn(1, 16, 64, 64) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 32, 32]) + + # test BasicConvBlock structure and forward + block = BasicConvBlock(16, 64, num_convs=3, dilation=3) + assert block.convs[0].conv.in_channels == 16 + assert block.convs[0].conv.out_channels == 64 + assert block.convs[0].conv.kernel_size == (3, 3) + assert block.convs[0].conv.dilation == (1, 1) + assert block.convs[0].conv.padding == (1, 1) + + assert block.convs[1].conv.in_channels == 64 + assert block.convs[1].conv.out_channels == 64 + assert block.convs[1].conv.kernel_size == (3, 3) + assert block.convs[1].conv.dilation == (3, 3) + assert block.convs[1].conv.padding == (3, 3) + + assert block.convs[2].conv.in_channels == 64 + assert block.convs[2].conv.out_channels == 64 + assert block.convs[2].conv.kernel_size == (3, 3) + assert block.convs[2].conv.dilation == (3, 3) + assert block.convs[2].conv.padding == (3, 3) + + +def test_deconv_module(): + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=1, scale_factor=2) + + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=3, scale_factor=2) + + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=5, scale_factor=4) + + # test DeconvModule with checkpoint forward and upsample 2X. + block = DeconvModule(64, 32, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = DeconvModule(64, 32, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test DeconvModule with different kernel size for upsample 2X. + x = torch.randn(1, 64, 64, 64) + block = DeconvModule(64, 32, kernel_size=2, scale_factor=2) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 128, 128]) + + block = DeconvModule(64, 32, kernel_size=6, scale_factor=2) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 128, 128]) + + # test DeconvModule with different kernel size for upsample 4X. + x = torch.randn(1, 64, 64, 64) + block = DeconvModule(64, 32, kernel_size=4, scale_factor=4) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = DeconvModule(64, 32, kernel_size=6, scale_factor=4) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + +def test_interp_conv(): + # test InterpConv with checkpoint forward and upsample 2X. + block = InterpConv(64, 32, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = InterpConv(64, 32, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with conv_first=False for upsample 2X. + block = InterpConv(64, 32, conv_first=False) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with conv_first=True for upsample 2X. + block = InterpConv(64, 32, conv_first=True) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], ConvModule) + assert isinstance(block.interp_upsample[1], nn.Upsample) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with bilinear upsample for upsample 2X. + block = InterpConv( + 64, + 32, + conv_first=False, + upsampe_cfg=dict(scale_factor=2, mode='bilinear', align_corners=False)) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + assert block.interp_upsample[0].mode == 'bilinear' + + # test InterpConv with nearest upsample for upsample 2X. + block = InterpConv( + 64, + 32, + conv_first=False, + upsampe_cfg=dict(scale_factor=2, mode='nearest')) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + assert block.interp_upsample[0].mode == 'nearest' + + +def test_up_conv_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + UpConvBlock(BasicConvBlock, 64, 32, 32, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + UpConvBlock(BasicConvBlock, 64, 32, 32, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + UpConvBlock(BasicConvBlock, 64, 32, 32, plugins=plugins) + + # test UpConvBlock with checkpoint forward and upsample 2X. + block = UpConvBlock(BasicConvBlock, 64, 32, 32, with_cp=True) + skip_x = torch.randn(1, 32, 256, 256, requires_grad=True) + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with upsample=True for upsample 2X. The spatial size of + # skip_x is 2X larger than x. + block = UpConvBlock( + BasicConvBlock, 64, 32, 32, upsample_cfg=dict(type='InterpConv')) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with upsample=False for upsample 2X. The spatial size of + # skip_x is the same as that of x. + block = UpConvBlock(BasicConvBlock, 64, 32, 32, upsample_cfg=None) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 256, 256) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with different upsample method for upsample 2X. + # The upsample method is interpolation upsample (bilinear or nearest). + block = UpConvBlock( + BasicConvBlock, + 64, + 32, + 32, + upsample_cfg=dict( + type='InterpConv', + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False))) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with different upsample method for upsample 2X. + # The upsample method is deconvolution upsample. + block = UpConvBlock( + BasicConvBlock, + 64, + 32, + 32, + upsample_cfg=dict(type='DeconvModule', kernel_size=4, scale_factor=2)) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test BasicConvBlock structure and forward + block = UpConvBlock( + conv_block=BasicConvBlock, + in_channels=64, + skip_channels=32, + out_channels=32, + num_convs=3, + dilation=3, + upsample_cfg=dict( + type='InterpConv', + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False))) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + assert block.conv_block.convs[0].conv.in_channels == 64 + assert block.conv_block.convs[0].conv.out_channels == 32 + assert block.conv_block.convs[0].conv.kernel_size == (3, 3) + assert block.conv_block.convs[0].conv.dilation == (1, 1) + assert block.conv_block.convs[0].conv.padding == (1, 1) + + assert block.conv_block.convs[1].conv.in_channels == 32 + assert block.conv_block.convs[1].conv.out_channels == 32 + assert block.conv_block.convs[1].conv.kernel_size == (3, 3) + assert block.conv_block.convs[1].conv.dilation == (3, 3) + assert block.conv_block.convs[1].conv.padding == (3, 3) + + assert block.conv_block.convs[2].conv.in_channels == 32 + assert block.conv_block.convs[2].conv.out_channels == 32 + assert block.conv_block.convs[2].conv.kernel_size == (3, 3) + assert block.conv_block.convs[2].conv.dilation == (3, 3) + assert block.conv_block.convs[2].conv.padding == (3, 3) + + assert block.upsample.interp_upsample[1].conv.in_channels == 64 + assert block.upsample.interp_upsample[1].conv.out_channels == 32 + assert block.upsample.interp_upsample[1].conv.kernel_size == (1, 1) + assert block.upsample.interp_upsample[1].conv.dilation == (1, 1) + assert block.upsample.interp_upsample[1].conv.padding == (0, 0) + + +def test_unet(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + UNet(3, 64, 5, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + UNet(3, 64, 5, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + UNet(3, 64, 5, plugins=plugins) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=4, + strides=(1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2), + dec_num_convs=(2, 2, 2), + downsamples=(True, True, True), + enc_dilations=(1, 1, 1, 1), + dec_dilations=(1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 32. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=6, + strides=(1, 1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2, 2), + downsamples=(True, True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(strides)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(enc_num_convs)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(dec_num_convs)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(downsamples)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(enc_dilations)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(dec_dilations)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + # test UNet norm_eval=True + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + norm_eval=True) + unet.train() + assert check_norm_state(unet.modules(), False) + + # test UNet norm_eval=False + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + norm_eval=False) + unet.train() + assert check_norm_state(unet.modules(), True) + + # test UNet forward and outputs. The whole downsample rate is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 8, 8]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 2. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, False, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 64, 64]) + assert x_outs[1].shape == torch.Size([2, 512, 64, 64]) + assert x_outs[2].shape == torch.Size([2, 256, 64, 64]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 1. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(False, False, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 128, 128]) + assert x_outs[1].shape == torch.Size([2, 512, 128, 128]) + assert x_outs[2].shape == torch.Size([2, 256, 128, 128]) + assert x_outs[3].shape == torch.Size([2, 128, 128, 128]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 8, 8]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet init_weights method. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + unet.init_weights(pretrained=None) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) diff --git a/tests/test_sampler.py b/tests/test_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..3c79c16277511db4c470a5cbe7b5aa61b0b0b9bd --- /dev/null +++ b/tests/test_sampler.py @@ -0,0 +1,38 @@ +import pytest +import torch + +from mmseg.core import OHEMPixelSampler +from mmseg.models.decode_heads import FCNHead + + +def _context_for_ohem(): + return FCNHead(in_channels=32, channels=16, num_classes=19) + + +def test_ohem_sampler(): + + with pytest.raises(AssertionError): + # seg_logit and seg_label must be of the same size + sampler = OHEMPixelSampler(context=_context_for_ohem()) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 89, 89)) + sampler.sample(seg_logit, seg_label) + + # test with thresh + sampler = OHEMPixelSampler( + context=_context_for_ohem(), thresh=0.7, min_kept=200) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 45, 45)) + seg_weight = sampler.sample(seg_logit, seg_label) + assert seg_weight.shape[0] == seg_logit.shape[0] + assert seg_weight.shape[1:] == seg_logit.shape[2:] + assert seg_weight.sum() > 200 + + # test w.o thresh + sampler = OHEMPixelSampler(context=_context_for_ohem(), min_kept=200) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 45, 45)) + seg_weight = sampler.sample(seg_logit, seg_label) + assert seg_weight.shape[0] == seg_logit.shape[0] + assert seg_weight.shape[1:] == seg_logit.shape[2:] + assert seg_weight.sum() == 200 diff --git a/tests/test_utils/test_inverted_residual_module.py b/tests/test_utils/test_inverted_residual_module.py new file mode 100644 index 0000000000000000000000000000000000000000..8d5eecf15bf7d5f5ad54aa8e71d61cb40973fa8d --- /dev/null +++ b/tests/test_utils/test_inverted_residual_module.py @@ -0,0 +1,120 @@ +import mmcv +import pytest +import torch + +from mmseg.models.utils import InvertedResidual, InvertedResidualV3 + + +def test_inv_residual(): + with pytest.raises(AssertionError): + # test stride assertion. + InvertedResidual(32, 32, 3, 4) + + # test default config with res connection. + # set expand_ratio = 4, stride = 1 and inp=oup. + inv_module = InvertedResidual(32, 32, 1, 4) + assert inv_module.use_res_connect + assert inv_module.conv[0].kernel_size == (1, 1) + assert inv_module.conv[0].padding == 0 + assert inv_module.conv[1].kernel_size == (3, 3) + assert inv_module.conv[1].padding == 1 + assert inv_module.conv[0].with_norm + assert inv_module.conv[1].with_norm + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test inv_residual module without res connection. + # set expand_ratio = 4, stride = 2. + inv_module = InvertedResidual(32, 32, 2, 4) + assert not inv_module.use_res_connect + assert inv_module.conv[0].kernel_size == (1, 1) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 32, 32) + + # test expand_ratio == 1 + inv_module = InvertedResidual(32, 32, 1, 1) + assert inv_module.conv[0].kernel_size == (3, 3) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test with checkpoint forward + inv_module = InvertedResidual(32, 32, 1, 1, with_cp=True) + assert inv_module.with_cp + x = torch.rand(1, 32, 64, 64, requires_grad=True) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + +def test_inv_residualv3(): + with pytest.raises(AssertionError): + # test stride assertion. + InvertedResidualV3(32, 32, 16, stride=3) + + with pytest.raises(AssertionError): + # test assertion. + InvertedResidualV3(32, 32, 16, with_expand_conv=False) + + # test with se_cfg=None, with_expand_conv=False + inv_module = InvertedResidualV3(32, 32, 32, with_expand_conv=False) + + assert inv_module.with_res_shortcut is True + assert inv_module.with_se is False + assert inv_module.with_expand_conv is False + assert not hasattr(inv_module, 'expand_conv') + assert isinstance(inv_module.depthwise_conv.conv, torch.nn.Conv2d) + assert inv_module.depthwise_conv.conv.kernel_size == (3, 3) + assert inv_module.depthwise_conv.conv.stride == (1, 1) + assert inv_module.depthwise_conv.conv.padding == (1, 1) + assert isinstance(inv_module.depthwise_conv.bn, torch.nn.BatchNorm2d) + assert isinstance(inv_module.depthwise_conv.activate, torch.nn.ReLU) + assert inv_module.linear_conv.conv.kernel_size == (1, 1) + assert inv_module.linear_conv.conv.stride == (1, 1) + assert inv_module.linear_conv.conv.padding == (0, 0) + assert isinstance(inv_module.linear_conv.bn, torch.nn.BatchNorm2d) + + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test with se_cfg and with_expand_conv + se_cfg = dict( + channels=16, + ratio=4, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))) + act_cfg = dict(type='HSwish') + inv_module = InvertedResidualV3( + 32, 40, 16, 3, 2, se_cfg=se_cfg, act_cfg=act_cfg) + assert inv_module.with_res_shortcut is False + assert inv_module.with_se is True + assert inv_module.with_expand_conv is True + assert inv_module.expand_conv.conv.kernel_size == (1, 1) + assert inv_module.expand_conv.conv.stride == (1, 1) + assert inv_module.expand_conv.conv.padding == (0, 0) + assert isinstance(inv_module.expand_conv.activate, mmcv.cnn.HSwish) + + assert isinstance(inv_module.depthwise_conv.conv, + mmcv.cnn.bricks.Conv2dAdaptivePadding) + assert inv_module.depthwise_conv.conv.kernel_size == (3, 3) + assert inv_module.depthwise_conv.conv.stride == (2, 2) + assert inv_module.depthwise_conv.conv.padding == (0, 0) + assert isinstance(inv_module.depthwise_conv.bn, torch.nn.BatchNorm2d) + assert isinstance(inv_module.depthwise_conv.activate, mmcv.cnn.HSwish) + assert inv_module.linear_conv.conv.kernel_size == (1, 1) + assert inv_module.linear_conv.conv.stride == (1, 1) + assert inv_module.linear_conv.conv.padding == (0, 0) + assert isinstance(inv_module.linear_conv.bn, torch.nn.BatchNorm2d) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 40, 32, 32) + + # test with checkpoint forward + inv_module = InvertedResidualV3( + 32, 40, 16, 3, 2, se_cfg=se_cfg, act_cfg=act_cfg, with_cp=True) + assert inv_module.with_cp + x = torch.randn(2, 32, 64, 64, requires_grad=True) + output = inv_module(x) + assert output.shape == (2, 40, 32, 32) diff --git a/tests/test_utils/test_make_divisible.py b/tests/test_utils/test_make_divisible.py new file mode 100644 index 0000000000000000000000000000000000000000..5e9d1062ffcbe3213a22701bad826ae48a52ecee --- /dev/null +++ b/tests/test_utils/test_make_divisible.py @@ -0,0 +1,13 @@ +from mmseg.models.utils import make_divisible + + +def test_make_divisible(): + # test with min_value = None + assert make_divisible(10, 4) == 12 + assert make_divisible(9, 4) == 12 + assert make_divisible(1, 4) == 4 + + # test with min_value = 8 + assert make_divisible(10, 4, 8) == 12 + assert make_divisible(9, 4, 8) == 12 + assert make_divisible(1, 4, 8) == 8 diff --git a/tests/test_utils/test_se_layer.py b/tests/test_utils/test_se_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..8bba7b33b93434a7021c69ee2053451cd4066d9d --- /dev/null +++ b/tests/test_utils/test_se_layer.py @@ -0,0 +1,41 @@ +import mmcv +import pytest +import torch + +from mmseg.models.utils.se_layer import SELayer + + +def test_se_layer(): + with pytest.raises(AssertionError): + # test act_cfg assertion. + SELayer(32, act_cfg=(dict(type='ReLU'), )) + + # test config with channels = 16. + se_layer = SELayer(16) + assert se_layer.conv1.conv.kernel_size == (1, 1) + assert se_layer.conv1.conv.stride == (1, 1) + assert se_layer.conv1.conv.padding == (0, 0) + assert isinstance(se_layer.conv1.activate, torch.nn.ReLU) + assert se_layer.conv2.conv.kernel_size == (1, 1) + assert se_layer.conv2.conv.stride == (1, 1) + assert se_layer.conv2.conv.padding == (0, 0) + assert isinstance(se_layer.conv2.activate, mmcv.cnn.HSigmoid) + + x = torch.rand(1, 16, 64, 64) + output = se_layer(x) + assert output.shape == (1, 16, 64, 64) + + # test config with channels = 16, act_cfg = dict(type='ReLU'). + se_layer = SELayer(16, act_cfg=dict(type='ReLU')) + assert se_layer.conv1.conv.kernel_size == (1, 1) + assert se_layer.conv1.conv.stride == (1, 1) + assert se_layer.conv1.conv.padding == (0, 0) + assert isinstance(se_layer.conv1.activate, torch.nn.ReLU) + assert se_layer.conv2.conv.kernel_size == (1, 1) + assert se_layer.conv2.conv.stride == (1, 1) + assert se_layer.conv2.conv.padding == (0, 0) + assert isinstance(se_layer.conv2.activate, torch.nn.ReLU) + + x = torch.rand(1, 16, 64, 64) + output = se_layer(x) + assert output.shape == (1, 16, 64, 64) diff --git a/tools/benchmark.py b/tools/benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..cb0df3bdfa65465eb99db2fff4ec80ba08d5bc23 --- /dev/null +++ b/tools/benchmark.py @@ -0,0 +1,82 @@ +import argparse +import time + +import torch +from mmcv import Config +from mmcv.parallel import MMDataParallel +from mmcv.runner import load_checkpoint + +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMSeg benchmark a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--log-interval', type=int, default=50, help='interval of logging') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + # set cudnn_benchmark + torch.backends.cudnn.benchmark = False + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # build the dataloader + # TODO: support multiple images per gpu (only minor changes are needed) + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=False, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_segmentor(cfg.model, test_cfg=cfg.get('test_cfg')) + load_checkpoint(model, args.checkpoint, map_location='cpu') + + model = MMDataParallel(model, device_ids=[0]) + + model.eval() + + # the first several iterations may be very slow so skip them + num_warmup = 5 + pure_inf_time = 0 + total_iters = 200 + + # benchmark with 200 image and take the average + for i, data in enumerate(data_loader): + + torch.cuda.synchronize() + start_time = time.perf_counter() + + with torch.no_grad(): + model(return_loss=False, rescale=True, **data) + + torch.cuda.synchronize() + elapsed = time.perf_counter() - start_time + + if i >= num_warmup: + pure_inf_time += elapsed + if (i + 1) % args.log_interval == 0: + fps = (i + 1 - num_warmup) / pure_inf_time + print(f'Done image [{i + 1:<3}/ {total_iters}], ' + f'fps: {fps:.2f} img / s') + + if (i + 1) == total_iters: + fps = (i + 1 - num_warmup) / pure_inf_time + print(f'Overall fps: {fps:.2f} img / s') + break + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/chase_db1.py b/tools/convert_datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..56bb210edbb359caf57b6048b8e09b94ef295152 --- /dev/null +++ b/tools/convert_datasets/chase_db1.py @@ -0,0 +1,87 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import mmcv + +CHASE_DB1_LEN = 28 * 3 +TRAINING_LEN = 60 + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert CHASE_DB1 dataset to mmsegmentation format') + parser.add_argument('dataset_path', help='path of CHASEDB1.zip') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + dataset_path = args.dataset_path + if args.out_dir is None: + out_dir = osp.join('data', 'CHASE_DB1') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + print('Extracting CHASEDB1.zip...') + zip_file = zipfile.ZipFile(dataset_path) + zip_file.extractall(tmp_dir) + + print('Generating training dataset...') + + assert len(os.listdir(tmp_dir)) == CHASE_DB1_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(CHASE_DB1_LEN) + + for img_name in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, img_name)) + if osp.splitext(img_name)[1] == '.jpg': + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(img_name)[0] + '.png')) + else: + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(img_name)[0] + '.png')) + + for img_name in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, img_name)) + if osp.splitext(img_name)[1] == '.jpg': + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(img_name)[0] + '.png')) + else: + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/cityscapes.py b/tools/convert_datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99d05b41f58c1d2b92a6cbb4f5859c6d696d0ac8 --- /dev/null +++ b/tools/convert_datasets/cityscapes.py @@ -0,0 +1,55 @@ +import argparse +import os.path as osp + +import mmcv +from cityscapesscripts.preparation.json2labelImg import json2labelImg + + +def convert_json_to_label(json_file): + label_file = json_file.replace('_polygons.json', '_labelTrainIds.png') + json2labelImg(json_file, label_file, 'trainIds') + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert Cityscapes annotations to TrainIds') + parser.add_argument('cityscapes_path', help='cityscapes data path') + parser.add_argument('--gt-dir', default='gtFine', type=str) + parser.add_argument('-o', '--out-dir', help='output path') + parser.add_argument( + '--nproc', default=1, type=int, help='number of process') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + cityscapes_path = args.cityscapes_path + out_dir = args.out_dir if args.out_dir else cityscapes_path + mmcv.mkdir_or_exist(out_dir) + + gt_dir = osp.join(cityscapes_path, args.gt_dir) + + poly_files = [] + for poly in mmcv.scandir(gt_dir, '_polygons.json', recursive=True): + poly_file = osp.join(gt_dir, poly) + poly_files.append(poly_file) + if args.nproc > 1: + mmcv.track_parallel_progress(convert_json_to_label, poly_files, + args.nproc) + else: + mmcv.track_progress(convert_json_to_label, poly_files) + + split_names = ['train', 'val', 'test'] + + for split in split_names: + filenames = [] + for poly in mmcv.scandir( + osp.join(gt_dir, split), '_polygons.json', recursive=True): + filenames.append(poly.replace('_gtFine_polygons.json', '')) + with open(osp.join(out_dir, f'{split}.txt'), 'w') as f: + f.writelines(f + '\n' for f in filenames) + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/drive.py b/tools/convert_datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..891f06f725cc7be9da8c65bc0dc56008b8313e30 --- /dev/null +++ b/tools/convert_datasets/drive.py @@ -0,0 +1,112 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import cv2 +import mmcv + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert DRIVE dataset to mmsegmentation format') + parser.add_argument( + 'training_path', help='the training part of DRIVE dataset') + parser.add_argument( + 'testing_path', help='the testing part of DRIVE dataset') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + training_path = args.training_path + testing_path = args.testing_path + if args.out_dir is None: + out_dir = osp.join('data', 'DRIVE') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + print('Extracting training.zip...') + zip_file = zipfile.ZipFile(training_path) + zip_file.extractall(tmp_dir) + + print('Generating training dataset...') + now_dir = osp.join(tmp_dir, 'training', 'images') + for img_name in os.listdir(now_dir): + img = mmcv.imread(osp.join(now_dir, img_name)) + mmcv.imwrite( + img, + osp.join( + out_dir, 'images', 'training', + osp.splitext(img_name)[0].replace('_training', '') + + '.png')) + + now_dir = osp.join(tmp_dir, 'training', '1st_manual') + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(img_name)[0] + '.png')) + + print('Extracting test.zip...') + zip_file = zipfile.ZipFile(testing_path) + zip_file.extractall(tmp_dir) + + print('Generating validation dataset...') + now_dir = osp.join(tmp_dir, 'test', 'images') + for img_name in os.listdir(now_dir): + img = mmcv.imread(osp.join(now_dir, img_name)) + mmcv.imwrite( + img, + osp.join( + out_dir, 'images', 'validation', + osp.splitext(img_name)[0].replace('_test', '') + '.png')) + + now_dir = osp.join(tmp_dir, 'test', '1st_manual') + if osp.exists(now_dir): + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + now_dir = osp.join(tmp_dir, 'test', '2nd_manual') + if osp.exists(now_dir): + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/hrf.py b/tools/convert_datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..bdeb6e7e5668e097f30bc019c88f9eab6c7fcf07 --- /dev/null +++ b/tools/convert_datasets/hrf.py @@ -0,0 +1,110 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import mmcv + +HRF_LEN = 15 +TRAINING_LEN = 5 + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert HRF dataset to mmsegmentation format') + parser.add_argument('healthy_path', help='the path of healthy.zip') + parser.add_argument( + 'healthy_manualsegm_path', help='the path of healthy_manualsegm.zip') + parser.add_argument('glaucoma_path', help='the path of glaucoma.zip') + parser.add_argument( + 'glaucoma_manualsegm_path', help='the path of glaucoma_manualsegm.zip') + parser.add_argument( + 'diabetic_retinopathy_path', + help='the path of diabetic_retinopathy.zip') + parser.add_argument( + 'diabetic_retinopathy_manualsegm_path', + help='the path of diabetic_retinopathy_manualsegm.zip') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + images_path = [ + args.healthy_path, args.glaucoma_path, args.diabetic_retinopathy_path + ] + annotations_path = [ + args.healthy_manualsegm_path, args.glaucoma_manualsegm_path, + args.diabetic_retinopathy_manualsegm_path + ] + if args.out_dir is None: + out_dir = osp.join('data', 'HRF') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + print('Generating images...') + for now_path in images_path: + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + zip_file = zipfile.ZipFile(now_path) + zip_file.extractall(tmp_dir) + + assert len(os.listdir(tmp_dir)) == HRF_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(HRF_LEN) + + for filename in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(filename)[0] + '.png')) + for filename in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Generating annotations...') + for now_path in annotations_path: + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + zip_file = zipfile.ZipFile(now_path) + zip_file.extractall(tmp_dir) + + assert len(os.listdir(tmp_dir)) == HRF_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(HRF_LEN) + + for filename in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + for filename in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/pascal_context.py b/tools/convert_datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..dc49ab7ad8fd359c458ec4b6190ed61851426031 --- /dev/null +++ b/tools/convert_datasets/pascal_context.py @@ -0,0 +1,86 @@ +import argparse +import os.path as osp +from functools import partial + +import mmcv +import numpy as np +from detail import Detail +from PIL import Image + +_mapping = np.sort( + np.array([ + 0, 2, 259, 260, 415, 324, 9, 258, 144, 18, 19, 22, 23, 397, 25, 284, + 158, 159, 416, 33, 162, 420, 454, 295, 296, 427, 44, 45, 46, 308, 59, + 440, 445, 31, 232, 65, 354, 424, 68, 326, 72, 458, 34, 207, 80, 355, + 85, 347, 220, 349, 360, 98, 187, 104, 105, 366, 189, 368, 113, 115 + ])) +_key = np.array(range(len(_mapping))).astype('uint8') + + +def generate_labels(img_id, detail, out_dir): + + def _class_to_index(mask, _mapping, _key): + # assert the values + values = np.unique(mask) + for i in range(len(values)): + assert (values[i] in _mapping) + index = np.digitize(mask.ravel(), _mapping, right=True) + return _key[index].reshape(mask.shape) + + mask = Image.fromarray( + _class_to_index(detail.getMask(img_id), _mapping=_mapping, _key=_key)) + filename = img_id['file_name'] + mask.save(osp.join(out_dir, filename.replace('jpg', 'png'))) + return osp.splitext(osp.basename(filename))[0] + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert PASCAL VOC annotations to mmsegmentation format') + parser.add_argument('devkit_path', help='pascal voc devkit path') + parser.add_argument('json_path', help='annoation json filepath') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + devkit_path = args.devkit_path + if args.out_dir is None: + out_dir = osp.join(devkit_path, 'VOC2010', 'SegmentationClassContext') + else: + out_dir = args.out_dir + json_path = args.json_path + mmcv.mkdir_or_exist(out_dir) + img_dir = osp.join(devkit_path, 'VOC2010', 'JPEGImages') + + train_detail = Detail(json_path, img_dir, 'train') + train_ids = train_detail.getImgs() + + val_detail = Detail(json_path, img_dir, 'val') + val_ids = val_detail.getImgs() + + mmcv.mkdir_or_exist( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext')) + + train_list = mmcv.track_progress( + partial(generate_labels, detail=train_detail, out_dir=out_dir), + train_ids) + with open( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext', + 'train.txt'), 'w') as f: + f.writelines(line + '\n' for line in sorted(train_list)) + + val_list = mmcv.track_progress( + partial(generate_labels, detail=val_detail, out_dir=out_dir), val_ids) + with open( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext', + 'val.txt'), 'w') as f: + f.writelines(line + '\n' for line in sorted(val_list)) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/stare.py b/tools/convert_datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..6238d62f64de9406ef84ebb4667d7c0e1ce8a8c5 --- /dev/null +++ b/tools/convert_datasets/stare.py @@ -0,0 +1,165 @@ +import argparse +import gzip +import os +import os.path as osp +import tarfile +import tempfile + +import mmcv + +STARE_LEN = 20 +TRAINING_LEN = 10 + + +def un_gz(src, dst): + g_file = gzip.GzipFile(src) + with open(dst, 'wb+') as f: + f.write(g_file.read()) + g_file.close() + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert STARE dataset to mmsegmentation format') + parser.add_argument('image_path', help='the path of stare-images.tar') + parser.add_argument('labels_ah', help='the path of labels-ah.tar') + parser.add_argument('labels_vk', help='the path of labels-vk.tar') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + image_path = args.image_path + labels_ah = args.labels_ah + labels_vk = args.labels_vk + if args.out_dir is None: + out_dir = osp.join('data', 'STARE') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting stare-images.tar...') + with tarfile.open(image_path) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting labels-ah.tar...') + with tarfile.open(labels_ah) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a threshold + # to convert the nonstandard annotation imgs. The value divided by + # 128 equivalent to '1 if value >= 128 else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting labels-vk.tar...') + with tarfile.open(labels_vk) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/voc_aug.py b/tools/convert_datasets/voc_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..942746351b64b2e931cb18ce684a1f3ccf7e3866 --- /dev/null +++ b/tools/convert_datasets/voc_aug.py @@ -0,0 +1,91 @@ +import argparse +import os.path as osp +from functools import partial + +import mmcv +import numpy as np +from PIL import Image +from scipy.io import loadmat + +AUG_LEN = 10582 + + +def convert_mat(mat_file, in_dir, out_dir): + data = loadmat(osp.join(in_dir, mat_file)) + mask = data['GTcls'][0]['Segmentation'][0].astype(np.uint8) + seg_filename = osp.join(out_dir, mat_file.replace('.mat', '.png')) + Image.fromarray(mask).save(seg_filename, 'PNG') + + +def generate_aug_list(merged_list, excluded_list): + return list(set(merged_list) - set(excluded_list)) + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert PASCAL VOC annotations to mmsegmentation format') + parser.add_argument('devkit_path', help='pascal voc devkit path') + parser.add_argument('aug_path', help='pascal voc aug path') + parser.add_argument('-o', '--out_dir', help='output path') + parser.add_argument( + '--nproc', default=1, type=int, help='number of process') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + devkit_path = args.devkit_path + aug_path = args.aug_path + nproc = args.nproc + if args.out_dir is None: + out_dir = osp.join(devkit_path, 'VOC2012', 'SegmentationClassAug') + else: + out_dir = args.out_dir + mmcv.mkdir_or_exist(out_dir) + in_dir = osp.join(aug_path, 'dataset', 'cls') + + mmcv.track_parallel_progress( + partial(convert_mat, in_dir=in_dir, out_dir=out_dir), + list(mmcv.scandir(in_dir, suffix='.mat')), + nproc=nproc) + + full_aug_list = [] + with open(osp.join(aug_path, 'dataset', 'train.txt')) as f: + full_aug_list += [line.strip() for line in f] + with open(osp.join(aug_path, 'dataset', 'val.txt')) as f: + full_aug_list += [line.strip() for line in f] + + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'train.txt')) as f: + ori_train_list = [line.strip() for line in f] + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'val.txt')) as f: + val_list = [line.strip() for line in f] + + aug_train_list = generate_aug_list(ori_train_list + full_aug_list, + val_list) + assert len(aug_train_list) == AUG_LEN, 'len(aug_train_list) != {}'.format( + AUG_LEN) + + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'trainaug.txt'), 'w') as f: + f.writelines(line + '\n' for line in aug_train_list) + + aug_list = generate_aug_list(full_aug_list, ori_train_list + val_list) + assert len(aug_list) == AUG_LEN - len( + ori_train_list), 'len(aug_list) != {}'.format(AUG_LEN - + len(ori_train_list)) + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', 'aug.txt'), + 'w') as f: + f.writelines(line + '\n' for line in aug_list) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/dist_test.sh b/tools/dist_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..34fb46541d447d923bc3561bbba09bd5c94d7bfe --- /dev/null +++ b/tools/dist_test.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +CONFIG=$1 +CHECKPOINT=$2 +GPUS=$3 +PORT=${PORT:-29500} +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/dist_train.sh b/tools/dist_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..1fcfc8bb1a6604359199b634cc7a19d257ade12e --- /dev/null +++ b/tools/dist_train.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +GPUS=$1 +PORT=${PORT:-29500} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \ + $(dirname "$0")/train.py --launcher pytorch ${@:2} diff --git a/tools/get_flops.py b/tools/get_flops.py new file mode 100644 index 0000000000000000000000000000000000000000..bc98c5252591b0c9ec218144c0652ea695a5b96e --- /dev/null +++ b/tools/get_flops.py @@ -0,0 +1,58 @@ +import argparse + +from mmcv import Config +from mmcv.cnn import get_model_complexity_info + +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a segmentor') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[2048, 1024], + help='input image size') + args = parser.parse_args() + return args + + +def main(): + + args = parse_args() + + if len(args.shape) == 1: + input_shape = (3, args.shape[0], args.shape[0]) + elif len(args.shape) == 2: + input_shape = (3, ) + tuple(args.shape) + else: + raise ValueError('invalid input shape') + + cfg = Config.fromfile(args.config) + cfg.model.pretrained = None + model = build_segmentor( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')).cuda() + model.eval() + + if hasattr(model, 'forward_dummy'): + model.forward = model.forward_dummy + else: + raise NotImplementedError( + 'FLOPs counter is currently not currently supported with {}'. + format(model.__class__.__name__)) + + flops, params = get_model_complexity_info(model, input_shape) + split_line = '=' * 30 + print('{0}\nInput shape: {1}\nFlops: {2}\nParams: {3}\n{0}'.format( + split_line, input_shape, flops, params)) + print('!!!Please be cautious if you use the results in papers. ' + 'You may need to check if all ops are supported and verify that the ' + 'flops computation is correct.') + + +if __name__ == '__main__': + main() diff --git a/tools/print_config.py b/tools/print_config.py new file mode 100644 index 0000000000000000000000000000000000000000..2a0c67780a0620fff1d8748db28177ca3ddcc0ca --- /dev/null +++ b/tools/print_config.py @@ -0,0 +1,28 @@ +import argparse + +from mmcv import Config, DictAction + + +def parse_args(): + parser = argparse.ArgumentParser(description='Print the whole config') + parser.add_argument('config', help='config file path') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='arguments in dict') + args = parser.parse_args() + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + print(f'Config:\n{cfg.pretty_text}') + # dump config + cfg.dump('example.py') + + +if __name__ == '__main__': + main() diff --git a/tools/publish_model.py b/tools/publish_model.py new file mode 100644 index 0000000000000000000000000000000000000000..a049f17674b7a1aa730057e5cc294d2368fe707c --- /dev/null +++ b/tools/publish_model.py @@ -0,0 +1,35 @@ +import argparse +import subprocess + +import torch + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Process a checkpoint to be published') + parser.add_argument('in_file', help='input checkpoint filename') + parser.add_argument('out_file', help='output checkpoint filename') + args = parser.parse_args() + return args + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) + subprocess.Popen(['mv', out_file, final_file]) + + +def main(): + args = parse_args() + process_checkpoint(args.in_file, args.out_file) + + +if __name__ == '__main__': + main() diff --git a/tools/pytorch2onnx.py b/tools/pytorch2onnx.py new file mode 100644 index 0000000000000000000000000000000000000000..2ec9feb59a86db61a8368d2239f8ef0dcb461d41 --- /dev/null +++ b/tools/pytorch2onnx.py @@ -0,0 +1,200 @@ +import argparse +from functools import partial + +import mmcv +import numpy as np +import onnxruntime as rt +import torch +import torch._C +import torch.serialization +from mmcv.onnx import register_extra_symbolics +from mmcv.runner import load_checkpoint +from torch import nn + +from mmseg.models import build_segmentor + +torch.manual_seed(3) + + +def _convert_batchnorm(module): + module_output = module + if isinstance(module, torch.nn.SyncBatchNorm): + module_output = torch.nn.BatchNorm2d(module.num_features, module.eps, + module.momentum, module.affine, + module.track_running_stats) + if module.affine: + module_output.weight.data = module.weight.data.clone().detach() + module_output.bias.data = module.bias.data.clone().detach() + # keep requires_grad unchanged + module_output.weight.requires_grad = module.weight.requires_grad + module_output.bias.requires_grad = module.bias.requires_grad + module_output.running_mean = module.running_mean + module_output.running_var = module.running_var + module_output.num_batches_tracked = module.num_batches_tracked + for name, child in module.named_children(): + module_output.add_module(name, _convert_batchnorm(child)) + del module + return module_output + + +def _demo_mm_inputs(input_shape, num_classes): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + rng = np.random.RandomState(0) + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + } for _ in range(N)] + mm_inputs = { + 'imgs': torch.FloatTensor(imgs).requires_grad_(True), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +def pytorch2onnx(model, + input_shape, + opset_version=11, + show=False, + output_file='tmp.onnx', + verify=False): + """Export Pytorch model to ONNX model and verify the outputs are same + between Pytorch and ONNX. + + Args: + model (nn.Module): Pytorch model we want to export. + input_shape (tuple): Use this input shape to construct + the corresponding dummy input and execute the model. + opset_version (int): The onnx op version. Default: 11. + show (bool): Whether print the computation graph. Default: False. + output_file (string): The path to where we store the output ONNX model. + Default: `tmp.onnx`. + verify (bool): Whether compare the outputs between Pytorch and ONNX. + Default: False. + """ + model.cpu().eval() + + if isinstance(model.decode_head, nn.ModuleList): + num_classes = model.decode_head[-1].num_classes + else: + num_classes = model.decode_head.num_classes + + mm_inputs = _demo_mm_inputs(input_shape, num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + + # replace original forward function + origin_forward = model.forward + model.forward = partial( + model.forward, img_metas=img_meta_list, return_loss=False) + + register_extra_symbolics(opset_version) + with torch.no_grad(): + torch.onnx.export( + model, (img_list, ), + output_file, + export_params=True, + keep_initializers_as_inputs=True, + verbose=show, + opset_version=opset_version) + print(f'Successfully exported ONNX model: {output_file}') + model.forward = origin_forward + + if verify: + # check by onnx + import onnx + onnx_model = onnx.load(output_file) + onnx.checker.check_model(onnx_model) + + # check the numerical value + # get pytorch output + pytorch_result = model(img_list, img_meta_list, return_loss=False)[0] + + # get onnx output + input_all = [node.name for node in onnx_model.graph.input] + input_initializer = [ + node.name for node in onnx_model.graph.initializer + ] + net_feed_input = list(set(input_all) - set(input_initializer)) + assert (len(net_feed_input) == 1) + sess = rt.InferenceSession(output_file) + onnx_result = sess.run( + None, {net_feed_input[0]: img_list[0].detach().numpy()})[0] + if not np.allclose(pytorch_result, onnx_result): + raise ValueError( + 'The outputs are different between Pytorch and ONNX') + print('The outputs are same between Pytorch and ONNX') + + +def parse_args(): + parser = argparse.ArgumentParser(description='Convert MMSeg to ONNX') + parser.add_argument('config', help='test config file path') + parser.add_argument('--checkpoint', help='checkpoint file', default=None) + parser.add_argument('--show', action='store_true', help='show onnx graph') + parser.add_argument( + '--verify', action='store_true', help='verify the onnx model') + parser.add_argument('--output-file', type=str, default='tmp.onnx') + parser.add_argument('--opset-version', type=int, default=11) + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[256, 256], + help='input image size') + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + if len(args.shape) == 1: + input_shape = (1, 3, args.shape[0], args.shape[0]) + elif len(args.shape) == 2: + input_shape = ( + 1, + 3, + ) + tuple(args.shape) + else: + raise ValueError('invalid input shape') + + cfg = mmcv.Config.fromfile(args.config) + cfg.model.pretrained = None + + # build the model and load checkpoint + cfg.model.train_cfg = None + segmentor = build_segmentor( + cfg.model, train_cfg=None, test_cfg=cfg.get('test_cfg')) + # convert SyncBN to BN + segmentor = _convert_batchnorm(segmentor) + + if args.checkpoint: + load_checkpoint(segmentor, args.checkpoint, map_location='cpu') + + # conver model to onnx file + pytorch2onnx( + segmentor, + input_shape, + opset_version=args.opset_version, + show=args.show, + output_file=args.output_file, + verify=args.verify) diff --git a/tools/slurm_test.sh b/tools/slurm_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..4e6f7bf4e33267f269cf0f455924cb70166ccd4b --- /dev/null +++ b/tools/slurm_test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +CHECKPOINT=$4 +GPUS=${GPUS:-4} +GPUS_PER_NODE=${GPUS_PER_NODE:-4} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +PY_ARGS=${@:5} +SRUN_ARGS=${SRUN_ARGS:-""} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS} diff --git a/tools/slurm_train.sh b/tools/slurm_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..ab232105f0309c720ed81a522eca14b6fbd64afd --- /dev/null +++ b/tools/slurm_train.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +GPUS=${GPUS:-4} +GPUS_PER_NODE=${GPUS_PER_NODE:-4} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${@:4} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/train.py ${CONFIG} --launcher="slurm" ${PY_ARGS} diff --git a/tools/test.py b/tools/test.py new file mode 100644 index 0000000000000000000000000000000000000000..a106f04626c44326ff081ffc62c1456f55a19be2 --- /dev/null +++ b/tools/test.py @@ -0,0 +1,148 @@ +import argparse +import os + +import mmcv +import torch +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +from mmcv.runner import get_dist_info, init_dist, load_checkpoint +from mmcv.utils import DictAction + +from mmseg.apis import multi_gpu_test, single_gpu_test +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser( + description='mmseg test (and eval) a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--aug-test', action='store_true', help='Use Flip and Multi scale aug') + parser.add_argument('--out', help='output result file in pickle format') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='evaluation metrics, which depends on the dataset, e.g., "mIoU"' + ' for generic datasets, and "cityscapes" for Cityscapes') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--gpu-collect', + action='store_true', + help='whether to use gpu to collect results.') + parser.add_argument( + '--tmpdir', + help='tmp directory used for collecting results from multiple ' + 'workers, available when gpu_collect is not specified') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='custom options') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def main(): + args = parse_args() + + assert args.out or args.eval or args.format_only or args.show \ + or args.show_dir, \ + ('Please specify at least one operation (save/eval/format/show the ' + 'results / save the results) with the argument "--out", "--eval"' + ', "--format-only", "--show" or "--show-dir"') + + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = mmcv.Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + if args.aug_test: + # hard code index + cfg.data.test.pipeline[1].img_ratios = [ + 0.5, 0.75, 1.0, 1.25, 1.5, 1.75 + ] + cfg.data.test.pipeline[1].flip = True + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + # build the dataloader + # TODO: support multiple images per gpu (only minor changes are needed) + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=distributed, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_segmentor(cfg.model, test_cfg=cfg.get('test_cfg')) + checkpoint = load_checkpoint(model, args.checkpoint, map_location='cpu') + model.CLASSES = checkpoint['meta']['CLASSES'] + model.PALETTE = checkpoint['meta']['PALETTE'] + + efficient_test = False + if args.eval_options is not None: + efficient_test = args.eval_options.get('efficient_test', False) + + if not distributed: + model = MMDataParallel(model, device_ids=[0]) + outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, + efficient_test) + else: + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False) + outputs = multi_gpu_test(model, data_loader, args.tmpdir, + args.gpu_collect, efficient_test) + + rank, _ = get_dist_info() + if rank == 0: + if args.out: + print(f'\nwriting results to {args.out}') + mmcv.dump(outputs, args.out) + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + dataset.evaluate(outputs, args.eval, **kwargs) + + +if __name__ == '__main__': + main() diff --git a/tools/train.py b/tools/train.py new file mode 100644 index 0000000000000000000000000000000000000000..890cafd992548dbaaf41e5775499de06754b54e6 --- /dev/null +++ b/tools/train.py @@ -0,0 +1,167 @@ +import argparse +import copy +import os +import os.path as osp +import time + +import mmcv +import torch +from mmcv.runner import init_dist +from mmcv.utils import Config, DictAction, get_git_hash + +from mmseg import __version__ +from mmseg.apis import set_random_seed, train_segmentor +from mmseg.datasets import build_dataset +from mmseg.models import build_segmentor +from mmseg.utils import collect_env, get_root_logger + + +# os.environ["CUDA_VISIBLE_DEVICES"] = "0" + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a segmentor') + parser.add_argument('--config',default="/SEG/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py", help='train config file path') + parser.add_argument('--work-dir',default="/SEG/mmsegmentation/checkpoints/ccnet/recipe1m_train2", help='the dir to save logs and models') + parser.add_argument( + '--load-from', help='the checkpoint file to load weights from') + parser.add_argument( + '--resume-from', help='the checkpoint file to resume from') + parser.add_argument( + '--no-validate', + action='store_true', + help='whether not to evaluate the checkpoint during training') + group_gpus = parser.add_mutually_exclusive_group() + group_gpus.add_argument( + '--gpus', + type=int, + help='number of gpus to use ' + '(only applicable to non-distributed training)') + group_gpus.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='ids of gpus to use ' + '(only applicable to non-distributed training)') + parser.add_argument('--seed', type=int, default=None, help='random seed') + parser.add_argument( + '--deterministic', + action='store_true', + help='whether to set deterministic options for CUDNN backend.') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='custom options') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + + # work_dir is determined in this priority: CLI > segment in file > filename + if args.work_dir is not None: + # update configs according to CLI args if args.work_dir is not None + cfg.work_dir = args.work_dir + elif cfg.get('work_dir', None) is None: + # use config filename as default work_dir if cfg.work_dir is None + cfg.work_dir = osp.join('./work_dirs', + osp.splitext(osp.basename(args.config))[0]) + if args.load_from is not None: + cfg.load_from = args.load_from + if args.resume_from is not None: + cfg.resume_from = args.resume_from + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids + else: + cfg.gpu_ids = range(1) if args.gpus is None else range(args.gpus) + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + # create work_dir + mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir)) + # dump config + cfg.dump(osp.join(cfg.work_dir, osp.basename(args.config))) + # init the logger before other steps + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = osp.join(cfg.work_dir, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, log_level=cfg.log_level) + + # init the meta dict to record some important information such as + # environment info and seed, which will be logged + meta = dict() + # log env info + env_info_dict = collect_env() + env_info = '\n'.join([f'{k}: {v}' for k, v in env_info_dict.items()]) + dash_line = '-' * 60 + '\n' + logger.info('Environment info:\n' + dash_line + env_info + '\n' + + dash_line) + meta['env_info'] = env_info + + # log some basic info + logger.info(f'Distributed training: {distributed}') + logger.info(f'Config:\n{cfg.pretty_text}') + + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, deterministic: ' + f'{args.deterministic}') + set_random_seed(args.seed, deterministic=args.deterministic) + cfg.seed = args.seed + meta['seed'] = args.seed + meta['exp_name'] = osp.basename(args.config) + + model = build_segmentor( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + + logger.info(model) + + datasets = [build_dataset(cfg.data.train)] + if len(cfg.workflow) == 2: + val_dataset = copy.deepcopy(cfg.data.val) + val_dataset.pipeline = cfg.data.train.pipeline + datasets.append(build_dataset(val_dataset)) + if cfg.checkpoint_config is not None: + # save mmseg version, config file content and class names in + # checkpoints as meta data + cfg.checkpoint_config.meta = dict( + mmseg_version=f'{__version__}+{get_git_hash()[:7]}', + config=cfg.pretty_text, + CLASSES=datasets[0].CLASSES, + PALETTE=datasets[0].PALETTE) + # add an attribute for visualization convenience + model.CLASSES = datasets[0].CLASSES + + train_segmentor( + model, + datasets, + cfg, + distributed=distributed, + validate=(not args.no_validate), + timestamp=timestamp, + meta=meta) + + +if __name__ == '__main__': + main()