From 49b062e3656a6b90518e5d1a9a7db2a7d92da5b3 Mon Sep 17 00:00:00 2001 From: Andrew Lau <44357892+liuruiqiang@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:02:19 +0800 Subject: [PATCH 01/24] CodeCamp #139 [Feature] Support REFUGE dataset. (#2554) ## Motivation Add REFUGE datasets Old PR: https://github.com/open-mmlab/mmsegmentation/pull/2420 --------- Co-authored-by: MengzhangLI --- configs/_base_/datasets/refuge.py | 90 +++++++++++ docs/en/user_guides/2_dataset_prepare.md | 57 ++++++- docs/zh_cn/user_guides/2_dataset_prepare.md | 141 ++++++++++++------ mmseg/datasets/__init__.py | 3 +- mmseg/datasets/refuge.py | 28 ++++ .../ann_dir/pseudo_g0001.png | Bin 0 -> 2876 bytes .../img_dir/pseudo_g0001.png | Bin 0 -> 294138 bytes tests/test_datasets/test_dataset.py | 16 +- tools/dataset_converters/refuge.py | 110 ++++++++++++++ 9 files changed, 391 insertions(+), 54 deletions(-) create mode 100644 configs/_base_/datasets/refuge.py create mode 100644 mmseg/datasets/refuge.py create mode 100644 tests/data/pseudo_refuge_dataset/ann_dir/pseudo_g0001.png create mode 100644 tests/data/pseudo_refuge_dataset/img_dir/pseudo_g0001.png create mode 100644 tools/dataset_converters/refuge.py diff --git a/configs/_base_/datasets/refuge.py b/configs/_base_/datasets/refuge.py new file mode 100644 index 000000000..79bb4d4e9 --- /dev/null +++ b/configs/_base_/datasets/refuge.py @@ -0,0 +1,90 @@ +# dataset settings +dataset_type = 'REFUGEDataset' +data_root = 'data/REFUGE' +train_img_scale = (2056, 2124) +val_img_scale = (1634, 1634) +test_img_scale = (1634, 1634) +crop_size = (512, 512) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=False), + dict( + type='RandomResize', + scale=train_img_scale, + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +val_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=val_img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=False), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=test_img_scale, keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations', reduce_zero_label=False), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/training', seg_map_path='annotations/training'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/validation', + seg_map_path='annotations/validation'), + pipeline=val_pipeline)) +test_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='images/test', seg_map_path='annotations/test'), + pipeline=val_pipeline)) + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice']) +test_evaluator = val_evaluator diff --git a/docs/en/user_guides/2_dataset_prepare.md b/docs/en/user_guides/2_dataset_prepare.md index e9c7683dc..5d36061d8 100644 --- a/docs/en/user_guides/2_dataset_prepare.md +++ b/docs/en/user_guides/2_dataset_prepare.md @@ -145,6 +145,15 @@ mmsegmentation │ │ ├── ann_dir │ │ │ ├── train │ │ │ ├── val +│ ├── REFUGE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test ``` ### Cityscapes @@ -330,7 +339,7 @@ For Potsdam dataset, please run the following command to download and re-organiz python tools/dataset_converters/potsdam.py /path/to/potsdam ``` -In our default setting, it will generate 3,456 images for training and 2,016 images for validation. +In our default setting, it will generate 3456 images for training and 2016 images for validation. ### ISPRS Vaihingen @@ -383,7 +392,7 @@ You may need to follow the following structure for dataset preparation after dow python tools/dataset_converters/isaid.py /path/to/iSAID ``` -In our default setting (`patch_width`=896, `patch_height`=896, `overlap_area`=384), it will generate 33,978 images for training and 11,644 images for validation. +In our default setting (`patch_width`=896, `patch_height`=896, `overlap_area`=384), it will generate 33978 images for training and 11644 images for validation. ## LIP(Look Into Person) dataset @@ -436,7 +445,7 @@ cd ./RawData/Training Then create `train.txt` and `val.txt` to split dataset. -According to TransUNet, the following is the data set division. +According to TransUnet, the following is the data set division. train.txt @@ -500,7 +509,45 @@ Then, use this command to convert synapse dataset. python tools/dataset_converters/synapse.py --dataset-path /path/to/synapse ``` -In our default setting, it will generate 2,211 2D images for training and 1,568 2D images for validation. - Noted that MMSegmentation default evaluation metric (such as mean dice value) is calculated on 2D slice image, which is not comparable to results of 3D scan in some paper such as [TransUNet](https://arxiv.org/abs/2102.04306). + +### REFUGE + +Register in [REFUGE Challenge](https://refuge.grand-challenge.org) and download [REFUGE dataset](https://refuge.grand-challenge.org/REFUGE2Download). + +Then, unzip `REFUGE2.zip` and the contents of original datasets include: + +```none +├── REFUGE2 +│ ├── REFUGE2 +│ │ ├── Annotation-Training400.zip +│ │ ├── REFUGE-Test400.zip +│ │ ├── REFUGE-Test-GT.zip +│ │ ├── REFUGE-Training400.zip +│ │ ├── REFUGE-Validation400.zip +│ │ ├── REFUGE-Validation400-GT.zip +│ ├── __MACOSX +``` + +Please run the following command to convert REFUGE dataset: + +```shell +python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/REFUGE2 +``` + +The script will make directory structure below: + +```none +│ ├── REFUGE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +``` + +It includes 400 images for training, 400 images for validation and 400 images for testing which is the same as REFUGE 2018 dataset. diff --git a/docs/zh_cn/user_guides/2_dataset_prepare.md b/docs/zh_cn/user_guides/2_dataset_prepare.md index a8dde9211..bea1efd5c 100644 --- a/docs/zh_cn/user_guides/2_dataset_prepare.md +++ b/docs/zh_cn/user_guides/2_dataset_prepare.md @@ -1,6 +1,6 @@ ## 准备数据集(待更新) -推荐用软链接, 将数据集根目录链接到 `$MMSEGMENTATION/data` 里. 如果您的文件夹结构是不同的, 您也许可以试着修改配置文件里对应的路径. +推荐用软链接,将数据集根目录链接到 `$MMSEGMENTATION/data` 里。如果您的文件夹结构是不同的,您也许可以试着修改配置文件里对应的路径。 ```none mmsegmentation @@ -126,51 +126,60 @@ mmsegmentation │ │ ├── ann_dir │ │ │ ├── train │ │ │ ├── val +│ ├── REFUGE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test ``` ### Cityscapes -注册成功后, 数据集可以在 [这里](https://www.cityscapes-dataset.com/downloads/) 下载. +注册成功后,数据集可以在 [这里](https://www.cityscapes-dataset.com/downloads/) 下载。 -通常情况下, `**labelTrainIds.png` 被用来训练 cityscapes. +通常情况下,`**labelTrainIds.png` 被用来训练 cityscapes。 基于 [cityscapesscripts](https://github.com/mcordts/cityscapesScripts), 我们提供了一个 [脚本](https://github.com/open-mmlab/mmsegmentation/blob/master/tools/convert_datasets/cityscapes.py), -去生成 `**labelTrainIds.png`. +去生成 `**labelTrainIds.png`。 ```shell -# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略. +# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略。 python tools/convert_datasets/cityscapes.py data/cityscapes --nproc 8 ``` ### Pascal VOC -Pascal VOC 2012 可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar) 下载. -此外, 许多最近在 Pascal VOC 数据集上的工作都会利用增广的数据, 它们可以在 [这里](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz) 找到. +Pascal VOC 2012 可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar) 下载。 +此外,许多最近在 Pascal VOC 数据集上的工作都会利用增广的数据,它们可以在 [这里](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz) 找到。 -如果您想使用增广后的 VOC 数据集, 请运行下面的命令来将数据增广的标注转成正确的格式. +如果您想使用增广后的 VOC 数据集,请运行下面的命令来将数据增广的标注转成正确的格式。 ```shell -# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略. +# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略。 python tools/convert_datasets/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 ``` -关于如何拼接数据集 (concatenate) 并一起训练它们, 更多细节请参考 [拼接连接数据集](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/tutorials/customize_datasets.md#%E6%8B%BC%E6%8E%A5%E6%95%B0%E6%8D%AE%E9%9B%86) . +关于如何拼接数据集 (concatenate) 并一起训练它们,更多细节请参考 [拼接连接数据集](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/tutorials/customize_datasets.md#%E6%8B%BC%E6%8E%A5%E6%95%B0%E6%8D%AE%E9%9B%86) 。 ### ADE20K -ADE20K 的训练集和验证集可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip) 下载. -您还可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip) 下载验证集. +ADE20K 的训练集和验证集可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip) 下载。 +您还可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip) 下载验证集。 ### Pascal Context -Pascal Context 的训练集和验证集可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar) 下载. -注册成功后, 您还可以在 [这里](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) 下载验证集. +Pascal Context 的训练集和验证集可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar) 下载。 +注册成功后,您还可以在 [这里](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) 下载验证集。 -为了从原始数据集里切分训练集和验证集, 您可以在 [这里](https://codalabuser.blob.core.windows.net/public/trainval_merged.json) -下载 trainval_merged.json. +为了从原始数据集里切分训练集和验证集, 您可以在 [这里](https://codalabuser.blob.core.windows.net/public/trainval_merged.json) +下载 trainval_merged.json。 -如果您想使用 Pascal Context 数据集, -请安装 [细节](https://github.com/zhanghang1989/detail-api) 然后再运行如下命令来把标注转换成正确的格式. +如果您想使用 Pascal Context 数据集, +请安装 [细节](https://github.com/zhanghang1989/detail-api) 然后再运行如下命令来把标注转换成正确的格式。 ```shell python tools/convert_datasets/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json @@ -178,64 +187,64 @@ python tools/convert_datasets/pascal_context.py data/VOCdevkit data/VOCdevkit/VO ### CHASE DB1 -CHASE DB1 的训练集和验证集可以在 [这里](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip) 下载. +CHASE DB1 的训练集和验证集可以在 [这里](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip) 下载。 -为了将 CHASE DB1 数据集转换成 MMSegmentation 的格式,您需要运行如下命令: +为了将 CHASE DB1 数据集转换成 MMSegmentation 的格式,您需要运行如下命令: ```shell python tools/convert_datasets/chase_db1.py /path/to/CHASEDB1.zip ``` -这个脚本将自动生成正确的文件夹结构. +这个脚本将自动生成正确的文件夹结构。 ### DRIVE -DRIVE 的训练集和验证集可以在 [这里](https://drive.grand-challenge.org/) 下载. -在此之前, 您需要注册一个账号, 当前 '1st_manual' 并未被官方提供, 因此需要您从其他地方获取. +DRIVE 的训练集和验证集可以在 [这里](https://drive.grand-challenge.org/) 下载。 +在此之前,您需要注册一个账号,当前 '1st_manual' 并未被官方提供,因此需要您从其他地方获取。 -为了将 DRIVE 数据集转换成 MMSegmentation 格式, 您需要运行如下命令: +为了将 DRIVE 数据集转换成 MMSegmentation 格式,您需要运行如下命令: ```shell python tools/convert_datasets/drive.py /path/to/training.zip /path/to/test.zip ``` -这个脚本将自动生成正确的文件夹结构. +这个脚本将自动生成正确的文件夹结构。 ### HRF -首先, 下载 [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) 以及 [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip). +首先,下载 [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) 以及 [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip) 。 -为了将 HRF 数据集转换成 MMSegmentation 格式, 您需要运行如下命令: +为了将 HRF 数据集转换成 MMSegmentation 格式,您需要运行如下命令: ```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 ``` -这个脚本将自动生成正确的文件夹结构. +这个脚本将自动生成正确的文件夹结构。 ### STARE -首先, 下载 [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) 和 [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar). +首先,下载 [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) 和 [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar) 。 -为了将 STARE 数据集转换成 MMSegmentation 格式, 您需要运行如下命令: +为了将 STARE 数据集转换成 MMSegmentation 格式,您需要运行如下命令: ```shell python tools/convert_datasets/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar ``` -这个脚本将自动生成正确的文件夹结构. +这个脚本将自动生成正确的文件夹结构。 ### Dark Zurich -因为我们只支持在此数据集上测试模型, 所以您只需下载[验证集](https://data.vision.ee.ethz.ch/csakarid/shared/GCMA_UIoU/Dark_Zurich_val_anon.zip). +因为我们只支持在此数据集上测试模型,所以您只需下载[验证集](https://data.vision.ee.ethz.ch/csakarid/shared/GCMA_UIoU/Dark_Zurich_val_anon.zip) 。 ### Nighttime Driving -因为我们只支持在此数据集上测试模型,所以您只需下载[测试集](http://data.vision.ee.ethz.ch/daid/NighttimeDriving/NighttimeDrivingTest.zip). +因为我们只支持在此数据集上测试模型,所以您只需下载[测试集](http://data.vision.ee.ethz.ch/daid/NighttimeDriving/NighttimeDrivingTest.zip) 。 ### LoveDA -可以从 Google Drive 里下载 [LoveDA数据集](https://drive.google.com/drive/folders/1ibYV0qwn4yuuh068Rnc-w4tPi0U0c-ti?usp=sharing). +可以从 Google Drive 里下载 [LoveDA数据集](https://drive.google.com/drive/folders/1ibYV0qwn4yuuh068Rnc-w4tPi0U0c-ti?usp=sharing) 。 或者它还可以从 [zenodo](https://zenodo.org/record/5706578#.YZvN7SYRXdF) 下载, 您需要运行如下命令: @@ -248,46 +257,46 @@ wget https://zenodo.org/record/5706578/files/Val.zip wget https://zenodo.org/record/5706578/files/Test.zip ``` -对于 LoveDA 数据集,请运行以下命令下载并重新组织数据集: +对于 LoveDA 数据集,请运行以下命令下载并重新组织数据集 ```shell python tools/convert_datasets/loveda.py /path/to/loveDA ``` -请参照 [这里](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/inference.md) 来使用训练好的模型去预测 LoveDA 测试集并且提交到官网. +请参照 [这里](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/inference.md) 来使用训练好的模型去预测 LoveDA 测试集并且提交到官网。 -关于 LoveDA 的更多细节可以在[这里](https://github.com/Junjue-Wang/LoveDA) 找到. +关于 LoveDA 的更多细节可以在[这里](https://github.com/Junjue-Wang/LoveDA) 找到。 ### ISPRS Potsdam [Potsdam](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-potsdam/) -数据集是一个有着2D 语义分割内容标注的城市遥感数据集. -数据集可以从挑战[主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/) 获得. -需要其中的 `2_Ortho_RGB.zip` 和 `5_Labels_all_noBoundary.zip`. +数据集是一个有着2D 语义分割内容标注的城市遥感数据集。 +数据集可以从挑战[主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/) 获得。 +需要其中的 '2_Ortho_RGB.zip' 和 '5_Labels_all_noBoundary.zip'。 -对于 Potsdam 数据集,请运行以下命令下载并重新组织数据集 +对于 Potsdam 数据集,请运行以下命令下载并重新组织数据集 ```shell python tools/convert_datasets/potsdam.py /path/to/potsdam ``` -使用我们默认的配置, 将生成 3,456 张图片的训练集和 2,016 张图片的验证集. +使用我们默认的配置, 将生成 3456 张图片的训练集和 2016 张图片的验证集。 ### ISPRS Vaihingen [Vaihingen](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-vaihingen/) -数据集是一个有着2D 语义分割内容标注的城市遥感数据集. +数据集是一个有着2D 语义分割内容标注的城市遥感数据集。 数据集可以从挑战 [主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/). -需要其中的 'ISPRS_semantic_labeling_Vaihingen.zip' 和 'ISPRS_semantic_labeling_Vaihingen_ground_truth_eroded_COMPLETE.zip'. +需要其中的 'ISPRS_semantic_labeling_Vaihingen.zip' 和 'ISPRS_semantic_labeling_Vaihingen_ground_truth_eroded_COMPLETE.zip'。 -对于 Vaihingen 数据集, 请运行以下命令下载并重新组织数据集 +对于 Vaihingen 数据集,请运行以下命令下载并重新组织数据集 ```shell python tools/convert_datasets/vaihingen.py /path/to/vaihingen ``` -使用我们默认的配置 (`clip_size`=512, `stride_size`=256), 将生成 344 张图片的训练集和 398 张图片的验证集. +使用我们默认的配置 (`clip_size`=512, `stride_size`=256), 将生成 344 张图片的训练集和 398 张图片的验证集。 ### iSAID @@ -297,7 +306,7 @@ iSAID 数据集(训练集/验证集)的注释可以从 [iSAID](https://captain-w 该数据集是一个大规模的实例分割(也可以用于语义分割)的遥感数据集. -下载后, 在数据集转换前, 您需要将数据集文件夹调整成如下格式. +下载后,在数据集转换前,您需要将数据集文件夹调整成如下格式. ``` │ ├── iSAID @@ -404,3 +413,41 @@ python tools/dataset_converters/synapse.py --dataset-path /path/to/synapse 使用我们默认的配置, 将生成 2,211 张 2D 图片的训练集和 1,568 张图片的验证集. 需要注意的是 MMSegmentation 默认的评价指标 (例如平均 Dice 值) 都是基于每帧 2D 图片计算的, 这与基于每套 3D 图片计算评价指标的 [TransUNet](https://arxiv.org/abs/2102.04306) 是不同的. + +### REFUGE + +在[官网](https://refuge.grand-challenge.org)注册后, 下载 [REFUGE 数据集](https://refuge.grand-challenge.org/REFUGE2Download) `REFUGE2.zip` , 解压后的内容如下: + +```none +├── REFUGE2 +│ ├── REFUGE2 +│ │ ├── Annotation-Training400.zip +│ │ ├── REFUGE-Test400.zip +│ │ ├── REFUGE-Test-GT.zip +│ │ ├── REFUGE-Training400.zip +│ │ ├── REFUGE-Validation400.zip +│ │ ├── REFUGE-Validation400-GT.zip +│ ├── __MACOSX +``` + +运行如下命令,就可以按照 REFUGE2018 挑战赛划分数据集的标准将数据集切分成训练集、验证集、测试集: + +```shell +python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/REFUGE2 +``` + +这个脚本将自动生成下面的文件夹结构: + +```none +│ ├── REFUGE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ │ │ ├── test +``` + +其中包括 400 张图片的训练集, 400 张图片的验证集和 400 张图片的测试集. diff --git a/mmseg/datasets/__init__.py b/mmseg/datasets/__init__.py index 8aa2e8d1a..0dd19ee31 100644 --- a/mmseg/datasets/__init__.py +++ b/mmseg/datasets/__init__.py @@ -17,6 +17,7 @@ from .loveda import LoveDADataset from .night_driving import NightDrivingDataset from .pascal_context import PascalContextDataset, PascalContextDataset59 from .potsdam import PotsdamDataset +from .refuge import REFUGEDataset from .stare import STAREDataset from .synapse import SynapseDataset # yapf: disable @@ -48,5 +49,5 @@ __all__ = [ 'DecathlonDataset', 'LIPDataset', 'ResizeShortestEdge', 'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur', 'BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip', - 'SynapseDataset' + 'SynapseDataset', 'REFUGEDataset' ] diff --git a/mmseg/datasets/refuge.py b/mmseg/datasets/refuge.py new file mode 100644 index 000000000..4016a825a --- /dev/null +++ b/mmseg/datasets/refuge.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine.fileio as fileio + +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset + + +@DATASETS.register_module() +class REFUGEDataset(BaseSegDataset): + """REFUGE dataset. + + In segmentation map annotation for REFUGE, 0 stands for background, which + is not included in 2 categories. ``reduce_zero_label`` is fixed to True. + The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.png'. + """ + METAINFO = dict( + classes=('background', ' Optic Cup', 'Optic Disc'), + palette=[[120, 120, 120], [6, 230, 230], [56, 59, 120]]) + + def __init__(self, **kwargs) -> None: + super().__init__( + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) + assert fileio.exists( + self.data_prefix['img_path'], backend_args=self.backend_args) diff --git a/tests/data/pseudo_refuge_dataset/ann_dir/pseudo_g0001.png b/tests/data/pseudo_refuge_dataset/ann_dir/pseudo_g0001.png new file mode 100644 index 0000000000000000000000000000000000000000..4e69365a9cbda901f0339882e6a20fcaca29f179 GIT binary patch literal 2876 zcmeHJVN4Te7`_%ZR6?pFfrX%k5bO_^F)VF&TeX?6AsH#kmVqHs9FtMHQeC5XX)TS5 zBXef3H5;^dmSJ$H(UmFSHcBa52x2&3AWW#V&DLBoC^cM6Ef%`>>&^XN{L7Cv?e*U0 zd!FZg-naL~enmmjrnF5Mh9wp5%P+w&J|AAm8{i#Vx%T%(3`>kF%zx|sle~w62kLg- zekr}{%52oC=f8ZbV6&{uIeh(yc;rRXP#Tt^#>%epDt}u4vhKli=3wmyonqT-BA%~7 zz4nz(u{JmwZ;F<(%VT)>15q-zC)a*u`*M0H51Ua}Oya_Esfc&?8j%yABHusFz{raf}cAHUVw6#EE`?BXziN;|B=xmOrkPQGn_)!8gJvmDB~gRYO+BBcNfr23yqP|kS9X+h7*9iN5N)-qGBl8 zp2QI;+>(u4g30@$O!@3}?ts%3m zfchn40sW)>(t&o3vj$LKwRYkGe-5y<^@h)atJ-$L3N=TAw7r(AIm6&98G@ff%*`IU z6zufuWzz$c%;zCfCnU-okeo>CDBZG2udT>)%RT|r6l>u1fL|2yIL`GFcUL!?2JFOX zP>XXiMZ2oeZcJKrP}>L*nA2 zV&^6=!THF$!nDSTFAxT#a@0Z-noC5J)I znv>~+o}zO~+%gEsqmbD9kTQ>hkKfEOIpFkwJzU3eYq=w7g6;sfdT0g`*wIUjLUMv? zryCa{Dp@`Mj|#GSQAH-)6Fg%Z$0sU@8j#93p!HcmZoe0uRYSP{s%e0Eiv~j=N zFa)s(P0FTlq4F5q@^3)Tqkx7laIs&2$#AP|_bIa-U|}+1p}s_1hh1UTYn|n8!#tqW z-;o`Z`{h8E?4}#U5Xkpv7FsHRS&?d3C1P938enbQfTBy9wOR1slvw^3We$R%=#0es z5wsm99yUU3;_K<+`;Cz;Xm}5?p8=svuplv4zDSu{&=P77AA>D}a-2qM!P_i20=7(^ z+&=_~`c7pWhka88`=*%HuViFb!lx3}4LG|2vbVOvg$oA`!^Lto4K5x8!yj8q;cymk zo=iAebqbrRn(vBEJ33%bOry0}%>K5L5rufVq7#u9R+}5=1w5aKZkv{DU+U-iNhJf81Mn`XAa_vmgKf literal 0 HcmV?d00001 diff --git a/tests/data/pseudo_refuge_dataset/img_dir/pseudo_g0001.png b/tests/data/pseudo_refuge_dataset/img_dir/pseudo_g0001.png new file mode 100644 index 0000000000000000000000000000000000000000..e424c3cd21649d04d177c77efa7377ef8ef96da2 GIT binary patch literal 294138 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

OtzQ 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

afwf}@($cyu({{PMR2t!Zux}7emq@}JrDk4 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 M07*qoM6N<$f(oAZ<^TWy literal 0 HcmV?d00001 diff --git a/tests/test_datasets/test_dataset.py b/tests/test_datasets/test_dataset.py index 7c37204a6..b97cbae3a 100644 --- a/tests/test_datasets/test_dataset.py +++ b/tests/test_datasets/test_dataset.py @@ -8,7 +8,8 @@ import pytest from mmseg.datasets import (ADE20KDataset, BaseSegDataset, CityscapesDataset, COCOStuffDataset, DecathlonDataset, ISPRSDataset, LIPDataset, LoveDADataset, PascalVOCDataset, - PotsdamDataset, SynapseDataset, iSAIDDataset) + PotsdamDataset, REFUGEDataset, SynapseDataset, + iSAIDDataset) from mmseg.registry import DATASETS from mmseg.utils import get_classes, get_palette @@ -232,6 +233,19 @@ def test_synapse(): assert len(test_dataset) == 2 +def test_refuge(): + test_dataset = REFUGEDataset( + pipeline=[], + data_prefix=dict( + img_path=osp.join( + osp.dirname(__file__), + '../data/pseudo_refuge_dataset/img_dir'), + seg_map_path=osp.join( + osp.dirname(__file__), + '../data/pseudo_refuge_dataset/ann_dir'))) + assert len(test_dataset) == 1 + + def test_isaid(): test_dataset = iSAIDDataset( pipeline=[], diff --git a/tools/dataset_converters/refuge.py b/tools/dataset_converters/refuge.py new file mode 100644 index 000000000..1186866ab --- /dev/null +++ b/tools/dataset_converters/refuge.py @@ -0,0 +1,110 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import mmcv +import numpy as np +from mmengine.utils import mkdir_or_exist + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert REFUGE dataset to mmsegmentation format') + parser.add_argument('--raw_data_root', help='the root path of raw data') + + 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 extract_img(root: str, + cur_dir: str, + out_dir: str, + mode: str = 'train', + file_type: str = 'img') -> None: + """_summary_ + + Args: + Args: + root (str): root where the extracted data is saved + cur_dir (cur_dir): dir where the zip_file exists + out_dir (str): root dir where the data is saved + + mode (str, optional): Defaults to 'train'. + file_type (str, optional): Defaults to 'img',else to 'mask'. + """ + zip_file = zipfile.ZipFile(cur_dir) + zip_file.extractall(root) + for cur_dir, dirs, files in os.walk(root): + # filter child dirs and directories with "Illustration" and "MACOSX" + if len(dirs) == 0 and \ + cur_dir.split('\\')[-1].find('Illustration') == -1 and \ + cur_dir.find('MACOSX') == -1: + + file_names = [ + file for file in files + if file.endswith('.jpg') or file.endswith('.bmp') + ] + for filename in sorted(file_names): + img = mmcv.imread(osp.join(cur_dir, filename)) + + if file_type == 'annotations': + img = img[:, :, 0] + img[np.where(img == 0)] = 1 + img[np.where(img == 128)] = 2 + img[np.where(img == 255)] = 0 + mmcv.imwrite( + img, + osp.join(out_dir, file_type, mode, + osp.splitext(filename)[0] + '.png')) + + +def main(): + args = parse_args() + + raw_data_root = args.raw_data_root + if args.out_dir is None: + out_dir = osp.join('./data', 'REFUGE') + + else: + out_dir = args.out_dir + + print('Making directories...') + mkdir_or_exist(out_dir) + mkdir_or_exist(osp.join(out_dir, 'images')) + mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mkdir_or_exist(osp.join(out_dir, 'images', 'test')) + mkdir_or_exist(osp.join(out_dir, 'annotations')) + mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + mkdir_or_exist(osp.join(out_dir, 'annotations', 'test')) + + print('Generating images and annotations...') + # process data from the child dir on the first rank + cur_dir, dirs, files = list(os.walk(raw_data_root))[0] + print('====================') + + files = list(filter(lambda x: x.endswith('.zip'), files)) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + for file in files: + # search data folders for training,validation,test + mode = list( + filter(lambda x: file.lower().find(x) != -1, + ['training', 'test', 'validation']))[0] + file_root = osp.join(tmp_dir, file[:-4]) + file_type = 'images' if file.find('Anno') == -1 and file.find( + 'GT') == -1 else 'annotations' + extract_img(file_root, osp.join(cur_dir, file), out_dir, mode, + file_type) + + print('Done!') + + +if __name__ == '__main__': + main() From 432628b7350a280b0a5ce6913898c1b1e8e785ad Mon Sep 17 00:00:00 2001 From: Tianlong Ai <50650583+AI-Tianlong@users.noreply.github.com> Date: Mon, 6 Feb 2023 18:55:22 +0800 Subject: [PATCH 02/24] [Fix] Rename and Fix bug of projects HieraSeg (old PR #2444) (#2565) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation Supplementary PR #2444 Fix tiny bug and add loss_by_feat() to compute loss to train. The inference process have verified to be accurate. ## Modification - modify `sep_aspp_contrast_head.py` , add `loss_by_feat()` function to train(training still has bug, will fix in future😫) - fix testing commands path error `bash tools/dist_test.sh projects/HieraSeg_project/` to `bash tools/dist_test.sh projects/HieraSeg/` at README.md --- projects/{HieraSeg => hssn}/README.md | 18 ++--- .../configs/_base_/datasets/cityscapes.py | 0 .../configs/_base_/default_runtime.py | 0 .../deeplabv3plus_r50-d8_vd_contrast.py | 0 .../configs/_base_/schedules/schedule_80k.py | 0 ...us_r101-d8_4xb2-80l_cityscapes-512x1024.py | 4 +- .../decode_head/__init__.py | 0 .../decode_head/sep_aspp_contrast_head.py | 76 ++++++++++--------- .../{HieraSeg => hssn}/losses/__init__.py | 0 .../losses/hiera_triplet_loss_cityscape.py | 0 .../losses/tree_triplet_loss.py | 0 11 files changed, 52 insertions(+), 46 deletions(-) rename projects/{HieraSeg => hssn}/README.md (82%) rename projects/{HieraSeg => hssn}/configs/_base_/datasets/cityscapes.py (100%) rename projects/{HieraSeg => hssn}/configs/_base_/default_runtime.py (100%) rename projects/{HieraSeg => hssn}/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py (100%) rename projects/{HieraSeg => hssn}/configs/_base_/schedules/schedule_80k.py (100%) rename projects/{HieraSeg/configs/hieraseg => hssn/configs/hssn}/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py (82%) rename projects/{HieraSeg => hssn}/decode_head/__init__.py (100%) rename projects/{HieraSeg => hssn}/decode_head/sep_aspp_contrast_head.py (76%) rename projects/{HieraSeg => hssn}/losses/__init__.py (100%) rename projects/{HieraSeg => hssn}/losses/hiera_triplet_loss_cityscape.py (100%) rename projects/{HieraSeg => hssn}/losses/tree_triplet_loss.py (100%) diff --git a/projects/HieraSeg/README.md b/projects/hssn/README.md similarity index 82% rename from projects/HieraSeg/README.md rename to projects/hssn/README.md index 5519ec691..c2a74c69f 100644 --- a/projects/HieraSeg/README.md +++ b/projects/hssn/README.md @@ -1,12 +1,10 @@ -# HieraSeg - -Support `Deep Hierarchical Semantic Segmentation` interface on `cityscapes` +# HSSN ## Description Author: AI-Tianlong -This project implements `HieraSeg` inference in the `cityscapes` dataset +This project implements `Deep Hierarchical Semantic Segmentation` inference on `cityscapes` dataset ## Usage @@ -14,17 +12,17 @@ This project implements `HieraSeg` inference in the `cityscapes` dataset - Python 3.8 - PyTorch 1.6 or higher -- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc3 -- mmcv v2.0.0rc3 -- mmengine +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) v1.0.0rc5 +- mmcv v2.0.0rc4 +- mmengine >=0.4.0 ### Dataset preparing -preparing `cityscapes` dataset like this [structure](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/dataset_prepare.md#prepare-datasets) +Preparing `cityscapes` dataset following this [Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/dataset_prepare.md#prepare-datasets) ### Testing commands -please put [`hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth`](https://download.openmmlab.com/mmsegmentation/v0.5/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth) to `mmsegmentation/checkpoints` +Please put [`hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth`](https://download.openmmlab.com/mmsegmentation/v0.5/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth) to `mmsegmentation/checkpoints` #### Multi-GPUs Test @@ -36,7 +34,7 @@ bash tools/dist_test.sh [configs] [model weights] [number of gpu] --tta #### Example ```shell -bash tools/dist_test.sh projects/HieraSeg_project/configs/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py checkpoints/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth 2 --tta +bash tools/dist_test.sh projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py checkpoints/hieraseg_deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024_20230112_125023-bc59a3d1.pth 2 --tta ``` ## Results diff --git a/projects/HieraSeg/configs/_base_/datasets/cityscapes.py b/projects/hssn/configs/_base_/datasets/cityscapes.py similarity index 100% rename from projects/HieraSeg/configs/_base_/datasets/cityscapes.py rename to projects/hssn/configs/_base_/datasets/cityscapes.py diff --git a/projects/HieraSeg/configs/_base_/default_runtime.py b/projects/hssn/configs/_base_/default_runtime.py similarity index 100% rename from projects/HieraSeg/configs/_base_/default_runtime.py rename to projects/hssn/configs/_base_/default_runtime.py diff --git a/projects/HieraSeg/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py b/projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py similarity index 100% rename from projects/HieraSeg/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py rename to projects/hssn/configs/_base_/models/deeplabv3plus_r50-d8_vd_contrast.py diff --git a/projects/HieraSeg/configs/_base_/schedules/schedule_80k.py b/projects/hssn/configs/_base_/schedules/schedule_80k.py similarity index 100% rename from projects/HieraSeg/configs/_base_/schedules/schedule_80k.py rename to projects/hssn/configs/_base_/schedules/schedule_80k.py diff --git a/projects/HieraSeg/configs/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py b/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py similarity index 82% rename from projects/HieraSeg/configs/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py rename to projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py index 0d02bef5d..8f04a2d65 100644 --- a/projects/HieraSeg/configs/hieraseg/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py +++ b/projects/hssn/configs/hssn/hieraseg_deeplabv3plus_r101-d8_4xb2-80l_cityscapes-512x1024.py @@ -5,8 +5,8 @@ _base_ = [ ] custom_imports = dict(imports=[ - 'projects.HieraSeg.decode_head.sep_aspp_contrast_head', - 'projects.HieraSeg.losses.hiera_triplet_loss_cityscape' + 'projects.hssn.decode_head.sep_aspp_contrast_head', + 'projects.hssn.losses.hiera_triplet_loss_cityscape' ]) model = dict( diff --git a/projects/HieraSeg/decode_head/__init__.py b/projects/hssn/decode_head/__init__.py similarity index 100% rename from projects/HieraSeg/decode_head/__init__.py rename to projects/hssn/decode_head/__init__.py diff --git a/projects/HieraSeg/decode_head/sep_aspp_contrast_head.py b/projects/hssn/decode_head/sep_aspp_contrast_head.py similarity index 76% rename from projects/HieraSeg/decode_head/sep_aspp_contrast_head.py rename to projects/hssn/decode_head/sep_aspp_contrast_head.py index 75f67e745..d1d087362 100644 --- a/projects/HieraSeg/decode_head/sep_aspp_contrast_head.py +++ b/projects/hssn/decode_head/sep_aspp_contrast_head.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import List +from typing import List, Tuple import torch import torch.nn as nn @@ -10,6 +10,7 @@ from mmseg.models.decode_heads.sep_aspp_head import DepthwiseSeparableASPPHead from mmseg.models.losses import accuracy from mmseg.models.utils import resize from mmseg.registry import MODELS +from mmseg.utils import SampleList class ProjectionHead(nn.Module): @@ -61,34 +62,16 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): dim_in=2048, norm_cfg=self.norm_cfg, proj=proj) self.register_buffer('step', torch.zeros(1)) - def forward(self, inputs): + def forward(self, inputs) -> Tuple[Tensor]: """Forward function.""" + output = super().forward(inputs) + self.step += 1 embedding = self.proj_head(inputs[-1]) - 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, embedding - def predict_by_feat(self, seg_logits: Tensor, + def predict_by_feat(self, seg_logits: Tuple[Tensor], batch_img_metas: List[dict]) -> Tensor: """Transform a batch of output seg_logits to the input shape. @@ -100,12 +83,13 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): Returns: Tensor: Outputs segmentation logits map. """ - # HieraSeg decode_head output is: (out, embedding) :tuple, + # HSSN decode_head output is: (out, embedding): tuple # only need 'out' here. if isinstance(seg_logits, tuple): seg_logit = seg_logits[0] - if seg_logit.size(1) == 26: + if seg_logit.size(1) == 26: # For cityscapes dataset,19 + 7 + hiera_num_classes = 7 seg_logit[:, 0:2] += seg_logit[:, -7] seg_logit[:, 2:5] += seg_logit[:, -6] seg_logit[:, 5:8] += seg_logit[:, -5] @@ -113,14 +97,18 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): seg_logit[:, 10:11] += seg_logit[:, -3] seg_logit[:, 11:13] += seg_logit[:, -2] seg_logit[:, 13:19] += seg_logit[:, -1] - elif seg_logit.size(1) == 12: + + elif seg_logit.size(1) == 12: # For Pascal_person dataset, 7 + 5 + hiera_num_classes = 5 seg_logit[:, 0:1] = seg_logit[:, 0:1] + \ seg_logit[:, 7] + seg_logit[:, 10] seg_logit[:, 1:5] = seg_logit[:, 1:5] + \ seg_logit[:, 8] + seg_logit[:, 11] seg_logit[:, 5:7] = seg_logit[:, 5:7] + \ seg_logit[:, 9] + seg_logit[:, 11] - elif seg_logit.size(1) == 25: + + elif seg_logit.size(1) == 25: # For LIP dataset, 20 + 5 + hiera_num_classes = 5 seg_logit[:, 0:1] = seg_logit[:, 0:1] + \ seg_logit[:, 20] + seg_logit[:, 23] seg_logit[:, 1:8] = seg_logit[:, 1:8] + \ @@ -136,8 +124,10 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): seg_logit[:, 16:20] = seg_logit[:, 16:20] + \ seg_logit[:, 22] + seg_logit[:, 24] - # seg_logit = seg_logit[:,:-self.test_cfg['hiera_num_classes']] - seg_logit = seg_logit[:, :-7] + # elif seg_logit.size(1) == 144 # For Mapillary dataset, 124+16+4 + # unofficial repository not release mapillary until 2023/2/6 + + seg_logit = seg_logit[:, :-hiera_num_classes] seg_logit = resize( input=seg_logit, size=batch_img_metas[0]['img_shape'], @@ -146,10 +136,27 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): return seg_logit - def losses(self, results, seg_label): - """Compute segmentation loss.""" - seg_logit_before = results[0] - embedding = results[1] + def loss_by_feat( + self, + seg_logits: Tuple[Tensor], # (out, embedding) + batch_data_samples: SampleList) -> dict: + """Compute segmentation loss. Will fix in future. + + Args: + seg_logits (Tuple[Tensor]): The output from decode head + forward function. + For this decode_head output are (out, embedding): tuple + batch_data_samples (List[:obj:`SegDataSample`]): The seg + data samples. It usually includes information such + as `metainfo` and `gt_sem_seg`. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logit_before = seg_logits[0] + embedding = seg_logits[1] + seg_label = self._stack_batch_gt(batch_data_samples) + loss = dict() seg_logit = resize( input=seg_logit_before, @@ -166,6 +173,7 @@ class DepthwiseSeparableASPPContrastHead(DepthwiseSeparableASPPHead): scale_factor=0.5, mode='bilinear', align_corners=self.align_corners) + loss['loss_seg'] = self.loss_decode( self.step, embedding, diff --git a/projects/HieraSeg/losses/__init__.py b/projects/hssn/losses/__init__.py similarity index 100% rename from projects/HieraSeg/losses/__init__.py rename to projects/hssn/losses/__init__.py diff --git a/projects/HieraSeg/losses/hiera_triplet_loss_cityscape.py b/projects/hssn/losses/hiera_triplet_loss_cityscape.py similarity index 100% rename from projects/HieraSeg/losses/hiera_triplet_loss_cityscape.py rename to projects/hssn/losses/hiera_triplet_loss_cityscape.py diff --git a/projects/HieraSeg/losses/tree_triplet_loss.py b/projects/hssn/losses/tree_triplet_loss.py similarity index 100% rename from projects/HieraSeg/losses/tree_triplet_loss.py rename to projects/hssn/losses/tree_triplet_loss.py From b2577e0ba0f751dfc898b048153cad995ae5265f Mon Sep 17 00:00:00 2001 From: MengzhangLI Date: Tue, 7 Feb 2023 14:47:22 +0800 Subject: [PATCH 03/24] [Doc] Add EN custmized runtime doc in dev-1.x (#2533) ## Motivation Translate Chinese version customized runtime doc into English https://github.com/open-mmlab/mmsegmentation/pull/2502. --- docs/en/advanced_guides/customize_runtime.md | 289 +++++++------------ 1 file changed, 106 insertions(+), 183 deletions(-) diff --git a/docs/en/advanced_guides/customize_runtime.md b/docs/en/advanced_guides/customize_runtime.md index f138c226f..33281bfe4 100644 --- a/docs/en/advanced_guides/customize_runtime.md +++ b/docs/en/advanced_guides/customize_runtime.md @@ -1,30 +1,83 @@ # Customize Runtime Settings -## Customize optimization settings +## Customize hooks -### Customize optimizer supported by Pytorch +### Step 1: Implement a new hook -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. +MMEngine has implemented commonly used [hooks](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md) for training and test, +When users have requirements for customization, they can follow examples below. +For example, if some hyper-parameter of the model needs to be changed when model training, we can implement a new hook for it: ```python -optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Sequence + +from mmengine.hooks import Hook +from mmengine.model import is_model_wrapper + +from mmseg.registry import HOOKS + + +@HOOKS.register_module() +class NewHook(Hook): + """Docstring for NewHook. + """ + + def __init__(self, a: int, b: int) -> None: + self.a = a + self.b = b + + def before_train_iter(self, + runner, + batch_idx: int, + data_batch: Optional[Sequence[dict]] = None) -> None: + cur_iter = runner.iter + # acquire this model when it is in a wrapper + if is_model_wrapper(runner.model): + model = runner.model.module + model.hyper_parameter = self.a * cur_iter + self.b ``` -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. +### Step 2: Import a new hook -### Customize self-implemented optimizer +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `NewHook` is implemented in `mmseg/engine/hooks/new_hook.py`, there are two ways to import it: -#### 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`: +- Import it by modifying `mmseg/engine/hooks/__init__.py`. + Modules should be imported in `mmseg/engine/hooks/__init__.py` thus these new modules can be found and added by registry. ```python -from .registry import OPTIMIZERS +from .new_hook import NewHook + +__all__ = [..., NewHook] +``` + +- Import it manually by `custom_imports` in config file. + +```python +custom_imports = dict(imports=['mmseg.engine.hooks.new_hook'], allow_failed_imports=False) +``` + +### Step 3: Modify config file + +Users can set and use customized hooks in training and test followed methods below. +The execution priority of hooks at the same place of `Runner` can be referred [here](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/hook.md#built-in-hooks), +Default priority of customized hook is `NORMAL`. + +```python +custom_hooks = [ + dict(type='NewHook', a=a_value, b=b_value, priority='ABOVE_NORMAL') +] +``` + +## Customize optimizer + +### Step 1: Implement a new optimizer + +We recommend the customized optimizer implemented in `mmseg/engine/optimizers/my_optimizer.py`. Here is an example of a new optimizer `MyOptimizer` which has parameters `a`, `b` and `c`: + +```python +from mmseg.registry import OPTIMIZERS from torch.optim import Optimizer @@ -32,214 +85,84 @@ from torch.optim import Optimizer class MyOptimizer(Optimizer): def __init__(self, a, b, c) - ``` -#### 2. Add the optimizer to registry +### Step 2: Import a new optimizer -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. +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `MyOptimizer` is implemented in `mmseg/engine/optimizers/my_optimizer.py`, there are two ways to import 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: +- Import it by modifying `mmseg/engine/optimizers/__init__.py`. + Modules should be imported in `mmseg/engine/optimizers/__init__.py` thus these new modules can be found and added by registry. ```python from .my_optimizer import MyOptimizer ``` -- Use `custom_imports` in the config to manually import it +- Import it manually by `custom_imports` in config file. ```python -custom_imports = dict(imports=['mmseg.core.optimizer.my_optimizer'], allow_failed_imports=False) +custom_imports = dict(imports=['mmseg.engine.optimizers.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. +### Step 3: Modify config file -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: +Then it needs to modify `optimizer` in `optim_wrapper` of config file, if users want to use customized `MyOptimizer`, it can be modified as: ```python -optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type='OptimWrapper', + optimizer=dict(type='MyOptimizer', + a=a_value, b=b_value, c=c_value), + clip_grad=None) ``` -To use your own optimizer, the field can be changed to +## Customize optimizer constructor + +### Step 1: Implement a new optimizer constructor + +Optimizer constructor is used to create optimizer and optimizer wrapper for model training, which has powerful functions like specifying learning rate and weight decay for different model layers. +Here is an example for a customized optimizer constructor. ```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): +from mmengine.optim import DefaultOptimWrapperConstructor +from mmseg.registry import OPTIM_WRAPPER_CONSTRUCTORS +@OPTIM_WRAPPER_CONSTRUCTORS.register_module() +class LearningRateDecayOptimizerConstructor(DefaultOptimWrapperConstructor): def __init__(self, optim_wrapper_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. +Default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmengine/blob/main/mmengine/optim/optimizer/default_constructor.py#L19). +It can also be used as base class of new optimizer constructor. -### Additional settings +### Step 2: Import a new optimizer constructor -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. +The module which is defined above needs to be imported into main namespace first to ensure being registered. +We assume `MyOptimizerConstructor` is implemented in `mmseg/engine/optimizers/my_optimizer_constructor.py`, there are two ways to import it: -- __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 override the unnecessary settings. See the [config documentation](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 +- Import it by modifying `mmseg/engine/optimizers/__init__.py`. + Modules should be imported in `mmseg/engine/optimizers/__init__.py` thus these new modules can be found and added by registry. ```python -workflow = [('train', 1)] +from .my_optimizer_constructor import MyOptimizerConstructor ``` -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 +- Import it manually by `custom_imports` in config file. ```python -[('train', 1), ('val', 1)] +custom_imports = dict(imports=['mmseg.engine.optimizers.my_optimizer_constructor'], allow_failed_imports=False) ``` -so that 1 epoch for training and 1 epoch for validation will be run iteratively. +### Step 3: Modify config file -:::{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 +Then it needs to modify `constructor` in `optim_wrapper` of config file, if users want to use customized `MyOptimizerConstructor`, it can be modified as: ```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 registered 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') +optim_wrapper = dict(type='OptimWrapper', + constructor='MyOptimizerConstructor', + clip_grad=None) ``` From 916ed2b2e208bf88dfd5180c79baa9883abb8f00 Mon Sep 17 00:00:00 2001 From: wangjiangben-hw <111729245+wangjiangben-hw@users.noreply.github.com> Date: Tue, 7 Feb 2023 16:36:36 +0800 Subject: [PATCH 04/24] [NPU] add npu result (#2569) Motivation add NPU results. Modification add docs/en/device/npu.md and docs/zh_cn/device/npu.md that accompanies the submission results. --------- Co-authored-by: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> --- docs/en/device/npu.md | 36 ++++++++++++++++++++++++++++++++++++ docs/zh_cn/device/npu.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 docs/en/device/npu.md create mode 100644 docs/zh_cn/device/npu.md diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md new file mode 100644 index 000000000..6772e6c4c --- /dev/null +++ b/docs/en/device/npu.md @@ -0,0 +1,36 @@ +# NPU (HUAWEI Ascend) + +## Usage + +Please refer to the [building documentation of MMCV](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) to install MMCV on NPU devices + +Here we use 4 NPUs on your computer to train the model with the following command: + +```shell +bash tools/dist_train.sh configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 4 +``` + +Also, you can use only one NPU to train the model with the following command: + +```shell +python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +``` + +## Models Results + +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | + +**Notes:** + +- If not specially marked, the results on NPU with amp are the basically same as those on the GPU with FP32. + +**All above models are provided by Huawei Ascend group.** diff --git a/docs/zh_cn/device/npu.md b/docs/zh_cn/device/npu.md new file mode 100644 index 000000000..c50030895 --- /dev/null +++ b/docs/zh_cn/device/npu.md @@ -0,0 +1,36 @@ +# NPU (华为 昇腾) + +## 使用方法 + +请参考 [MMCV 的安装文档](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) 来安装 NPU 版本的 MMCV。 + +以下展示单机四卡场景的运行指令: + +```shell +bash tools/dist_train.sh configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 4 +``` + +以下展示单机单卡下的运行指令: + +```shell +python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py +``` + +## 模型验证结果 + +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | + +**注意:** + +- 如果没有特别标记,NPU 上的使用混合精度训练的结果与使用 FP32 的 GPU 上的结果相同。 + +**以上模型结果由华为昇腾团队提供** From 08eb9a4e1d2547cd4e5a13b0db34940d0483778f Mon Sep 17 00:00:00 2001 From: jinxianwei <81373517+jinxianwei@users.noreply.github.com> Date: Wed, 8 Feb 2023 19:53:50 +0800 Subject: [PATCH 05/24] [Doc] for Visualization feature map using wandb backend in dev-1.x (#2557) ## Motivation Docs for Visualization featusre map using wandb backend. ## Modification Add a new markdown file and result demo of wandb. --------- Co-authored-by: MeowZheng --- docs/zh_cn/user_guides/index.rst | 1 + .../user_guides/visualization_feature_map.md | 201 ++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 docs/zh_cn/user_guides/visualization_feature_map.md diff --git a/docs/zh_cn/user_guides/index.rst b/docs/zh_cn/user_guides/index.rst index dacac7969..d0a313d31 100644 --- a/docs/zh_cn/user_guides/index.rst +++ b/docs/zh_cn/user_guides/index.rst @@ -18,3 +18,4 @@ visualization.md useful_tools.md deployment.md + visualization_feature_map.md diff --git a/docs/zh_cn/user_guides/visualization_feature_map.md b/docs/zh_cn/user_guides/visualization_feature_map.md new file mode 100644 index 000000000..fda99bb5a --- /dev/null +++ b/docs/zh_cn/user_guides/visualization_feature_map.md @@ -0,0 +1,201 @@ +# wandb记录特征图可视化 + +MMSegmentation 1.x 提供了 Weights & Biases 的后端支持,方便对项目代码结果的可视化和管理。 + +## Wandb的配置 + +安装 Weights & Biases 的过程可以参考 [官方安装指南](https://docs.wandb.ai/quickstart),具体的步骤如下: + +```shell +pip install wandb +wandb login +``` + +在 `vis_backend` 中添加 `WandbVisBackend`。 + +```python +vis_backends=[dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend'), + dict(type='WandbVisBackend')] +``` + +## 测试数据和结果及特征图的可视化 + +`SegLocalVisualizer` 是继承自 MMEngine 中 `Visualizer` 类的子类,适用于 MMSegmentation 可视化,有关 `Visualizer` 的详细信息请参考在 MMEngine 中的[可视化教程](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html) 。 + +以下是一个关于 `SegLocalVisualizer` 的示例,首先你可以使用下面的命令下载这个案例中的数据: + +

+ +
+ +```shell +wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png +wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png + +wget https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth + +``` + +```python +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser +from typing import Type + +import mmcv +import torch +import torch.nn as nn + +from mmengine.model import revert_sync_batchnorm +from mmengine.structures import PixelData +from mmseg.apis import inference_model, init_model +from mmseg.structures import SegDataSample +from mmseg.utils import register_all_modules +from mmseg.visualization import SegLocalVisualizer + + +class Recorder: + """record the forward output feature map and save to data_buffer.""" + + def __init__(self) -> None: + self.data_buffer = list() + + def __enter__(self, ): + self._data_buffer = list() + + def record_data_hook(self, model: nn.Module, input: Type, output: Type): + self.data_buffer.append(output) + + def __exit__(self, *args, **kwargs): + pass + + +def visualize(args, model, recorder, result): + seg_visualizer = SegLocalVisualizer( + vis_backends=[dict(type='WandbVisBackend')], + save_dir='temp_dir', + alpha=0.5) + seg_visualizer.dataset_meta = dict( + classes=model.dataset_meta['classes'], + palette=model.dataset_meta['palette']) + + image = mmcv.imread(args.img, 'color') + + seg_visualizer.add_datasample( + name='predict', + image=image, + data_sample=result, + draw_gt=False, + draw_pred=True, + wait_time=0, + out_file=None, + show=False) + + # add feature map to wandb visualizer + for i in range(len(recorder.data_buffer)): + feature = recorder.data_buffer[i][0] # remove the batch + drawn_img = seg_visualizer.draw_featmap( + feature, image, channel_reduction='select_max') + seg_visualizer.add_image(f'feature_map{i}', drawn_img) + + if args.gt_mask: + sem_seg = mmcv.imread(args.gt_mask, 'unchanged') + sem_seg = torch.from_numpy(sem_seg) + gt_mask = dict(data=sem_seg) + gt_mask = PixelData(**gt_mask) + data_sample = SegDataSample() + data_sample.gt_sem_seg = gt_mask + + seg_visualizer.add_datasample( + name='gt_mask', + image=image, + data_sample=data_sample, + draw_gt=True, + draw_pred=False, + wait_time=0, + out_file=None, + show=False) + + seg_visualizer.add_image('image', image) + + +def main(): + parser = ArgumentParser( + description='Draw the Feature Map During Inference') + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--gt_mask', default=None, help='Path of gt mask file') + parser.add_argument('--out-file', default=None, help='Path to output file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + parser.add_argument( + '--title', default='result', help='The image identifier.') + args = parser.parse_args() + + register_all_modules() + + # build the model from a config file and a checkpoint file + model = init_model(args.config, args.checkpoint, device=args.device) + if args.device == 'cpu': + model = revert_sync_batchnorm(model) + + # show all named module in the model and use it in source list below + for name, module in model.named_modules(): + print(name) + + source = [ + 'decode_head.fusion.stages.0.query_project.activate', + 'decode_head.context.stages.0.key_project.activate', + 'decode_head.context.bottleneck.activate' + ] + source = dict.fromkeys(source) + + count = 0 + recorder = Recorder() + # registry the forward hook + for name, module in model.named_modules(): + if name in source: + count += 1 + module.register_forward_hook(recorder.record_data_hook) + if count == len(source): + break + + with recorder: + # test a single image, and record feature map to data_buffer + result = inference_model(model, args.img) + + visualize(args, model, recorder, result) + + +if __name__ == '__main__': + main() + +``` + +将上述代码保存为 feature_map_visual.py,在终端执行如下代码 + +```shell +python feature_map_visual.py ${图像} ${配置文件} ${检查点文件} [可选参数] +``` + +样例 + +```shell +python feature_map_visual.py \ +aachen_000000_000019_leftImg8bit.png \ +configs/ann/ann_r50-d8_4xb2-40k_cityscapes-512x1024.py \ +ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth \ +--gt_mask aachen_000000_000019_gtFine_labelTrainIds.png +``` + +可视化后的图像结果和它的对应的 feature map图像会出现在wandb账户中 + +
+ +
From 2cbc3cf183e653f39446b12665e27b55e03599b5 Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Fri, 10 Feb 2023 14:29:06 +0800 Subject: [PATCH 06/24] [Fix] Fix the benchmark model list (#2582) as title --- .dev/batch_test_list.py | 38 +++++++++++++++++++------------------- .dev/batch_train_list.txt | 38 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.dev/batch_test_list.py b/.dev/batch_test_list.py index c4fd8f97e..0d096ed94 100644 --- a/.dev/batch_test_list.py +++ b/.dev/batch_test_list.py @@ -2,25 +2,25 @@ # Inference Speed is tested on NVIDIA V100 hrnet = [ dict( - config='configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py', + config='configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py', checkpoint='fcn_hr18s_512x512_160k_ade20k_20200614_214413-870f65ac.pth', # noqa eval='mIoU', metric=dict(mIoU=33.0), ), dict( - config='configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py', + config='configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py', checkpoint='fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth', # noqa eval='mIoU', metric=dict(mIoU=76.31), ), dict( - config='configs/hrnet/fcn_hr48_512x512_160k_ade20k.py', + config='configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py', checkpoint='fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth', eval='mIoU', metric=dict(mIoU=42.02), ), dict( - config='configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py', + config='configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py', checkpoint='fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth', # noqa eval='mIoU', metric=dict(mIoU=80.65), @@ -28,25 +28,25 @@ hrnet = [ ] pspnet = [ dict( - config='configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py', + config='configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py', checkpoint='pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth', # noqa eval='mIoU', metric=dict(mIoU=78.55), ), dict( - config='configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py', + config='configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py', checkpoint='pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth', # noqa eval='mIoU', metric=dict(mIoU=79.76), ), dict( - config='configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py', + config='configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py', checkpoint='pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth', # noqa eval='mIoU', metric=dict(mIoU=44.39), ), dict( - config='configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py', + config='configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py', checkpoint='pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth', # noqa eval='mIoU', metric=dict(mIoU=42.48), @@ -54,13 +54,13 @@ pspnet = [ ] resnest = [ dict( - config='configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py', + config='configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py', # noqa checkpoint='pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth', # noqa eval='mIoU', metric=dict(mIoU=45.44), ), dict( - config='configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py', + config='configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py', # noqa checkpoint='pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth', # noqa eval='mIoU', metric=dict(mIoU=78.57), @@ -68,7 +68,7 @@ resnest = [ ] fastscnn = [ dict( - config='configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py', + config='configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py', checkpoint='fast_scnn_8x4_160k_lr0.12_cityscapes-0cec9937.pth', eval='mIoU', metric=dict(mIoU=70.96), @@ -76,25 +76,25 @@ fastscnn = [ ] deeplabv3plus = [ dict( - config='configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py', # noqa + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py', # noqa checkpoint='deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405-a7573d20.pth', # noqa eval='mIoU', metric=dict(mIoU=80.98), ), dict( - config='configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py', # noqa + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py', # noqa checkpoint='deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth', # noqa eval='mIoU', metric=dict(mIoU=80.97), ), dict( - config='configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py', # noqa + config='configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py', # noqa checkpoint='deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth', # noqa eval='mIoU', metric=dict(mIoU=80.09), ), dict( - config='configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py', # noqa + config='configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py', # noqa checkpoint='deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth', # noqa eval='mIoU', metric=dict(mIoU=79.83), @@ -102,13 +102,13 @@ deeplabv3plus = [ ] vit = [ dict( - config='configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py', + config='configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py', # noqa checkpoint='upernet_vit-b16_ln_mln_512x512_160k_ade20k-f444c077.pth', eval='mIoU', metric=dict(mIoU=47.73), ), dict( - config='configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py', + config='configs/vit/vit_deit-s16-ln_mln_upernet_512x512_160k_ade20k-512x512.py', # noqa checkpoint='upernet_deit-s16_ln_mln_512x512_160k_ade20k-c0cd652f.pth', eval='mIoU', metric=dict(mIoU=43.52), @@ -116,7 +116,7 @@ vit = [ ] fp16 = [ dict( - config='configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py', # noqa + config='configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py', # noqa checkpoint='deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes_20200717_230920-f1104f4b.pth', # noqa eval='mIoU', metric=dict(mIoU=80.46), @@ -124,7 +124,7 @@ fp16 = [ ] swin = [ dict( - config='configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py', # noqa + config='configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py', # noqa checkpoint='upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210531_112542-e380ad3e.pth', # noqa eval='mIoU', metric=dict(mIoU=44.41), diff --git a/.dev/batch_train_list.txt b/.dev/batch_train_list.txt index 17d19932e..6c1a122dc 100644 --- a/.dev/batch_train_list.txt +++ b/.dev/batch_train_list.txt @@ -1,19 +1,19 @@ -configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py -configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py -configs/hrnet/fcn_hr48_512x512_160k_ade20k.py -configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py -configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py -configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py -configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py -configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py -configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py -configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py -configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py -configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py -configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py -configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py -configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py -configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py -configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py -configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py -configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py +configs/hrnet/fcn_hr18s_4xb4-160k_ade20k-512x512.py +configs/hrnet/fcn_hr18s_4xb2-160k_cityscapes-512x1024.py +configs/hrnet/fcn_hr48_4xb4-160k_ade20k-512x512.py +configs/hrnet/fcn_hr48_4xb2-160k_cityscapes-512x1024.py +configs/pspnet/pspnet_r50-d8_4xb2-80k_cityscapes-512x1024.py +configs/pspnet/pspnet_r101-d8_4xb2-80k_cityscapes-512x1024.py +configs/pspnet/pspnet_r101-d8_4xb4-160k_ade20k-512x512.py +configs/pspnet/pspnet_r50-d8_4xb4-160k_ade20k-512x512.py +configs/resnest/resnest_s101-d8_pspnet_4xb4-160k_ade20k-512x512.py +configs/resnest/resnest_s101-d8_pspnet_4xb2-80k_cityscapes512x1024.py +configs/fastscnn/fast_scnn_8xb4-160k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-769x769.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-80k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-512x1024.py +configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-80k_cityscapes-769x769.py +configs/vit/vit_vit-b16-ln_mln_upernet_8xb2-160k_ade20k-512x512.py +configs/vit/vit_deit-s16-ln_mln_upernet_512x512_160k_ade20k-512x512.py +configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-amp-80k_cityscapes-512x1024.py +configs/swin/swin-tiny-patch4-window7-in1k-pre_upernet_8xb2-160k_ade20k-512x512.py From e289eb273e13f35332cd83c73d82424ccb26e038 Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Fri, 10 Feb 2023 14:31:31 +0800 Subject: [PATCH 07/24] [Fix] Fix the benchmark model list (#2582) as title From 712612b1a1a873a4975b6afa6513c9bc0122adaf Mon Sep 17 00:00:00 2001 From: Yijie Zheng <67947949+VoyagerXvoyagerx@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:14:22 +0800 Subject: [PATCH 08/24] [Doc] fix api name error in the migration doc (#2601) as title --- docs/en/migration/package.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/migration/package.md b/docs/en/migration/package.md index 95fefe131..c0aa1d6e3 100644 --- a/docs/en/migration/package.md +++ b/docs/en/migration/package.md @@ -82,7 +82,7 @@ Here is the changes of `mmseg.apis`: | Function | Changes | | :-------------------: | :---------------------------------------------- | | `init_segmentor` | Renamed to `init_model` | -| `inference_segmentor` | Rename to `inference_segmentor` | +| `inference_segmentor` | Rename to `inference_model` | | `show_result_pyplot` | Implemented based on `SegLocalVisualizer` | | `train_model` | Removed, use `runner.train` to train. | | `multi_gpu_test` | Removed, use `runner.test` to test. | From fdf7585bbab20662974f5597ce3508332905c351 Mon Sep 17 00:00:00 2001 From: vansin Date: Wed, 15 Feb 2023 11:29:53 +0800 Subject: [PATCH 09/24] docs: Add twitter discord medium youtube link (#2602) as title --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 308fca871..ebe0debc4 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,6 @@
 
- -
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mmsegmentation)](https://pypi.org/project/mmsegmentation/) [![PyPI](https://img.shields.io/pypi/v/mmsegmentation)](https://pypi.org/project/mmsegmentation) @@ -33,6 +31,22 @@ Documentation: English | [简体中文](README_zh-CN.md) + + +
+ ## Introduction MMSegmentation is an open source semantic segmentation toolbox based on PyTorch. From 9b8e8b730c2a17e9f0517489cb707e981e0eab39 Mon Sep 17 00:00:00 2001 From: wangjiangben-hw <111729245+wangjiangben-hw@users.noreply.github.com> Date: Wed, 15 Feb 2023 12:03:01 +0800 Subject: [PATCH 10/24] [NPU] add npu result (#2596) Motivation add NPU results -- apcnet, bisenetv1, bisenetv2 Modification add docs/en/device/npu.md and docs/zh_cn/device/npu.md that accompanies the submission results. --------- Co-authored-by: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> --- docs/en/device/npu.md | 23 +++++++++++++---------- docs/en/index.rst | 6 +++++- docs/zh_cn/device/npu.md | 23 +++++++++++++---------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md index 6772e6c4c..9468dfd97 100644 --- a/docs/en/device/npu.md +++ b/docs/en/device/npu.md @@ -18,16 +18,19 @@ python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512 ## Models Results -| Model | mIoU | Config | Download | -| :-----------------: | :---: | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | -| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | -| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | -| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | -| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | -| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | -| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | -| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | -| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :-------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | **Notes:** diff --git a/docs/en/index.rst b/docs/en/index.rst index 63cfb924c..cdf8622f9 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -45,13 +45,17 @@ Welcome to MMSegmentation's documentation! notes/changelog.md notes/faq.md +.. toctree:: + :caption: Device Support + + device/npu.md + .. toctree:: :caption: Switch Language switch_language.md - Indices and tables ================== diff --git a/docs/zh_cn/device/npu.md b/docs/zh_cn/device/npu.md index c50030895..d7334fdc1 100644 --- a/docs/zh_cn/device/npu.md +++ b/docs/zh_cn/device/npu.md @@ -18,16 +18,19 @@ python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512 ## 模型验证结果 -| Model | mIoU | Config | Download | -| :-----------------: | :---: | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | -| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | -| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | -| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | -| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | -| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | -| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | -| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | -| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :-------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | **注意:** From 2e27f8b678a93c0137139874975192bbed37527c Mon Sep 17 00:00:00 2001 From: CSH <40987381+csatsurnh@users.noreply.github.com> Date: Wed, 15 Feb 2023 19:02:00 +0800 Subject: [PATCH 11/24] [Enhancement]Replace numpy ascontiguousarray with torch contiguous to speed-up (#2604) ## Motivation Original motivation was after [MMDetection PR #9533](https://github.com/open-mmlab/mmdetection/pull/9533) With several experiments I found out that if a ndarray is contiguous, numpy.transpose + torch.contiguous perform better, while if not, then use numpy.ascontiguousarray + numpy.transpose ## Modification Replace numpy.ascontiguousarray with torch.contiguous in [PackSegInputs](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/datasets/transforms/formatting.py) Co-authored-by: MeowZheng --- mmseg/datasets/transforms/formatting.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mmseg/datasets/transforms/formatting.py b/mmseg/datasets/transforms/formatting.py index f4018f788..4391161df 100644 --- a/mmseg/datasets/transforms/formatting.py +++ b/mmseg/datasets/transforms/formatting.py @@ -63,8 +63,12 @@ class PackSegInputs(BaseTransform): img = results['img'] if len(img.shape) < 3: img = np.expand_dims(img, -1) - img = np.ascontiguousarray(img.transpose(2, 0, 1)) - packed_results['inputs'] = to_tensor(img) + if not img.flags.c_contiguous: + img = to_tensor(np.ascontiguousarray(img.transpose(2, 0, 1))) + else: + img = img.transpose(2, 0, 1) + img = to_tensor(img).contiguous() + packed_results['inputs'] = img data_sample = SegDataSample() if 'gt_seg_map' in results: From a947e3e7547c59e9079a424454f4a0faa7efdc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=98=95=E8=BE=B0?= Date: Thu, 16 Feb 2023 15:33:52 +0800 Subject: [PATCH 12/24] [FIx] Set default `backend_args` values to None (#2597) ## Motivation In MMEngine >= 0.2.0, it might directly determine what the backend is by using the `data_root` path. ## Modification Set all default `backend_args` values are `None`. --- configs/_base_/datasets/ade20k.py | 2 +- configs/_base_/datasets/ade20k_640x640.py | 2 +- configs/_base_/datasets/chase_db1.py | 2 +- configs/_base_/datasets/cityscapes.py | 2 +- configs/_base_/datasets/coco-stuff10k.py | 2 +- configs/_base_/datasets/coco-stuff164k.py | 2 +- configs/_base_/datasets/drive.py | 2 +- configs/_base_/datasets/hrf.py | 2 +- configs/_base_/datasets/isaid.py | 2 +- configs/_base_/datasets/loveda.py | 2 +- configs/_base_/datasets/pascal_context_59.py | 2 +- configs/_base_/datasets/pascal_voc12.py | 2 +- configs/_base_/datasets/pascal_voc12_aug.py | 2 +- configs/_base_/datasets/potsdam.py | 2 +- configs/_base_/datasets/stare.py | 2 +- configs/_base_/datasets/vaihingen.py | 2 +- docs/en/migration/interface.md | 2 +- mmseg/datasets/basesegdataset.py | 42 +++++++------- mmseg/datasets/transforms/loading.py | 60 +++++++++----------- mmseg/engine/hooks/visualization_hook.py | 10 ++-- tests/test_datasets/test_loading.py | 12 ++-- 21 files changed, 75 insertions(+), 83 deletions(-) diff --git a/configs/_base_/datasets/ade20k.py b/configs/_base_/datasets/ade20k.py index 2c01b2ff5..48340d11e 100644 --- a/configs/_base_/datasets/ade20k.py +++ b/configs/_base_/datasets/ade20k.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/ade20k_640x640.py b/configs/_base_/datasets/ade20k_640x640.py index 866403b27..c1f642da7 100644 --- a/configs/_base_/datasets/ade20k_640x640.py +++ b/configs/_base_/datasets/ade20k_640x640.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/chase_db1.py b/configs/_base_/datasets/chase_db1.py index 62dd3b3cb..ed47c2dbe 100644 --- a/configs/_base_/datasets/chase_db1.py +++ b/configs/_base_/datasets/chase_db1.py @@ -26,7 +26,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/cityscapes.py b/configs/_base_/datasets/cityscapes.py index b7d95c1ec..b63a4cdfe 100644 --- a/configs/_base_/datasets/cityscapes.py +++ b/configs/_base_/datasets/cityscapes.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/coco-stuff10k.py b/configs/_base_/datasets/coco-stuff10k.py index 9d3026bd4..5d6bb12b9 100644 --- a/configs/_base_/datasets/coco-stuff10k.py +++ b/configs/_base_/datasets/coco-stuff10k.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/coco-stuff164k.py b/configs/_base_/datasets/coco-stuff164k.py index c785e313f..baf633f9d 100644 --- a/configs/_base_/datasets/coco-stuff164k.py +++ b/configs/_base_/datasets/coco-stuff164k.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/drive.py b/configs/_base_/datasets/drive.py index 3bd6080aa..6a3dd82c6 100644 --- a/configs/_base_/datasets/drive.py +++ b/configs/_base_/datasets/drive.py @@ -26,7 +26,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/hrf.py b/configs/_base_/datasets/hrf.py index b0ae34abe..353d07047 100644 --- a/configs/_base_/datasets/hrf.py +++ b/configs/_base_/datasets/hrf.py @@ -26,7 +26,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/isaid.py b/configs/_base_/datasets/isaid.py index 8407e06ac..5cd4309f6 100644 --- a/configs/_base_/datasets/isaid.py +++ b/configs/_base_/datasets/isaid.py @@ -32,7 +32,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/loveda.py b/configs/_base_/datasets/loveda.py index 8ecc91965..b93bc74af 100644 --- a/configs/_base_/datasets/loveda.py +++ b/configs/_base_/datasets/loveda.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/pascal_context_59.py b/configs/_base_/datasets/pascal_context_59.py index bb144dd20..7f31043ed 100644 --- a/configs/_base_/datasets/pascal_context_59.py +++ b/configs/_base_/datasets/pascal_context_59.py @@ -28,7 +28,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/pascal_voc12.py b/configs/_base_/datasets/pascal_voc12.py index 0fa3d5576..5235ca9cf 100644 --- a/configs/_base_/datasets/pascal_voc12.py +++ b/configs/_base_/datasets/pascal_voc12.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/pascal_voc12_aug.py b/configs/_base_/datasets/pascal_voc12_aug.py index 8b358cc0c..69c365488 100644 --- a/configs/_base_/datasets/pascal_voc12_aug.py +++ b/configs/_base_/datasets/pascal_voc12_aug.py @@ -27,7 +27,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/potsdam.py b/configs/_base_/datasets/potsdam.py index 4439f4191..95f603935 100644 --- a/configs/_base_/datasets/potsdam.py +++ b/configs/_base_/datasets/potsdam.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/stare.py b/configs/_base_/datasets/stare.py index e55519b59..b7545dc62 100644 --- a/configs/_base_/datasets/stare.py +++ b/configs/_base_/datasets/stare.py @@ -26,7 +26,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/configs/_base_/datasets/vaihingen.py b/configs/_base_/datasets/vaihingen.py index 2b3fa7609..6c78994fe 100644 --- a/configs/_base_/datasets/vaihingen.py +++ b/configs/_base_/datasets/vaihingen.py @@ -25,7 +25,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/docs/en/migration/interface.md b/docs/en/migration/interface.md index 1bc3d206e..d75f8ec3e 100644 --- a/docs/en/migration/interface.md +++ b/docs/en/migration/interface.md @@ -237,7 +237,7 @@ test_pipeline = [ ] img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] tta_pipeline = [ - dict(type='LoadImageFromFile', backend_args=dict(backend='local')), + dict(type='LoadImageFromFile', backend_args=None), dict( type='TestTimeAug', transforms=[ diff --git a/mmseg/datasets/basesegdataset.py b/mmseg/datasets/basesegdataset.py index bf433b209..ddf476bae 100644 --- a/mmseg/datasets/basesegdataset.py +++ b/mmseg/datasets/basesegdataset.py @@ -73,38 +73,36 @@ class BaseSegDataset(BaseDataset): ignore_index (int): The label index to be ignored. Default: 255 reduce_zero_label (bool): Whether to mark label zero as ignored. Default to False. - backend_args (dict): Arguments to instantiate a file backend. + backend_args (dict, Optional): Arguments to instantiate a file backend. See https://mmengine.readthedocs.io/en/latest/api/fileio.htm - for details. Defaults to ``dict(backend='local')`` + for details. Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ METAINFO: dict = dict() - def __init__( - self, - ann_file: str = '', - img_suffix='.jpg', - seg_map_suffix='.png', - metainfo: Optional[dict] = None, - data_root: Optional[str] = None, - data_prefix: dict = dict(img_path='', seg_map_path=''), - filter_cfg: Optional[dict] = None, - indices: Optional[Union[int, Sequence[int]]] = None, - serialize_data: bool = True, - pipeline: List[Union[dict, Callable]] = [], - test_mode: bool = False, - lazy_init: bool = False, - max_refetch: int = 1000, - ignore_index: int = 255, - reduce_zero_label: bool = False, - backend_args: dict = dict(backend='local') - ) -> None: + def __init__(self, + ann_file: str = '', + img_suffix='.jpg', + seg_map_suffix='.png', + metainfo: Optional[dict] = None, + data_root: Optional[str] = None, + data_prefix: dict = dict(img_path='', seg_map_path=''), + filter_cfg: Optional[dict] = None, + indices: Optional[Union[int, Sequence[int]]] = None, + serialize_data: bool = True, + pipeline: List[Union[dict, Callable]] = [], + test_mode: bool = False, + lazy_init: bool = False, + max_refetch: int = 1000, + ignore_index: int = 255, + reduce_zero_label: bool = False, + backend_args: Optional[dict] = None) -> None: self.img_suffix = img_suffix self.seg_map_suffix = seg_map_suffix self.ignore_index = ignore_index self.reduce_zero_label = reduce_zero_label - self.backend_args = backend_args.copy() + self.backend_args = backend_args.copy() if backend_args else None self.data_root = data_root self.data_prefix = copy.copy(data_prefix) diff --git a/mmseg/datasets/transforms/loading.py b/mmseg/datasets/transforms/loading.py index 5a413717b..492f2063e 100644 --- a/mmseg/datasets/transforms/loading.py +++ b/mmseg/datasets/transforms/loading.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import warnings -from typing import Dict +from typing import Dict, Optional import mmcv import mmengine.fileio as fileio @@ -56,14 +56,14 @@ class LoadAnnotations(MMCV_LoadAnnotations): Defaults to 'pillow'. backend_args (dict): Arguments to instantiate a file backend. See https://mmengine.readthedocs.io/en/latest/api/fileio.htm - for details. Defaults to ``dict(backend='local')`` + for details. Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ def __init__( self, reduce_zero_label=None, - backend_args=dict(backend='local'), + backend_args=None, imdecode_backend='pillow', ) -> None: super().__init__( @@ -203,23 +203,21 @@ class LoadBiomedicalImageFromFile(BaseTransform): to_float32 (bool): Whether to convert the loaded image to a float32 numpy array. If set to False, the loaded image is an float64 array. Defaults to True. - backend_args (dict): Arguments to instantiate a file backend. + backend_args (dict, Optional): Arguments to instantiate a file backend. See https://mmengine.readthedocs.io/en/latest/api/fileio.htm - for details. Defaults to ``dict(backend='local')`` + for details. Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ - def __init__( - self, - decode_backend: str = 'nifti', - to_xyz: bool = False, - to_float32: bool = True, - backend_args: dict = dict(backend='local') - ) -> None: + def __init__(self, + decode_backend: str = 'nifti', + to_xyz: bool = False, + to_float32: bool = True, + backend_args: Optional[dict] = None) -> None: self.decode_backend = decode_backend self.to_xyz = to_xyz self.to_float32 = to_float32 - self.backend_args = backend_args.copy() + self.backend_args = backend_args.copy() if backend_args else None def transform(self, results: Dict) -> Dict: """Functions to load image. @@ -295,24 +293,22 @@ class LoadBiomedicalAnnotation(BaseTransform): to_float32 (bool): Whether to convert the loaded seg map to a float32 numpy array. If set to False, the loaded image is an float64 array. Defaults to True. - backend_args (dict): Arguments to instantiate a file backend. + backend_args (dict, Optional): Arguments to instantiate a file backend. See :class:`mmengine.fileio` for details. - Defaults to ``dict(backend='local')``. + Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ - def __init__( - self, - decode_backend: str = 'nifti', - to_xyz: bool = False, - to_float32: bool = True, - backend_args: dict = dict(backend='local') - ) -> None: + def __init__(self, + decode_backend: str = 'nifti', + to_xyz: bool = False, + to_float32: bool = True, + backend_args: Optional[dict] = None) -> None: super().__init__() self.decode_backend = decode_backend self.to_xyz = to_xyz self.to_float32 = to_float32 - self.backend_args = backend_args.copy() + self.backend_args = backend_args.copy() if backend_args else None def transform(self, results: Dict) -> Dict: """Functions to load image. @@ -384,23 +380,21 @@ class LoadBiomedicalData(BaseTransform): backend is 'nifti'. Defaults to 'nifti'. to_xyz (bool): Whether transpose data from Z, Y, X to X, Y, Z. Defaults to False. - backend_args (dict): Arguments to instantiate a file backend. + backend_args (dict, Optional): Arguments to instantiate a file backend. See https://mmengine.readthedocs.io/en/latest/api/fileio.htm - for details. Defaults to ``dict(backend='local')`` + for details. Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ - def __init__( - self, - with_seg=False, - decode_backend: str = 'numpy', - to_xyz: bool = False, - backend_args: dict = dict(backend='local') - ) -> None: # noqa + def __init__(self, + with_seg=False, + decode_backend: str = 'numpy', + to_xyz: bool = False, + backend_args: Optional[dict] = None) -> None: # noqa self.with_seg = with_seg self.decode_backend = decode_backend self.to_xyz = to_xyz - self.backend_args = backend_args.copy() + self.backend_args = backend_args.copy() if backend_args else None def transform(self, results: Dict) -> Dict: """Functions to load image. diff --git a/mmseg/engine/hooks/visualization_hook.py b/mmseg/engine/hooks/visualization_hook.py index 25aa1cf8b..1e7c97afe 100644 --- a/mmseg/engine/hooks/visualization_hook.py +++ b/mmseg/engine/hooks/visualization_hook.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp import warnings -from typing import Sequence +from typing import Optional, Sequence import mmcv import mmengine.fileio as fileio @@ -30,9 +30,9 @@ class SegVisualizationHook(Hook): interval (int): The interval of visualization. Defaults to 50. show (bool): Whether to display the drawn image. Default to False. wait_time (float): The interval of show (s). Defaults to 0. - backend_args (dict): Arguments to instantiate a file backend. + backend_args (dict, Optional): Arguments to instantiate a file backend. See https://mmengine.readthedocs.io/en/latest/api/fileio.htm - for details. Defaults to ``dict(backend='local')`` + for details. Defaults to None. Notes: mmcv>=2.0.0rc4, mmengine>=0.2.0 required. """ @@ -41,7 +41,7 @@ class SegVisualizationHook(Hook): interval: int = 50, show: bool = False, wait_time: float = 0., - backend_args: dict = dict(backend='local')): + backend_args: Optional[dict] = None): self._visualizer: SegLocalVisualizer = \ SegLocalVisualizer.get_current_instance() self.interval = interval @@ -55,7 +55,7 @@ class SegVisualizationHook(Hook): 'needs to be excluded.') self.wait_time = wait_time - self.backend_args = backend_args.copy() + self.backend_args = backend_args.copy() if backend_args else None self.draw = draw if not self.draw: warnings.warn('The draw is False, it means that the ' diff --git a/tests/test_datasets/test_loading.py b/tests/test_datasets/test_loading.py index 100eb042e..5ce624bff 100644 --- a/tests/test_datasets/test_loading.py +++ b/tests/test_datasets/test_loading.py @@ -57,9 +57,9 @@ class TestLoading: results = transform(copy.deepcopy(results)) assert results['gt_seg_map'].shape == (288, 512) assert results['gt_seg_map'].dtype == np.uint8 - # assert repr(transform) == transform.__class__.__name__ + \ - # "(reduce_zero_label=True, imdecode_backend='pillow', " + \ - # "backend_args={'backend': 'local'})" + assert repr(transform) == transform.__class__.__name__ + \ + "(reduce_zero_label=True, imdecode_backend='pillow', " + \ + 'backend_args=None)' # reduce_zero_label transform = LoadAnnotations(reduce_zero_label=True) @@ -241,7 +241,7 @@ class TestLoading: "decode_backend='nifti', " 'to_xyz=False, ' 'to_float32=True, ' - "backend_args={'backend': 'local'})") + 'backend_args=None)') def test_load_biomedical_annotation(self): results = dict( @@ -265,7 +265,7 @@ class TestLoading: 'with_seg=True, ' "decode_backend='numpy', " 'to_xyz=False, ' - "backend_args={'backend': 'local'})") + 'backend_args=None)') transform = LoadBiomedicalData(with_seg=False) results = transform(copy.deepcopy(input_results)) @@ -275,4 +275,4 @@ class TestLoading: 'with_seg=False, ' "decode_backend='numpy', " 'to_xyz=False, ' - "backend_args={'backend': 'local'})") + 'backend_args=None)') From e9d5b036078907a0e261b0082a6dd1cd55cff292 Mon Sep 17 00:00:00 2001 From: wangjiangben-hw <111729245+wangjiangben-hw@users.noreply.github.com> Date: Thu, 16 Feb 2023 17:43:18 +0800 Subject: [PATCH 13/24] [DOC] update link in NPU DOC (#2610) ## Motivation update link in dock ## Modification docs/en/device/npu.md docs/zh_cn/device/npu.md --- docs/en/device/npu.md | 26 +++++++++++++------------- docs/zh_cn/device/npu.md | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md index 9468dfd97..a90d6ac43 100644 --- a/docs/en/device/npu.md +++ b/docs/en/device/npu.md @@ -18,19 +18,19 @@ python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512 ## Models Results -| Model | mIoU | Config | Download | -| :-----------------: | :---: | :-------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | -| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | -| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | -| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | -| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | -| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | -| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | -| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | -| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | -| [apcnet](<>) | 78.02 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | -| [bisenetv1](<>) | 76.04 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | -| [bisenetv2](<>) | 72.44 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :----------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | **Notes:** diff --git a/docs/zh_cn/device/npu.md b/docs/zh_cn/device/npu.md index d7334fdc1..d50439d04 100644 --- a/docs/zh_cn/device/npu.md +++ b/docs/zh_cn/device/npu.md @@ -18,19 +18,19 @@ python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512 ## 模型验证结果 -| Model | mIoU | Config | Download | -| :-----------------: | :---: | :-------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | -| [deeplabv3](<>) | 78.85 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | -| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | -| [hrnet](<>) | 78.1 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | -| [fcn](<>) | 74.15 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | -| [icnet](<>) | 69.25 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | -| [pspnet](<>) | 77.21 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | -| [unet](<>) | 68.86 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | -| [upernet](<>) | 77.81 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | -| [apcnet](<>) | 78.02 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | -| [bisenetv1](<>) | 76.04 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | -| [bisenetv2](<>) | 72.44 | [config](https://github.com/wangjiangben-hw/mmsegmentation/blob/master/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | +| Model | mIoU | Config | Download | +| :-----------------: | :---: | :----------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | +| [deeplabv3](<>) | 78.85 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024_20230115_205626.json) | +| [deeplabv3plus](<>) | 79.23 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/deeplabv3plus_r50-d8_4xb2-40k_cityscapes-512x1024_20230116_043450.json) | +| [hrnet](<>) | 78.1 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/hrnet/fcn_hr18_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_hr18_4xb2-40k_cityscapes-512x1024_20230116_215821.json) | +| [fcn](<>) | 74.15 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/fcn_r50-d8_4xb2-40k_cityscapes-512x1024_20230111_083014.json) | +| [icnet](<>) | 69.25 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/icnet/icnet_r50-d8_4xb2-80k_cityscapes-832x832.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/icnet_r50-d8_4xb2-80k_cityscapes-832x832_20230119_002929.json) | +| [pspnet](<>) | 77.21 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/pspnet/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/pspnet_r50b-d8_4xb2-80k_cityscapes-512x1024_20230114_042721.json) | +| [unet](<>) | 68.86 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024_20230129_224750.json) | +| [upernet](<>) | 77.81 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/upernet_r50_4xb2-40k_cityscapes-512x1024_20230129_014634.json) | +| [apcnet](<>) | 78.02 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/apcnet/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/apcnet_r50-d8_4xb2-40k_cityscapes-512x1024_20230209_212545.json) | +| [bisenetv1](<>) | 76.04 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv1/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv1_r50-d32_4xb4-160k_cityscapes-1024x1024_20230201_023946.json) | +| [bisenetv2](<>) | 72.44 | [config](https://github.com/open-mmlab/mmsegmentation/tree/1.x/configs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/device/npu/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024_20230205_215606.json) | **注意:** From 2d38bc8554b31cf2f3961ae3ddb65d23033e6aec Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Wed, 22 Feb 2023 19:18:12 +0800 Subject: [PATCH 14/24] [Enhancement] Refine projects (#2586) ## Motivation Make projects contribution more clear ## Modification 1. Add description on project/README 2. Modify comments to reference in example_project/README 3. Add faq for projects ## BC-breaking (Optional) No --- README.md | 21 ++++-- README_zh-CN.md | 22 +++++-- projects/README.md | 18 +++-- projects/example_project/README.md | 65 ++++++++++--------- ...mmy-r50-d8_4xb2-40k_cityscapes-512x1024.py | 4 +- projects/faq.md | 19 ++++++ 6 files changed, 105 insertions(+), 44 deletions(-) create mode 100644 projects/faq.md diff --git a/README.md b/README.md index ebe0debc4..c02d822cd 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,8 @@ To migrate from MMSegmentation 1.x, please refer to [migration](docs/en/migratio Results and models are available in the [model zoo](docs/en/model_zoo.md). -Supported backbones: +
+Supported backbones: - [x] ResNet (CVPR'2016) - [x] ResNeXt (CVPR'2017) @@ -117,7 +118,10 @@ Supported backbones: - [x] [MAE (CVPR'2022)](configs/mae) - [x] [PoolFormer (CVPR'2022)](configs/poolformer) -Supported methods: +
+ +
+Supported methods: - [x] [FCN (CVPR'2015/TPAMI'2017)](configs/fcn) - [x] [ERFNet (T-ITS'2017)](configs/erfnet) @@ -156,7 +160,10 @@ Supported methods: - [x] [MaskFormer (NeurIPS'2021)](configs/maskformer) - [x] [Mask2Former (CVPR'2022)](configs/mask2former) -Supported datasets: +
+ +
+Supported datasets: - [x] [Cityscapes](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#cityscapes) - [x] [PASCAL VOC](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#pascal-voc) @@ -175,8 +182,14 @@ Supported datasets: - [x] [Vaihingen](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#isprs-vaihingen) - [x] [iSAID](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/en/user_guides/2_dataset_prepare.md#isaid) +
+ Please refer to [FAQ](docs/en/notes/faq.md) for frequently asked questions. +## Projects + +[Here](projects/README.md) are some implementations of SOTA models and solutions built on MMSegmentation, which are supported and maintained by community users. These projects demonstrate the best practices based on MMSegmentation for research and product development. We welcome and appreciate all the contributions to OpenMMLab ecosystem. + ## Contributing We appreciate all contributions to improve MMSegmentation. Please refer to [CONTRIBUTING.md](.github/CONTRIBUTING.md) for the contributing guideline. @@ -205,7 +218,7 @@ If you find this project useful in your research, please consider cite: This project is released under the [Apache 2.0 license](LICENSE). -## Projects in OpenMMLab +## OpenMMLab Family - [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab foundational library for training deep learning models - [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision. diff --git a/README_zh-CN.md b/README_zh-CN.md index 8db274641..110d3f5b0 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -82,7 +82,8 @@ MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱。它是 O 测试结果和模型可以在[模型库](docs/zh_cn/model_zoo.md)中找到。 -已支持的骨干网络: +
+已支持的骨干网络: - [x] ResNet (CVPR'2016) - [x] ResNeXt (CVPR'2017) @@ -98,7 +99,10 @@ MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱。它是 O - [x] [MAE (CVPR'2022)](configs/mae) - [x] [PoolFormer (CVPR'2022)](configs/poolformer) -已支持的算法: +
+ +
+已支持的算法: - [x] [FCN (CVPR'2015/TPAMI'2017)](configs/fcn) - [x] [ERFNet (T-ITS'2017)](configs/erfnet) @@ -137,7 +141,10 @@ MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱。它是 O - [x] [MaskFormer (NeurIPS'2021)](configs/maskformer) - [x] [Mask2Former (CVPR'2022)](configs/mask2former) -已支持的数据集: +
+ +
+已支持的数据集: - [x] [Cityscapes](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/zh_cn/dataset_prepare.md#cityscapes) - [x] [PASCAL VOC](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/zh_cn/dataset_prepare.md#pascal-voc) @@ -156,15 +163,22 @@ MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱。它是 O - [x] [Vaihingen](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/zh_cn/dataset_prepare.md#isprs-vaihingen) - [x] [iSAID](https://github.com/open-mmlab/mmsegmentation/blob/1.x/docs/zh_cn/dataset_prepare.md#isaid) +
+ 如果遇到问题,请参考 [常见问题解答](docs/zh_cn/notes/faq.md)。 +## 社区项目 + +[这里](projects/README.md)有一些由社区用户支持和维护的基于 MMSegmentation 的 SOTA 模型和解决方案的实现。这些项目展示了基于 MMSegmentation 的研究和产品开发的最佳实践。 +我们欢迎并感谢对 OpenMMLab 生态系统的所有贡献。 + ## 贡献指南 我们感谢所有的贡献者为改进和提升 MMSegmentation 所作出的努力。请参考[贡献指南](.github/CONTRIBUTING.md)来了解参与项目贡献的相关指引。 ## 致谢 -MMSegmentation 是一个由来自不同高校和企业的研发人员共同参与贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。 我们希望这个工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现已有算法并开发自己的新模型,从而不断为开源社区提供贡献。 +MMSegmentation 是一个由来自不同高校和企业的研发人员共同参与贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。我们希望这个工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现已有算法并开发自己的新模型,从而不断为开源社区提供贡献。 ## 引用 diff --git a/projects/README.md b/projects/README.md index 40d515eda..5482c479a 100644 --- a/projects/README.md +++ b/projects/README.md @@ -1,9 +1,19 @@ # Projects -Implementing new models and features into OpenMMLab's algorithm libraries could be troublesome due to the rigorous requirements on code quality, which could hinder the fast iteration of SOTA models and might discourage our members from sharing their latest outcomes here. +The OpenMMLab ecosystem can only grow through the contributions of the community. +Everyone is welcome to post their implementation of any great ideas in this folder! If you wish to start your own project, please go through the [example project](example_project/) for the best practice. For common questions about projects, please read our [faq](faq.md). -And that's why we have this `Projects/` folder now, where some experimental features, frameworks and models are placed, only needed to satisfy the minimum requirement on the code quality, and can be used as standalone libraries. Users are welcome to use them if they [use MMSegmentation from source](https://mmsegmentation.readthedocs.io/en/dev-1.x/get_started.html#best-practices). +## External Projects -Everyone is welcome to post their implementation of any great ideas in this folder! If you wish to start your own project, please go through the [example project](example_project/) for the best practice. +There are also selected external projects released in the community that use MMSegmentation: -Note: The core maintainers of MMSegmentation only ensure the results are reproducible and the code quality meets its claim at the time each project was submitted, but they may not be responsible for future maintenance. The original authors take responsibility for maintaining their own projects. +- [SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation](https://github.com/visual-attention-network/segnext) +- [Vision Transformer Adapter for Dense Predictions](https://github.com/czczup/ViT-Adapter) +- [UniFormer: Unifying Convolution and Self-attention for Visual Recognition](https://github.com/Sense-X/UniFormer) +- [Multi-Scale High-Resolution Vision Transformer for Semantic Segmentation](https://github.com/facebookresearch/HRViT) +- [ViTAE: Vision Transformer Advanced by Exploring Intrinsic Inductive Bias](https://github.com/ViTAE-Transformer/ViTAE-Transformer) +- [DAFormer: Improving Network Architectures and Training Strategies for Domain-Adaptive Semantic Segmentation](https://github.com/lhoyer/DAFormer) +- [MPViT : Multi-Path Vision Transformer for Dense Prediction](https://github.com/youngwanLEE/MPViT) +- [TopFormer: Token Pyramid Transformer for Mobile Semantic Segmentation](https://github.com/hustvl/TopFormer) + +Note: These projects are supported and maintained by their own contributors. The core maintainers of MMSegmentation only ensure the results are reproducible and the code quality meets its claim at the time each project was submitted, but they may not be responsible for future maintenance. diff --git a/projects/example_project/README.md b/projects/example_project/README.md index 27ca5d4e2..4338b8aca 100644 --- a/projects/example_project/README.md +++ b/projects/example_project/README.md @@ -1,20 +1,26 @@ # Dummy ResNet Wrapper -This is an example README for community `projects/`. We have provided detailed explanations for each field in the form of html comments, which are visible when you read the source of this README file. If you wish to submit your project to our main repository, then all the fields in this README are mandatory for others to understand what you have achieved in this implementation. For more details, read our [contribution guide](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/.github/CONTRIBUTING.md) or approach us in [Discussions](https://github.com/open-mmlab/mmsegmentation/discussions). +> A README.md template for releasing a project. +> +> All the fields in this README are **mandatory** for others to understand what you have achieved in this implementation. +> Please read our [Projects FAQ](../faq.md) if you still feel unclear about the requirements, or raise an [issue](https://github.com/open-mmlab/mmsegmentation/issues) to us! ## Description - +Author: @xxx. This project implements a dummy ResNet wrapper, which literally does nothing new but prints "hello world" during initialization. ## Usage - +> For a typical model, this section should contain the commands for training and testing. +> You are also suggested to dump your environment specification to env.yml by `conda env export > env.yml`. ### Prerequisites @@ -47,9 +53,8 @@ mim train mmsegmentation configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.p mim test mmsegmentation configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py --work-dir work_dirs/dummy_resnet --checkpoint ${CHECKPOINT_PATH} ``` - +> List the results as usually done in other model's README. \[Example\](https://github.com/open-mmlab/mmsegmentation/tree/dev-1.x/configs/fcn#results-and-models +> You should claim whether this is based on the pre-trained weights, which are converted from the official release; or it's a reproduced result obtained from retraining the model in this project | Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | | ------ | -------- | --------- | ------: | -------- | -------------- | ----: | ------------: | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -57,7 +62,7 @@ You should claim whether this is based on the pre-trained weights, which are con ## Citation - +> You may remove this section if not applicable. ```bibtex @misc{mmseg2020, @@ -72,58 +77,58 @@ You should claim whether this is based on the pre-trained weights, which are con Here is a checklist illustrating a usual development workflow of a successful project, and also serves as an overview of this project's progress. - +> A project does not necessarily have to be finished in a single PR, but it's essential for the project to at least reach the first milestone in its very first PR. - [ ] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. - [ ] Finish the code - +> The code's design shall follow existing interfaces and convention. For example, each model component should be registered into `mmseg.registry.MODELS` and configurable via a config file. - - [ ] Basic docstrings & proper citation +- [ ] Basic docstrings & proper citation - +> Each major object should contain a docstring, describing its functionality and arguments. If you have adapted the code from other open-source projects, don't forget to cite the source project in docstring and make sure your behavior is not against its license. Typically, we do not accept any code snippet under GPL license. [A Short Guide to Open Source Licenses](https://medium.com/nationwide-technology/a-short-guide-to-open-source-licenses-cf5b1c329edd) - - [ ] Test-time correctness +- [ ] Test-time correctness - +> If you are reproducing the result from a paper, make sure your model's inference-time performance matches that in the original paper. The weights usually could be obtained by simply renaming the keys in the official pre-trained weights. This test could be skipped though, if you are able to prove the training-time correctness and check the second milestone. - - [ ] A full README +- [ ] A full README - +> As this template does. - [ ] Milestone 2: Indicates a successful model implementation. - [ ] Training-time correctness - +> If you are reproducing the result from a paper, checking this item means that you should have trained your model from scratch based on the original paper's specification and verified that the final result matches the report within a minor error range. - [ ] Milestone 3: Good to be a part of our core package! - [ ] Type hints and docstrings - +> Ideally *all* the methods should have [type hints](https://www.pythontutorial.net/python-basics/python-type-hints/) and [docstrings](https://google.github.io/styleguide/pyguide.html#381-docstrings). [Example](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/utils/io.py#L9) - - [ ] Unit tests +- [ ] Unit tests - +> Unit tests for each module are required. [Example](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/tests/test_utils/test_io.py#L14) - - [ ] Code polishing +- [ ] Code polishing - +> Refactor your code according to reviewer's comment. - - [ ] Metafile.yml +- [ ] Metafile.yml - +> It will be parsed by MIM and Inferencer. [Example](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/fcn/fcn.yml) - [ ] Move your modules into the core package following the codebase's file hierarchy structure. - +> In particular, you may have to refactor this README into a standard one. [Example](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/fcn/README.md) - [ ] Refactor your modules into the core package following the codebase's file hierarchy structure. diff --git a/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py b/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py index b0ec67b69..43015364e 100644 --- a/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py +++ b/projects/example_project/configs/fcn_dummy-r50-d8_4xb2-40k_cityscapes-512x1024.py @@ -1,6 +1,6 @@ -_base_ = ['../../../configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py'] +_base_ = ['mmseg::fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py'] -custom_imports = dict(imports=['projects.example_project.dummy']) +custom_imports = dict(imports=['dummy']) crop_size = (512, 1024) data_preprocessor = dict(size=crop_size) diff --git a/projects/faq.md b/projects/faq.md new file mode 100644 index 000000000..724c1cf6a --- /dev/null +++ b/projects/faq.md @@ -0,0 +1,19 @@ +Q1: Why set up `projects/` folder? + +Implementing new models and features into OpenMMLab's algorithm libraries could be troublesome due to the rigorous requirements on code quality, which could hinder the fast iteration of SOTA models and might discourage our members from sharing their latest outcomes here. And that's why we have this `projects/` folder now, where some experimental features, frameworks and models are placed, only needed to satisfy the minimum requirement on the code quality, and can be used as standalone libraries. Users are welcome to use them if they [use MMSegmentation from source](https://mmsegmentation.readthedocs.io/en/dev-1.x/get_started.html#best-practices). + +Q2: Why should there be a checklist for a project? + +This checkelist is crucial not only for this project's developers but the entire community, since there might be some other contributors joining this project and deciding their starting point from this list. It also helps maintainers accurately estimate time and effort on further code polishing, if needed. + +Q3: What kind of PR will be merged? + +Reaching the first milestone means that this project suffices the minimum requirement of being merged into 'projects/'. That is, the very first PR of a project must have all the terms in the first milestone checked. We do not have any extra requirements on the project's following PRs, so they can be a minor bug fix or update, and do not have to achieve one milestone at once. But keep in mind that this project is only eligible to become a part of the core package upon attaining the last milestone. + +Q4: Compared to other models in the core packages, why do the model implementations in projects have different training/testing commands? + +Projects are organized independently from the core package, and therefore their modules cannot be directly imported by train.py and test.py. Each model implementation in projects should either use `mim` for training/testing as suggested in the example project or provide a custom train.py/test.py. + +Q5: How to debug a project with a debugger? + +Debugger makes our lives easier, but using it becomes a bit tricky if we have to train/test a model via `mim`. The way to circumvent that is that we can take advantage of relative path to import these modules. Assuming that we are developing a project X and the core modules are placed under `projects/X/modules`, then simply adding `custom_imports = dict(imports='projects.X.modules')` to the config allows us to debug from usual entrypoints (e.g. `tools/train.py`) from the root directory of the algorithm library. Just don't forget to remove 'projects.X' before project publishment. From 039ba5d4ca8ba208dd1195899667d6067330a7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=98=95=E8=BE=B0?= Date: Thu, 23 Feb 2023 20:33:17 +0800 Subject: [PATCH 15/24] [Feature] Support auto import modules from registry. (#2481) ## Motivation The registry now supports auto-import modules from the given location. register_all_modules before running is no longer needed. The modules will be lazy-imported during building. - [x] This PR can be merged after https://github.com/open-mmlab/mmengine/pull/643. The MMEngine version should be updated. Ref: https://github.com/open-mmlab/mmdetection/pull/9143 --- configs/_base_/models/fpn_poolformer_s12.py | 5 +- ...former_r50_8xb2-90k_cityscapes-512x1024.py | 2 - ...1k-384x384-pre_8xb2-160k_ade20k-640x640.py | 1 - demo/MMSegmentation_Tutorial.ipynb | 12 +-- demo/image_demo.py | 3 - demo/inference_demo.ipynb | 96 +++++++++++++++---- demo/video_demo.py | 3 - docs/en/advanced_guides/datasets.md | 4 +- docs/en/get_started.md | 2 - docs/en/user_guides/3_inference.md | 10 -- docs/zh_cn/advanced_guides/datasets.md | 5 +- docs/zh_cn/get_started.md | 2 - mmseg/__init__.py | 2 +- mmseg/apis/inference.py | 3 + mmseg/registry/__init__.py | 20 ++-- mmseg/registry/registry.py | 72 ++++++++++---- requirements/mminstall.txt | 2 +- requirements/readthedocs.txt | 2 +- tests/test_config.py | 4 +- tests/test_datasets/test_dataset_builder.py | 4 +- tests/test_datasets/test_transform.py | 4 +- .../test_layer_decay_optimizer_constructor.py | 4 +- tests/test_models/test_backbones/test_unet.py | 4 +- tests/test_models/test_forward.py | 4 +- .../test_heads/test_maskformer_head.py | 4 +- .../test_segmentors/test_seg_tta_model.py | 4 +- tools/analysis_tools/benchmark.py | 6 +- tools/misc/browse_dataset.py | 4 +- tools/test.py | 6 -- tools/train.py | 7 +- 30 files changed, 188 insertions(+), 113 deletions(-) diff --git a/configs/_base_/models/fpn_poolformer_s12.py b/configs/_base_/models/fpn_poolformer_s12.py index 483d82330..b6893f697 100644 --- a/configs/_base_/models/fpn_poolformer_s12.py +++ b/configs/_base_/models/fpn_poolformer_s12.py @@ -1,7 +1,10 @@ # model settings norm_cfg = dict(type='SyncBN', requires_grad=True) checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s12_3rdparty_32xb128_in1k_20220414-f8d83051.pth' # noqa -custom_imports = dict(imports='mmcls.models', allow_failed_imports=False) +# TODO: delete custom_imports after mmcls supports auto import +# please install mmcls>=1.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) data_preprocessor = dict( type='SegDataPreProcessor', mean=[123.675, 116.28, 103.53], diff --git a/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py b/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py index fc132a698..d2211b66a 100644 --- a/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py +++ b/configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py @@ -1,7 +1,5 @@ _base_ = ['../_base_/default_runtime.py', '../_base_/datasets/cityscapes.py'] -custom_imports = dict(imports='mmdet.models', allow_failed_imports=False) - crop_size = (512, 1024) data_preprocessor = dict( type='SegDataPreProcessor', diff --git a/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py b/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py index 4e4036db3..b8b1d6cff 100644 --- a/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py +++ b/configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py @@ -3,7 +3,6 @@ _base_ = [ ] pretrained = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_20220317-55b0104a.pth' # noqa -custom_imports = dict(imports='mmdet.models', allow_failed_imports=False) crop_size = (640, 640) data_preprocessor = dict( diff --git a/demo/MMSegmentation_Tutorial.ipynb b/demo/MMSegmentation_Tutorial.ipynb index 89d6e5261..1d92342ae 100644 --- a/demo/MMSegmentation_Tutorial.ipynb +++ b/demo/MMSegmentation_Tutorial.ipynb @@ -460,12 +460,8 @@ "outputs": [], "source": [ "from mmengine.runner import Runner\n", - "from mmseg.utils import register_all_modules\n", "\n", - "# register all modules in mmseg into the registries\n", - "# do not init the default scope here because it will be init in the runner\n", - "register_all_modules(init_default_scope=False)\n", - "runner = Runner.from_cfg(cfg)\n" + "runner = Runner.from_cfg(cfg)" ] }, { @@ -523,7 +519,7 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3.8.5 ('tensorflow')", + "display_name": "Python 3.10.6 ('pt1.12')", "language": "python", "name": "python3" }, @@ -537,7 +533,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.6" }, "pycharm": { "stem_cell": { @@ -550,7 +546,7 @@ }, "vscode": { "interpreter": { - "hash": "20d4b83e0c8b3730b580c42434163d64f4b735d580303a8fade7c849d4d29eba" + "hash": "0442e67aee3d9cbb788fa6e86d60c4ffa94ad7f1943c65abfecb99a6f4696c58" } } }, diff --git a/demo/image_demo.py b/demo/image_demo.py index fe11b7693..231aacb9d 100644 --- a/demo/image_demo.py +++ b/demo/image_demo.py @@ -4,7 +4,6 @@ from argparse import ArgumentParser from mmengine.model import revert_sync_batchnorm from mmseg.apis import inference_model, init_model, show_result_pyplot -from mmseg.utils import register_all_modules def main(): @@ -24,8 +23,6 @@ def main(): '--title', default='result', help='The image identifier.') args = parser.parse_args() - register_all_modules() - # build the model from a config file and a checkpoint file model = init_model(args.config, args.checkpoint, device=args.device) if args.device == 'cpu': diff --git a/demo/inference_demo.ipynb b/demo/inference_demo.ipynb index f05a94748..3a29a9646 100644 --- a/demo/inference_demo.ipynb +++ b/demo/inference_demo.ipynb @@ -2,9 +2,28 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mkdir: ../checkpoints: File exists\n", + "--2023-02-23 19:23:01-- https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n", + "正在解析主机 download.openmmlab.com (download.openmmlab.com)... 116.0.89.205, 116.0.89.209, 116.0.89.207, ...\n", + "正在连接 download.openmmlab.com (download.openmmlab.com)|116.0.89.205|:443... 已连接。\n", + "已发出 HTTP 请求,正在等待回应... 200 OK\n", + "长度:196205945 (187M) [application/octet-stream]\n", + "正在保存至: “../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.3”\n", + "\n", + "pspnet_r50-d8_512x1 100%[===================>] 187.12M 861KB/s 用时 2m 56s \n", + "\n", + "2023-02-23 19:25:57 (1.06 MB/s) - 已保存 “../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.3” [196205945/196205945])\n", + "\n" + ] + } + ], "source": [ "!mkdir ../checkpoints\n", "!wget https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P ../checkpoints" @@ -12,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "pycharm": { "is_executing": true @@ -24,14 +43,12 @@ "import mmcv\n", "import matplotlib.pyplot as plt\n", "from mmengine.model.utils import revert_sync_batchnorm\n", - "from mmseg.apis import init_model, inference_model, show_result_pyplot\n", - "from mmseg.utils import register_all_modules\n", - "register_all_modules()" + "from mmseg.apis import init_model, inference_model, show_result_pyplot" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "pycharm": { "is_executing": true @@ -39,15 +56,33 @@ }, "outputs": [], "source": [ - "config_file = '../configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py'\n", + "config_file = '../configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py'\n", "checkpoint_file = '../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/xxc/Desktop/pjlab/mmsegv2/mmseg/models/builder.py:36: UserWarning: ``build_loss`` would be deprecated soon, please use ``mmseg.registry.MODELS.build()`` \n", + " warnings.warn('``build_loss`` would be deprecated soon, please use '\n", + "/Users/xxc/Desktop/pjlab/mmsegv2/mmseg/models/losses/cross_entropy_loss.py:235: UserWarning: Default ``avg_non_ignore`` is False, if you would like to ignore the certain label and average loss over non-ignore labels, which is the same with PyTorch official cross_entropy, set ``avg_non_ignore=True``.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loads checkpoint by local backend from path: ../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n" + ] + } + ], "source": [ "# build the model from a config file and a checkpoint file\n", "model = init_model(config_file, checkpoint_file, device='cuda:0')" @@ -55,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -68,9 +103,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/pt1.13/lib/python3.10/site-packages/mmengine/visualization/visualizer.py:163: UserWarning: `Visualizer` backend is not initialized because save_dir is None.\n", + " warnings.warn('`Visualizer` backend is not initialized '\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# show the results\n", "vis_result = show_result_pyplot(model, img, result)\n", @@ -87,7 +151,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.4 ('pt1.11-v2')", + "display_name": "pt1.13", "language": "python", "name": "python3" }, @@ -101,7 +165,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.9" }, "pycharm": { "stem_cell": { @@ -114,7 +178,7 @@ }, "vscode": { "interpreter": { - "hash": "fdab7187f8cbd4ce42bbf864ddb4c4693e7329271a15a7fa96e4bdb82b9302c9" + "hash": "f61d5b8fecdd960739697f6c2860080d7b76a5be5d896cb034bdb275ab3ddda0" } } }, diff --git a/demo/video_demo.py b/demo/video_demo.py index 3eb326b7a..7e6f3d605 100644 --- a/demo/video_demo.py +++ b/demo/video_demo.py @@ -6,7 +6,6 @@ from mmengine.model.utils import revert_sync_batchnorm from mmseg.apis import inference_model, init_model from mmseg.apis.inference import show_result_pyplot -from mmseg.utils import register_all_modules def main(): @@ -53,8 +52,6 @@ def main(): assert args.show or args.output_file, \ 'At least one output should be enabled.' - register_all_modules() - # build the model from a config file and a checkpoint file model = init_model(args.config, args.checkpoint, device=args.device) if args.device == 'cpu': diff --git a/docs/en/advanced_guides/datasets.md b/docs/en/advanced_guides/datasets.md index 733e2a26d..a1b8044b3 100644 --- a/docs/en/advanced_guides/datasets.md +++ b/docs/en/advanced_guides/datasets.md @@ -15,8 +15,8 @@ Instantiate Cityscapes training dataset: ```python from mmseg.datasets import CityscapesDataset -from mmseg.utils import register_all_modules -register_all_modules() +from mmengine.registry import init_default_scope +init_default_scope('mmseg') data_root = 'data/cityscapes/' data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') diff --git a/docs/en/get_started.md b/docs/en/get_started.md index 313501e0d..cf861b1fe 100644 --- a/docs/en/get_started.md +++ b/docs/en/get_started.md @@ -91,10 +91,8 @@ Option (b). If you install mmsegmentation with pip, open you python interpreter ```python from mmseg.apis import inference_model, init_model, show_result_pyplot -from mmseg.utils import register_all_modules import mmcv -register_all_modules() config_file = 'pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' checkpoint_file = 'pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' diff --git a/docs/en/user_guides/3_inference.md b/docs/en/user_guides/3_inference.md index 6b6f6f7f3..39f296a51 100644 --- a/docs/en/user_guides/3_inference.md +++ b/docs/en/user_guides/3_inference.md @@ -31,14 +31,10 @@ Example: ```python from mmseg.apis import init_model -from mmseg.utils import register_all_modules config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' -# register all modules in mmseg into the registries -register_all_modules() - # initialize model without checkpoint model = init_model(config_path) @@ -76,14 +72,11 @@ Example: ```python from mmseg.apis import init_model, inference_model -from mmseg.utils import register_all_modules config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' img_path = 'demo/demo.png' -# register all modules in mmseg into the registries -register_all_modules() model = init_model(config_path, checkpoint_path) result = inference_model(model, img_path) @@ -115,14 +108,11 @@ Example: ```python from mmseg.apis import init_model, inference_model, show_result_pyplot -from mmseg.utils import register_all_modules config_path = 'configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' checkpoint_path = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' img_path = 'demo/demo.png' -# register all modules in mmseg into the registries -register_all_modules() # build the model from a config file and a checkpoint file model = init_model(config_path, checkpoint_path, device='cuda:0') diff --git a/docs/zh_cn/advanced_guides/datasets.md b/docs/zh_cn/advanced_guides/datasets.md index 0f3ad2b68..546e97f70 100644 --- a/docs/zh_cn/advanced_guides/datasets.md +++ b/docs/zh_cn/advanced_guides/datasets.md @@ -9,9 +9,10 @@ 实例化 Cityscapes 训练数据集: ```python +from mmengine.registry import init_default_scope from mmseg.datasets import CityscapesDataset -from mmseg.utils import register_all_modules -register_all_modules() + +init_default_scope('mmseg') data_root = 'data/cityscapes/' data_prefix=dict(img_path='leftImg8bit/train', seg_map_path='gtFine/train') diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md index fff70a256..695cd811d 100644 --- a/docs/zh_cn/get_started.md +++ b/docs/zh_cn/get_started.md @@ -92,10 +92,8 @@ python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_4xb2-40k_ci ```python from mmseg.apis import inference_model, init_model, show_result_pyplot -from mmseg.utils import register_all_modules import mmcv -register_all_modules() config_file = 'pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py' checkpoint_file = 'pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' diff --git a/mmseg/__init__.py b/mmseg/__init__.py index 765ff4a04..1a7627af5 100644 --- a/mmseg/__init__.py +++ b/mmseg/__init__.py @@ -9,7 +9,7 @@ from .version import __version__, version_info MMCV_MIN = '2.0.0rc4' MMCV_MAX = '2.1.0' -MMENGINE_MIN = '0.2.0' +MMENGINE_MIN = '0.4.0' MMENGINE_MAX = '1.0.0' diff --git a/mmseg/apis/inference.py b/mmseg/apis/inference.py index d1cc54559..4aadffc79 100644 --- a/mmseg/apis/inference.py +++ b/mmseg/apis/inference.py @@ -9,6 +9,7 @@ import numpy as np import torch from mmengine import Config from mmengine.dataset import Compose +from mmengine.registry import init_default_scope from mmengine.runner import load_checkpoint from mmengine.utils import mkdir_or_exist @@ -48,6 +49,8 @@ def init_model(config: Union[str, Path, Config], config.model.backbone.init_cfg = None config.model.pretrained = None config.model.train_cfg = None + init_default_scope(config.get('default_scope', 'mmseg')) + model = MODELS.build(config.model) if checkpoint is not None: checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') diff --git a/mmseg/registry/__init__.py b/mmseg/registry/__init__.py index c646b7e5a..ee514d1a2 100644 --- a/mmseg/registry/__init__.py +++ b/mmseg/registry/__init__.py @@ -1,13 +1,15 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .registry import (DATA_SAMPLERS, DATASETS, HOOKS, LOOPS, METRICS, - MODEL_WRAPPERS, MODELS, OPTIM_WRAPPER_CONSTRUCTORS, - OPTIMIZERS, PARAM_SCHEDULERS, RUNNER_CONSTRUCTORS, - RUNNERS, TASK_UTILS, TRANSFORMS, VISBACKENDS, - VISUALIZERS, WEIGHT_INITIALIZERS) +from .registry import (DATA_SAMPLERS, DATASETS, EVALUATOR, HOOKS, INFERENCERS, + LOG_PROCESSORS, LOOPS, METRICS, MODEL_WRAPPERS, MODELS, + OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS, OPTIMIZERS, + PARAM_SCHEDULERS, RUNNER_CONSTRUCTORS, RUNNERS, + TASK_UTILS, TRANSFORMS, VISBACKENDS, VISUALIZERS, + WEIGHT_INITIALIZERS) __all__ = [ - 'RUNNERS', 'RUNNER_CONSTRUCTORS', 'HOOKS', 'DATASETS', 'DATA_SAMPLERS', - 'TRANSFORMS', 'MODELS', 'WEIGHT_INITIALIZERS', 'OPTIMIZERS', - 'OPTIM_WRAPPER_CONSTRUCTORS', 'TASK_UTILS', 'PARAM_SCHEDULERS', 'METRICS', - 'MODEL_WRAPPERS', 'LOOPS', 'VISBACKENDS', 'VISUALIZERS' + 'HOOKS', 'DATASETS', 'DATA_SAMPLERS', 'TRANSFORMS', 'MODELS', + 'WEIGHT_INITIALIZERS', 'OPTIMIZERS', 'OPTIM_WRAPPER_CONSTRUCTORS', + 'TASK_UTILS', 'PARAM_SCHEDULERS', 'METRICS', 'MODEL_WRAPPERS', + 'VISBACKENDS', 'VISUALIZERS', 'RUNNERS', 'RUNNER_CONSTRUCTORS', 'LOOPS', + 'EVALUATOR', 'LOG_PROCESSORS', 'OPTIM_WRAPPERS', 'INFERENCERS' ] diff --git a/mmseg/registry/registry.py b/mmseg/registry/registry.py index 5c9977ab8..32684e758 100644 --- a/mmseg/registry/registry.py +++ b/mmseg/registry/registry.py @@ -10,6 +10,7 @@ from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS from mmengine.registry import DATASETS as MMENGINE_DATASETS from mmengine.registry import EVALUATOR as MMENGINE_EVALUATOR from mmengine.registry import HOOKS as MMENGINE_HOOKS +from mmengine.registry import INFERENCERS as MMENGINE_INFERENCERS from mmengine.registry import LOG_PROCESSORS as MMENGINE_LOG_PROCESSORS from mmengine.registry import LOOPS as MMENGINE_LOOPS from mmengine.registry import METRICS as MMENGINE_METRICS @@ -39,45 +40,82 @@ RUNNER_CONSTRUCTORS = Registry( # manage all kinds of loops like `EpochBasedTrainLoop` LOOPS = Registry('loop', parent=MMENGINE_LOOPS) # manage all kinds of hooks like `CheckpointHook` -HOOKS = Registry('hook', parent=MMENGINE_HOOKS) +HOOKS = Registry( + 'hook', parent=MMENGINE_HOOKS, locations=['mmseg.engine.hooks']) # manage data-related modules -DATASETS = Registry('dataset', parent=MMENGINE_DATASETS) -DATA_SAMPLERS = Registry('data sampler', parent=MMENGINE_DATA_SAMPLERS) -TRANSFORMS = Registry('transform', parent=MMENGINE_TRANSFORMS) +DATASETS = Registry( + 'dataset', parent=MMENGINE_DATASETS, locations=['mmseg.datasets']) +DATA_SAMPLERS = Registry( + 'data sampler', + parent=MMENGINE_DATA_SAMPLERS, + locations=['mmseg.datasets.samplers']) +TRANSFORMS = Registry( + 'transform', + parent=MMENGINE_TRANSFORMS, + locations=['mmseg.datasets.transforms']) # mangage all kinds of modules inheriting `nn.Module` -MODELS = Registry('model', parent=MMENGINE_MODELS) +MODELS = Registry('model', parent=MMENGINE_MODELS, locations=['mmseg.models']) # mangage all kinds of model wrappers like 'MMDistributedDataParallel' -MODEL_WRAPPERS = Registry('model_wrapper', parent=MMENGINE_MODEL_WRAPPERS) +MODEL_WRAPPERS = Registry( + 'model_wrapper', + parent=MMENGINE_MODEL_WRAPPERS, + locations=['mmseg.models']) # mangage all kinds of weight initialization modules like `Uniform` WEIGHT_INITIALIZERS = Registry( - 'weight initializer', parent=MMENGINE_WEIGHT_INITIALIZERS) + 'weight initializer', + parent=MMENGINE_WEIGHT_INITIALIZERS, + locations=['mmseg.models']) # mangage all kinds of optimizers like `SGD` and `Adam` -OPTIMIZERS = Registry('optimizer', parent=MMENGINE_OPTIMIZERS) +OPTIMIZERS = Registry( + 'optimizer', + parent=MMENGINE_OPTIMIZERS, + locations=['mmseg.engine.optimizers']) # manage optimizer wrapper -OPTIM_WRAPPERS = Registry('optim_wrapper', parent=MMENGINE_OPTIM_WRAPPERS) +OPTIM_WRAPPERS = Registry( + 'optim_wrapper', + parent=MMENGINE_OPTIM_WRAPPERS, + locations=['mmseg.engine.optimizers']) # manage constructors that customize the optimization hyperparameters. OPTIM_WRAPPER_CONSTRUCTORS = Registry( 'optimizer wrapper constructor', - parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS) + parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS, + locations=['mmseg.engine.optimizers']) # mangage all kinds of parameter schedulers like `MultiStepLR` PARAM_SCHEDULERS = Registry( - 'parameter scheduler', parent=MMENGINE_PARAM_SCHEDULERS) + 'parameter scheduler', + parent=MMENGINE_PARAM_SCHEDULERS, + locations=['mmseg.engine.schedulers']) # manage all kinds of metrics -METRICS = Registry('metric', parent=MMENGINE_METRICS) +METRICS = Registry( + 'metric', parent=MMENGINE_METRICS, locations=['mmseg.evaluation']) # manage evaluator -EVALUATOR = Registry('evaluator', parent=MMENGINE_EVALUATOR) +EVALUATOR = Registry( + 'evaluator', parent=MMENGINE_EVALUATOR, locations=['mmseg.evaluation']) # manage task-specific modules like ohem pixel sampler -TASK_UTILS = Registry('task util', parent=MMENGINE_TASK_UTILS) +TASK_UTILS = Registry( + 'task util', parent=MMENGINE_TASK_UTILS, locations=['mmseg.models']) # manage visualizer -VISUALIZERS = Registry('visualizer', parent=MMENGINE_VISUALIZERS) +VISUALIZERS = Registry( + 'visualizer', + parent=MMENGINE_VISUALIZERS, + locations=['mmseg.visualization']) # manage visualizer backend -VISBACKENDS = Registry('vis_backend', parent=MMENGINE_VISBACKENDS) +VISBACKENDS = Registry( + 'vis_backend', + parent=MMENGINE_VISBACKENDS, + locations=['mmseg.visualization']) # manage logprocessor -LOG_PROCESSORS = Registry('log_processor', parent=MMENGINE_LOG_PROCESSORS) +LOG_PROCESSORS = Registry( + 'log_processor', + parent=MMENGINE_LOG_PROCESSORS, + locations=['mmseg.visualization']) + +# manage inferencer +INFERENCERS = Registry('inferencer', parent=MMENGINE_INFERENCERS) diff --git a/requirements/mminstall.txt b/requirements/mminstall.txt index 11a6d5a57..8dd00e5cc 100644 --- a/requirements/mminstall.txt +++ b/requirements/mminstall.txt @@ -1,4 +1,4 @@ mmcls>=1.0.0rc0 mmcv>=2.0.0rc4 -e git+https://github.com/open-mmlab/mmdetection.git@dev-3.x#egg=mmdet -mmengine>=0.2.0,<1.0.0 +mmengine>=0.4.0,<1.0.0 diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt index 1b5d8443b..962750488 100644 --- a/requirements/readthedocs.txt +++ b/requirements/readthedocs.txt @@ -1,5 +1,5 @@ mmcv>=2.0.0rc1,<2.1.0 -mmengine>=0.1.0,<1.0.0 +mmengine>=0.4.0,<1.0.0 prettytable scipy torch diff --git a/tests/test_config.py b/tests/test_config.py index bd664ed74..13de46018 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,10 +6,10 @@ from os.path import dirname, exists, isdir, join, relpath import numpy as np from mmengine import Config from mmengine.dataset import Compose +from mmengine.registry import init_default_scope from torch import nn from mmseg.models import build_segmentor -from mmseg.utils import register_all_modules def _get_config_directory(): @@ -70,7 +70,7 @@ def test_config_data_pipeline(): xdoctest -m tests/test_config.py test_config_build_data_pipeline """ - register_all_modules() + init_default_scope('mmseg') config_dpath = _get_config_directory() print(f'Found config_dpath = {config_dpath!r}') diff --git a/tests/test_datasets/test_dataset_builder.py b/tests/test_datasets/test_dataset_builder.py index 099c5b1df..b67b1e7aa 100644 --- a/tests/test_datasets/test_dataset_builder.py +++ b/tests/test_datasets/test_dataset_builder.py @@ -2,12 +2,12 @@ import os.path as osp from mmengine.dataset import ConcatDataset, RepeatDataset +from mmengine.registry import init_default_scope from mmseg.datasets import MultiImageMixDataset from mmseg.registry import DATASETS -from mmseg.utils import register_all_modules -register_all_modules() +init_default_scope('mmseg') @DATASETS.register_module() diff --git a/tests/test_datasets/test_transform.py b/tests/test_datasets/test_transform.py index 906b3c27e..a9136bebc 100644 --- a/tests/test_datasets/test_transform.py +++ b/tests/test_datasets/test_transform.py @@ -5,6 +5,7 @@ import os.path as osp import mmcv import numpy as np import pytest +from mmengine.registry import init_default_scope from PIL import Image from mmseg.datasets.transforms import * # noqa @@ -12,9 +13,8 @@ from mmseg.datasets.transforms import (LoadBiomedicalData, LoadBiomedicalImageFromFile, PhotoMetricDistortion, RandomCrop) from mmseg.registry import TRANSFORMS -from mmseg.utils import register_all_modules -register_all_modules() +init_default_scope('mmseg') def test_resize(): diff --git a/tests/test_engine/test_layer_decay_optimizer_constructor.py b/tests/test_engine/test_layer_decay_optimizer_constructor.py index 72dc6c512..e7d13db1d 100644 --- a/tests/test_engine/test_layer_decay_optimizer_constructor.py +++ b/tests/test_engine/test_layer_decay_optimizer_constructor.py @@ -5,12 +5,12 @@ import torch import torch.nn as nn from mmcv.cnn import ConvModule from mmengine.optim.optimizer import build_optim_wrapper +from mmengine.registry import init_default_scope from mmseg.engine.optimizers.layer_decay_optimizer_constructor import \ LearningRateDecayOptimizerConstructor -from mmseg.utils import register_all_modules -register_all_modules() +init_default_scope('mmseg') base_lr = 1 decay_rate = 2 diff --git a/tests/test_models/test_backbones/test_unet.py b/tests/test_models/test_backbones/test_unet.py index d0eaccd39..4d3faf68c 100644 --- a/tests/test_models/test_backbones/test_unet.py +++ b/tests/test_models/test_backbones/test_unet.py @@ -2,14 +2,14 @@ import pytest import torch from mmcv.cnn import ConvModule +from mmengine.registry import init_default_scope from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule, InterpConv, UNet, UpConvBlock) from mmseg.models.utils import Upsample -from mmseg.utils import register_all_modules from .utils import check_norm_state -register_all_modules() +init_default_scope('mmseg') def test_unet_basic_conv_block(): diff --git a/tests/test_models/test_forward.py b/tests/test_models/test_forward.py index ab88e4393..7f72efae2 100644 --- a/tests/test_models/test_forward.py +++ b/tests/test_models/test_forward.py @@ -9,14 +9,14 @@ import pytest import torch import torch.nn as nn from mmengine.model.utils import revert_sync_batchnorm +from mmengine.registry import init_default_scope from mmengine.structures import PixelData from mmengine.utils import is_list_of, is_tuple_of from torch import Tensor from mmseg.structures import SegDataSample -from mmseg.utils import register_all_modules -register_all_modules() +init_default_scope('mmseg') def _demo_mm_inputs(batch_size=2, image_shapes=(3, 32, 32), num_classes=5): diff --git a/tests/test_models/test_heads/test_maskformer_head.py b/tests/test_models/test_heads/test_maskformer_head.py index fe4bf96fe..6a47239b0 100644 --- a/tests/test_models/test_heads/test_maskformer_head.py +++ b/tests/test_models/test_heads/test_maskformer_head.py @@ -3,15 +3,15 @@ from os.path import dirname, join import torch from mmengine import Config +from mmengine.registry import init_default_scope from mmengine.structures import PixelData from mmseg.registry import MODELS from mmseg.structures import SegDataSample -from mmseg.utils import register_all_modules def test_maskformer_head(): - register_all_modules() + init_default_scope('mmseg') repo_dpath = dirname(dirname(__file__)) cfg = Config.fromfile( join( diff --git a/tests/test_models/test_segmentors/test_seg_tta_model.py b/tests/test_models/test_segmentors/test_seg_tta_model.py index c0e76b22f..3c9699e8d 100644 --- a/tests/test_models/test_segmentors/test_seg_tta_model.py +++ b/tests/test_models/test_segmentors/test_seg_tta_model.py @@ -2,14 +2,14 @@ import torch from mmengine import ConfigDict from mmengine.model import BaseTTAModel +from mmengine.registry import init_default_scope from mmengine.structures import PixelData from mmseg.registry import MODELS from mmseg.structures import SegDataSample -from mmseg.utils import register_all_modules from .utils import * # noqa: F401,F403 -register_all_modules() +init_default_scope('mmseg') def test_encoder_decoder_tta(): diff --git a/tools/analysis_tools/benchmark.py b/tools/analysis_tools/benchmark.py index bcb3948a6..afaeabac8 100644 --- a/tools/analysis_tools/benchmark.py +++ b/tools/analysis_tools/benchmark.py @@ -8,11 +8,11 @@ import torch from mmengine import Config from mmengine.fileio import dump from mmengine.model.utils import revert_sync_batchnorm +from mmengine.registry import init_default_scope from mmengine.runner import Runner, load_checkpoint from mmengine.utils import mkdir_or_exist from mmseg.registry import MODELS -from mmseg.utils import register_all_modules def parse_args(): @@ -32,8 +32,10 @@ def parse_args(): def main(): args = parse_args() - register_all_modules() cfg = Config.fromfile(args.config) + + init_default_scope(cfg.get('default_scope', 'mmseg')) + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) if args.work_dir is not None: mkdir_or_exist(osp.abspath(args.work_dir)) diff --git a/tools/misc/browse_dataset.py b/tools/misc/browse_dataset.py index b2852c21a..7863eb74f 100644 --- a/tools/misc/browse_dataset.py +++ b/tools/misc/browse_dataset.py @@ -3,10 +3,10 @@ import argparse import os.path as osp from mmengine import Config, DictAction +from mmengine.registry import init_default_scope from mmengine.utils import ProgressBar from mmseg.registry import DATASETS, VISUALIZERS -from mmseg.utils import register_all_modules def parse_args(): @@ -44,7 +44,7 @@ def main(): cfg.merge_from_dict(args.cfg_options) # register all modules in mmseg into the registries - register_all_modules() + init_default_scope('mmseg') dataset = DATASETS.build(cfg.train_dataloader.dataset) cfg.visualizer['save_dir'] = args.output_dir diff --git a/tools/test.py b/tools/test.py index b21b990f2..7bfde5820 100644 --- a/tools/test.py +++ b/tools/test.py @@ -6,8 +6,6 @@ import os.path as osp from mmengine.config import Config, DictAction from mmengine.runner import Runner -from mmseg.utils import register_all_modules - # TODO: support fuse_conv_bn, visualization, and format_only def parse_args(): @@ -77,10 +75,6 @@ def trigger_visualization_hook(cfg, args): def main(): args = parse_args() - # register all modules in mmseg into the registries - # do not init the default scope here because it will be init in the runner - register_all_modules(init_default_scope=False) - # load config cfg = Config.fromfile(args.config) cfg.launcher = args.launcher diff --git a/tools/train.py b/tools/train.py index 172815a9f..172130666 100644 --- a/tools/train.py +++ b/tools/train.py @@ -6,10 +6,9 @@ import os.path as osp from mmengine.config import Config, DictAction from mmengine.logging import print_log -from mmengine.registry import RUNNERS from mmengine.runner import Runner -from mmseg.utils import register_all_modules +from mmseg.registry import RUNNERS def parse_args(): @@ -52,10 +51,6 @@ def parse_args(): def main(): args = parse_args() - # register all modules in mmseg into the registries - # do not init the default scope here because it will be init in the runner - register_all_modules(init_default_scope=False) - # load config cfg = Config.fromfile(args.config) cfg.launcher = args.launcher From 53fe1ccf39a3725b1361f6302c94f0e85784a64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=98=95=E8=BE=B0?= Date: Thu, 23 Feb 2023 21:16:19 +0800 Subject: [PATCH 16/24] [Feature] Support MMSegInferencer (#2413) ## Motivation Support `MMSegInferencer` for providing an easy and clean interface for single or multiple images inferencing. Ref: https://github.com/open-mmlab/mmengine/pull/773 https://github.com/open-mmlab/mmocr/pull/1608 ## Modification - mmseg/apis/mmseg_inferencer.py - mmseg/visualization/local_visualizer.py - demo/image_demo_with_inferencer.py ## Use cases (Optional) Based on https://github.com/open-mmlab/mmengine/tree/inference Add a new image inference demo with `MMSegInferencer` - demo/image_demo_with_inferencer.py ```shell python demo/image_demo_with_inferencer.py demo/demo.png fcn_r50-d8_4xb2-40k_cityscapes-512x1024 ``` --------- Co-authored-by: MeowZheng --- demo/image_demo_with_inferencer.py | 54 +++++ mmseg/__init__.py | 2 +- mmseg/apis/__init__.py | 5 +- mmseg/apis/mmseg_inferencer.py | 279 ++++++++++++++++++++++++ mmseg/datasets/transforms/loading.py | 58 ++++- mmseg/visualization/local_visualizer.py | 28 ++- requirements/mminstall.txt | 2 +- tests/test_apis/test_inferencer.py | 115 ++++++++++ 8 files changed, 528 insertions(+), 15 deletions(-) create mode 100644 demo/image_demo_with_inferencer.py create mode 100644 mmseg/apis/mmseg_inferencer.py create mode 100644 tests/test_apis/test_inferencer.py diff --git a/demo/image_demo_with_inferencer.py b/demo/image_demo_with_inferencer.py new file mode 100644 index 000000000..ce40f2224 --- /dev/null +++ b/demo/image_demo_with_inferencer.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +from mmseg.apis import MMSegInferencer + + +def main(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('model', help='Config file') + parser.add_argument('--checkpoint', default=None, help='Checkpoint file') + parser.add_argument( + '--out-dir', default='', help='Path to save result file') + parser.add_argument( + '--show', + action='store_true', + default=False, + help='Whether to display the drawn image.') + parser.add_argument( + '--save-mask', + action='store_true', + default=False, + help='Enable save the mask file') + parser.add_argument( + '--dataset-name', + default='cityscapes', + help='Color palette used for segmentation map') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--opacity', + type=float, + default=0.5, + help='Opacity of painted segmentation map. In (0, 1] range.') + args = parser.parse_args() + + # build the model from a config file and a checkpoint file + mmseg_inferencer = MMSegInferencer( + args.model, + args.checkpoint, + dataset_name=args.dataset_name, + device=args.device) + + # test a single image + mmseg_inferencer( + args.img, + show=args.show, + out_dir=args.out_dir, + save_mask=args.save_mask, + opacity=args.opacity) + + +if __name__ == '__main__': + main() diff --git a/mmseg/__init__.py b/mmseg/__init__.py index 1a7627af5..9f171ccb0 100644 --- a/mmseg/__init__.py +++ b/mmseg/__init__.py @@ -9,7 +9,7 @@ from .version import __version__, version_info MMCV_MIN = '2.0.0rc4' MMCV_MAX = '2.1.0' -MMENGINE_MIN = '0.4.0' +MMENGINE_MIN = '0.5.0' MMENGINE_MAX = '1.0.0' diff --git a/mmseg/apis/__init__.py b/mmseg/apis/__init__.py index 9933b99b3..d22dc3f0a 100644 --- a/mmseg/apis/__init__.py +++ b/mmseg/apis/__init__.py @@ -1,4 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from .inference import inference_model, init_model, show_result_pyplot +from .mmseg_inferencer import MMSegInferencer -__all__ = ['init_model', 'inference_model', 'show_result_pyplot'] +__all__ = [ + 'init_model', 'inference_model', 'show_result_pyplot', 'MMSegInferencer' +] diff --git a/mmseg/apis/mmseg_inferencer.py b/mmseg/apis/mmseg_inferencer.py new file mode 100644 index 000000000..deb57b9b8 --- /dev/null +++ b/mmseg/apis/mmseg_inferencer.py @@ -0,0 +1,279 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from typing import List, Optional, Sequence, Union + +import mmcv +import mmengine +import numpy as np +from mmcv.transforms import Compose +from mmengine.infer.infer import BaseInferencer, ModelType + +from mmseg.structures import SegDataSample +from mmseg.utils import ConfigType, SampleList, register_all_modules +from mmseg.visualization import SegLocalVisualizer + +InputType = Union[str, np.ndarray] +InputsType = Union[InputType, Sequence[InputType]] +PredType = Union[SegDataSample, SampleList] + + +class MMSegInferencer(BaseInferencer): + """Semantic segmentation inferencer, provides inference and visualization + interfaces. Note: MMEngine >= 0.5.0 is required. + + Args: + model (str, optional): Path to the config file or the model name + defined in metafile. For example, it could be + "fcn_r50-d8_4xb2-40k_cityscapes-512x1024" or + "configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py" + weights (str, optional): Path to the checkpoint. If it is not specified + and model is a model name of metafile, the weights will be loaded + from metafile. Defaults to None. + palette (List[List[int]], optional): The palette of + segmentation map. + classes (Tuple[str], optional): Category information. + dataset_name (str, optional): Name of the datasets supported in mmseg. + device (str, optional): Device to run inference. If None, the available + device will be automatically used. Defaults to None. + scope (str, optional): The scope of the model. Defaults to None. + """ + + preprocess_kwargs: set = set() + forward_kwargs: set = {'mode', 'out_dir'} + visualize_kwargs: set = { + 'show', 'wait_time', 'draw_pred', 'img_out_dir', 'opacity' + } + postprocess_kwargs: set = { + 'pred_out_dir', 'return_datasample', 'save_mask', 'mask_dir' + } + + def __init__(self, + model: Union[ModelType, str], + weights: Optional[str] = None, + palette: Optional[Union[str, List]] = None, + classes: Optional[Union[str, List]] = None, + dataset_name: Optional[str] = None, + device: Optional[str] = None, + scope: Optional[str] = 'mmseg') -> None: + # A global counter tracking the number of images processes, for + # naming of the output images + self.num_visualized_imgs = 0 + register_all_modules() + super().__init__( + model=model, weights=weights, device=device, scope=scope) + + assert isinstance(self.visualizer, SegLocalVisualizer) + self.visualizer.set_dataset_meta(palette, classes, dataset_name) + + def __call__(self, + inputs: InputsType, + return_datasamples: bool = False, + batch_size: int = 1, + show: bool = False, + wait_time: int = 0, + draw_pred: bool = True, + out_dir: str = '', + save_mask: bool = False, + mask_dir: str = 'mask', + **kwargs) -> dict: + """Call the inferencer. + + Args: + inputs (Union[str, np.ndarray]): Inputs for the inferencer. + return_datasamples (bool): Whether to return results as + :obj:`SegDataSample`. Defaults to False. + batch_size (int): Batch size. Defaults to 1. + show (bool): Whether to display the image in a popup window. + Defaults to False. + wait_time (float): The interval of show (s). Defaults to 0. + draw_pred (bool): Whether to draw Prediction SegDataSample. + Defaults to True. + out_dir (str): Output directory of inference results. Defaults: ''. + save_mask (bool): Whether save pred mask as a file. + mask_dir (str): Sub directory of `pred_out_dir`, used to save pred + mask file. + + Returns: + dict: Inference and visualization results. + """ + return super().__call__( + inputs=inputs, + return_datasamples=return_datasamples, + batch_size=batch_size, + show=show, + wait_time=wait_time, + draw_pred=draw_pred, + img_out_dir=out_dir, + pred_out_dir=out_dir, + save_mask=save_mask, + mask_dir=mask_dir, + **kwargs) + + def visualize(self, + inputs: list, + preds: List[dict], + show: bool = False, + wait_time: int = 0, + draw_pred: bool = True, + img_out_dir: str = '', + opacity: float = 0.8) -> List[np.ndarray]: + """Visualize predictions. + + Args: + inputs (list): Inputs preprocessed by :meth:`_inputs_to_list`. + preds (Any): Predictions of the model. + show (bool): Whether to display the image in a popup window. + Defaults to False. + wait_time (float): The interval of show (s). Defaults to 0. + draw_pred (bool): Whether to draw Prediction SegDataSample. + Defaults to True. + img_out_dir (str): Output directory of drawn images. Defaults: '' + opacity (int, float): The transparency of segmentation mask. + Defaults to 0.8. + + Returns: + List[np.ndarray]: Visualization results. + """ + if self.visualizer is None or (not show and img_out_dir == ''): + return None + + if getattr(self, 'visualizer') is None: + raise ValueError('Visualization needs the "visualizer" term' + 'defined in the config, but got None') + + self.visualizer.alpha = opacity + + results = [] + + for single_input, pred in zip(inputs, preds): + if isinstance(single_input, str): + img_bytes = mmengine.fileio.get(single_input) + img = mmcv.imfrombytes(img_bytes) + img = img[:, :, ::-1] + img_name = osp.basename(single_input) + elif isinstance(single_input, np.ndarray): + img = single_input.copy() + img_num = str(self.num_visualized_imgs).zfill(8) + img_name = f'{img_num}.jpg' + else: + raise ValueError('Unsupported input type:' + f'{type(single_input)}') + + out_file = osp.join(img_out_dir, img_name) if img_out_dir != ''\ + else None + + self.visualizer.add_datasample( + img_name, + img, + pred, + show=show, + wait_time=wait_time, + draw_gt=False, + draw_pred=draw_pred, + out_file=out_file) + results.append(self.visualizer.get_image()) + self.num_visualized_imgs += 1 + + return results + + def postprocess(self, + preds: PredType, + visualization: List[np.ndarray], + return_datasample: bool = False, + mask_dir: str = 'mask', + save_mask: bool = True, + pred_out_dir: str = '') -> dict: + """Process the predictions and visualization results from ``forward`` + and ``visualize``. + + This method should be responsible for the following tasks: + + 1. Convert datasamples into a json-serializable dict if needed. + 2. Pack the predictions and visualization results and return them. + 3. Dump or log the predictions. + + Args: + preds (List[Dict]): Predictions of the model. + visualization (np.ndarray): Visualized predictions. + return_datasample (bool): Whether to return results as datasamples. + Defaults to False. + pred_out_dir: File to save the inference results w/o + visualization. If left as empty, no file will be saved. + Defaults to ''. + mask_dir (str): Sub directory of `pred_out_dir`, used to save pred + mask file. + save_mask (bool): Whether save pred mask as a file. + + Returns: + dict: Inference and visualization results with key ``predictions`` + and ``visualization`` + + - ``visualization (Any)``: Returned by :meth:`visualize` + - ``predictions`` (dict or DataSample): Returned by + :meth:`forward` and processed in :meth:`postprocess`. + If ``return_datasample=False``, it usually should be a + json-serializable dict containing only basic data elements such + as strings and numbers. + """ + results_dict = {} + + results_dict['predictions'] = preds + results_dict['visualization'] = visualization + + if pred_out_dir != '': + mmengine.mkdir_or_exist(pred_out_dir) + if save_mask: + preds = [preds] if isinstance(preds, SegDataSample) else preds + for pred in preds: + mmcv.imwrite( + pred.pred_sem_seg.numpy().data[0], + osp.join(pred_out_dir, mask_dir, + osp.basename(pred.metainfo['img_path']))) + else: + mmengine.dump(results_dict, + osp.join(pred_out_dir, 'results.pkl')) + + if return_datasample: + return preds + + return results_dict + + def _init_pipeline(self, cfg: ConfigType) -> Compose: + """Initialize the test pipeline. + + Return a pipeline to handle various input data, such as ``str``, + ``np.ndarray``. It is an abstract method in BaseInferencer, and should + be implemented in subclasses. + + The returned pipeline will be used to process a single data. + It will be used in :meth:`preprocess` like this: + + .. code-block:: python + def preprocess(self, inputs, batch_size, **kwargs): + ... + dataset = map(self.pipeline, dataset) + ... + """ + pipeline_cfg = cfg.test_dataloader.dataset.pipeline + # Loading annotations is also not applicable + idx = self._get_transform_idx(pipeline_cfg, 'LoadAnnotations') + if idx != -1: + del pipeline_cfg[idx] + load_img_idx = self._get_transform_idx(pipeline_cfg, + 'LoadImageFromFile') + + if load_img_idx == -1: + raise ValueError( + 'LoadImageFromFile is not found in the test pipeline') + pipeline_cfg[load_img_idx]['type'] = 'InferencerLoader' + return Compose(pipeline_cfg) + + def _get_transform_idx(self, pipeline_cfg: ConfigType, name: str) -> int: + """Returns the index of the transform in a pipeline. + + If the transform is not found, returns -1. + """ + for i, transform in enumerate(pipeline_cfg): + if transform['type'] == name: + return i + return -1 diff --git a/mmseg/datasets/transforms/loading.py b/mmseg/datasets/transforms/loading.py index 492f2063e..d2e93b1ab 100644 --- a/mmseg/datasets/transforms/loading.py +++ b/mmseg/datasets/transforms/loading.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import warnings -from typing import Dict, Optional +from typing import Dict, Optional, Union import mmcv import mmengine.fileio as fileio @@ -437,3 +437,59 @@ class LoadBiomedicalData(BaseTransform): f'to_xyz={self.to_xyz}, ' f'backend_args={self.backend_args})') return repr_str + + +@TRANSFORMS.register_module() +class InferencerLoader(BaseTransform): + """Load an image from ``results['img']``. + + Similar with :obj:`LoadImageFromFile`, but the image has been loaded as + :obj:`np.ndarray` in ``results['img']``. Can be used when loading image + from webcam. + + Required Keys: + + - img + + Modified Keys: + + - img + - img_path + - img_shape + - ori_shape + + 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. + """ + + def __init__(self, **kwargs) -> None: + super().__init__() + self.from_file = TRANSFORMS.build( + dict(type='LoadImageFromFile', **kwargs)) + self.from_ndarray = TRANSFORMS.build( + dict(type='LoadImageFromNDArray', **kwargs)) + + def transform(self, single_input: Union[str, np.ndarray, dict]) -> dict: + """Transform function to add image meta information. + + Args: + results (dict): Result dict with Webcam read image in + ``results['img']``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + if isinstance(single_input, str): + inputs = dict(img_path=single_input) + elif isinstance(single_input, np.ndarray): + inputs = dict(img=single_input) + elif isinstance(single_input, dict): + inputs = single_input + else: + raise NotImplementedError + + if 'img' in inputs: + return self.from_ndarray(inputs) + return self.from_file(inputs) diff --git a/mmseg/visualization/local_visualizer.py b/mmseg/visualization/local_visualizer.py index 27443f2c5..f4db83594 100644 --- a/mmseg/visualization/local_visualizer.py +++ b/mmseg/visualization/local_visualizer.py @@ -63,16 +63,7 @@ class SegLocalVisualizer(Visualizer): **kwargs): super().__init__(name, image, vis_backends, save_dir, **kwargs) self.alpha: float = alpha - # Set default value. When calling - # `SegLocalVisualizer().dataset_meta=xxx`, - # it will override the default value. - if dataset_name is None: - dataset_name = 'cityscapes' - classes = classes if classes else get_classes(dataset_name) - palette = palette if palette else get_palette(dataset_name) - assert len(classes) == len( - palette), 'The length of classes should be equal to palette' - self.dataset_meta: dict = {'classes': classes, 'palette': palette} + self.set_dataset_meta(palette, classes, dataset_name) def _draw_sem_seg(self, image: np.ndarray, sem_seg: PixelData, classes: Optional[Tuple[str]], @@ -109,6 +100,21 @@ class SegLocalVisualizer(Visualizer): return self.get_image() + def set_dataset_meta(self, + palette: Optional[Union[str, List]] = None, + classes: Optional[Union[str, List]] = None, + dataset_name: Optional[str] = None) -> None: + # Set default value. When calling + # `SegLocalVisualizer().dataset_meta=xxx`, + # it will override the default value. + if dataset_name is None: + dataset_name = 'cityscapes' + classes = classes if classes else get_classes(dataset_name) + palette = palette if palette else get_palette(dataset_name) + assert len(classes) == len( + palette), 'The length of classes should be equal to palette' + self.dataset_meta: dict = {'classes': classes, 'palette': palette} + @master_only def add_datasample( self, @@ -186,6 +192,6 @@ class SegLocalVisualizer(Visualizer): self.show(drawn_img, win_name=name, wait_time=wait_time) if out_file is not None: - mmcv.imwrite(drawn_img, out_file) + mmcv.imwrite(mmcv.bgr2rgb(drawn_img), out_file) else: self.add_image(name, drawn_img, step) diff --git a/requirements/mminstall.txt b/requirements/mminstall.txt index 8dd00e5cc..707ba66ff 100644 --- a/requirements/mminstall.txt +++ b/requirements/mminstall.txt @@ -1,4 +1,4 @@ mmcls>=1.0.0rc0 mmcv>=2.0.0rc4 -e git+https://github.com/open-mmlab/mmdetection.git@dev-3.x#egg=mmdet -mmengine>=0.4.0,<1.0.0 +mmengine>=0.5.0,<1.0.0 diff --git a/tests/test_apis/test_inferencer.py b/tests/test_apis/test_inferencer.py new file mode 100644 index 000000000..44eb17157 --- /dev/null +++ b/tests/test_apis/test_inferencer.py @@ -0,0 +1,115 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import tempfile + +import numpy as np +import torch +import torch.nn as nn +from mmengine import ConfigDict +from torch.utils.data import DataLoader, Dataset + +from mmseg.apis import MMSegInferencer +from mmseg.models import EncoderDecoder +from mmseg.models.decode_heads.decode_head import BaseDecodeHead +from mmseg.registry import MODELS +from mmseg.utils import register_all_modules + + +@MODELS.register_module(name='InferExampleHead') +class ExampleDecodeHead(BaseDecodeHead): + + def __init__(self, num_classes=19, out_channels=None): + super().__init__( + 3, 3, num_classes=num_classes, out_channels=out_channels) + + def forward(self, inputs): + return self.cls_seg(inputs[0]) + + +@MODELS.register_module(name='InferExampleBackbone') +class ExampleBackbone(nn.Module): + + def __init__(self): + super().__init__() + self.conv = nn.Conv2d(3, 3, 3) + + def init_weights(self, pretrained=None): + pass + + def forward(self, x): + return [self.conv(x)] + + +@MODELS.register_module(name='InferExampleModel') +class ExampleModel(EncoderDecoder): + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + +class ExampleDataset(Dataset): + + def __init__(self) -> None: + super().__init__() + self.pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') + ] + + def __getitem__(self, idx): + return dict(img=torch.tensor([1]), img_metas=dict()) + + def __len__(self): + return 1 + + +def test_inferencer(): + register_all_modules() + test_dataset = ExampleDataset() + data_loader = DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_workers=0, + shuffle=False, + ) + + visualizer = dict( + type='SegLocalVisualizer', + vis_backends=[dict(type='LocalVisBackend')], + name='visualizer') + + cfg_dict = dict( + model=dict( + type='InferExampleModel', + data_preprocessor=dict(type='SegDataPreProcessor'), + backbone=dict(type='InferExampleBackbone'), + decode_head=dict(type='InferExampleHead'), + test_cfg=dict(mode='whole')), + visualizer=visualizer, + test_dataloader=data_loader) + cfg = ConfigDict(cfg_dict) + model = MODELS.build(cfg.model) + + ckpt = model.state_dict() + ckpt_filename = tempfile.mktemp() + torch.save(ckpt, ckpt_filename) + + # test initialization + infer = MMSegInferencer(cfg, ckpt_filename) + + # test forward + img = np.random.randint(0, 256, (4, 4, 3)) + infer(img) + + imgs = [img, img] + infer(imgs) + results = infer(imgs, out_dir=tempfile.gettempdir(), draw_pred=True) + + # test results + assert 'predictions' in results + assert 'visualization' in results + assert len(results['predictions']) == 2 + assert results['predictions'][0].seg_logits.data.shape == torch.Size( + (19, 4, 4)) + assert results['predictions'][0].pred_sem_seg.shape == torch.Size((4, 4)) From 619a3c2508d2fc5f4b3c7cbc6f69106b1bedd416 Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Fri, 24 Feb 2023 14:57:54 +0800 Subject: [PATCH 17/24] [Enhancement] Remove mmdet and mmcls from mminstall (#2642) ## Motivation As the mmdet and mmcls are not very stabel, and mim can install repo from source code, we remove them from mminstall and they won't be installed automatically when run `mim install mmsegmentation` ## Modification 1. remove mmdet and mcls from mminstall 2. add explanation in faq --------- Co-authored-by: MengzhangLI --- docs/en/notes/faq.md | 6 +++++- requirements/mminstall.txt | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/en/notes/faq.md b/docs/en/notes/faq.md index bb09873cf..cd6885216 100644 --- a/docs/en/notes/faq.md +++ b/docs/en/notes/faq.md @@ -17,7 +17,11 @@ The compatible MMSegmentation, MMCV and MMEngine versions are as below. Please i | 1.0.0rc1 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | | 1.0.0rc0 | mmcv >= 2.0.0rc1, \<=2.0.0rc3> | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | Not required | -Notes: To install MMSegmentation 0.x and master branch, please refer to [the faq 0.x document](https://mmsegmentation.readthedocs.io/en/latest/faq.html#installation) to check compatible versions of MMCV. +Notes: + +- MMClassification and MMDetatction are optional for MMSegmentation. If you didn't install them, `ConvNeXt` (required MMClassification) and MaskFormer, Mask2Former (required MMDetection) cannot be used. We recommend to install them with source code. Please refer to [MMClasssication](https://github.com/open-mmlab/mmclassification) and [MMDetection](https://github.com/open-mmlab/mmdetection) for more details about their installation. + +- To install MMSegmentation 0.x and master branch, please refer to [the faq 0.x document](https://mmsegmentation.readthedocs.io/en/latest/faq.html#installation) to check compatible versions of MMCV. ## How to know the number of GPUs needed to train the model diff --git a/requirements/mminstall.txt b/requirements/mminstall.txt index 707ba66ff..df073e0c1 100644 --- a/requirements/mminstall.txt +++ b/requirements/mminstall.txt @@ -1,4 +1,2 @@ -mmcls>=1.0.0rc0 mmcv>=2.0.0rc4 --e git+https://github.com/open-mmlab/mmdetection.git@dev-3.x#egg=mmdet mmengine>=0.5.0,<1.0.0 From eca61d3cda63b3f5453721ef35ad121ce0b14eea Mon Sep 17 00:00:00 2001 From: jinxianwei <81373517+jinxianwei@users.noreply.github.com> Date: Mon, 27 Feb 2023 12:02:48 +0800 Subject: [PATCH 18/24] tools/analysis_tools browse_dataset.py (#2649) ## Motivation browse_dataset before training ## Modification create tools/analysis_tools/browse_dataset.py --- tools/analysis_tools/browse_dataset.py | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tools/analysis_tools/browse_dataset.py diff --git a/tools/analysis_tools/browse_dataset.py b/tools/analysis_tools/browse_dataset.py new file mode 100644 index 000000000..925c14a8a --- /dev/null +++ b/tools/analysis_tools/browse_dataset.py @@ -0,0 +1,77 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp + +from mmengine.config import Config, DictAction +from mmengine.utils import ProgressBar + +from mmseg.registry import DATASETS, VISUALIZERS +from mmseg.utils import register_all_modules + + +def parse_args(): + parser = argparse.ArgumentParser(description='Browse a dataset') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--output-dir', + default=None, + type=str, + help='If there is no display interface, you can save it') + parser.add_argument('--not-show', default=False, action='store_true') + parser.add_argument( + '--show-interval', + type=float, + default=2, + help='the interval of show (s)') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + # register all modules in mmdet into the registries + register_all_modules() + + dataset = DATASETS.build(cfg.train_dataloader.dataset) + visualizer = VISUALIZERS.build(cfg.visualizer) + visualizer.dataset_meta = dataset.metainfo + + progress_bar = ProgressBar(len(dataset)) + for item in dataset: + img = item['inputs'].permute(1, 2, 0).numpy() + img = img[..., [2, 1, 0]] # bgr to rgb + data_sample = item['data_samples'].numpy() + img_path = osp.basename(item['data_samples'].img_path) + + out_file = osp.join( + args.output_dir, + osp.basename(img_path)) if args.output_dir is not None else None + + visualizer.add_datasample( + name=osp.basename(img_path), + image=img, + data_sample=data_sample, + draw_gt=True, + draw_pred=False, + wait_time=args.show_interval, + out_file=out_file, + show=not args.not_show) + progress_bar.update() + + +if __name__ == '__main__': + main() From 19f92851f56a9159cab247ea9914aae1306d4a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=98=95=E8=BE=B0?= Date: Tue, 28 Feb 2023 15:57:43 +0800 Subject: [PATCH 19/24] [Fix] Add out_channels in `CascadeEncoderDecoder` and update OCRNet and MobileNet v2 results (#2656) ## Motivation As title. ## Modification 1. update results in readme 2. fix attr error in cascade encoder decoder --- configs/mobilenet_v2/README.md | 12 +++++----- configs/mobilenet_v2/mobilenet_v2.yml | 5 +++-- configs/ocrnet/README.md | 22 +++++++++---------- configs/ocrnet/ocrnet.yml | 6 ++--- .../segmentors/cascade_encoder_decoder.py | 1 + 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/configs/mobilenet_v2/README.md b/configs/mobilenet_v2/README.md index c1010044a..30f1fe3ce 100644 --- a/configs/mobilenet_v2/README.md +++ b/configs/mobilenet_v2/README.md @@ -39,12 +39,12 @@ The MobileNetV2 architecture is based on an inverted residual structure where th ### Cityscapes -| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | -| ---------- | -------- | --------- | ------: | -------: | -------------- | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| FCN | M-V2-D8 | 512x1024 | 80000 | 3.4 | 14.2 | 61.54 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py) | [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 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py) | [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 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py) | [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 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py) | [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) | +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | +| ---------- | -------- | --------- | ------: | -------: | -------------- | ----: | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FCN | M-V2-D8 | 512x1024 | 80000 | 3.4 | 14.2 | 71.19 | 73.34 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024-20230224_185436-13fef4ea.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024_20230224_185436.json) | +| PSPNet | M-V2-D8 | 512x1024 | 80000 | 3.6 | 11.2 | 70.23 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024.py) | [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 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3_4xb2-80k_cityscapes-512x1024.py) | [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 | - | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/mobilenet_v2/mobilenet-v2-d8_deeplabv3plus_4xb2-80k_cityscapes-512x1024.py) | [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 diff --git a/configs/mobilenet_v2/mobilenet_v2.yml b/configs/mobilenet_v2/mobilenet_v2.yml index 69d73d568..6d87401ce 100644 --- a/configs/mobilenet_v2/mobilenet_v2.yml +++ b/configs/mobilenet_v2/mobilenet_v2.yml @@ -17,9 +17,10 @@ Models: - Task: Semantic Segmentation Dataset: Cityscapes Metrics: - mIoU: 61.54 + mIoU: 71.19 + mIoU(ms+flip): 73.34 Config: configs/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024.py - Weights: 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 + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024/mobilenet-v2-d8_fcn_4xb2-80k_cityscapes-512x1024-20230224_185436-13fef4ea.pth - Name: mobilenet-v2-d8_pspnet_4xb2-80k_cityscapes-512x1024 In Collection: PSPNet Metadata: diff --git a/configs/ocrnet/README.md b/configs/ocrnet/README.md index 5cbfbabfc..4bd9c7d0b 100644 --- a/configs/ocrnet/README.md +++ b/configs/ocrnet/README.md @@ -46,17 +46,17 @@ In this paper, we address the problem of semantic segmentation and focus on the #### HRNet backbone -| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | -| ------ | ------------------ | --------- | ------: | -------- | -------------- | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OCRNet | HRNetV2p-W18-Small | 512x1024 | 40000 | 3.5 | 10.45 | 74.30 | 75.95 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.pyy) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py) | [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) | +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | config | download | +| ------ | ------------------ | --------- | ------: | -------- | -------------- | ----: | ------------: | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 40000 | 3.5 | 10.45 | 76.61 | 78.01 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py) | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026-6c052a14.pth) \| [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 40000 | 4.7 | 7.50 | 77.72 | 79.49 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-40k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-40k_cityscapes-512x1024.pyy) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-80k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18s_4xb2-160k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr18_4xb2-160k_cityscapes-512x1024.py) | [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 | [config](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/configs/ocrnet/ocrnet_hr48_4xb2-160k_cityscapes-512x1024.py) | [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 diff --git a/configs/ocrnet/ocrnet.yml b/configs/ocrnet/ocrnet.yml index a81aec2c7..20002e886 100644 --- a/configs/ocrnet/ocrnet.yml +++ b/configs/ocrnet/ocrnet.yml @@ -33,10 +33,10 @@ Models: - Task: Semantic Segmentation Dataset: Cityscapes Metrics: - mIoU: 74.3 - mIoU(ms+flip): 75.95 + mIoU: 76.61 + mIoU(ms+flip): 78.01 Config: configs/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024.py - Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes/ocrnet_hr18s_512x1024_40k_cityscapes_20200601_033304-fa2436c2.pth + Weights: https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024/ocrnet_hr18s_4xb2-40k_cityscapes-512x1024_20230227_145026-6c052a14.pth - Name: ocrnet_hr18_4xb2-40k_cityscapes-512x1024 In Collection: OCRNet Metadata: diff --git a/mmseg/models/segmentors/cascade_encoder_decoder.py b/mmseg/models/segmentors/cascade_encoder_decoder.py index c932b4306..0184a3533 100644 --- a/mmseg/models/segmentors/cascade_encoder_decoder.py +++ b/mmseg/models/segmentors/cascade_encoder_decoder.py @@ -68,6 +68,7 @@ class CascadeEncoderDecoder(EncoderDecoder): self.decode_head.append(MODELS.build(decode_head[i])) self.align_corners = self.decode_head[-1].align_corners self.num_classes = self.decode_head[-1].num_classes + self.out_channels = self.decode_head[-1].out_channels def encode_decode(self, inputs: Tensor, batch_img_metas: List[dict]) -> Tensor: From e955d6868af1406511d5422080c69bb7420991aa Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Thu, 2 Mar 2023 09:16:48 +0800 Subject: [PATCH 20/24] [Docs] Fix migration link in README (#2659) as title --- README.md | 2 +- docs/zh_cn/migration.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c02d822cd..a38a7de36 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ There are also [advanced tutorials](https://mmsegmentation.readthedocs.io/en/dev A Colab tutorial is also provided. You may preview the notebook [here](demo/MMSegmentation_Tutorial.ipynb) or directly [run](https://colab.research.google.com/github/open-mmlab/mmsegmentation/blob/1.x/demo/MMSegmentation_Tutorial.ipynb) on Colab. -To migrate from MMSegmentation 1.x, please refer to [migration](docs/en/migration.md). +To migrate from MMSegmentation 1.x, please refer to [migration](docs/en/migration). ## Benchmark and model zoo diff --git a/docs/zh_cn/migration.md b/docs/zh_cn/migration.md index 5168bb0bd..3f19b2671 100644 --- a/docs/zh_cn/migration.md +++ b/docs/zh_cn/migration.md @@ -1 +1,3 @@ # 迁移文档 + +中文迁移文档在支持中,请先阅读[英文版迁移文档](../en/migration/) From 8c1d299cb6b7356f87f86e3647f31aaa395d376f Mon Sep 17 00:00:00 2001 From: Tianlong Ai <50650583+AI-Tianlong@users.noreply.github.com> Date: Thu, 2 Mar 2023 09:56:00 +0800 Subject: [PATCH 21/24] [Docs] Add Chinese dataflow markdown (#2652) ## Modification Add Chinese dataflow markdown --------- Signed-off-by: csatsurnh Co-authored-by: csatsurnh Co-authored-by: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> --- docs/zh_cn/advanced_guides/data_flow.md | 89 +++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/docs/zh_cn/advanced_guides/data_flow.md b/docs/zh_cn/advanced_guides/data_flow.md index 960b4e658..5c4f0a023 100644 --- a/docs/zh_cn/advanced_guides/data_flow.md +++ b/docs/zh_cn/advanced_guides/data_flow.md @@ -1 +1,90 @@ # 数据流 + +在本章节中,我们将介绍 [Runner](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html) 管理的内部模块之间的数据流和数据格式约定。 + +## 数据流概述 + +[Runner](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/design/runner.md) 相当于 MMEngine 中的“集成器”。它覆盖了框架的所有方面,并肩负着组织和调度几乎所有模块的责任,这意味着各模块之间的数据流也由 `Runner` 控制。 如 [MMEngine 中的 Runner 文档](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html)所示,下图展示了基本的数据流。 + +![Basic dataflow](https://user-images.githubusercontent.com/112053249/199228350-5f80699e-7fd2-4b4c-ac32-0b16b1922c2e.png) + +虚线边框、灰色填充形状代表不同的数据格式,而实心框表示模块/方法。由于 MMEngine 极大的灵活性和可扩展性,一些重要的基类可以被继承,并且它们的方法可以被覆写。 上图所示数据流仅适用于当用户没有自定义 `Runner` 中的 `TrainLoop`、`ValLoop` 和 `TestLoop`,并且没有在其自定义模型中覆写 `train_step`、`val_step` 和 `test_step` 方法时。MMSegmentation 中 loop 的默认设置如下:使用`IterBasedTrainLoop` 训练模型,共计 20000 次迭代,并且在每 2000 次迭代后进行一次验证。 + +```python +train_cfg = dict(type='IterBasedTrainLoop', max_iters=20000, val_interval=2000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') +``` + +在上图中,红色线表示 [train_step](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md#train_step) ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/models.md#train_step))*** ,在每次训练迭代中,数据加载器(dataloader)从存储中加载图像并传输到数据预处理器(data preprocessor),数据预处理器会将图像放到特定的设备上,并将数据堆叠到批处理中,之后模型接受批处理数据作为输入,最后将模型的输出发送给优化器(optimizer)。蓝色线表示 [val_step](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md#val_step) 和 [test_step](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md#test_step) ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/models.md#test_step))*** 。这两个过程的数据流除了模型输出与 `train_step` 不同外,其余均和 `train_step` 类似。由于在评估时模型参数会被冻结,因此模型的输出将被传递给 [Evaluator](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/evaluation.md#ioumetric) ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/evaluation.md#ioumetric))*** +来计算指标。 + +## MMSegmentation 中的数据流约定 + +在上面的图中,我们可以看到基本的数据流。在本节中,我们将分别介绍数据流中涉及的数据的格式约定。 + +### 数据加载器到数据预处理器 + +数据加载器(DataLoader)是 MMEngine 的训练和测试流程中的一个重要组件。 +从概念上讲,它源于 [PyTorch](https://pytorch.org/) 并保持一致。DataLoader 从文件系统加载数据,原始数据通过数据准备流程后被发送给数据预处理器。 + +MMSegmentation 在 [PackSegInputs](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/datasets/transforms/formatting.py#L12) 中定义了默认数据格式, 它是 `train_pipeline` 和 `test_pipeline` 的最后一个组件。有关数据转换 `pipeline` 的更多信息,请参阅[数据转换文档](https://mmsegmentation.readthedocs.io/en/dev-1.x/advanced_guides/transforms.html)。 ***([中文链接待更新](https://mmsegmentation.readthedocs.io/zh_CN/dev-1.x/advanced_guides/transforms.html))*** + +在没有任何修改的情况下,PackSegInputs 的返回值通常是一个包含 `inputs` 和 `data_samples` 的 `dict`。以下伪代码展示了 mmseg 中数据加载器输出的数据类型,它是从数据集中获取的一批数据样本,数据加载器将它们打包成一个字典列表。`inputs` 是输入进模型的张量列表,`data_samples` 包含了输入图像的 meta information 和相应的 ground truth。 + +```python +dict( + inputs=List[torch.Tensor], + data_samples=List[SegDataSample] +) +``` + +**注意:** [SegDataSample](https://github.com/open-mmlab/mmsegmentation/blob/1.x/mmseg/structures/seg_data_sample.py) 是 MMSegmentation 的数据结构接口,用于连接不同组件。`SegDataSample` 实现了抽象数据元素 `mmengine.structures.BaseDataElement`,更多信息请在 [MMEngine](https://github.com/open-mmlab/mmengine) 中参阅 [SegDataSample 文档](https://mmsegmentation.readthedocs.io/zh_CN/1.x/advanced_guides/structures.html)和[数据元素文档](https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/data_element.html)。 + +### 数据预处理器到模型 + +虽然在[上面的图](#数据流概述)中分开绘制了数据预处理器和模型,但数据预处理器是模型的一部分,因此可以在[模型教程](https://mmsegmentation.readthedocs.io/en/dev-1.x/advanced_guides/models.html)中找到数据预处理器章节。 ***([中文链接待更新](https://mmsegmentation.readthedocs.io/zh_CN/dev-1.x/advanced_guides/models.html))*** + +数据预处理器的返回值是一个包含 `inputs` 和 `data_samples` 的字典,其中 `inputs` 是批处理图像的 4D 张量,`data_samples` 中添加了一些用于数据预处理的额外元信息。当传递给网络时,字典将被解包为两个值。 以下伪代码展示了数据预处理器的返回值和模型的输入值。 + +```python +dict( + inputs=torch.Tensor, + data_samples=List[SegDataSample] +) +``` + +```python +class Network(BaseSegmentor): + + def forward(self, inputs: torch.Tensor, data_samples: List[SegDataSample], mode: str): + pass +``` + +**注意:** 模型的前向传播有 3 种模式,由输入参数 mode 控制,更多信息请参阅[模型教程](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md)。 ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/models.md))*** + +### 模型输出 + +如[模型教程](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md#forward) ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/models.md#forward))*** 所提到的 3 种前向传播具有 3 种输出。 +`train_step` 和 `test_step`(或 `val_step`)分别对应于 `'loss'` 和 `'predict'`。 + +在 `test_step` 或 `val_step` 中,推理结果会被传递给 `Evaluator` 。您可以参阅[评估文档](https://mmsegmentation.readthedocs.io/en/dev-1.x/advanced_guides/evaluation.html) ***([中文链接待更新](https://mmsegmentation.readthedocs.io/zh_CN/dev-1.x/advanced_guides/evaluation.html))*** 来获取更多关于 `Evaluator` 的信息。 + +在推理后,MMSegmentation 中的 [BaseSegmentor](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/segmentors/base.py#L15) 会对推理结果进行简单的后处理以打包推理结果。神经网络生成的分割 logits,经过 `argmax` 操作后的分割 mask 和 ground truth(如果存在)将被打包到类似 `SegDataSample` 的实例。 [postprocess_result](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/segmentors/base.py#L132) 的返回值是一个 **`SegDataSample`的`List`**。下图显示了这些 `SegDataSample` 实例的关键属性。 + +![SegDataSample](https://user-images.githubusercontent.com/15952744/209912225-ab46a8d9-904a-43cb-8bf1-8bec4938ed29.png) + +与数据预处理器一致,损失函数也是模型的一部分,它是[解码头](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/decode_head.py#L142)的属性之一。 + +在 MMSegmentation 中,`decode_head` 的 [loss_by_feat](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/models/decode_heads/decode_head.py#L291) 方法是用于计算损失的统一接口。 + +参数: + +- seg_logits (Tensor):解码头前向函数的输出 +- batch_data_samples (List\[SegDataSample\]):分割数据样本,通常包括如 `metainfo` 和 `gt_sem_seg` 等信息 + +返回值: + +- dict\[str, Tensor\]:一个损失组件的字典 + +**注意:** `train_step` 将损失传递进 OptimWrapper 以更新模型中的权重,更多信息请参阅 [train_step](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/en/advanced_guides/models.md#train_step)。 ***([中文链接待更新](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/docs/zh_cn/advanced_guides/models.md#train_step))*** From 310ec4afc78c2d2a9a3dd566b1078c3c037aaf53 Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:37:54 +0800 Subject: [PATCH 22/24] [Enhancement] Modify interface of MMSeginferencer and add docs (#2658) ## Motivation Make MMSeginferencer easier to be used ## Modification 1. Add `_load_weights_to_model` to MMSeginferencer, it is for get `dataset_meta` from ckpt 2. Modify and remove some parameters of `__call__`, `visualization` and `postprocess` 3. Add function of save seg mask, remove dump pkl. 4. Refine docstring of MMSeginferencer and SegLocalVisualizer 5. Add the user documentation of MMSeginferencer ## BC-breaking (Optional) yes, remove some parameters, we need to discuss whether keep them with deprecated waring or just remove them as the MMSeginferencer just merged in mmseg a few days. Co-authored-by: xiexinch --- demo/image_demo_with_inferencer.py | 11 +- docs/en/user_guides/3_inference.md | 129 +++++++++++++- mmseg/apis/mmseg_inferencer.py | 226 ++++++++++++++++-------- mmseg/visualization/local_visualizer.py | 60 +++++-- tests/test_apis/test_inferencer.py | 6 +- 5 files changed, 328 insertions(+), 104 deletions(-) diff --git a/demo/image_demo_with_inferencer.py b/demo/image_demo_with_inferencer.py index ce40f2224..26bf0f257 100644 --- a/demo/image_demo_with_inferencer.py +++ b/demo/image_demo_with_inferencer.py @@ -16,11 +16,6 @@ def main(): action='store_true', default=False, help='Whether to display the drawn image.') - parser.add_argument( - '--save-mask', - action='store_true', - default=False, - help='Enable save the mask file') parser.add_argument( '--dataset-name', default='cityscapes', @@ -43,11 +38,7 @@ def main(): # test a single image mmseg_inferencer( - args.img, - show=args.show, - out_dir=args.out_dir, - save_mask=args.save_mask, - opacity=args.opacity) + args.img, show=args.show, out_dir=args.out_dir, opacity=args.opacity) if __name__ == '__main__': diff --git a/docs/en/user_guides/3_inference.md b/docs/en/user_guides/3_inference.md index 39f296a51..c9f4e62f1 100644 --- a/docs/en/user_guides/3_inference.md +++ b/docs/en/user_guides/3_inference.md @@ -4,13 +4,132 @@ MMSegmentation provides pre-trained models for semantic segmentation in [Model Z This note will show how to use existing models to inference on given images. As for how to test existing models on standard datasets, please see this [guide](./4_train_test.md) -## Inference API - MMSegmentation provides several interfaces for users to easily use pre-trained models for inference. -- [mmseg.apis.init_model](#mmsegapisinit_model) -- [mmseg.apis.inference_model](#mmsegapisinference_model) -- [mmseg.apis.show_result_pyplot](#mmsegapisshow_result_pyplot) +- [Tutorial 3: Inference with existing models](#tutorial-3-inference-with-existing-models) + - [Inferencer](#inferencer) + - [Basic Usage](#basic-usage) + - [Initialization](#initialization) + - [Visualize prediction](#visualize-prediction) + - [List model](#list-model) + - [Inference API](#inference-api) + - [mmseg.apis.init_model](#mmsegapisinit_model) + - [mmseg.apis.inference_model](#mmsegapisinference_model) + - [mmseg.apis.show_result_pyplot](#mmsegapisshow_result_pyplot) + +## Inferencer + +We provides the most **convenient** way to use the model in MMSegmentation `MMSegInferencer`. You can get segmentation mask for an image with only 3 lines of code. + +### Basic Usage + +The following example shows how to use `MMSegInferencer` to perform inference on a single image. + +``` +>>> from mmseg.apis import MMSegInferencer +>>> # Load models into memory +>>> inferencer = MMSegInferencer(model='deeplabv3plus_r18-d8_4xb2-80k_cityscapes-512x1024') +>>> # Inference +>>> inferencer('demo/demo.png', show=True) +``` + +The visualization result should look like: + +
+https://user-images.githubusercontent.com/76149310/221507927-ae01e3a7-016f-4425-b966-7b19cbbe494e.png +
+ +Moreover, you can use `MMSegInferencer` to process a list of images: + +``` +# Input a list of images +>>> images = [image1, image2, ...] # image1 can be a file path or a np.ndarray +>>> inferencer(images, show=True, wait_time=0.5) # wait_time is delay time, and 0 means forever. + +# Or input image directory +>>> images = $IMAGESDIR +>>> inferencer(images, show=True, wait_time=0.5) + +# Save visualized rendering color maps and predicted results +# out_dir is the directory to save the output results, img_out_dir and pred_out_dir are subdirectories of out_dir +# to save visualized rendering color maps and predicted results +>>> inferencer(images, out_dir='outputs', img_out_dir='vis', pred_out_dir='pred') +``` + +There is a optional parameter of inferencer, `return_datasamples`, whose default value is False, and +return value of inferencer is a `dict` type by default, including 2 keys 'visualization' and 'predictions'. +If `return_datasamples=True` inferencer will return [`SegDataSample`](../advanced_guides/structures.md), or list of it. + +``` +result = inferencer('demo/demo.png') +# result is a `dict` including 2 keys 'visualization' and 'predictions'. +# 'visualization' includes color segmentation map +print(result['visualization'].shape) +# (512, 683, 3) + +# 'predictions' includes segmentation mask with label indice +print(result['predictions'].shape) +# (512, 683) + +result = inferencer('demo/demo.png', return_datasamples=True) +print(type(result)) +# + +# Input a list of images +results = inferencer(images) +# The output is list +print(type(results['visualization']), results['visualization'][0].shape) +# (512, 683, 3) +print(type(results['predictions']), results['predictions'][0].shape) +# (512, 683) + +results = inferencer(images, return_datasamples=True) +# +print(type(results[0])) +# +``` + +### Initialization + +`MMSegInferencer` must be initialized from a `model`, which can be a model name or a `Config` even a path of config file. +The model names can be found in models' metafile, like one model name of maskformer is `maskformer_r50-d32_8xb2-160k_ade20k-512x512`, and if input model name and the weights of the model will be download automatically. Below are other input parameters: + +- weights (str, optional) - Path to the checkpoint. If it is not specified and model is a model name of metafile, the weights will be loaded + from metafile. Defaults to None. +- classes (list, optional) - Input classes for result rendering, as the prediction of segmentation + model is a segment map with label indices, `classes` is a list which includes + items responding to the label indices. If classes is not defined, visualizer will take `cityscapes` classes by default. Defaults to None. +- palette (list, optional) - Input palette for result rendering, which is a list of color palette + responding to the classes. If palette is not defined, visualizer will take `cityscapes` palette by default. Defaults to None. +- dataset_name (str, optional)[Dataset name or alias](https://github.com/open-mmlab/mmsegmentation/blob/dev-1.x/mmseg/utils/class_names.py#L302-L317) + visulizer will use the meta information of the dataset i.e. classes and palette, + but the `classes` and `palette` have higher priority. Defaults to None. +- device (str, optional) - Device to run inference. If None, the available device will be automatically used. Defaults to None. +- scope (str, optional) - The scope of the model. Defaults to 'mmseg'. + +### Visualize prediction + +`MMSegInferencer` supports 4 parameters for visualize prediction, you can use them when call initialized inferencer: + +- show (bool) - Whether to display the image in a popup window. Defaults to False. +- wait_time (float) - The interval of show (s). Defaults to 0. +- img_out_dir (str) - Subdirectory of `out_dir`, used to save rendering color segmentation mask, so `out_dir` must be defined + if you would like to save predicted mask. Defaults to 'vis'. +- opacity (int, float) - The transparency of segmentation mask. Defaults to 0.8. + +The examples of these parameters is in [Basic Usage](#basic-usage) + +### List model + +There is a very easy to list all model names in MMSegmentation + +``` +>>> from mmseg.apis import MMSegInferencer +# models is a list of model names, and them will print automatically +>>> models = MMSegInferencer.list_models('mmseg') +``` + +## Inference API ### mmseg.apis.init_model diff --git a/mmseg/apis/mmseg_inferencer.py b/mmseg/apis/mmseg_inferencer.py index deb57b9b8..cb387b10b 100644 --- a/mmseg/apis/mmseg_inferencer.py +++ b/mmseg/apis/mmseg_inferencer.py @@ -1,15 +1,22 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp +import warnings from typing import List, Optional, Sequence, Union import mmcv import mmengine import numpy as np +import torch +import torch.nn as nn from mmcv.transforms import Compose from mmengine.infer.infer import BaseInferencer, ModelType +from mmengine.model import revert_sync_batchnorm +from mmengine.registry import init_default_scope +from mmengine.runner.checkpoint import _load_checkpoint_to_model +from PIL import Image from mmseg.structures import SegDataSample -from mmseg.utils import ConfigType, SampleList, register_all_modules +from mmseg.utils import ConfigType, SampleList, get_classes, get_palette from mmseg.visualization import SegLocalVisualizer InputType = Union[str, np.ndarray] @@ -23,90 +30,164 @@ class MMSegInferencer(BaseInferencer): Args: model (str, optional): Path to the config file or the model name - defined in metafile. For example, it could be - "fcn_r50-d8_4xb2-40k_cityscapes-512x1024" or - "configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py" + defined in metafile. Take the `mmseg metafile `_ + as an example the `model` could be + "fcn_r50-d8_4xb2-40k_cityscapes-512x1024", and the weights of model + will be download automatically. If use config file, like + "configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py", the + `weights` should be defined. weights (str, optional): Path to the checkpoint. If it is not specified and model is a model name of metafile, the weights will be loaded from metafile. Defaults to None. - palette (List[List[int]], optional): The palette of - segmentation map. - classes (Tuple[str], optional): Category information. - dataset_name (str, optional): Name of the datasets supported in mmseg. + classes (list, optional): Input classes for result rendering, as the + prediction of segmentation model is a segment map with label + indices, `classes` is a list which includes items responding to the + label indices. If classes is not defined, visualizer will take + `cityscapes` classes by default. Defaults to None. + palette (list, optional): Input palette for result rendering, which is + a list of color palette responding to the classes. If palette is + not defined, visualizer will take `cityscapes` palette by default. + Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. classes + and palette, but the `classes` and `palette` have higher priority. + Defaults to None. device (str, optional): Device to run inference. If None, the available device will be automatically used. Defaults to None. - scope (str, optional): The scope of the model. Defaults to None. - """ + scope (str, optional): The scope of the model. Defaults to 'mmseg'. + """ # noqa preprocess_kwargs: set = set() forward_kwargs: set = {'mode', 'out_dir'} - visualize_kwargs: set = { - 'show', 'wait_time', 'draw_pred', 'img_out_dir', 'opacity' - } - postprocess_kwargs: set = { - 'pred_out_dir', 'return_datasample', 'save_mask', 'mask_dir' - } + visualize_kwargs: set = {'show', 'wait_time', 'img_out_dir', 'opacity'} + postprocess_kwargs: set = {'pred_out_dir', 'return_datasample'} def __init__(self, model: Union[ModelType, str], weights: Optional[str] = None, - palette: Optional[Union[str, List]] = None, classes: Optional[Union[str, List]] = None, + palette: Optional[Union[str, List]] = None, dataset_name: Optional[str] = None, device: Optional[str] = None, scope: Optional[str] = 'mmseg') -> None: # A global counter tracking the number of images processes, for # naming of the output images self.num_visualized_imgs = 0 - register_all_modules() + self.num_pred_imgs = 0 + init_default_scope(scope if scope else 'mmseg') super().__init__( model=model, weights=weights, device=device, scope=scope) + if device == 'cpu' or not torch.cuda.is_available(): + self.model = revert_sync_batchnorm(self.model) + assert isinstance(self.visualizer, SegLocalVisualizer) self.visualizer.set_dataset_meta(palette, classes, dataset_name) + def _load_weights_to_model(self, model: nn.Module, + checkpoint: Optional[dict], + cfg: Optional[ConfigType]) -> None: + """Loading model weights and meta information from cfg and checkpoint. + + Subclasses could override this method to load extra meta information + from ``checkpoint`` and ``cfg`` to model. + + Args: + model (nn.Module): Model to load weights and meta information. + checkpoint (dict, optional): The loaded checkpoint. + cfg (Config or ConfigDict, optional): The loaded config. + """ + + if checkpoint is not None: + _load_checkpoint_to_model(model, checkpoint) + checkpoint_meta = checkpoint.get('meta', {}) + # save the dataset_meta in the model for convenience + if 'dataset_meta' in checkpoint_meta: + # mmsegmentation 1.x + model.dataset_meta = { + 'classes': checkpoint_meta['dataset_meta'].get('classes'), + 'palette': checkpoint_meta['dataset_meta'].get('palette') + } + elif 'CLASSES' in checkpoint_meta: + # mmsegmentation 0.x + classes = checkpoint_meta['CLASSES'] + palette = checkpoint_meta.get('PALETTE', None) + model.dataset_meta = {'classes': classes, 'palette': palette} + else: + warnings.warn( + 'dataset_meta or class names are not saved in the ' + 'checkpoint\'s meta data, use classes of Cityscapes by ' + 'default.') + model.dataset_meta = { + 'classes': get_classes('cityscapes'), + 'palette': get_palette('cityscapes') + } + else: + warnings.warn('Checkpoint is not loaded, and the inference ' + 'result is calculated by the randomly initialized ' + 'model!') + warnings.warn( + 'weights is None, use cityscapes classes by default.') + model.dataset_meta = { + 'classes': get_classes('cityscapes'), + 'palette': get_palette('cityscapes') + } + def __call__(self, inputs: InputsType, return_datasamples: bool = False, batch_size: int = 1, show: bool = False, wait_time: int = 0, - draw_pred: bool = True, out_dir: str = '', - save_mask: bool = False, - mask_dir: str = 'mask', + img_out_dir: str = 'vis', + pred_out_dir: str = 'pred', **kwargs) -> dict: """Call the inferencer. Args: - inputs (Union[str, np.ndarray]): Inputs for the inferencer. + inputs (Union[list, str, np.ndarray]): Inputs for the inferencer. return_datasamples (bool): Whether to return results as :obj:`SegDataSample`. Defaults to False. batch_size (int): Batch size. Defaults to 1. - show (bool): Whether to display the image in a popup window. - Defaults to False. + show (bool): Whether to display the rendering color segmentation + mask in a popup window. Defaults to False. wait_time (float): The interval of show (s). Defaults to 0. - draw_pred (bool): Whether to draw Prediction SegDataSample. - Defaults to True. - out_dir (str): Output directory of inference results. Defaults: ''. - save_mask (bool): Whether save pred mask as a file. - mask_dir (str): Sub directory of `pred_out_dir`, used to save pred - mask file. + out_dir (str): Output directory of inference results. Defaults + to ''. + img_out_dir (str): Subdirectory of `out_dir`, used to save + rendering color segmentation mask, so `out_dir` must be defined + if you would like to save predicted mask. Defaults to 'vis'. + pred_out_dir (str): Subdirectory of `out_dir`, used to save + predicted mask file, so `out_dir` must be defined if you would + like to save predicted mask. Defaults to 'pred'. + + **kwargs: Other keyword arguments passed to :meth:`preprocess`, + :meth:`forward`, :meth:`visualize` and :meth:`postprocess`. + Each key in kwargs should be in the corresponding set of + ``preprocess_kwargs``, ``forward_kwargs``, ``visualize_kwargs`` + and ``postprocess_kwargs``. + Returns: dict: Inference and visualization results. """ + + if out_dir != '': + pred_out_dir = osp.join(out_dir, pred_out_dir) + img_out_dir = osp.join(out_dir, img_out_dir) + else: + pred_out_dir = '' + img_out_dir = '' + return super().__call__( inputs=inputs, return_datasamples=return_datasamples, batch_size=batch_size, show=show, wait_time=wait_time, - draw_pred=draw_pred, - img_out_dir=out_dir, - pred_out_dir=out_dir, - save_mask=save_mask, - mask_dir=mask_dir, + img_out_dir=img_out_dir, + pred_out_dir=pred_out_dir, **kwargs) def visualize(self, @@ -114,7 +195,6 @@ class MMSegInferencer(BaseInferencer): preds: List[dict], show: bool = False, wait_time: int = 0, - draw_pred: bool = True, img_out_dir: str = '', opacity: float = 0.8) -> List[np.ndarray]: """Visualize predictions. @@ -125,9 +205,8 @@ class MMSegInferencer(BaseInferencer): show (bool): Whether to display the image in a popup window. Defaults to False. wait_time (float): The interval of show (s). Defaults to 0. - draw_pred (bool): Whether to draw Prediction SegDataSample. - Defaults to True. - img_out_dir (str): Output directory of drawn images. Defaults: '' + img_out_dir (str): Output directory of rendering prediction i.e. + color segmentation mask. Defaults: '' opacity (int, float): The transparency of segmentation mask. Defaults to 0.8. @@ -140,7 +219,7 @@ class MMSegInferencer(BaseInferencer): if getattr(self, 'visualizer') is None: raise ValueError('Visualization needs the "visualizer" term' 'defined in the config, but got None') - + self.visualizer.set_dataset_meta(**self.model.dataset_meta) self.visualizer.alpha = opacity results = [] @@ -153,7 +232,7 @@ class MMSegInferencer(BaseInferencer): img_name = osp.basename(single_input) elif isinstance(single_input, np.ndarray): img = single_input.copy() - img_num = str(self.num_visualized_imgs).zfill(8) + img_num = str(self.num_visualized_imgs).zfill(8) + '_vis' img_name = f'{img_num}.jpg' else: raise ValueError('Unsupported input type:' @@ -169,7 +248,7 @@ class MMSegInferencer(BaseInferencer): show=show, wait_time=wait_time, draw_gt=False, - draw_pred=draw_pred, + draw_pred=True, out_file=out_file) results.append(self.visualizer.get_image()) self.num_visualized_imgs += 1 @@ -180,62 +259,65 @@ class MMSegInferencer(BaseInferencer): preds: PredType, visualization: List[np.ndarray], return_datasample: bool = False, - mask_dir: str = 'mask', - save_mask: bool = True, pred_out_dir: str = '') -> dict: """Process the predictions and visualization results from ``forward`` and ``visualize``. This method should be responsible for the following tasks: - 1. Convert datasamples into a json-serializable dict if needed. - 2. Pack the predictions and visualization results and return them. - 3. Dump or log the predictions. + 1. Pack the predictions and visualization results and return them. + 2. Save the predictions, if it needed. Args: preds (List[Dict]): Predictions of the model. - visualization (np.ndarray): Visualized predictions. + visualization (List[np.ndarray]): The list of rendering color + segmentation mask. return_datasample (bool): Whether to return results as datasamples. Defaults to False. pred_out_dir: File to save the inference results w/o visualization. If left as empty, no file will be saved. Defaults to ''. - mask_dir (str): Sub directory of `pred_out_dir`, used to save pred - mask file. - save_mask (bool): Whether save pred mask as a file. Returns: dict: Inference and visualization results with key ``predictions`` and ``visualization`` - ``visualization (Any)``: Returned by :meth:`visualize` - - ``predictions`` (dict or DataSample): Returned by + - ``predictions`` (List[np.ndarray], np.ndarray): Returned by :meth:`forward` and processed in :meth:`postprocess`. - If ``return_datasample=False``, it usually should be a - json-serializable dict containing only basic data elements such - as strings and numbers. + If ``return_datasample=False``, it will be the segmentation mask + with label indice. """ + if return_datasample: + if len(preds) == 1: + return preds[0] + else: + return preds + results_dict = {} - results_dict['predictions'] = preds - results_dict['visualization'] = visualization + results_dict['predictions'] = [] + results_dict['visualization'] = [] - if pred_out_dir != '': - mmengine.mkdir_or_exist(pred_out_dir) - if save_mask: - preds = [preds] if isinstance(preds, SegDataSample) else preds - for pred in preds: - mmcv.imwrite( - pred.pred_sem_seg.numpy().data[0], - osp.join(pred_out_dir, mask_dir, - osp.basename(pred.metainfo['img_path']))) - else: - mmengine.dump(results_dict, - osp.join(pred_out_dir, 'results.pkl')) - - if return_datasample: - return preds + for i, pred in enumerate(preds): + pred_data = pred.pred_sem_seg.numpy().data[0] + results_dict['predictions'].append(pred_data) + if visualization is not None: + vis = visualization[i] + results_dict['visualization'].append(vis) + if pred_out_dir != '': + mmengine.mkdir_or_exist(pred_out_dir) + img_name = str(self.num_pred_imgs).zfill(8) + '_pred.png' + img_path = osp.join(pred_out_dir, img_name) + output = Image.fromarray(pred_data.astype(np.uint8)) + output.save(img_path) + self.num_pred_imgs += 1 + if len(results_dict['predictions']) == 1: + results_dict['predictions'] = results_dict['predictions'][0] + if visualization is not None: + results_dict['visualization'] = \ + results_dict['visualization'][0] return results_dict def _init_pipeline(self, cfg: ConfigType) -> Compose: diff --git a/mmseg/visualization/local_visualizer.py b/mmseg/visualization/local_visualizer.py index f4db83594..d11ad79c8 100644 --- a/mmseg/visualization/local_visualizer.py +++ b/mmseg/visualization/local_visualizer.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import Dict, List, Optional, Tuple, Union +from typing import Dict, List, Optional import mmcv import numpy as np @@ -24,6 +24,17 @@ class SegLocalVisualizer(Visualizer): Defaults to None. save_dir (str, optional): Save file dir for all storage backends. If it is None, the backend storage will not save any data. + classes (list, optional): Input classes for result rendering, as the + prediction of segmentation model is a segment map with label + indices, `classes` is a list which includes items responding to the + label indices. If classes is not defined, visualizer will take + `cityscapes` classes by default. Defaults to None. + palette (list, optional): Input palette for result rendering, which is + a list of color palette responding to the classes. Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. classes + and palette, but the `classes` and `palette` have higher priority. + Defaults to None. alpha (int, float): The transparency of segmentation mask. Defaults to 0.8. @@ -49,15 +60,15 @@ class SegLocalVisualizer(Visualizer): >>> seg_local_visualizer.add_datasample( ... 'visualizer_example', image, ... gt_seg_data_sample, show=True) - """ + """ # noqa def __init__(self, name: str = 'visualizer', image: Optional[np.ndarray] = None, vis_backends: Optional[Dict] = None, save_dir: Optional[str] = None, - palette: Optional[Union[str, List]] = None, - classes: Optional[Union[str, List]] = None, + classes: Optional[List] = None, + palette: Optional[List] = None, dataset_name: Optional[str] = None, alpha: float = 0.8, **kwargs): @@ -66,17 +77,23 @@ class SegLocalVisualizer(Visualizer): self.set_dataset_meta(palette, classes, dataset_name) def _draw_sem_seg(self, image: np.ndarray, sem_seg: PixelData, - classes: Optional[Tuple[str]], - palette: Optional[List[List[int]]]) -> np.ndarray: + classes: Optional[List], + palette: Optional[List]) -> np.ndarray: """Draw semantic seg of GT or prediction. Args: image (np.ndarray): The image to draw. - sem_seg (:obj:`PixelData`): Data structure for - pixel-level annotations or predictions. - classes (Tuple[str], optional): Category information. - palette (List[List[int]], optional): The palette of - segmentation map. + sem_seg (:obj:`PixelData`): Data structure for pixel-level + annotations or predictions. + classes (list, optional): Input classes for result rendering, as + the prediction of segmentation model is a segment map with + label indices, `classes` is a list which includes items + responding to the label indices. If classes is not defined, + visualizer will take `cityscapes` classes by default. + Defaults to None. + palette (list, optional): Input palette for result rendering, which + is a list of color palette responding to the classes. + Defaults to None. Returns: np.ndarray: the drawn image which channel is RGB. @@ -101,9 +118,26 @@ class SegLocalVisualizer(Visualizer): return self.get_image() def set_dataset_meta(self, - palette: Optional[Union[str, List]] = None, - classes: Optional[Union[str, List]] = None, + classes: Optional[List] = None, + palette: Optional[List] = None, dataset_name: Optional[str] = None) -> None: + """Set meta information to visualizer. + + Args: + classes (list, optional): Input classes for result rendering, as + the prediction of segmentation model is a segment map with + label indices, `classes` is a list which includes items + responding to the label indices. If classes is not defined, + visualizer will take `cityscapes` classes by default. + Defaults to None. + palette (list, optional): Input palette for result rendering, which + is a list of color palette responding to the classes. + Defaults to None. + dataset_name (str, optional): `Dataset name or alias `_ + visulizer will use the meta information of the dataset i.e. + classes and palette, but the `classes` and `palette` have + higher priority. Defaults to None. + """ # noqa # Set default value. When calling # `SegLocalVisualizer().dataset_meta=xxx`, # it will override the default value. diff --git a/tests/test_apis/test_inferencer.py b/tests/test_apis/test_inferencer.py index 44eb17157..497eae4a0 100644 --- a/tests/test_apis/test_inferencer.py +++ b/tests/test_apis/test_inferencer.py @@ -104,12 +104,10 @@ def test_inferencer(): imgs = [img, img] infer(imgs) - results = infer(imgs, out_dir=tempfile.gettempdir(), draw_pred=True) + results = infer(imgs, out_dir=tempfile.gettempdir()) # test results assert 'predictions' in results assert 'visualization' in results assert len(results['predictions']) == 2 - assert results['predictions'][0].seg_logits.data.shape == torch.Size( - (19, 4, 4)) - assert results['predictions'][0].pred_sem_seg.shape == torch.Size((4, 4)) + assert results['predictions'][0].shape == (4, 4) From aaa08dc4b20d5e2724320715ca8f1f303fbe4d8f Mon Sep 17 00:00:00 2001 From: Miao Zheng <76149310+MeowZheng@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:51:38 +0800 Subject: [PATCH 23/24] [Doc] Refine MMSegmentation documentation (#2668) --- .../{add_dataset.md => add_datasets.md} | 2 +- docs/en/advanced_guides/add_metrics.md | 1 + docs/en/advanced_guides/add_transform.md | 37 -- docs/en/advanced_guides/add_transforms.md | 52 ++ docs/en/advanced_guides/evaluation.md | 4 +- docs/en/advanced_guides/index.rst | 2 +- docs/en/advanced_guides/training_tricks.md | 2 +- docs/en/advanced_guides/transforms.md | 49 +- docs/en/api.rst | 7 +- docs/en/modelzoo_statistics.md | 102 ++++ docs/en/notes/faq.md | 2 +- docs/en/user_guides/deployment.md | 2 +- docs/en/user_guides/useful_tools.md | 2 +- docs/zh_cn/advanced_guides/add_datasets.md | 2 +- docs/zh_cn/advanced_guides/add_metric.md | 1 - docs/zh_cn/advanced_guides/add_metrics.md | 1 + docs/zh_cn/advanced_guides/add_models.md | 3 + docs/zh_cn/advanced_guides/add_modules.md | 230 --------- docs/zh_cn/advanced_guides/add_transforms.md | 167 +------ docs/zh_cn/advanced_guides/data_flow.md | 2 +- docs/zh_cn/advanced_guides/evaluation.md | 4 +- docs/zh_cn/advanced_guides/index.rst | 2 +- docs/zh_cn/advanced_guides/models.md | 2 + docs/zh_cn/advanced_guides/transforms.md | 4 +- docs/zh_cn/api.rst | 5 - docs/zh_cn/get_started.md | 2 +- docs/zh_cn/modelzoo_statistics.md | 102 ++++ docs/zh_cn/user_guides/2_dataset_prepare.md | 452 +----------------- docs/zh_cn/user_guides/3_inference.md | 126 +---- docs/zh_cn/user_guides/4_train_test.md | 8 +- docs/zh_cn/user_guides/visualization.md | 2 +- 31 files changed, 294 insertions(+), 1085 deletions(-) rename docs/en/advanced_guides/{add_dataset.md => add_datasets.md} (99%) create mode 100644 docs/en/advanced_guides/add_metrics.md delete mode 100644 docs/en/advanced_guides/add_transform.md create mode 100644 docs/en/advanced_guides/add_transforms.md create mode 100644 docs/en/modelzoo_statistics.md delete mode 100644 docs/zh_cn/advanced_guides/add_metric.md create mode 100644 docs/zh_cn/advanced_guides/add_metrics.md create mode 100644 docs/zh_cn/advanced_guides/add_models.md delete mode 100644 docs/zh_cn/advanced_guides/add_modules.md create mode 100644 docs/zh_cn/modelzoo_statistics.md diff --git a/docs/en/advanced_guides/add_dataset.md b/docs/en/advanced_guides/add_datasets.md similarity index 99% rename from docs/en/advanced_guides/add_dataset.md rename to docs/en/advanced_guides/add_datasets.md index 4149014e6..f33f3d32c 100644 --- a/docs/en/advanced_guides/add_dataset.md +++ b/docs/en/advanced_guides/add_datasets.md @@ -1,4 +1,4 @@ -# Add New Datasets +# \[WIP\] Add New Datasets ## Customize datasets by reorganizing data diff --git a/docs/en/advanced_guides/add_metrics.md b/docs/en/advanced_guides/add_metrics.md new file mode 100644 index 000000000..0a25a81fc --- /dev/null +++ b/docs/en/advanced_guides/add_metrics.md @@ -0,0 +1 @@ +# Add New Metrics diff --git a/docs/en/advanced_guides/add_transform.md b/docs/en/advanced_guides/add_transform.md deleted file mode 100644 index 69de9d317..000000000 --- a/docs/en/advanced_guides/add_transform.md +++ /dev/null @@ -1,37 +0,0 @@ -# Adding New Data Transforms - -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 TRANSFORMS - @TRANSFORMS.register_module() - class MyTransform: - def transform(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 - crop_size = (512, 1024) - train_pipeline = [ - dict(type='LoadImageFromFile'), - dict(type='LoadAnnotations'), - dict(type='RandomResize', - scale=(2048, 1024), - ratio_range=(0.5, 2.0), - keep_ratio=True), - dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), - dict(type='RandomFlip', flip_ratio=0.5), - dict(type='PhotoMetricDistortion'), - dict(type='MyTransform'), - dict(type='PackSegInputs'), - ] - ``` diff --git a/docs/en/advanced_guides/add_transforms.md b/docs/en/advanced_guides/add_transforms.md new file mode 100644 index 000000000..ca336ce04 --- /dev/null +++ b/docs/en/advanced_guides/add_transforms.md @@ -0,0 +1,52 @@ +# Adding New Data Transforms + +## Customization data transformation + +The customized data transformation must inherited from `BaseTransform` and implement `transform` function. +Here we use a simple flipping transformation as example: + +```python +import random +import mmcv +from mmcv.transforms import BaseTransform, TRANSFORMS + +@TRANSFORMS.register_module() +class MyFlip(BaseTransform): + def __init__(self, direction: str): + super().__init__() + self.direction = direction + + def transform(self, results: dict) -> dict: + img = results['img'] + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +Moreover, import the new class. + +```python +from .my_pipeline import MyFlip +``` + +Thus, we can instantiate a `MyFlip` object and use it to process the data dict. + +```python +import numpy as np + +transform = MyFlip(direction='horizontal') +data_dict = {'img': np.random.rand(224, 224, 3)} +data_dict = transform(data_dict) +processed_img = data_dict['img'] +``` + +Or, we can use `MyFlip` transformation in data pipeline in our config file. + +```python +pipeline = [ + ... + dict(type='MyFlip', direction='horizontal'), + ... +] +``` + +Note that if you want to use `MyFlip` in config, you must ensure the file containing `MyFlip` is imported during runtime. diff --git a/docs/en/advanced_guides/evaluation.md b/docs/en/advanced_guides/evaluation.md index 55728281a..ee5a927ff 100644 --- a/docs/en/advanced_guides/evaluation.md +++ b/docs/en/advanced_guides/evaluation.md @@ -81,7 +81,7 @@ The arguments of the constructor: - `process` method processes one batch of data and data_samples. - `compute_metrics` method computes the metrics from processed results. -#### IoUMetric.process +### IoUMetric.process Parameters: @@ -92,7 +92,7 @@ Returns: This method doesn't have returns since the processed results would be stored in `self.results`, which will be used to compute the metrics when all batches have been processed. -#### IoUMetric.compute_metrics +### IoUMetric.compute_metrics Parameters: diff --git a/docs/en/advanced_guides/index.rst b/docs/en/advanced_guides/index.rst index 1cae420c1..53ef8c5e7 100644 --- a/docs/en/advanced_guides/index.rst +++ b/docs/en/advanced_guides/index.rst @@ -19,7 +19,7 @@ Component Customization .. toctree:: :maxdepth: 1 - add_modules.md + add_models.md add_datasets.md add_transforms.md add_metrics.md diff --git a/docs/en/advanced_guides/training_tricks.md b/docs/en/advanced_guides/training_tricks.md index 6c43230c7..8fa89131d 100644 --- a/docs/en/advanced_guides/training_tricks.md +++ b/docs/en/advanced_guides/training_tricks.md @@ -1,4 +1,4 @@ -# Training Tricks +# \[WIP\] Training Tricks MMSegmentation support following training tricks out of box. diff --git a/docs/en/advanced_guides/transforms.md b/docs/en/advanced_guides/transforms.md index d42d61a9e..e0c4155b5 100644 --- a/docs/en/advanced_guides/transforms.md +++ b/docs/en/advanced_guides/transforms.md @@ -6,7 +6,9 @@ The structure of this guide is as follows: - [Data Transforms](#data-transforms) - [Design of Data pipelines](#design-of-data-pipelines) - - [Customization data transformation](#customization-data-transformation) + - [Data loading](#data-loading) + - [Pre-processing](#pre-processing) + - [Formatting](#formatting) ## Design of Data pipelines @@ -125,48 +127,3 @@ The position of random contrast is in second or second to last(mode 0 or 1 below - add: `inputs`, `data_sample` - remove: keys specified by `meta_keys` (merged into the metainfo of data_sample), all other keys - -## Customization data transformation - -The customized data transformation must inherited from `BaseTransform` and implement `transform` function. -Here we use a simple flipping transformation as example: - -```python -import random -import mmcv -from mmcv.transforms import BaseTransform, TRANSFORMS - -@TRANSFORMS.register_module() -class MyFlip(BaseTransform): - def __init__(self, direction: str): - super().__init__() - self.direction = direction - - def transform(self, results: dict) -> dict: - img = results['img'] - results['img'] = mmcv.imflip(img, direction=self.direction) - return results -``` - -Thus, we can instantiate a `MyFlip` object and use it to process the data dict. - -```python -import numpy as np - -transform = MyFlip(direction='horizontal') -data_dict = {'img': np.random.rand(224, 224, 3)} -data_dict = transform(data_dict) -processed_img = data_dict['img'] -``` - -Or, we can use `MyFlip` transformation in data pipeline in our config file. - -```python -pipeline = [ - ... - dict(type='MyFlip', direction='horizontal'), - ... -] -``` - -Note that if you want to use `MyFlip` in config, you must ensure the file containing `MyFlip` is imported during runtime. diff --git a/docs/en/api.rst b/docs/en/api.rst index 94f64313d..2f1a25ef9 100644 --- a/docs/en/api.rst +++ b/docs/en/api.rst @@ -11,11 +11,6 @@ datasets .. automodule:: mmseg.datasets :members: -samplers -^^^^^^^^^^ -.. automodule:: mmseg.datasets.samplers - :members: - transforms ^^^^^^^^^^^^ .. automodule:: mmseg.datasets.transforms @@ -35,7 +30,7 @@ optimizers :members: mmseg.evaluation --------------- +----------------- metrics ^^^^^^^^^^ diff --git a/docs/en/modelzoo_statistics.md b/docs/en/modelzoo_statistics.md new file mode 100644 index 000000000..c8fa46d01 --- /dev/null +++ b/docs/en/modelzoo_statistics.md @@ -0,0 +1,102 @@ +# Model Zoo Statistics + +- Number of papers: 47 + + - ALGORITHM: 36 + - BACKBONE: 11 + +- Number of checkpoints: 612 + + - \[ALGORITHM\] [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) (16 ckpts) + + - \[ALGORITHM\] [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) (12 ckpts) + + - \[BACKBONE\] [BEiT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/beit) (2 ckpts) + + - \[ALGORITHM\] [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv1) (11 ckpts) + + - \[ALGORITHM\] [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv2) (4 ckpts) + + - \[ALGORITHM\] [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) (16 ckpts) + + - \[ALGORITHM\] [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) (2 ckpts) + + - \[BACKBONE\] [ConvNeXt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/convnext) (6 ckpts) + + - \[ALGORITHM\] [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) (16 ckpts) + + - \[ALGORITHM\] [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) (41 ckpts) + + - \[ALGORITHM\] [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) (42 ckpts) + + - \[ALGORITHM\] [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) (12 ckpts) + + - \[ALGORITHM\] [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) (12 ckpts) + + - \[ALGORITHM\] [DPT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dpt) (1 ckpts) + + - \[ALGORITHM\] [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) (4 ckpts) + + - \[ALGORITHM\] [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) (12 ckpts) + + - \[ALGORITHM\] [ERFNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/erfnet) (1 ckpts) + + - \[ALGORITHM\] [FastFCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastfcn) (12 ckpts) + + - \[ALGORITHM\] [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) (1 ckpts) + + - \[ALGORITHM\] [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) (41 ckpts) + + - \[ALGORITHM\] [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) (16 ckpts) + + - \[BACKBONE\] [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) (37 ckpts) + + - \[ALGORITHM\] [ICNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/icnet) (12 ckpts) + + - \[ALGORITHM\] [ISANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/isanet) (16 ckpts) + + - \[ALGORITHM\] [K-Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/knet) (7 ckpts) + + - \[BACKBONE\] [MAE](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mae) (1 ckpts) + + - \[ALGORITHM\] [Mask2Former](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mask2former) (13 ckpts) + + - \[ALGORITHM\] [MaskFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/maskformer) (4 ckpts) + + - \[BACKBONE\] [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) (8 ckpts) + + - \[BACKBONE\] [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) (4 ckpts) + + - \[ALGORITHM\] [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nonlocal_net) (16 ckpts) + + - \[ALGORITHM\] [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) (24 ckpts) + + - \[ALGORITHM\] [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) (4 ckpts) + + - \[BACKBONE\] [PoolFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/poolformer) (5 ckpts) + + - \[ALGORITHM\] [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) (16 ckpts) + + - \[ALGORITHM\] [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) (54 ckpts) + + - \[BACKBONE\] [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) (8 ckpts) + + - \[ALGORITHM\] [SegFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segformer) (13 ckpts) + + - \[ALGORITHM\] [Segmenter](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segmenter) (5 ckpts) + + - \[ALGORITHM\] [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/sem_fpn) (4 ckpts) + + - \[ALGORITHM\] [SETR](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/setr) (7 ckpts) + + - \[ALGORITHM\] [STDC](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/stdc) (4 ckpts) + + - \[BACKBONE\] [Swin Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/swin) (6 ckpts) + + - \[BACKBONE\] [Twins](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/twins) (12 ckpts) + + - \[ALGORITHM\] [UNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/unet) (25 ckpts) + + - \[ALGORITHM\] [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) (16 ckpts) + + - \[BACKBONE\] [Vision Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/vit) (11 ckpts) diff --git a/docs/en/notes/faq.md b/docs/en/notes/faq.md index cd6885216..48f1e42bc 100644 --- a/docs/en/notes/faq.md +++ b/docs/en/notes/faq.md @@ -1,4 +1,4 @@ -# Frequently Asked Questions (FAQ) +# \[WIP\] Frequently Asked Questions (FAQ) We list some common troubles faced by many users and their corresponding solutions here. Feel free to enrich the list if you find any frequent issues and have ways to help others to solve them. If the contents here do not cover your issue, please create an issue using the [provided templates](https://github.com/open-mmlab/mmsegmentation/blob/master/.github/ISSUE_TEMPLATE/error-report.md/) and make sure you fill in all required information in the template. diff --git a/docs/en/user_guides/deployment.md b/docs/en/user_guides/deployment.md index 036db997d..a23f4b404 100644 --- a/docs/en/user_guides/deployment.md +++ b/docs/en/user_guides/deployment.md @@ -1,4 +1,4 @@ -# Deployment +# \[WIP\] Deployment > ## [Try the new MMDeploy to deploy your model](https://mmdeploy.readthedocs.io/) diff --git a/docs/en/user_guides/useful_tools.md b/docs/en/user_guides/useful_tools.md index 128397b80..0d8677854 100644 --- a/docs/en/user_guides/useful_tools.md +++ b/docs/en/user_guides/useful_tools.md @@ -1,4 +1,4 @@ -# Useful Tools +# \[WIP\] Useful Tools Apart from training/testing scripts, We provide lots of useful tools under the `tools/` directory. diff --git a/docs/zh_cn/advanced_guides/add_datasets.md b/docs/zh_cn/advanced_guides/add_datasets.md index 512df8b98..4ea14934e 100644 --- a/docs/zh_cn/advanced_guides/add_datasets.md +++ b/docs/zh_cn/advanced_guides/add_datasets.md @@ -1,4 +1,4 @@ -# 自定义数据集(待更新) +# 新增自定义数据集(待更新) ## 通过重新组织数据来定制数据集 diff --git a/docs/zh_cn/advanced_guides/add_metric.md b/docs/zh_cn/advanced_guides/add_metric.md deleted file mode 100644 index dfd94487d..000000000 --- a/docs/zh_cn/advanced_guides/add_metric.md +++ /dev/null @@ -1 +0,0 @@ -# 添加评测指标 diff --git a/docs/zh_cn/advanced_guides/add_metrics.md b/docs/zh_cn/advanced_guides/add_metrics.md new file mode 100644 index 000000000..3a371e357 --- /dev/null +++ b/docs/zh_cn/advanced_guides/add_metrics.md @@ -0,0 +1 @@ +# 新增评测指标 (待更新) diff --git a/docs/zh_cn/advanced_guides/add_models.md b/docs/zh_cn/advanced_guides/add_models.md new file mode 100644 index 000000000..3f86a0c7c --- /dev/null +++ b/docs/zh_cn/advanced_guides/add_models.md @@ -0,0 +1,3 @@ +# 新增模块(待更新) + +中文版文档支持中,请先阅读[英文版本](../../en/advanced_guides/add_models.md) diff --git a/docs/zh_cn/advanced_guides/add_modules.md b/docs/zh_cn/advanced_guides/add_modules.md deleted file mode 100644 index e20dadd24..000000000 --- a/docs/zh_cn/advanced_guides/add_modules.md +++ /dev/null @@ -1,230 +0,0 @@ -# 自定义模型(待更新) - -## 自定义优化器 (optimizer) - -假设您想增加一个新的叫 `MyOptimizer` 的优化器,它的参数分别为 `a`, `b`, 和 `c`。 -您首先需要在一个文件里实现这个新的优化器,例如在 `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) - -``` - -然后增加这个模块到 `mmseg/core/optimizer/__init__.py` 里面,这样注册器 (registry) 将会发现这个新的模块并添加它: - -```python -from .my_optimizer import MyOptimizer -``` - -之后您可以在配置文件的 `optimizer` 域里使用 `MyOptimizer`, -如下所示,在配置文件里,优化器被 `optimizer` 域所定义: - -```python -optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) -``` - -为了使用您自己的优化器,域可以被修改为: - -```python -optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) -``` - -我们已经支持了 PyTorch 自带的全部优化器,唯一修改的地方是在配置文件里的 `optimizer` 域。例如,如果您想使用 `ADAM`,尽管数值表现会掉点,还是可以如下修改: - -```python -optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) -``` - -使用者可以直接按照 PyTorch [文档教程](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) 去设置参数。 - -## 定制优化器的构造器 (optimizer constructor) - -对于优化,一些模型可能会有一些特别定义的参数,例如批归一化 (BatchNorm) 层里面的权重衰减 (weight decay)。 -使用者可以通过定制优化器的构造器来微调这些细粒度的优化器参数。 - -```python -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, optim_wrapper_cfg, paramwise_cfg=None): - - def __call__(self, model): - - return my_optimizer - -``` - -## 开发和增加新的组件(Module) - -MMSegmentation 里主要有2种组件: - -- 主干网络 (backbone): 通常是卷积网络的堆叠,来做特征提取,例如 ResNet, HRNet -- 解码头 (decoder head): 用于语义分割图的解码的组件(得到分割结果) - -### 添加新的主干网络 - -这里我们以 MobileNet 为例,展示如何增加新的主干组件: - -1. 创建一个新的文件 `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. 在 `mmseg/models/backbones/__init__.py` 里面导入模块 - -```python -from .mobilenet import MobileNet -``` - -3. 在您的配置文件里使用它 - -```python -model = dict( - ... - backbone=dict( - type='MobileNet', - arg1=xxx, - arg2=xxx), - ... -``` - -### 增加新的解码头 (decoder head)组件 - -在 MMSegmentation 里面,对于所有的分割头,我们提供一个基类解码头 [BaseDecodeHead](https://github.com/open-mmlab/mmsegmentation/blob/master/mmseg/models/decode_heads/decode_head.py) 。 -所有新建的解码头都应该继承它。这里我们以 [PSPNet](https://arxiv.org/abs/1612.01105) 为例, -展示如何开发和增加一个新的解码头组件: - -首先,在 `mmseg/models/decode_heads/psp_head.py` 里添加一个新的解码头。 -PSPNet 中实现了一个语义分割的解码头。为了实现一个解码头,我们只需要在新构造的解码头中实现如下的3个函数: - -```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): - -``` - -接着,使用者需要在 `mmseg/models/decode_heads/__init__.py` 里面添加这个模块,这样对应的注册器 (registry) 可以查找并加载它们。 - -PSPNet的配置文件如下所示: - -```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))) - -``` - -### 增加新的损失函数 - -假设您想添加一个新的损失函数 `MyLoss` 到语义分割解码器里。 -为了添加一个新的损失函数,使用者需要在 `mmseg/models/losses/my_loss.py` 里面去实现它。 -`weighted_loss` 可以对计算损失时的每个样本做加权。 - -```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 -``` - -然后使用者需要在 `mmseg/models/losses/__init__.py` 里面添加它: - -```python -from .my_loss import MyLoss, my_loss - -``` - -为了使用它,修改 `loss_xxx` 域。之后您需要在解码头组件里修改 `loss_decode` 域。 -`loss_weight` 可以被用来对不同的损失函数做加权。 - -```python -loss_decode=dict(type='MyLoss', loss_weight=1.0)) -``` diff --git a/docs/zh_cn/advanced_guides/add_transforms.md b/docs/zh_cn/advanced_guides/add_transforms.md index 2fa55f0c0..58a2485e0 100644 --- a/docs/zh_cn/advanced_guides/add_transforms.md +++ b/docs/zh_cn/advanced_guides/add_transforms.md @@ -1,166 +1,3 @@ -# 自定义数据流程(待更新) +# 新增数据增强(待更新) -## 数据流程的设计 - -按照通常的惯例,我们使用 `Dataset` 和 `DataLoader` 做多线程的数据加载。`Dataset` 返回一个数据内容的字典,里面对应于模型前传方法的各个参数。 -因为在语义分割中,输入的图像数据具有不同的大小,我们在 MMCV 里引入一个新的 `DataContainer` 类别去帮助收集和分发不同大小的输入数据。 - -更多细节,请查看[这里](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py) 。 - -数据的准备流程和数据集是解耦的。通常一个数据集定义了如何处理标注数据(annotations)信息,而一个数据流程定义了准备一个数据字典的所有步骤。一个流程包括了一系列操作,每个操作里都把一个字典作为输入,然后再输出一个新的字典给下一个变换操作。 - -这些操作可分为数据加载 (data loading),预处理 (pre-processing),格式变化 (formatting) 和测试时数据增强 (test-time augmentation)。 - -下面的例子就是 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']), - ]) -] -``` - -对于每个操作,我们列出它添加、更新、移除的相关字典域 (dict fields): - -### 数据加载 Data loading - -`LoadImageFromFile` - -- 增加: img, img_shape, ori_shape - -`LoadAnnotations` - -- 增加: gt_semantic_seg, seg_fields - -### 预处理 Pre-processing - -`Resize` - -- 增加: scale, scale_idx, pad_shape, scale_factor, keep_ratio -- 更新: img, img_shape, \*seg_fields - -`RandomFlip` - -- 增加: flip -- 更新: img, \*seg_fields - -`Pad` - -- 增加: pad_fixed_size, pad_size_divisor -- 更新: img, pad_shape, \*seg_fields - -`RandomCrop` - -- 更新: img, pad_shape, \*seg_fields - -`Normalize` - -- 增加: img_norm_cfg -- 更新: img - -`SegRescale` - -- 更新: gt_semantic_seg - -`PhotoMetricDistortion` - -- 更新: img - -### 格式 Formatting - -`ToTensor` - -- 更新: 由 `keys` 指定 - -`ImageToTensor` - -- 更新: 由 `keys` 指定 - -`Transpose` - -- 更新: 由 `keys` 指定 - -`ToDataContainer` - -- 更新: 由 `keys` 指定 - -`DefaultFormatBundle` - -- 更新: img, gt_semantic_seg - -`Collect` - -- 增加: img_meta (the keys of img_meta is specified by `meta_keys`) -- 移除: all other keys except for those specified by `keys` - -### 测试时数据增强 Test time augmentation - -`MultiScaleFlipAug` - -## 拓展和使用自定义的流程 - -1. 在任何一个文件里写一个新的流程,例如 `my_pipeline.py`,它以一个字典作为输入并且输出一个字典 - - ```python - from mmseg.datasets import PIPELINES - - @PIPELINES.register_module() - class MyTransform: - - def __call__(self, results): - results['dummy'] = True - return results - ``` - -2. 导入一个新类 - - ```python - from .my_pipeline import MyTransform - ``` - -3. 在配置文件里使用它 - - ```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']), - ] - ``` +中文版文档支持中,请先阅读[英文版本](../../en/advanced_guides/add_transform.md) diff --git a/docs/zh_cn/advanced_guides/data_flow.md b/docs/zh_cn/advanced_guides/data_flow.md index 5c4f0a023..0716d36d1 100644 --- a/docs/zh_cn/advanced_guides/data_flow.md +++ b/docs/zh_cn/advanced_guides/data_flow.md @@ -43,7 +43,7 @@ dict( ### 数据预处理器到模型 -虽然在[上面的图](#数据流概述)中分开绘制了数据预处理器和模型,但数据预处理器是模型的一部分,因此可以在[模型教程](https://mmsegmentation.readthedocs.io/en/dev-1.x/advanced_guides/models.html)中找到数据预处理器章节。 ***([中文链接待更新](https://mmsegmentation.readthedocs.io/zh_CN/dev-1.x/advanced_guides/models.html))*** +虽然在[上面的图](##数据流概述)中分开绘制了数据预处理器和模型,但数据预处理器是模型的一部分,因此可以在[模型教程](https://mmsegmentation.readthedocs.io/en/dev-1.x/advanced_guides/models.html)中找到数据预处理器章节。 ***([中文链接待更新](https://mmsegmentation.readthedocs.io/zh_CN/dev-1.x/advanced_guides/models.html))*** 数据预处理器的返回值是一个包含 `inputs` 和 `data_samples` 的字典,其中 `inputs` 是批处理图像的 4D 张量,`data_samples` 中添加了一些用于数据预处理的额外元信息。当传递给网络时,字典将被解包为两个值。 以下伪代码展示了数据预处理器的返回值和模型的输入值。 diff --git a/docs/zh_cn/advanced_guides/evaluation.md b/docs/zh_cn/advanced_guides/evaluation.md index d07fcf104..a82311ccc 100644 --- a/docs/zh_cn/advanced_guides/evaluation.md +++ b/docs/zh_cn/advanced_guides/evaluation.md @@ -1 +1,3 @@ -# 模型评测 +# 模型评测 + +中文版文档支持中,请先阅读[英文版本](../../en/advanced_guides/evaluation.md) diff --git a/docs/zh_cn/advanced_guides/index.rst b/docs/zh_cn/advanced_guides/index.rst index b70674260..2aec1ac9c 100644 --- a/docs/zh_cn/advanced_guides/index.rst +++ b/docs/zh_cn/advanced_guides/index.rst @@ -19,7 +19,7 @@ .. toctree:: :maxdepth: 1 - add_modules.md + add_models.md add_datasets.md add_transforms.md add_metrics.md diff --git a/docs/zh_cn/advanced_guides/models.md b/docs/zh_cn/advanced_guides/models.md index bebf4ef44..62dbea38c 100644 --- a/docs/zh_cn/advanced_guides/models.md +++ b/docs/zh_cn/advanced_guides/models.md @@ -1 +1,3 @@ # 模型 + +中文版文档支持中,请先阅读[英文版本](../../en/advanced_guides/models.md) diff --git a/docs/zh_cn/advanced_guides/transforms.md b/docs/zh_cn/advanced_guides/transforms.md index c96b688bd..1cbe79ba4 100644 --- a/docs/zh_cn/advanced_guides/transforms.md +++ b/docs/zh_cn/advanced_guides/transforms.md @@ -1 +1,3 @@ -# 数据增广 +# 数据增强变化 + +中文版文档支持中,请先阅读[英文版本](../../en/advanced_guides/transforms.md) diff --git a/docs/zh_cn/api.rst b/docs/zh_cn/api.rst index 94f64313d..3478aa936 100644 --- a/docs/zh_cn/api.rst +++ b/docs/zh_cn/api.rst @@ -11,11 +11,6 @@ datasets .. automodule:: mmseg.datasets :members: -samplers -^^^^^^^^^^ -.. automodule:: mmseg.datasets.samplers - :members: - transforms ^^^^^^^^^^^^ .. automodule:: mmseg.datasets.transforms diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md index 695cd811d..da6d728a1 100644 --- a/docs/zh_cn/get_started.md +++ b/docs/zh_cn/get_started.md @@ -34,7 +34,7 @@ conda install pytorch torchvision cpuonly -c pytorch ## 安装 -我们建议用户遵循我们的最佳实践来安装 MMSegmentation 。但是整个过程是高度自定义的。更多信息请参见[自定义安装](#自定义安装)部分。 +我们建议用户遵循我们的最佳实践来安装 MMSegmentation 。但是整个过程是高度自定义的。更多信息请参见[自定义安装](##自定义安装)部分。 ### 最佳实践 diff --git a/docs/zh_cn/modelzoo_statistics.md b/docs/zh_cn/modelzoo_statistics.md new file mode 100644 index 000000000..b057575a2 --- /dev/null +++ b/docs/zh_cn/modelzoo_statistics.md @@ -0,0 +1,102 @@ +# 模型库统计数据 + +- 论文数量: 47 + + - ALGORITHM: 36 + - BACKBONE: 11 + +- 模型数量: 612 + + - \[ALGORITHM\] [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) (16 ckpts) + + - \[ALGORITHM\] [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) (12 ckpts) + + - \[BACKBONE\] [BEiT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/beit) (2 ckpts) + + - \[ALGORITHM\] [BiSeNetV1](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv1) (11 ckpts) + + - \[ALGORITHM\] [BiSeNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/bisenetv2) (4 ckpts) + + - \[ALGORITHM\] [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) (16 ckpts) + + - \[ALGORITHM\] [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) (2 ckpts) + + - \[BACKBONE\] [ConvNeXt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/convnext) (6 ckpts) + + - \[ALGORITHM\] [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) (16 ckpts) + + - \[ALGORITHM\] [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) (41 ckpts) + + - \[ALGORITHM\] [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) (42 ckpts) + + - \[ALGORITHM\] [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) (12 ckpts) + + - \[ALGORITHM\] [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) (12 ckpts) + + - \[ALGORITHM\] [DPT](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dpt) (1 ckpts) + + - \[ALGORITHM\] [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) (4 ckpts) + + - \[ALGORITHM\] [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) (12 ckpts) + + - \[ALGORITHM\] [ERFNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/erfnet) (1 ckpts) + + - \[ALGORITHM\] [FastFCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastfcn) (12 ckpts) + + - \[ALGORITHM\] [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) (1 ckpts) + + - \[ALGORITHM\] [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) (41 ckpts) + + - \[ALGORITHM\] [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) (16 ckpts) + + - \[BACKBONE\] [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) (37 ckpts) + + - \[ALGORITHM\] [ICNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/icnet) (12 ckpts) + + - \[ALGORITHM\] [ISANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/isanet) (16 ckpts) + + - \[ALGORITHM\] [K-Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/knet) (7 ckpts) + + - \[BACKBONE\] [MAE](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mae) (1 ckpts) + + - \[ALGORITHM\] [Mask2Former](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mask2former) (13 ckpts) + + - \[ALGORITHM\] [MaskFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/maskformer) (4 ckpts) + + - \[BACKBONE\] [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) (8 ckpts) + + - \[BACKBONE\] [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) (4 ckpts) + + - \[ALGORITHM\] [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nonlocal_net) (16 ckpts) + + - \[ALGORITHM\] [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) (24 ckpts) + + - \[ALGORITHM\] [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) (4 ckpts) + + - \[BACKBONE\] [PoolFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/poolformer) (5 ckpts) + + - \[ALGORITHM\] [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) (16 ckpts) + + - \[ALGORITHM\] [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) (54 ckpts) + + - \[BACKBONE\] [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) (8 ckpts) + + - \[ALGORITHM\] [SegFormer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segformer) (13 ckpts) + + - \[ALGORITHM\] [Segmenter](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/segmenter) (5 ckpts) + + - \[ALGORITHM\] [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/sem_fpn) (4 ckpts) + + - \[ALGORITHM\] [SETR](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/setr) (7 ckpts) + + - \[ALGORITHM\] [STDC](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/stdc) (4 ckpts) + + - \[BACKBONE\] [Swin Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/swin) (6 ckpts) + + - \[BACKBONE\] [Twins](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/twins) (12 ckpts) + + - \[ALGORITHM\] [UNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/unet) (25 ckpts) + + - \[ALGORITHM\] [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) (16 ckpts) + + - \[BACKBONE\] [Vision Transformer](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/vit) (11 ckpts) diff --git a/docs/zh_cn/user_guides/2_dataset_prepare.md b/docs/zh_cn/user_guides/2_dataset_prepare.md index bea1efd5c..c9c360697 100644 --- a/docs/zh_cn/user_guides/2_dataset_prepare.md +++ b/docs/zh_cn/user_guides/2_dataset_prepare.md @@ -1,453 +1,3 @@ ## 准备数据集(待更新) -推荐用软链接,将数据集根目录链接到 `$MMSEGMENTATION/data` 里。如果您的文件夹结构是不同的,您也许可以试着修改配置文件里对应的路径。 - -```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 -| ├── dark_zurich -| │   ├── gps -| │   │   ├── val -| │   │   └── val_ref -| │   ├── gt -| │   │   └── val -| │   ├── LICENSE.txt -| │   ├── lists_file_names -| │   │   ├── val_filenames.txt -| │   │   └── val_ref_filenames.txt -| │   ├── README.md -| │   └── rgb_anon -| │   | ├── val -| │   | └── val_ref -| ├── NighttimeDrivingTest -| | ├── gtCoarse_daytime_trainvaltest -| | │   └── test -| | │   └── night -| | └── leftImg8bit -| | | └── test -| | | └── night -│ ├── loveDA -│ │ ├── img_dir -│ │ │ ├── train -│ │ │ ├── val -│ │ │ ├── test -│ │ ├── ann_dir -│ │ │ ├── train -│ │ │ ├── val -│ ├── potsdam -│ │ ├── img_dir -│ │ │ ├── train -│ │ │ ├── val -│ │ ├── ann_dir -│ │ │ ├── train -│ │ │ ├── val -│ ├── vaihingen -│ │ ├── img_dir -│ │ │ ├── train -│ │ │ ├── val -│ │ ├── ann_dir -│ │ │ ├── train -│ │ │ ├── val -│ ├── iSAID -│ │ ├── img_dir -│ │ │ ├── train -│ │ │ ├── val -│ │ │ ├── test -│ │ ├── ann_dir -│ │ │ ├── train -│ │ │ ├── val -│ ├── synapse -│ │ ├── img_dir -│ │ │ ├── train -│ │ │ ├── val -│ │ ├── ann_dir -│ │ │ ├── train -│ │ │ ├── val -│ ├── REFUGE -│ │ ├── images -│ │ │ ├── training -│ │ │ ├── validation -│ │ │ ├── test -│ │ ├── annotations -│ │ │ ├── training -│ │ │ ├── validation -│ │ │ ├── test -``` - -### Cityscapes - -注册成功后,数据集可以在 [这里](https://www.cityscapes-dataset.com/downloads/) 下载。 - -通常情况下,`**labelTrainIds.png` 被用来训练 cityscapes。 -基于 [cityscapesscripts](https://github.com/mcordts/cityscapesScripts), -我们提供了一个 [脚本](https://github.com/open-mmlab/mmsegmentation/blob/master/tools/convert_datasets/cityscapes.py), -去生成 `**labelTrainIds.png`。 - -```shell -# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略。 -python tools/convert_datasets/cityscapes.py data/cityscapes --nproc 8 -``` - -### Pascal VOC - -Pascal VOC 2012 可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar) 下载。 -此外,许多最近在 Pascal VOC 数据集上的工作都会利用增广的数据,它们可以在 [这里](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz) 找到。 - -如果您想使用增广后的 VOC 数据集,请运行下面的命令来将数据增广的标注转成正确的格式。 - -```shell -# --nproc 8 意味着有 8 个进程用来转换,它也可以被忽略。 -python tools/convert_datasets/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 -``` - -关于如何拼接数据集 (concatenate) 并一起训练它们,更多细节请参考 [拼接连接数据集](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/tutorials/customize_datasets.md#%E6%8B%BC%E6%8E%A5%E6%95%B0%E6%8D%AE%E9%9B%86) 。 - -### ADE20K - -ADE20K 的训练集和验证集可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip) 下载。 -您还可以在 [这里](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip) 下载验证集。 - -### Pascal Context - -Pascal Context 的训练集和验证集可以在 [这里](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar) 下载。 -注册成功后,您还可以在 [这里](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) 下载验证集。 - -为了从原始数据集里切分训练集和验证集, 您可以在 [这里](https://codalabuser.blob.core.windows.net/public/trainval_merged.json) -下载 trainval_merged.json。 - -如果您想使用 Pascal Context 数据集, -请安装 [细节](https://github.com/zhanghang1989/detail-api) 然后再运行如下命令来把标注转换成正确的格式。 - -```shell -python tools/convert_datasets/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json -``` - -### CHASE DB1 - -CHASE DB1 的训练集和验证集可以在 [这里](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip) 下载。 - -为了将 CHASE DB1 数据集转换成 MMSegmentation 的格式,您需要运行如下命令: - -```shell -python tools/convert_datasets/chase_db1.py /path/to/CHASEDB1.zip -``` - -这个脚本将自动生成正确的文件夹结构。 - -### DRIVE - -DRIVE 的训练集和验证集可以在 [这里](https://drive.grand-challenge.org/) 下载。 -在此之前,您需要注册一个账号,当前 '1st_manual' 并未被官方提供,因此需要您从其他地方获取。 - -为了将 DRIVE 数据集转换成 MMSegmentation 格式,您需要运行如下命令: - -```shell -python tools/convert_datasets/drive.py /path/to/training.zip /path/to/test.zip -``` - -这个脚本将自动生成正确的文件夹结构。 - -### HRF - -首先,下载 [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) 以及 [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip) 。 - -为了将 HRF 数据集转换成 MMSegmentation 格式,您需要运行如下命令: - -```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 -``` - -这个脚本将自动生成正确的文件夹结构。 - -### STARE - -首先,下载 [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) 和 [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar) 。 - -为了将 STARE 数据集转换成 MMSegmentation 格式,您需要运行如下命令: - -```shell -python tools/convert_datasets/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar -``` - -这个脚本将自动生成正确的文件夹结构。 - -### Dark Zurich - -因为我们只支持在此数据集上测试模型,所以您只需下载[验证集](https://data.vision.ee.ethz.ch/csakarid/shared/GCMA_UIoU/Dark_Zurich_val_anon.zip) 。 - -### Nighttime Driving - -因为我们只支持在此数据集上测试模型,所以您只需下载[测试集](http://data.vision.ee.ethz.ch/daid/NighttimeDriving/NighttimeDrivingTest.zip) 。 - -### LoveDA - -可以从 Google Drive 里下载 [LoveDA数据集](https://drive.google.com/drive/folders/1ibYV0qwn4yuuh068Rnc-w4tPi0U0c-ti?usp=sharing) 。 - -或者它还可以从 [zenodo](https://zenodo.org/record/5706578#.YZvN7SYRXdF) 下载, 您需要运行如下命令: - -```shell -# Download Train.zip -wget https://zenodo.org/record/5706578/files/Train.zip -# Download Val.zip -wget https://zenodo.org/record/5706578/files/Val.zip -# Download Test.zip -wget https://zenodo.org/record/5706578/files/Test.zip -``` - -对于 LoveDA 数据集,请运行以下命令下载并重新组织数据集 - -```shell -python tools/convert_datasets/loveda.py /path/to/loveDA -``` - -请参照 [这里](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/zh_cn/inference.md) 来使用训练好的模型去预测 LoveDA 测试集并且提交到官网。 - -关于 LoveDA 的更多细节可以在[这里](https://github.com/Junjue-Wang/LoveDA) 找到。 - -### ISPRS Potsdam - -[Potsdam](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-potsdam/) -数据集是一个有着2D 语义分割内容标注的城市遥感数据集。 -数据集可以从挑战[主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/) 获得。 -需要其中的 '2_Ortho_RGB.zip' 和 '5_Labels_all_noBoundary.zip'。 - -对于 Potsdam 数据集,请运行以下命令下载并重新组织数据集 - -```shell -python tools/convert_datasets/potsdam.py /path/to/potsdam -``` - -使用我们默认的配置, 将生成 3456 张图片的训练集和 2016 张图片的验证集。 - -### ISPRS Vaihingen - -[Vaihingen](https://www2.isprs.org/commissions/comm2/wg4/benchmark/2d-sem-label-vaihingen/) -数据集是一个有着2D 语义分割内容标注的城市遥感数据集。 - -数据集可以从挑战 [主页](https://www2.isprs.org/commissions/comm2/wg4/benchmark/data-request-form/). -需要其中的 'ISPRS_semantic_labeling_Vaihingen.zip' 和 'ISPRS_semantic_labeling_Vaihingen_ground_truth_eroded_COMPLETE.zip'。 - -对于 Vaihingen 数据集,请运行以下命令下载并重新组织数据集 - -```shell -python tools/convert_datasets/vaihingen.py /path/to/vaihingen -``` - -使用我们默认的配置 (`clip_size`=512, `stride_size`=256), 将生成 344 张图片的训练集和 398 张图片的验证集。 - -### iSAID - -iSAID 数据集(训练集/验证集/测试集)的图像可以从 [DOTA-v1.0](https://captain-whu.github.io/DOTA/dataset.html) 下载. - -iSAID 数据集(训练集/验证集)的注释可以从 [iSAID](https://captain-whu.github.io/iSAID/dataset.html) 下载. - -该数据集是一个大规模的实例分割(也可以用于语义分割)的遥感数据集. - -下载后,在数据集转换前,您需要将数据集文件夹调整成如下格式. - -``` -│ ├── iSAID -│ │ ├── train -│ │ │ ├── images -│ │ │ │ ├── part1.zip -│ │ │ │ ├── part2.zip -│ │ │ │ ├── part3.zip -│ │ │ ├── Semantic_masks -│ │ │ │ ├── images.zip -│ │ ├── val -│ │ │ ├── images -│ │ │ │ ├── part1.zip -│ │ │ ├── Semantic_masks -│ │ │ │ ├── images.zip -│ │ ├── test -│ │ │ ├── images -│ │ │ │ ├── part1.zip -│ │ │ │ ├── part2.zip -``` - -```shell -python tools/convert_datasets/isaid.py /path/to/iSAID -``` - -使用我们默认的配置 (`patch_width`=896, `patch_height`=896, `overlap_area`=384), 将生成 33,978 张图片的训练集和 11,644 张图片的验证集. - -## Synapse dataset - -这个数据集可以在这个[网页](https://www.synapse.org/#!Synapse:syn3193805/wiki/) 里被下载. -我们参考了 [TransUNet](https://arxiv.org/abs/2102.04306) 里面的数据集预处理的设置, 它将原始数据集 (30 套 3D 样例) 切分出 18 套用于训练, 12 套用于验证. 请参考以下步骤来准备该数据集: - -```shell -unzip RawData.zip -cd ./RawData/Training -``` - -随后新建 `train.txt` 和 `val.txt`. - -根据 TransUNet 来将训练集和验证集如下划分: - -train.txt - -```none -img0005.nii.gz -img0006.nii.gz -img0007.nii.gz -img0009.nii.gz -img0010.nii.gz -img0021.nii.gz -img0023.nii.gz -img0024.nii.gz -img0026.nii.gz -img0027.nii.gz -img0028.nii.gz -img0030.nii.gz -img0031.nii.gz -img0033.nii.gz -img0034.nii.gz -img0037.nii.gz -img0039.nii.gz -img0040.nii.gz -``` - -val.txt - -```none -img0008.nii.gz -img0022.nii.gz -img0038.nii.gz -img0036.nii.gz -img0032.nii.gz -img0002.nii.gz -img0029.nii.gz -img0003.nii.gz -img0001.nii.gz -img0004.nii.gz -img0025.nii.gz -img0035.nii.gz -``` - -此时, synapse 数据集包括了以下内容: - -```none -├── Training -│ ├── img -│ │ ├── img0001.nii.gz -│ │ ├── img0002.nii.gz -│ │ ├── ... -│ ├── label -│ │ ├── label0001.nii.gz -│ │ ├── label0002.nii.gz -│ │ ├── ... -│ ├── train.txt -│ ├── val.txt -``` - -随后, 运行下面的数据集转换脚本来处理 synapse 数据集: - -```shell -python tools/dataset_converters/synapse.py --dataset-path /path/to/synapse -``` - -使用我们默认的配置, 将生成 2,211 张 2D 图片的训练集和 1,568 张图片的验证集. - -需要注意的是 MMSegmentation 默认的评价指标 (例如平均 Dice 值) 都是基于每帧 2D 图片计算的, 这与基于每套 3D 图片计算评价指标的 [TransUNet](https://arxiv.org/abs/2102.04306) 是不同的. - -### REFUGE - -在[官网](https://refuge.grand-challenge.org)注册后, 下载 [REFUGE 数据集](https://refuge.grand-challenge.org/REFUGE2Download) `REFUGE2.zip` , 解压后的内容如下: - -```none -├── REFUGE2 -│ ├── REFUGE2 -│ │ ├── Annotation-Training400.zip -│ │ ├── REFUGE-Test400.zip -│ │ ├── REFUGE-Test-GT.zip -│ │ ├── REFUGE-Training400.zip -│ │ ├── REFUGE-Validation400.zip -│ │ ├── REFUGE-Validation400-GT.zip -│ ├── __MACOSX -``` - -运行如下命令,就可以按照 REFUGE2018 挑战赛划分数据集的标准将数据集切分成训练集、验证集、测试集: - -```shell -python tools/convert_datasets/refuge.py --raw_data_root=/path/to/refuge/REFUGE2/REFUGE2 -``` - -这个脚本将自动生成下面的文件夹结构: - -```none -│ ├── REFUGE -│ │ ├── images -│ │ │ ├── training -│ │ │ ├── validation -│ │ │ ├── test -│ │ ├── annotations -│ │ │ ├── training -│ │ │ ├── validation -│ │ │ ├── test -``` - -其中包括 400 张图片的训练集, 400 张图片的验证集和 400 张图片的测试集. +中文版文档支持中,请先阅读[英文版本](../../en/user_guides/2_dataset_prepare.md) diff --git a/docs/zh_cn/user_guides/3_inference.md b/docs/zh_cn/user_guides/3_inference.md index b90f73420..d2fe60076 100644 --- a/docs/zh_cn/user_guides/3_inference.md +++ b/docs/zh_cn/user_guides/3_inference.md @@ -1,127 +1,3 @@ ## 使用预训练模型推理(待更新) -我们提供测试脚本来评估完整数据集(Cityscapes, PASCAL VOC, ADE20k 等)上的结果,同时为了使其他项目的整合更容易,也提供一些高级 API。 - -### 测试一个数据集 - -- 单卡 GPU -- CPU -- 单节点多卡 GPU -- 多节点 - -您可以使用以下命令来测试一个数据集。 - -```shell -# 单卡 GPU 测试 -python tools/test.py ${配置文件} ${检查点文件} [--out ${结果文件}] [--eval ${评估指标}] [--show] - -# CPU: 如果机器没有 GPU, 则跟上述单卡 GPU 测试一致 -# CPU: 如果机器有 GPU, 那么先禁用 GPU 再运行单 GPU 测试脚本 -export CUDA_VISIBLE_DEVICES=-1 # 禁用 GPU -python tools/test.py ${配置文件} ${检查点文件} [--out ${结果文件}] [--eval ${评估指标}] [--show] - -# 多卡GPU 测试 -./tools/dist_test.sh ${配置文件} ${检查点文件} ${GPU数目} [--out ${结果文件}] [--eval ${评估指标}] -``` - -可选参数: - -- `RESULT_FILE`: pickle 格式的输出结果的文件名,如果不专门指定,结果将不会被专门保存成文件。(MMseg v0.17 之后,args.out 将只会保存评估时的中间结果或者是分割图的保存路径。) -- `EVAL_METRICS`: 在结果里将被评估的指标。这主要取决于数据集, `mIoU` 对于所有数据集都可获得,像 Cityscapes 数据集可以通过 `cityscapes` 命令来专门评估,就像标准的 `mIoU`一样。 -- `--show`: 如果被指定,分割结果将会在一张图像里画出来并且在另一个窗口展示。它仅仅是用来调试与可视化,并且仅针对单卡 GPU 测试。请确认 GUI 在您的环境里可用,否则您也许会遇到报错 `cannot connect to X server` -- `--show-dir`: 如果被指定,分割结果将会在一张图像里画出来并且保存在指定文件夹里。它仅仅是用来调试与可视化,并且仅针对单卡GPU测试。使用该参数时,您的环境不需要 GUI。 -- `--eval-options`: 评估时的可选参数,当设置 `efficient_test=True` 时,它将会保存中间结果至本地文件里以节约 CPU 内存。请确认您本地硬盘有足够的存储空间(大于20GB)。(MMseg v0.17 之后,`efficient_test` 不再生效,我们重构了 test api,通过使用一种渐近式的方式来提升评估和保存结果的效率。) - -例子: - -假设您已经下载检查点文件至文件夹 `checkpoints/` 里。 - -1. 测试 PSPNet 并可视化结果。按下任何键会进行到下一张图 - - ```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. 测试 PSPNet 并保存画出的图以便于之后的可视化 - - ```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. 在数据集 PASCAL VOC (不保存测试结果) 上测试 PSPNet 并评估 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. 使用4卡 GPU 测试 PSPNet,并且在标准 mIoU 和 cityscapes 指标里评估模型 - - ```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 - ``` - - 注意:在 cityscapes mIoU 和我们的 mIoU 指标会有一些差异 (~0.1%) 。因为 cityscapes 默认是根据类别样本数的多少进行加权平均,而我们对所有的数据集都是采取直接平均的方法来得到 mIoU。 - -5. 在 cityscapes 数据集上4卡 GPU 测试 PSPNet, 并生成 png 文件以便提交给官方评估服务器 - - 首先,在配置文件里添加内容: `configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py`, - - ```python - data = dict( - test=dict( - img_dir='leftImg8bit/test', - ann_dir='gtFine/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" - ``` - - 您会在文件夹 `./pspnet_test_results` 里得到生成的 png 文件。 - 您也许可以运行 `zip -r results.zip pspnet_test_results/` 并提交 zip 文件给 [evaluation server](https://www.cityscapes-dataset.com/submit/) 。 - -6. 在 Cityscapes 数据集上使用 CPU 高效内存选项来测试 DeeplabV3+ `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 - ``` - - 使用 `pmap` 可查看 CPU 内存情况, `efficient_test=True` 会使用约 2.25GB 的 CPU 内存, `efficient_test=False` 会使用约 11.06GB 的 CPU 内存。 这个可选参数可以节约很多 CPU 内存。(MMseg v0.17 之后, `efficient_test` 参数将不再生效, 我们使用了一种渐近的方式来更加有效快速地评估和保存结果。) - -7. 在 LoveDA 数据集上1卡 GPU 测试 PSPNet, 并生成 png 文件以便提交给官方评估服务器 - - 首先,在配置文件里添加内容: `configs/pspnet/pspnet_r50-d8_512x512_80k_loveda.py`, - - ```python - data = dict( - test=dict( - img_dir='img_dir/test', - ann_dir='ann_dir/test')) - ``` - - 随后,进行测试。 - - ```shell - python ./tools/test.py configs/pspnet/pspnet_r50-d8_512x512_80k_loveda.py \ - checkpoints/pspnet_r50-d8_512x512_80k_loveda_20211104_155728-88610f9f.pth \ - --format-only --eval-options "imgfile_prefix=./pspnet_test_results" - ``` - - 您会在文件夹 `./pspnet_test_results` 里得到生成的 png 文件。 - 您也许可以运行 `zip -r -j Results.zip pspnet_test_results/` 并提交 zip 文件给 [evaluation server](https://codalab.lisn.upsaclay.fr/competitions/421) 。 +中文版文档支持中,请先阅读[英文版本](../../en/user_guides/3_inference.md) diff --git a/docs/zh_cn/user_guides/4_train_test.md b/docs/zh_cn/user_guides/4_train_test.md index b26132e76..309e046b2 100644 --- a/docs/zh_cn/user_guides/4_train_test.md +++ b/docs/zh_cn/user_guides/4_train_test.md @@ -43,7 +43,7 @@ python tools/train.py ${配置文件} --resume --cfg-options load_from=${检查 export CUDA_VISIBLE_DEVICES=-1 ``` -然后运行[上方](#在单GPU上训练)脚本。 +然后运行[上方](###在单GPU上训练)脚本。 ### 在单GPU上测试 @@ -69,7 +69,7 @@ python tools/test.py ${配置文件} ${模型权重文件} [可选参数] export CUDA_VISIBLE_DEVICES=-1 ``` -然后运行[上方](#在单GPU上测试)脚本。 +然后运行[上方](###在单GPU上测试)脚本。 ## 多GPU、多机器上训练和测试 @@ -85,7 +85,7 @@ OpenMMLab2.0 通过 `MMDistributedDataParallel`实现 **分布式** 训练。 sh tools/dist_train.sh ${配置文件} ${GPU数量} [可选参数] ``` -可选参数与[上方](#在单GPU上训练)相同并且还增加了可以指定gpu数量的参数。 +可选参数与[上方](###在单GPU上训练)相同并且还增加了可以指定gpu数量的参数。 示例: @@ -112,7 +112,7 @@ ln -s ${您的工作路径} ${MMSEG 路径}/work_dirs sh tools/dist_test.sh ${配置文件} ${检查点文件} ${GPU数量} [可选参数] ``` -可选参数与[上方](#在单GPU上测试)相同并且增加了可以指定 gpu 数量的参数。 +可选参数与[上方](###在单GPU上测试)相同并且增加了可以指定 gpu 数量的参数。 示例: diff --git a/docs/zh_cn/user_guides/visualization.md b/docs/zh_cn/user_guides/visualization.md index ac8b9e289..2ef020ba8 100644 --- a/docs/zh_cn/user_guides/visualization.md +++ b/docs/zh_cn/user_guides/visualization.md @@ -69,7 +69,7 @@ default_hooks = dict( work_dirs/test_visual/20220810_115248/vis_data/vis_image ``` -另外,如果在 `vis_backends` 中添加 `TensorboardVisBackend` ,如 [TensorBoard 的配置](#tensorboard-configuration),我们还可以运行下面的命令在 TensorBoard 中查看它们: +另外,如果在 `vis_backends` 中添加 `TensorboardVisBackend` ,如 [TensorBoard 的配置](###TensorBoard的配置),我们还可以运行下面的命令在 TensorBoard 中查看它们: ```shell tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data From 779b86cd74dc8df9024f72ab9939531c693d84e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=98=95=E8=BE=B0?= Date: Fri, 3 Mar 2023 16:54:12 +0800 Subject: [PATCH 24/24] bump v1.0.0rc6 (#2647) as title --- README.md | 6 +++--- README_zh-CN.md | 2 +- docker/serve/Dockerfile | 2 +- docs/en/notes/changelog.md | 35 +++++++++++++++++++++++++++++++++++ docs/en/notes/faq.md | 7 ++++--- mmseg/version.py | 2 +- 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a38a7de36..9b4a580f3 100644 --- a/README.md +++ b/README.md @@ -76,11 +76,11 @@ The 1.x branch works with **PyTorch 1.6+**. ## What's New -v1.0.0rc5 was released on 01/02/2023. +v1.0.0rc6 was released on 03/03/2023. Please refer to [changelog.md](docs/en/notes/changelog.md) for details and release history. -- Support ISNet (ICCV'2021) in projects ([#2400](https://github.com/open-mmlab/mmsegmentation/pull/2400)) -- Support HSSN (CVPR'2022) in projects ([#2444](https://github.com/open-mmlab/mmsegmentation/pull/2444)) +- Support MMSegInferencer ([#2413](https://github.com/open-mmlab/mmsegmentation/pull/2413), [#2658](https://github.com/open-mmlab/mmsegmentation/pull/2658)) +- Support REFUGE dataset ([#2554](https://github.com/open-mmlab/mmsegmentation/pull/2554)) ## Installation diff --git a/README_zh-CN.md b/README_zh-CN.md index 110d3f5b0..858485fd5 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -61,7 +61,7 @@ MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱。它是 O ## 更新日志 -最新版本 v1.0.0rc5 在 2023.02.01 发布。 +最新版本 v1.0.0rc6 在 2023.03.03 发布。 如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/en/notes/changelog.md)。 ## 安装 diff --git a/docker/serve/Dockerfile b/docker/serve/Dockerfile index 5ae1eb607..cf127ddbe 100644 --- a/docker/serve/Dockerfile +++ b/docker/serve/Dockerfile @@ -4,7 +4,7 @@ ARG CUDNN="8" FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel ARG MMCV="2.0.0rc4" -ARG MMSEG="1.0.0rc5" +ARG MMSEG="1.0.0rc6" ENV PYTHONUNBUFFERED TRUE diff --git a/docs/en/notes/changelog.md b/docs/en/notes/changelog.md index 963cd6945..518bfb314 100644 --- a/docs/en/notes/changelog.md +++ b/docs/en/notes/changelog.md @@ -1,5 +1,40 @@ # Changelog of v1.x +## v1.0.0rc6(03/03/2023) + +### Highlights + +- Support MMSegInferencer ([#2413](https://github.com/open-mmlab/mmsegmentation/pull/2413), [#2658](https://github.com/open-mmlab/mmsegmentation/pull/2658)) +- Support REFUGE dataset ([#2554](https://github.com/open-mmlab/mmsegmentation/pull/2554)) + +### Features + +- Support auto import modules from registry ([#2481](https://github.com/open-mmlab/mmsegmentation/pull/2481)) +- Replace numpy ascontiguousarray with torch contiguous to speed-up ([#2604](https://github.com/open-mmlab/mmsegmentation/pull/2604)) +- Add browse_dataset.py tool ([#2649](https://github.com/open-mmlab/mmsegmentation/pull/2649)) + +### Bug fix + +- Rename and Fix bug of projects HieraSeg ([#2565](https://github.com/open-mmlab/mmsegmentation/pull/2565)) +- Add out_channels in `CascadeEncoderDecoder` and update OCRNet and MobileNet v2 results ([#2656](https://github.com/open-mmlab/mmsegmentation/pull/2656)) + +### Documentation + +- Add dataflow documentation of Chinese version ([#2652](https://github.com/open-mmlab/mmsegmentation/pull/2652)) +- Add custmized runtime documentation of English version ([#2533](https://github.com/open-mmlab/mmsegmentation/pull/2533)) +- Add documentation for visualizing feature map using wandb backend ([#2557](https://github.com/open-mmlab/mmsegmentation/pull/2557)) +- Add documentation for benchmark results on NPU (HUAWEI Ascend) ([#2569](https://github.com/open-mmlab/mmsegmentation/pull/2569), [#2596](https://github.com/open-mmlab/mmsegmentation/pull/2596), [#2610](https://github.com/open-mmlab/mmsegmentation/pull/2610)) +- Fix api name error in the migration doc ([#2601](https://github.com/open-mmlab/mmsegmentation/pull/2601)) +- Refine projects documentation ([#2586](https://github.com/open-mmlab/mmsegmentation/pull/2586)) +- Refine MMSegmentation documentation ([#2668](https://github.com/open-mmlab/mmsegmentation/pull/2668), [#2659](https://github.com/open-mmlab/mmsegmentation/pull/2659)) + +### New Contributors + +- @zccjjj made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2548 +- @liuruiqiang made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2554 +- @wangjiangben-hw made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2569 +- @jinxianwei made their first contribution in https://github.com/open-mmlab/mmsegmentation/pull/2557 + ## v1.0.0rc5(02/01/2023) ### Bug fix diff --git a/docs/en/notes/faq.md b/docs/en/notes/faq.md index 48f1e42bc..fe5cac383 100644 --- a/docs/en/notes/faq.md +++ b/docs/en/notes/faq.md @@ -8,9 +8,10 @@ The compatible MMSegmentation, MMCV and MMEngine versions are as below. Please i | MMSegmentation version | MMCV version | MMEngine version | MMClassification (optional) version | MMDetection (optional) version | | :--------------------: | :----------------------------: | :---------------: | :---------------------------------: | :----------------------------: | -| dev-1.x branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>3.0.0rc5 | -| 1.x branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>3.0.0rc5 | -| 1.0.0rc5 | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>3.0.0rc5 | +| dev-1.x branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.5.0 | mmcls>=1.0.0rc0 | mmdet >= 3.0.0rc6 | +| 1.x branch | mmcv >= 2.0.0rc4 | MMEngine >= 0.5.0 | mmcls>=1.0.0rc0 | mmdet >= 3.0.0rc6 | +| 1.0.0rc6 | mmcv >= 2.0.0rc4 | MMEngine >= 0.5.0 | mmcls>=1.0.0rc0 | mmdet >= 3.0.0rc6 | +| 1.0.0rc5 | mmcv >= 2.0.0rc4 | MMEngine >= 0.2.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc6 | | 1.0.0rc4 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4, \<=3.0.0rc5 | | 1.0.0rc3 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4 \<=3.0.0rc5 | | 1.0.0rc2 | mmcv == 2.0.0rc3 | MMEngine >= 0.1.0 | mmcls>=1.0.0rc0 | mmdet>=3.0.0rc4 \<=3.0.0rc5 | diff --git a/mmseg/version.py b/mmseg/version.py index 10ceca812..ef8e391a2 100644 --- a/mmseg/version.py +++ b/mmseg/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '1.0.0rc5' +__version__ = '1.0.0rc6' def parse_version_info(version_str):